@decaf-ts/core
Version:
Core persistence module for the decaf framework
54 lines • 2.19 kB
JavaScript
import { apply, metadata, Metadata } from "@decaf-ts/decoration";
import { inject, injectable } from "@decaf-ts/injectable-decorators";
import { PersistenceKeys } from "./../persistence/index.js";
import { isOperationBlocked } from "./utils.js";
import { OperationKeys } from "@decaf-ts/db-decorators";
function OperationGuard(op) {
return function (target, _propertyKey, descriptor) {
const original = descriptor.value;
descriptor.value = function (...args) {
const ModelConstr = this.class;
if (ModelConstr && isOperationBlocked(ModelConstr, op)) {
const name = ModelConstr?.name ?? "Model";
throw new Error(`Operation "${op}" is blocked by @BlockOperations for ${name}.`);
}
return original.apply(this, args);
};
return descriptor;
};
}
export const create = () => OperationGuard(OperationKeys.CREATE);
export const read = () => OperationGuard(OperationKeys.READ);
export const update = () => OperationGuard(OperationKeys.UPDATE);
export const del = () => OperationGuard(OperationKeys.DELETE);
export function service(key) {
key =
typeof key === "string"
? key
: Metadata.Symbol(key).toString();
return function service(target, prop, descriptor) {
Metadata.set(PersistenceKeys.SERVICE, key, target);
const decs = [];
if (descriptor && typeof descriptor.value === "number") {
decs.push(inject(key));
}
else if (!descriptor && !prop) {
decs.push(injectable(key, {
callback: (inst) => Object.defineProperty(inst, "name", {
enumerable: true,
configurable: false,
writable: false,
value: key,
}),
}));
}
else if (!descriptor) {
decs.push(inject(key));
}
else
throw new Error("Invalid decorator usage. Should be impossible");
decs.push(metadata(PersistenceKeys.SERVICE, key));
return apply(...decs)(target, prop, descriptor);
};
}
//# sourceMappingURL=decorators.js.map