@decaf-ts/core
Version:
Core persistence module for the decaf framework
60 lines • 2.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.repository = repository;
const injectable_decorators_1 = require("@decaf-ts/injectable-decorators");
const db_decorators_1 = require("@decaf-ts/db-decorators");
const decorator_validation_1 = require("@decaf-ts/decorator-validation");
const Repository_1 = require("./Repository.cjs");
const persistence_1 = require("./../persistence/index.cjs");
const decoration_1 = require("@decaf-ts/decoration");
/**
* @description Repository decorator for model classes.
* @summary Creates and registers a repository for a model class. Can be used as both a property decorator and a class decorator.
* @template T - The model type that extends Model.
* @param {Constructor<T>} model - The constructor of the model class.
* @param {string} [flavour] - the required adapter's flavour/alias. If not provided, it will be retrieved from the model metadata..
* @return {any} - The decorator function.
* @function repository
* @mermaid
* sequenceDiagram
* participant C as Client Code
* participant D as Decorator
* participant R as Repository
* participant M as Metadata
*
* C->>D: Apply @repository(Model)
* alt Property Decorator
* D->>D: Check if propertyKey exists
* D->>+C: Return inject(name) decorator
* else Class Decorator
* D->>M: Set repository metadata on model
* D->>R: Register model with Repository
* D->>+C: Return injectable decorator with config
* C->>C: Define DBKeys.CLASS property
* end
* @category Decorators
*/
function repository(model, flavour) {
return ((original, propertyKey) => {
if (propertyKey) {
return (0, injectable_decorators_1.inject)(decoration_1.Metadata.constr(model))(original, propertyKey);
}
decoration_1.Metadata.set(db_decorators_1.DBKeys.REPOSITORY, decoration_1.Metadata.key(flavour || persistence_1.Adapter.currentFlavour, decorator_validation_1.Model.tableName(model)), original);
(0, decoration_1.metadata)(db_decorators_1.DBKeys.REPOSITORY, original.name)(model);
flavour =
flavour || decoration_1.Metadata.get(original.constructor, persistence_1.PersistenceKeys.ADAPTER);
Repository_1.Repository.register(decoration_1.Metadata.constr(model), original, flavour);
return (0, injectable_decorators_1.injectable)(decoration_1.Metadata.constr(model), {
callback: (instance) => {
Object.defineProperty(instance, db_decorators_1.DBKeys.CLASS, {
enumerable: false,
configurable: false,
writable: false,
value: model,
});
return instance;
},
})(original);
});
}
//# sourceMappingURL=decorators.js.map