UNPKG

@axway/api-builder-plugin-dc-mbs

Version:

Mobile Backend Services connector

85 lines (79 loc) 2.22 kB
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 };