UNPKG

express-crud-router

Version:

React Admin backend for Express. 1 line per resource! ORM agnostic.

91 lines (76 loc) 2.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseQuery = exports.getMany = exports.computeAdditionalAttributes = void 0; var _pLimit = _interopRequireDefault(require("p-limit")); var _headers = require("./headers"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const getMany = (doGetFilteredList, options) => async (req, res, next) => { try { const { limit, offset, filter, order } = await parseQuery(req.query, options?.filters ?? {}); const { rows, count } = await doGetFilteredList({ filter, limit, offset, order }, { req, res }); (0, _headers.setGetListHeaders)(res, offset, count, rows.length); res.json(options?.additionalAttributes ? await computeAdditionalAttributes(options.additionalAttributes, options.additionalAttributesConcurrency ?? 1, req)(rows) : rows); } catch (error) { next(error); } }; exports.getMany = getMany; const parseQuery = async (query, filtersOption) => { const { range, sort, filter } = query; const [from, to] = range ? JSON.parse(range) : [0, 10000]; return { offset: from, limit: to - from + 1, filter: await getFilter(JSON.parse(filter || '{}'), filtersOption), order: [sort ? JSON.parse(sort) : ['id', 'ASC']] }; }; exports.parseQuery = parseQuery; const getFilter = async (filter, filtersOption) => { const result = {}; for (const [key, value] of Object.entries(filter)) { if (filtersOption && filtersOption[key]) { Object.assign(result, await filtersOption[key](value)); } else { result[key] = value; } } return result; }; const computeAdditionalAttributes = (additionalAttributes, concurrency, req) => { const limit = (0, _pLimit.default)(concurrency); return records => Promise.all(records.map(async record => { const populatedRecord = { ...record }; for (const [key, mapper] of Object.entries(additionalAttributes)) { populatedRecord[key] = await limit(() => mapper(record, { rows: records, req })); } return populatedRecord; })); }; exports.computeAdditionalAttributes = computeAdditionalAttributes;