Over the past year or two, I've been playing with newer technologies in my side projects. As a web developer, I've gone from the following (and still the following, at work):
The 'classic' technology stack
- Web browser POSTs forms to...
- a C#-coded web application server-side, communicating to...
- external services via XML, then ultimately...
- writing the application state to a SQL database.
To using a very different arrangement:
The fully-dynamic technology stack
- Web browser submitting XmlHttpRequests to...
- other external services via RESTful services in JSON, ultimately...
- writing the application state to a no-SQL database
It's gotten to the point where my whole stack has absolutely no enforcement of type or schema, anywhere.
Now, this has been just fine before, when consuming others' web services. It might have even been fine up until the SQL databases were ditched (along with their DB schemas). But now I'm stuck at:
Where do I declaratively define what is the valid structure of my business-domain data?
I want to enforce data validity before making any of my projects publically available - after all, what's to stop someone from just submitting invalid data to my services, and using it all as just a hacky free database provider? At some point, it has to be enforced that "this web service will only accept a collection of at least one X. X must contain A, B, and optionally C".
The first solution I thought of was to do validation inside my node.js, through a big block of imperative code/if-elses/etc. This felt wrong.
I have been using CouchDB, and for a while I thought that it might be best to put that validation code in the
_update handlers. At least we're performing validation as part of persistence, but it's still an ugly imperative block.
Next, I looked into JSON schema languages. There is no standard as far as I can see, and I wasn't confident in the multiple solutions offered. I could roll my own, but then I'd only be expanding the body of non-standard JSON schema languages.
XML? I could put the X back into AJAX, and have them all schema-validated on the server side. That doesn't seem to follow the trends in software development, however. Neither would using an XML data store instead of a JSON CouchDB/BSON MongoDB persistence layer.
So, I'm stuck. Ideas?
TL;DR Where do I declaratively define the valid structure of my business-domain data when I am using no static Object Oriented language, and no schema-bound SQL database, in my technology stack? Is it possible that there must be some static typing (or DB schema, or validated XML) somewhere for a technology stack to make any sense? If so, where?