var path = require('path'); var isarray = require('lodash.isarray'); var pluralize = require('pluralize'); var Q = require('q'); /** * OKUtils! * Cross cutting concerns n stuff */ module.exports = { /** * 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. */ fetchTemplateData: function fetchTemplateData(meta, queries, options) { return Q.promise(function(resolve, reject) { return Q.all( [meta.get()].concat(queries.map(function(query) { return query.get(options); }))) .then(function(results) { var metadata = results.shift(); var normalized = results.reduce(function(cache, result, i) { var resource = queries[i].resource; var type = queries[i].type; var plural = pluralize(type); if (isarray(result)) { result = result.map(function(data) { // Inform template of ID in generic way data.id = data[resource.idField]; return data; }); } else { // Inform template of ID in generic way result.id = result[resource.idField]; result = [result] } cache[plural] = cache[plural] || []; cache[plural] = cache[plural].concat(result); return cache; }, {meta: metadata}); resolve(normalized); }).fail(reject); }); }, /** * Return a copy of the route with a trailing slash */ withTrailingSlash: function withTrailingSlash(route) { route = route || ''; return path.normalize(route + '/'); }, /** * Return a copy of the route without a trailing slash */ withoutTrailingSlash: function withoutTrailingSlash(route) { route = route || ''; return route.charAt(route.length - 1) === '/' ? route.slice(0, -1) : route; } };