UNPKG

odatafy-mongodb

Version:

convert oData requests through odatafy to MongoDB queries

157 lines (156 loc) 5.87 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getQuery = exports.getQueryFromUrl = void 0; var url_1 = __importDefault(require("url")); var filterGenerator_1 = require("./filterGenerator"); var limitGenerator_1 = require("./limitGenerator"); var skipGenerator_1 = require("./skipGenerator"); var sortGenerator_1 = require("./sortGenerator"); var selectGenerator_1 = require("./selectGenerator"); var lookupGenerator_1 = require("./lookupGenerator"); var computeGenerator_1 = require("./computeGenerator"); var searchGenerator_1 = require("./searchGenerator"); /** * Get MongoDB aggregation query from a given url can be obtained by nodes req.url * @param oDataUrl - the url format ?param=value * @param opts options for getting the url * @returns MongoDB aggregation query */ function getQueryFromUrl(oDataUrl, opts) { var query = url_1.default.parse(oDataUrl, true).query; var validParams = [ "filter", "orderby", "skip", "top", "expand", "compute", "select", "search", ]; var params = Object.keys(query); var parseParameters = {}; validParams.forEach(function (param) { //check if url if (params.includes(param) && params.includes("$" + param)) { throw new Error("Malformed oData url, cannot contain param: ".concat(param, " and param: $").concat(param)); } if (params.includes(param) || params.includes("$" + param)) { parseParameters[param] = query[params.includes(param) ? param : "$" + param]; } }); return getQuery(parseParameters, opts); } exports.getQueryFromUrl = getQueryFromUrl; /** * Get a MongoDB based on oData url paramaters * @param parameters parameters * @param opts options for getting the url * @returns MongoDB aggregaion pipeline */ function getQuery(parameters, opts) { var pipeline = []; var countPipeline = []; if (parameters.expand) { pipeline.push.apply(pipeline, __spreadArray([], __read((0, lookupGenerator_1.generateLookupFromExpand)(parameters.expand, (opts === null || opts === void 0 ? void 0 : opts.expandMapping) ? opts.expandMapping : {})), false)); } if (parameters.compute) { pipeline.push((0, computeGenerator_1.generateComputeStageFromComputedExpr)(parameters.compute)); } if (parameters.filter) { pipeline.push((0, filterGenerator_1.generateMatchFromFilterExpr)(parameters.filter)); } /* copy to count query */ if ((opts === null || opts === void 0 ? void 0 : opts.returnDataCountQuery) || (opts === null || opts === void 0 ? void 0 : opts.returnCountOnly)) { countPipeline = __spreadArray([], __read(pipeline), false); } if (parameters.search) { var searchExpr = (0, searchGenerator_1.generateSearchFromSearchExpr)(parameters.search, opts === null || opts === void 0 ? void 0 : opts.regexSearchFields); pipeline.push(searchExpr); countPipeline.push(searchExpr); } if (parameters.skip) { pipeline.push((0, skipGenerator_1.generateSkipFromSkipExpr)(parameters.skip)); } if (parameters.top) { pipeline.push((0, limitGenerator_1.generateLimitFromTopExpr)(parameters.top)); } if (parameters.select) { pipeline.push((0, selectGenerator_1.generateProjectFromSelectExpr)(parameters.select)); } if (parameters.orderby) { pipeline.push((0, sortGenerator_1.generateSortFromOrderbyExpr)(parameters.orderby)); } //add default steps if pipline must not be empty - i.e. in mongoose an empty pipeline returns an error if (!(opts === null || opts === void 0 ? void 0 : opts.returnEmptyPipeline) && pipeline.length == 0) { pipeline.push({ $addFields: { odatafyMongoDBTempField: "", }, }, { $project: { odatafyMongoDBTempField: 0, }, }); countPipeline = __spreadArray([], __read(pipeline), false); } countPipeline.push({ $count: "count", }); if (opts === null || opts === void 0 ? void 0 : opts.returnCountOnly) { return countPipeline; } if (opts === null || opts === void 0 ? void 0 : opts.returnDataCountQuery) { return [ { $facet: { data: pipeline, countTmp: countPipeline, }, }, { $addFields: { countTmp2: { $first: "$countTmp", }, }, }, { $project: { data: "$data", count: "$countTmp2.count", }, }, ]; } return pipeline; } exports.getQuery = getQuery;