From 565feb87740dcc693be50f8dbde4887e4ebdc79f Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Wed, 8 Apr 2015 16:05:56 -0400 Subject: Move fetchTemplateData back into OKAdminView --- app/node_modules/okview/index.js | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) (limited to 'app/node_modules/okview/index.js') diff --git a/app/node_modules/okview/index.js b/app/node_modules/okview/index.js index 1ceac03..5f3a8c9 100644 --- a/app/node_modules/okview/index.js +++ b/app/node_modules/okview/index.js @@ -1,4 +1,7 @@ -var fetchTemplateData = require('okutil').fetchTemplateData; +var assign = require('object-assign'); +var pluralize = require('pluralize'); +var isarray = require('lodash.isarray'); +var Q = require('q'); var OKResource = require('okresource'); // Routes for views over collections have a special pattern @@ -129,4 +132,55 @@ function getParamName(route) { return matches[1]; } +/** + * Takes a meta data query and an array of resource queries + * and returns a promise for an object merging all queried + * data, pluralizing keys where necessary. + * + * Lil bit convoluted, sorry. + */ +function fetchTemplateData(meta, queries) { + return Q.promise(function(resolve, reject) { + return Q.all( + [meta.get()].concat(queries.map(function(query) { + return query.get(); + }))) + .then(function(results) { + var metadata = results.shift(); + var normalized = results.reduce(function(cache, result, i) { + // Huh? Bail + if (!result) + return cache; + var resource = queries[i].resource; + var type = queries[i].type; + var manyResult = isarray(result); + // Inform template of ID in generic field + if (manyResult) { + result = result.map(function(data) { + return assign({}, data, {id: data[resource.idField]}) + }); + } else { + result = assign({}, result, {id: result[resource.idField]}); + } + // If we have a lot of results for a certain type, + // we pluralize the key and yield an array of results + if (cache[type] || manyResult) { + var plural = pluralize(type); + delete cache[type]; + cache[plural] = []; + if (manyResult) { + cache[plural] = cache[plural].concat(result); + } else { + cache[plural].push(result); + } + } else { + cache[type] = result; + } + return cache; + }, {meta: metadata}); + resolve(normalized); + }).fail(reject); + }); +} + module.exports = OKView; -- cgit v1.2.3-70-g09d2 From 29b81b08d925596694ef5dc1b80a9fff6e4625f7 Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Wed, 8 Apr 2015 16:11:56 -0400 Subject: Fix up OKView a wee bit --- app/node_modules/okview/index.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) (limited to 'app/node_modules/okview/index.js') diff --git a/app/node_modules/okview/index.js b/app/node_modules/okview/index.js index 5f3a8c9..e9c0bfe 100644 --- a/app/node_modules/okview/index.js +++ b/app/node_modules/okview/index.js @@ -2,6 +2,7 @@ var assign = require('object-assign'); var pluralize = require('pluralize'); var isarray = require('lodash.isarray'); var Q = require('q'); +var OKQuery = require('okquery'); var OKResource = require('okresource'); // Routes for views over collections have a special pattern @@ -18,11 +19,11 @@ function OKView(options) { if (!(this instanceof OKView)) return new OKView(options); options = options || {}; if (!options.template) - throw new Error('No template provided to view.'); + throw new Error('No template provided to OKView.'); if (!options.meta) - throw new Error('No meta resource provided to view'); + throw new Error('No meta resource provided to OKView'); if (!options.route) - throw new Error('No route provided to view'); + throw new Error('No route provided to OKView'); var route = options.route; var mount = options.mount || 'get'; this._template = options.template; @@ -32,28 +33,29 @@ function OKView(options) { // resource will be resolved later // TODO This bound / unbound thing can probably be expressed in a // less convoluted way. - var unbound = this.unbound = !!UNBOUND_ROUTE_PATTERN.exec(this.route); + var unbound = this.unbound = !!UNBOUND_ROUTE_PATTERN.exec(route); + Object.defineProperty(this, 'mount', { value: mount, writable: false, enumerable: true }); + Object.defineProperty(this, 'route', { value: route, writable: false, enumerable: true }); + this._middleware = createMiddleware(this); - this._fetchTemplateData = unbound ? - fetchResourceTemplateData : fetchCollectionTemplateData; + this._fetchTemplateData = unbound ? fetchUnbound : fetchBound; - function fetchResourceTemplateData(id) { - // Bound views only have a single query - // TODO This is super convoluted + function fetchUnbound(id) { + // TODO Janky return fetchTemplateData(meta, [queries[0].get(id)]); } - function fetchCollectionTemplateData() { + function fetchBound() { return fetchTemplateData(meta, queries); } } @@ -65,7 +67,7 @@ OKView.prototype.middleware = function() { OKView.prototype.render = function(req, res, data) { this._template.render(data).then(function(html) { res.send(html); - }, errorHandler(req, res, data)); + }).fail(errorHandler(req, res, data)); }; OKView.prototype.fetchTemplateData = function() { @@ -97,7 +99,7 @@ function unboundMiddleware(view) { var id = req.params[paramName]; view.fetchTemplateData(id).then(function(data) { view.render(req, res, data); - }, errorHandler(req, res, next)); + }).fail(errorHandler(req, res, next)); }; } @@ -109,7 +111,7 @@ function boundMiddleware(view) { return function(req, res, next) { view.fetchTemplateData().then(function(data) { view.render(req, res, data); - }, errorHandler(req, res, next)); + }).fail(errorHandler(req, res, next)); }; } -- cgit v1.2.3-70-g09d2 From bb3d8da23279dc2e4cf275b08b03148b3980fb01 Mon Sep 17 00:00:00 2001 From: Sean Fridman Date: Wed, 8 Apr 2015 18:28:26 -0400 Subject: Fix bug where views didn't resolve resource correctly --- app/index.js | 2 +- app/node_modules/okview/index.js | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'app/node_modules/okview/index.js') diff --git a/app/index.js b/app/index.js index 0e83363..792c10a 100644 --- a/app/index.js +++ b/app/index.js @@ -152,7 +152,7 @@ OKCMS.prototype._createQueries = function(queryConfig, resourceCache) { queryConfig = [queryConfig]; return queryConfig.map(function(config) { var type = config.type; - var resource = resourceCache.get(type); + var resource = resourceCache.get(type, config.query); if (!resource) throw new Error('Query configured with nonexistent resource'); // Default to "select all" query diff --git a/app/node_modules/okview/index.js b/app/node_modules/okview/index.js index e9c0bfe..c245b0c 100644 --- a/app/node_modules/okview/index.js +++ b/app/node_modules/okview/index.js @@ -51,8 +51,11 @@ function OKView(options) { this._fetchTemplateData = unbound ? fetchUnbound : fetchBound; function fetchUnbound(id) { - // TODO Janky - return fetchTemplateData(meta, [queries[0].get(id)]); + var resource = queries[0].resource; + return fetchTemplateData(meta, [OKQuery({ + resource: resource, + query: id + })]); } function fetchBound() { @@ -150,9 +153,10 @@ function fetchTemplateData(meta, queries) { .then(function(results) { var metadata = results.shift(); var normalized = results.reduce(function(cache, result, i) { - // Huh? Bail - if (!result) + // Could be just some rogue request + if (!result) { return cache; + } var resource = queries[i].resource; var type = queries[i].type; var manyResult = isarray(result); -- cgit v1.2.3-70-g09d2