UNPKG

gypsum

Version:

Simple and easy lightweight typescript server side framework on Node.js.

76 lines 3.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const object_1 = require("tools-box/object"); const logger_1 = require("../misc/logger"); const state_1 = require("../state"); const types_1 = require("../types"); const util_1 = require("../util"); function reference(ctx, options) { const logger = new logger_1.Logger('referenceHook'); let model, responseData; let idsList = []; let groups = {}; if (!options) { logger.warn('options was not provided!'); return ctx.next(); } if (!options.model) { logger.warn('model name was not provided!'); return ctx.next(); } model = state_1.State.getModel(options.model); if (!model) { logger.warn(`${options.model} model not found!.`); return ctx.next(); } responseData = ctx.response.data; if (!responseData) { logger.warn('undefined response!'); return ctx.next(); } responseData = Array.isArray(responseData) ? responseData : [responseData]; for (let i = 0; i < responseData.length; i++) { let ids = object_1.getValue(responseData[i], options.path); if (ids) { ids = Array.isArray(ids) ? ids : [ids]; idsList.push(...ids); groups[responseData[i]._id.toString()] = ids; } } if (!idsList.length) { logger.warn(`'${options.path}' was not found in response data`); return ctx.next(); } let query = util_1.toObjectID({ _id: { $in: idsList } }); model.find(query, options.queryOptions || {}) .then(res => { if (!res || !res.data || !res.data.length) { logger.warn(`${model.name} references were not found`); return ctx.next(); } for (let i = 0; i < responseData.length; i++) { let currentId = responseData[i]._id; let group = groups[currentId]; let references = res.data.filter((entry) => group.indexOf(entry._id.toString()) > -1); object_1.injectValue(responseData[i], options.path, references); } if (Array.isArray(ctx.response.data)) { if (!Array.isArray(object_1.getValue(ctx.response.data[0], options.path))) for (let i = 0; i < responseData.length; i++) object_1.injectValue(ctx.response.data[i], options.path, object_1.getValue(responseData[i], options.path)[0]); } else { if (!Array.isArray(object_1.getValue(ctx.response.data, options.path))) { object_1.injectValue(ctx.response.data, options.path, object_1.getValue(responseData[0], options.path)[0]); } } ctx.next(); }) .catch(error => ctx.next({ message: `error referencing ${model.name} with references '${idsList}'`, original: error, code: types_1.RESPONSE_CODES.UNKNOWN_ERROR })); } exports.reference = reference; //# sourceMappingURL=reference.js.map