@decaf-ts/db-decorators
Version:
Agnostic database decorators and repository
87 lines (86 loc) • 4.05 kB
JavaScript
;
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;