UNPKG

@decaf-ts/db-decorators

Version:

Agnostic database decorators and repository

64 lines (62 loc) 8.26 kB
import { DBKeys } from "../model/constants"; import { getAllPropertyDecoratorsRecursive } from "../repository/utils"; import { ModelKeys, sf } from "@decaf-ts/decorator-validation"; import { InternalError } from "../repository/errors"; /** * @summary Returns the primary key attribute for a {@link Model} * @description searches in all the properties in the object for an {@link id} decorated property * * @param {Model} model * * @throws {InternalError} if no property or more than one properties are {@link id} decorated * or no value is set in that property * * @function findPrimaryKey * * @category managers */ export function findPrimaryKey(model) { const decorators = getAllPropertyDecoratorsRecursive(model, undefined, DBKeys.REFLECT + DBKeys.ID); const idDecorators = Object.entries(decorators).reduce((accum, [prop, decs]) => { const filtered = decs.filter((d) => d.key !== ModelKeys.TYPE); if (filtered && filtered.length) { accum[prop] = accum[prop] || []; accum[prop].push(...filtered); } return accum; }, {}); if (!idDecorators || !Object.keys(idDecorators).length) throw new InternalError("Could not find ID decorated Property"); if (Object.keys(idDecorators).length > 1) throw new InternalError(sf(Object.keys(idDecorators).join(", "))); const idProp = Object.keys(idDecorators)[0]; if (!idProp) throw new InternalError("Could not find ID decorated Property"); return { id: idProp, props: idDecorators[idProp][0].props, }; } /** * @summary Returns the primary key value for a {@link Model} * @description searches in all the properties in the object for an {@link pk} decorated property * * @param {Model} model * @param {boolean} [returnEmpty] * @return {string} primary key * * @throws {InternalError} if no property or more than one properties are {@link pk} decorated * @throws {NotFoundError} returnEmpty is false and no value is set on the {@link pk} decorated property * * @function findModelID * * @category managers */ export function findModelId(model, returnEmpty = false) { const idProp = findPrimaryKey(model).id; const modelId = model[idProp]; if (!modelId && !returnEmpty) throw new InternalError(sf("No value for the Id is defined under the property {0}", idProp)); return modelId; } //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9pZGVudGl0eS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFTLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBa0IsS0FBUTtJQUN0RCxNQUFNLFVBQVUsR0FBRyxpQ0FBaUMsQ0FDbEQsS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQzNCLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQW9CLENBQUMsQ0FBQyxNQUFNLENBQzlELENBQUMsS0FBbUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ3BELE1BQU0sUUFBUSxHQUFJLElBQTBCLENBQUMsTUFBTSxDQUNqRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUNoQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNO1FBQ3BELE1BQU0sSUFBSSxhQUFhLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNsRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDdEMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksYUFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDN0UsT0FBTztRQUNMLEVBQUUsRUFBRSxNQUFNO1FBQ1YsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0tBQ3JDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQVksRUFBRSxXQUFXLEdBQUcsS0FBSztJQUMzRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFJLEtBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVztRQUMxQixNQUFNLElBQUksYUFBYSxDQUNyQixFQUFFLENBQUMsdURBQXVELEVBQUUsTUFBTSxDQUFDLENBQ3BFLENBQUM7SUFDSixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwiZmlsZSI6ImlkZW50aXR5L3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREJLZXlzIH0gZnJvbSBcIi4uL21vZGVsL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdXRpbHNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbEtleXMsIHNmIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L2Vycm9yc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBmb3IgYSB7QGxpbmsgTW9kZWx9XG4gKiBAZGVzY3JpcHRpb24gc2VhcmNoZXMgaW4gYWxsIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBvYmplY3QgZm9yIGFuIHtAbGluayBpZH0gZGVjb3JhdGVkIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtNb2RlbH0gbW9kZWxcbiAqXG4gKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBpZiBubyBwcm9wZXJ0eSBvciBtb3JlIHRoYW4gb25lIHByb3BlcnRpZXMgYXJlIHtAbGluayBpZH0gZGVjb3JhdGVkXG4gKiBvciBubyB2YWx1ZSBpcyBzZXQgaW4gdGhhdCBwcm9wZXJ0eVxuICpcbiAqIEBmdW5jdGlvbiBmaW5kUHJpbWFyeUtleVxuICpcbiAqIEBjYXRlZ29yeSBtYW5hZ2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFByaW1hcnlLZXk8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCkge1xuICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgIG1vZGVsLFxuICAgIHVuZGVmaW5lZCxcbiAgICBEQktleXMuUkVGTEVDVCArIERCS2V5cy5JRFxuICApO1xuICBjb25zdCBpZERlY29yYXRvcnMgPSBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JzIGFzIG9iamVjdCkucmVkdWNlKFxuICAgIChhY2N1bTogeyBbaW5kZXhlcjogc3RyaW5nXTogYW55W10gfSwgW3Byb3AsIGRlY3NdKSA9PiB7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IChkZWNzIGFzIHsga2V5OiBzdHJpbmcgfVtdKS5maWx0ZXIoXG4gICAgICAgIChkKSA9PiBkLmtleSAhPT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICk7XG4gICAgICBpZiAoZmlsdGVyZWQgJiYgZmlsdGVyZWQubGVuZ3RoKSB7XG4gICAgICAgIGFjY3VtW3Byb3BdID0gYWNjdW1bcHJvcF0gfHwgW107XG4gICAgICAgIGFjY3VtW3Byb3BdLnB1c2goLi4uZmlsdGVyZWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sXG4gICAge31cbiAgKTtcblxuICBpZiAoIWlkRGVjb3JhdG9ycyB8fCAhT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJDb3VsZCBub3QgZmluZCBJRCBkZWNvcmF0ZWQgUHJvcGVydHlcIik7XG4gIGlmIChPYmplY3Qua2V5cyhpZERlY29yYXRvcnMpLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3Ioc2YoT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKS5qb2luKFwiLCBcIikpKTtcbiAgY29uc3QgaWRQcm9wID0gT2JqZWN0LmtleXMoaWREZWNvcmF0b3JzKVswXTtcbiAgaWYgKCFpZFByb3ApIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiQ291bGQgbm90IGZpbmQgSUQgZGVjb3JhdGVkIFByb3BlcnR5XCIpO1xuICByZXR1cm4ge1xuICAgIGlkOiBpZFByb3AsXG4gICAgcHJvcHM6IGlkRGVjb3JhdG9yc1tpZFByb3BdWzBdLnByb3BzLFxuICB9O1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHByaW1hcnkga2V5IHZhbHVlIGZvciBhIHtAbGluayBNb2RlbH1cbiAqIEBkZXNjcmlwdGlvbiBzZWFyY2hlcyBpbiBhbGwgdGhlIHByb3BlcnRpZXMgaW4gdGhlIG9iamVjdCBmb3IgYW4ge0BsaW5rIHBrfSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge01vZGVsfSBtb2RlbFxuICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuRW1wdHldXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByaW1hcnkga2V5XG4gKlxuICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gaWYgbm8gcHJvcGVydHkgb3IgbW9yZSB0aGFuIG9uZSBwcm9wZXJ0aWVzIGFyZSB7QGxpbmsgcGt9IGRlY29yYXRlZFxuICogQHRocm93cyB7Tm90Rm91bmRFcnJvcn0gcmV0dXJuRW1wdHkgaXMgZmFsc2UgYW5kIG5vIHZhbHVlIGlzIHNldCBvbiB0aGUge0BsaW5rIHBrfSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqXG4gKiBAZnVuY3Rpb24gZmluZE1vZGVsSURcbiAqXG4gKiBAY2F0ZWdvcnkgbWFuYWdlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRNb2RlbElkKG1vZGVsOiBNb2RlbCwgcmV0dXJuRW1wdHkgPSBmYWxzZSkge1xuICBjb25zdCBpZFByb3AgPSBmaW5kUHJpbWFyeUtleShtb2RlbCkuaWQ7XG4gIGNvbnN0IG1vZGVsSWQgPSAobW9kZWwgYXMgYW55KVtpZFByb3BdO1xuICBpZiAoIW1vZGVsSWQgJiYgIXJldHVybkVtcHR5KVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgc2YoXCJObyB2YWx1ZSBmb3IgdGhlIElkIGlzIGRlZmluZWQgdW5kZXIgdGhlIHByb3BlcnR5IHswfVwiLCBpZFByb3ApXG4gICAgKTtcbiAgcmV0dXJuIG1vZGVsSWQ7XG59XG4iXX0=