diff options
| author | Sean Fridman <fridman@mail.sfsu.edu> | 2015-04-08 14:06:30 -0400 |
|---|---|---|
| committer | Sean Fridman <fridman@mail.sfsu.edu> | 2015-04-08 14:06:39 -0400 |
| commit | 0fc380788157779a39fe630b2464280eea9f5088 (patch) | |
| tree | f4f2f88c3bd098dd8ec083e56ec64f5340e2c445 /app/index.js | |
| parent | b91c88be52170a7c9a8b133ef72052bec8caccba (diff) | |
Add resource instance concept
Can now define resource classes bound to particular data points,
in particular they can be static data defined by app config and not
even in DB
Diffstat (limited to 'app/index.js')
| -rw-r--r-- | app/index.js | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/app/index.js b/app/index.js index c8dceb5..ca09079 100644 --- a/app/index.js +++ b/app/index.js @@ -53,12 +53,13 @@ function OKCMS(options) { } }; var schemas = this._schemas = this._createSchemas(schemaConfig); - var resources = this._resources = + var resourceCache = this._resourceCache = this._createResources(resourceConfig, db, schemas); // Create view instances from config var views = this._views = - this._createViews(viewConfig, db, meta, resources, templateProvider); + this._createViews(viewConfig, db, meta, resourceCache, templateProvider); + var server = this._server = new OKServer({ express: express, app: app, @@ -85,22 +86,24 @@ OKCMS.prototype._createSchemas = function(schemaConfig) { OKCMS.prototype._createResources = function(resourceConfig, db, schemaCache) { resourceConfig = resourceConfig || {}; - var typeCache = {}; - return resourceConfig.reduce(function(cache, config) { + var resources = resourceConfig.map(function(config) { var type = config.type; var schema = schemaCache[type]; if (!schema) throw new Error('Resource config references nonexistent schema'); - // If we already created resource class, just skip - if (cache[type]) - return cache; - cache[type] = OKResource({ + var resource = OKResource({ type: type, db: db, schema: schema - }) - return cache; - }, {}); + }); + // Static resources have some data defined by configuration and + // are a special case + if (config.static) { + resource = resource.instance({static: config.static}); + } + return resource; + }); + return ResourceCache(resources); }; OKCMS.prototype._createViews = function(viewConfig, db, @@ -150,7 +153,7 @@ OKCMS.prototype._createQueries = function(queryConfig, resourceCache) { queryConfig = [queryConfig]; return queryConfig.map(function(config) { var type = config.type; - var resource = resourceCache[type]; + var resource = resourceCache.get(type); if (!resource) throw new Error('Query configured with nonexistent resource'); // Default to "select all" query @@ -162,6 +165,35 @@ OKCMS.prototype._createQueries = function(queryConfig, resourceCache) { }); }; +/** + * Stupid lil cache to help deal with the fact that + * resources can be indexed by either type or a type + id combo. + */ +function ResourceCache(resources) { + if (!(this instanceof ResourceCache)) return new ResourceCache(resources); + resources = resources || []; + var cache = this._cache = {}; + resources.forEach(function(resource) { + if (!resource) + throw new Error('Undefined resource given to ResourceCache'); + if (resource.bound) { + cache[resource.type] = resource.parent; + cache[resource.type + ':' + resource.id] = resource; + } else { + cache[resource.type] = resource; + } + }); +} + +ResourceCache.prototype.get = function(type, id) { + if (!type) return; + if (id && this._cache[type + ':' + id]) { + return this._cache[type + ':' + id]; + } else { + return this._cache[type]; + } +}; + module.exports = { createApp: function(options) { |
