UNPKG

@decaf-ts/core

Version:

Core persistence module for the decaf framework

54 lines 2.19 kB
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