gypsum
Version:
Simple and easy lightweight typescript server side framework on Node.js.
76 lines • 3.06 kB
JavaScript
;
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