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