@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
JavaScript
;
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