express-crud-router
Version:
React Admin backend for Express. 1 line per resource! ORM agnostic.
91 lines (76 loc) • 2.29 kB
JavaScript
;
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;