@axway/api-builder-plugin-dc-mbs
Version:
Mobile Backend Services connector
85 lines (79 loc) • 2.22 kB
JavaScript
const {
translateSelOrUnsel,
translateOrderToCSV,
translateWhere,
validateLimitOption,
validateWhereOption,
getTranslatedError
} = require('../utils');
const ignoreMissingFields = true; // readability
function query(Model, options, next) {
this.logger.trace('MBS.query', { options, model: Model.name });
const { Collection } = this.runtime;
const opts = {
classname: Model.name
};
try {
// any of these utils methods might throw
if (options.sel) {
opts.sel = translateSelOrUnsel(Model, options.sel, { includeId: true });
} else if (options.unsel) {
opts.unsel = translateSelOrUnsel(Model, options.unsel);
}
if (options.order) {
opts.order = translateOrderToCSV(Model, options.order);
}
if (options.where) {
validateWhereOption(options.where);
const props = Object.keys(options.where);
if (props.length) {
// handle $nin [ null ] case
for (const prop of props) {
if (options.where[prop].$nin
&& options.where[prop].$nin.length === 1
&& options.where[prop].$nin[0] === null) {
return next(null, new Collection(Model, []));
}
}
// create where clause only if one is provided
opts.where = translateWhere(options.where);
}
}
if (options.skip) {
opts.skip = options.skip;
if (options.skip >= 5000) {
const error = new Error('Skip must be less than 5000');
error.status = 400;
return next(error);
}
}
if (options.limit !== undefined) {
validateLimitOption(options.limit);
opts.limit = options.limit;
}
} catch (err) {
return next(err);
}
const pkName = Model.getPrimaryKeyName();
this.db.customObjectsQuery(opts, (err, response) => {
if (err) {
// Do not expose `err` via callback (information disclosure)
return next(getTranslatedError(this, err));
}
const instances = [];
if (response.body.meta.code === 200) {
const items = response.body.response[Model.name];
if (items.length) {
for (const item of items) {
const instance = Model.instance(item, ignoreMissingFields);
instance.setPrimaryKey(item[pkName]);
instances.push(instance);
}
}
}
return next(null, new Collection(Model, instances));
});
}
module.exports = {
query
};