Create an interface representing a data store and the methods to create/retrieve a product
Write the API for registering queries. We'll need this to properly support using map/reduce database and/or actualised views.
Add a table for registered queries
Start work on the representation of a queryable product
Make it possible to execute queries (as the product developer) against a database
Add the data store and the 'product admin' object
Use the new interfaces in the test app
Don't record events if the session ID provided is empty (StartSession returns this if the product/user is invalid)
This script doesn't actually work to add events any more due to data structure changes; add a GO so we can still create the test product and user
Fix issue with the way that the JSON for a query is decoded
Create the test user and product when setting up the database
Better name for the 'Fluent' class to (hopefully) stop it becoming a dumpbox of stuff.
Initial design for an interface for managing user opt-in state
Add the implementation needed to opt in/opt out users using the SQL database
Add the ability to specify a session ID when talking to the event recorder (so the app can control these if it wants, which avoids needing to change the web API to directly support sessions)
When asked to record an event for a non-existent session, the event recorder will now drop it on the floor (this creates well-defined behaviour for this scenario, which is now much more likely). This behavior likely isn't correct.
Add a static class that can be used to retrieve the data store for the current process
The test app can use the factory to create a data store
Use the cloud configuration or app configuration to retrieve a SQL server connection string in order to create a new data store
Add some exception handling so the behaviour when we try to start two sessions with the same ID is well-defined (the old session is left alone)