UNPKG

@decaf-ts/db-decorators

Version:

Agnostic database decorators and repository

87 lines (86 loc) 4.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Repository = void 0; const utils_1 = require("./utils.cjs"); const constants_1 = require("../operations/constants.cjs"); const errors_1 = require("./errors.cjs"); const BaseRepository_1 = require("./BaseRepository.cjs"); const constants_2 = require("../model/constants.cjs"); const Context_1 = require("./Context.cjs"); class Repository extends BaseRepository_1.BaseRepository { constructor(clazz) { super(clazz); } async createPrefix(model, ...args) { const contextArgs = await Context_1.Context.args(constants_1.OperationKeys.CREATE, this.class, args); model = new this.class(model); await (0, utils_1.enforceDBDecorators)(this, contextArgs.context, model, constants_1.OperationKeys.CREATE, constants_1.OperationKeys.ON); const errors = model.hasErrors(); if (errors) throw new errors_1.ValidationError(errors.toString()); return [model, ...contextArgs.args]; } async createAllPrefix(models, ...args) { const contextArgs = await Context_1.Context.args(constants_1.OperationKeys.CREATE, this.class, args); await Promise.all(models.map(async (m) => { m = new this.class(m); await (0, utils_1.enforceDBDecorators)(this, contextArgs.context, m, constants_1.OperationKeys.CREATE, constants_1.OperationKeys.ON); return m; })); const errors = models .map((m) => m.hasErrors()) .reduce((accum, e, i) => { if (e) accum = typeof accum === "string" ? accum + `\n - ${i}: ${e.toString()}` : ` - ${i}: ${e.toString()}`; return accum; }, undefined); if (errors) throw new errors_1.ValidationError(errors); return [models, ...contextArgs.args]; } async updatePrefix(model, ...args) { const contextArgs = await Context_1.Context.args(constants_1.OperationKeys.UPDATE, this.class, args); const pk = model[this.pk]; if (!pk) throw new errors_1.InternalError(`No value for the Id is defined under the property ${this.pk}`); const oldModel = await this.read(pk); model = this.merge(oldModel, model); await (0, utils_1.enforceDBDecorators)(this, contextArgs.context, model, constants_1.OperationKeys.UPDATE, constants_1.OperationKeys.ON, oldModel); const errors = model.hasErrors(oldModel); if (errors) throw new errors_1.ValidationError(errors.toString()); return [model, ...contextArgs.args]; } async updateAllPrefix(models, ...args) { const contextArgs = await Context_1.Context.args(constants_1.OperationKeys.UPDATE, this.class, args); const ids = models.map((m) => { const id = m[this.pk]; if (!id) throw new errors_1.InternalError(`No value for the Id is defined under the property ${this.pk}`); return id; }); const oldModels = await this.readAll(ids, ...contextArgs.args); models = models.map((m, i) => this.merge(oldModels[i], m)); await Promise.all(models.map((m, i) => (0, utils_1.enforceDBDecorators)(this, contextArgs.context, m, constants_1.OperationKeys.UPDATE, constants_1.OperationKeys.ON, oldModels[i]))); const errors = models .map((m, i) => m.hasErrors(oldModels[i], m)) .reduce((accum, e, i) => { if (e) accum = typeof accum === "string" ? accum + `\n - ${i}: ${e.toString()}` : ` - ${i}: ${e.toString()}`; return accum; }, undefined); if (errors) throw new errors_1.ValidationError(errors); return [models, ...contextArgs.args]; } static key(key) { return constants_2.DBKeys.REFLECT + key; } } exports.Repository = Repository;