UNPKG

@resin/pinejs

Version:

Pine.js is a sophisticated rules-driven API engine that enables you to define rules in a structured subset of English. Those rules are used in order for Pine.js to generate a database schema and the associated [OData](http://www.odata.org/) API. This make

125 lines 4.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.prepareModel = exports.process = exports.resourceURI = void 0; const odata_to_abstract_sql_1 = require("@resin/odata-to-abstract-sql"); const sbvrTypes = require("@resin/sbvr-types"); const Bluebird = require("bluebird"); const _ = require("lodash"); const sbvr_utils_1 = require("./sbvr-utils"); const checkForExpansion = async (vocab, abstractSqlModel, parentResourceName, fieldName, instance) => { let field = instance[fieldName]; if (field == null) { return; } if (typeof field === 'string') { try { field = JSON.parse(field); } catch (_e) { } } if (Array.isArray(field)) { const mappingResourceName = sbvr_utils_1.resolveNavigationResource({ abstractSqlModel, vocabulary: vocab, resourceName: parentResourceName, }, fieldName); const expandedField = await exports.process(vocab, abstractSqlModel, mappingResourceName, field); instance[fieldName] = expandedField; } else { const mappingResourceName = sbvr_utils_1.resolveNavigationResource({ abstractSqlModel, vocabulary: vocab, resourceName: parentResourceName, }, fieldName); instance[fieldName] = { __deferred: { uri: '/' + vocab + '/' + mappingResourceName + '(' + field + ')', }, __id: field, }; } }; exports.resourceURI = (vocab, resourceName, id) => { if (id == null) { return; } if (typeof id === 'string') { id = "'" + encodeURIComponent(id) + "'"; } return `/${vocab}/${resourceName}(@id)?@id=${id}`; }; const getLocalFields = (table) => { if (table.localFields == null) { table.localFields = {}; for (const { fieldName, dataType } of table.fields) { if (dataType !== 'ForeignKey') { const odataName = odata_to_abstract_sql_1.sqlNameToODataName(fieldName); table.localFields[odataName] = true; } } } return table.localFields; }; const getFetchProcessingFields = (table) => { if (table.fetchProcessingFields == null) { table.fetchProcessingFields = _(table.fields) .filter(({ dataType }) => sbvrTypes[dataType] != null && sbvrTypes[dataType].fetchProcessing != null) .map(({ fieldName, dataType }) => { const odataName = odata_to_abstract_sql_1.sqlNameToODataName(fieldName); return [odataName, sbvrTypes[dataType].fetchProcessing]; }) .fromPairs() .value(); } return table.fetchProcessingFields; }; exports.process = async (vocab, abstractSqlModel, resourceName, rows) => { if (rows.length === 0) { return []; } if (rows.length === 1) { if (rows[0].$count != null) { const count = parseInt(rows[0].$count, 10); return count; } } const sqlResourceName = sbvr_utils_1.resolveSynonym({ abstractSqlModel, vocabulary: vocab, resourceName, }); const table = abstractSqlModel.tables[sqlResourceName]; const odataIdField = odata_to_abstract_sql_1.sqlNameToODataName(table.idField); const instances = rows.map((instance) => { instance.__metadata = { uri: exports.resourceURI(vocab, resourceName, instance[odataIdField]), }; return instance; }); const instanceKeys = Object.keys(instances[0]); const localFields = getLocalFields(table); const expandableFields = instanceKeys.filter((fieldName) => !fieldName.startsWith('__') && !localFields.hasOwnProperty(fieldName)); if (expandableFields.length > 0) { await Bluebird.map(instances, (instance) => Bluebird.map(expandableFields, (fieldName) => checkForExpansion(vocab, abstractSqlModel, sqlResourceName, fieldName, instance))); } const fetchProcessingFields = getFetchProcessingFields(table); const processedFields = instanceKeys.filter((fieldName) => !fieldName.startsWith('__') && fetchProcessingFields.hasOwnProperty(fieldName)); if (processedFields.length > 0) { await Bluebird.map(instances, (instance) => Bluebird.map(processedFields, async (fieldName) => { const result = await fetchProcessingFields[fieldName](instance[fieldName]); instance[fieldName] = result; })); } return instances; }; exports.prepareModel = (abstractSqlModel) => { _.forEach(abstractSqlModel.tables, (table) => { getLocalFields(table); getFetchProcessingFields(table); }); }; //# sourceMappingURL=odata-response.js.map