UNPKG

express-crud-router

Version:

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

148 lines (125 loc) 3.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.populateReferenceOne = exports.populateReferenceManyCount = exports.populateReferenceMany = exports.populateReference = void 0; const populateReference = ({ fetchAll, source, target = 'id' }) => { const cache = new Cache(); return async (record, { rows, req }) => { let referencesByTarget = cache.get(req); if (!referencesByTarget) { const references = await fetchAll(rows); referencesByTarget = references.reduce((referencesByTarget, reference) => { referencesByTarget[reference[target ?? 'id']] = reference; return referencesByTarget; }, {}); cache.set(req, referencesByTarget); } return referencesByTarget[record[source]]; }; }; exports.populateReference = populateReference; const populateReferenceMany = ({ fetchAll, source = 'id', target }) => { const cache = new Cache(); return async (record, { rows, req }) => { let referencesByTarget = cache.get(req); if (!referencesByTarget) { const references = await fetchAll(rows, req); referencesByTarget = references.reduce((referencesByTarget, reference) => { if (!referencesByTarget[reference[target]]) { referencesByTarget[reference[target]] = []; } referencesByTarget[reference[target]].push(reference); return referencesByTarget; }, {}); cache.set(req, referencesByTarget); } return referencesByTarget[record[source ?? 'id']] ?? []; }; }; exports.populateReferenceMany = populateReferenceMany; const populateReferenceManyCount = ({ fetchAll, source = 'id', target }) => { const cache = new Cache(); return async (record, { rows, req }) => { let referencesByTarget = cache.get(req); if (!referencesByTarget) { const references = await fetchAll(rows, req); referencesByTarget = references.reduce((referencesByTarget, reference) => { if (!referencesByTarget[reference[target]]) { referencesByTarget[reference[target]] = []; } referencesByTarget[reference[target]].push(reference); return referencesByTarget; }, {}); cache.set(req, referencesByTarget); } return referencesByTarget[record[source ?? 'id']]?.length ?? 0; }; }; exports.populateReferenceManyCount = populateReferenceManyCount; const populateReferenceOne = ({ fetchAll, source = 'id', target }) => { const getAllReferences = populateReferenceMany({ fetchAll, source, target }); return async (record, { rows, req }) => { const references = await getAllReferences(record, { rows, req }); return references[0]; }; }; exports.populateReferenceOne = populateReferenceOne; let id = 1; class Cache { constructor() { this.id = id; id += 1; } get = req => { if (!req.locals?.expressCrudRouter) { return undefined; } return req.locals.expressCrudRouter[this.id]; }; set = (req, value) => { req = req; if (!req.locals) { req.locals = {}; } if (!req.locals.expressCrudRouter) { req.locals.expressCrudRouter = {}; } req.locals.expressCrudRouter[this.id] = value; }; }