UNPKG

@decaf-ts/db-decorators

Version:

Agnostic database decorators and repository

100 lines 12.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Operations = void 0; const decorator_validation_1 = require("@decaf-ts/decorator-validation"); const OperationsRegistry_1 = require("./OperationsRegistry.cjs"); const constants_1 = require("./constants.cjs"); /** * @description Static utility class for database operation management * @summary Provides functionality for registering, retrieving, and managing database operation handlers * @class Operations * @template M - Model type * @template R - Repository type * @template V - Metadata type * @template F - Repository flags * @template C - Context type * @example * // Register a handler for a create operation * Operations.register(myHandler, OperationKeys.CREATE, targetModel, 'propertyName'); * * // Get handlers for a specific operation * const handlers = Operations.get(targetModel.constructor.name, 'propertyName', 'onCreate'); * * @mermaid * classDiagram * class Operations { * -registry: OperationsRegistry * +getHandlerName(handler) * +key(str) * +get(targetName, propKey, operation) * -getOpRegistry() * +register(handler, operation, target, propKey) * } * Operations --> OperationsRegistry : uses */ class Operations { constructor() { } /** * @description Gets a unique name for an operation handler * @summary Returns the name of the handler function or generates a hash if name is not available * @param {OperationHandler<any, any, any, any, any>} handler - The handler function to get the name for * @return {string} The name of the handler or a generated hash */ static getHandlerName(handler) { if (handler.name) return handler.name; console.warn("Handler name not defined. A name will be generated, but this is not desirable. please avoid using anonymous functions"); return decorator_validation_1.Hashing.hash(handler.toString()); } /** * @description Generates a reflection metadata key * @summary Creates a fully qualified metadata key by prefixing with the reflection namespace * @param {string} str - The operation key string to prefix * @return {string} The fully qualified metadata key */ static key(str) { return constants_1.OperationKeys.REFLECT + str; } /** * @description Retrieves operation handlers for a specific target and operation * @summary Gets registered handlers from the operations registry for a given target, property, and operation * @template M - Model type extending Model * @template R - Repository type extending IRepository * @template V - Metadata type, defaults to object * @template F - Repository flags extending RepositoryFlags * @template C - Context type extending Context<F> * @param {string | Record<string, any>} targetName - The target class name or object * @param {string} propKey - The property key to get handlers for * @param {string} operation - The operation key to get handlers for * @return {any} The registered handlers for the specified target, property, and operation */ static get(targetName, propKey, operation) { return Operations.registry.get(targetName, propKey, operation); } /** * @description Gets or initializes the operations registry * @summary Returns the existing registry or creates a new one if it doesn't exist * @return {OperationsRegistry} The operations registry instance * @private */ static getOpRegistry() { if (!Operations.registry) Operations.registry = new OperationsRegistry_1.OperationsRegistry(); return Operations.registry; } /** * @description Registers an operation handler for a specific target and operation * @summary Adds a handler to the operations registry for a given target, property, and operation * @template V - Model type extending Model * @param {OperationHandler<V, any, any>} handler - The handler function to register * @param {OperationKeys} operation - The operation key to register the handler for * @param {V} target - The target model instance * @param {string | symbol} propKey - The property key to register the handler for * @return {void} */ static register(handler, operation, target, propKey) { Operations.getOpRegistry().register(handler, operation, target, propKey); } } exports.Operations = Operations; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVyYXRpb25zL09wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQWdFO0FBRWhFLGlFQUEwRDtBQUMxRCwrQ0FBNEM7QUFLNUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQWEsVUFBVTtJQUdyQixnQkFBdUIsQ0FBQztJQUV4Qjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBa0Q7UUFDdEUsSUFBSSxPQUFPLENBQUMsSUFBSTtZQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztRQUV0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHVIQUF1SCxDQUN4SCxDQUFDO1FBQ0YsT0FBTyw4QkFBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyx5QkFBYSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxHQUFHLENBT1IsVUFBd0MsRUFDeEMsT0FBZSxFQUNmLFNBQWlCO1FBRWpCLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQzVCLFVBQVUsRUFDVixPQUFPLEVBQ1AsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxNQUFNLENBQUMsYUFBYTtRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVE7WUFBRSxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksdUNBQWtCLEVBQUUsQ0FBQztRQUN6RSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQ2IsT0FBc0MsRUFDdEMsU0FBd0IsRUFDeEIsTUFBUyxFQUNULE9BQXdCO1FBRXhCLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQ2pDLE9BQWMsRUFDZCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBL0ZELGdDQStGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhhc2hpbmcsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgT3BlcmF0aW9uSGFuZGxlciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25zUmVnaXN0cnkgfSBmcm9tIFwiLi9PcGVyYXRpb25zUmVnaXN0cnlcIjtcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IElSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeVwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeUZsYWdzIH0gZnJvbSBcIi4uL3JlcG9zaXRvcnkvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RhdGljIHV0aWxpdHkgY2xhc3MgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbiBtYW5hZ2VtZW50XG4gKiBAc3VtbWFyeSBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZywgcmV0cmlldmluZywgYW5kIG1hbmFnaW5nIGRhdGFiYXNlIG9wZXJhdGlvbiBoYW5kbGVyc1xuICogQGNsYXNzIE9wZXJhdGlvbnNcbiAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZVxuICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGVcbiAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZVxuICogQHRlbXBsYXRlIEYgLSBSZXBvc2l0b3J5IGZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIENvbnRleHQgdHlwZVxuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgYSBjcmVhdGUgb3BlcmF0aW9uXG4gKiBPcGVyYXRpb25zLnJlZ2lzdGVyKG15SGFuZGxlciwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIHRhcmdldE1vZGVsLCAncHJvcGVydHlOYW1lJyk7XG4gKiBcbiAqIC8vIEdldCBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb25cbiAqIGNvbnN0IGhhbmRsZXJzID0gT3BlcmF0aW9ucy5nZXQodGFyZ2V0TW9kZWwuY29uc3RydWN0b3IubmFtZSwgJ3Byb3BlcnR5TmFtZScsICdvbkNyZWF0ZScpO1xuICogXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIE9wZXJhdGlvbnMge1xuICogICAgIC1yZWdpc3RyeTogT3BlcmF0aW9uc1JlZ2lzdHJ5XG4gKiAgICAgK2dldEhhbmRsZXJOYW1lKGhhbmRsZXIpXG4gKiAgICAgK2tleShzdHIpXG4gKiAgICAgK2dldCh0YXJnZXROYW1lLCBwcm9wS2V5LCBvcGVyYXRpb24pXG4gKiAgICAgLWdldE9wUmVnaXN0cnkoKVxuICogICAgICtyZWdpc3RlcihoYW5kbGVyLCBvcGVyYXRpb24sIHRhcmdldCwgcHJvcEtleSlcbiAqICAgfVxuICogICBPcGVyYXRpb25zIC0tPiBPcGVyYXRpb25zUmVnaXN0cnkgOiB1c2VzXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25zIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVnaXN0cnk6IE9wZXJhdGlvbnNSZWdpc3RyeTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSB1bmlxdWUgbmFtZSBmb3IgYW4gb3BlcmF0aW9uIGhhbmRsZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlciBmdW5jdGlvbiBvciBnZW5lcmF0ZXMgYSBoYXNoIGlmIG5hbWUgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuYW1lIGZvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyIG9yIGEgZ2VuZXJhdGVkIGhhc2hcbiAgICovXG4gIHN0YXRpYyBnZXRIYW5kbGVyTmFtZShoYW5kbGVyOiBPcGVyYXRpb25IYW5kbGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55Pikge1xuICAgIGlmIChoYW5kbGVyLm5hbWUpIHJldHVybiBoYW5kbGVyLm5hbWU7XG5cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkhhbmRsZXIgbmFtZSBub3QgZGVmaW5lZC4gQSBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkLCBidXQgdGhpcyBpcyBub3QgZGVzaXJhYmxlLiBwbGVhc2UgYXZvaWQgdXNpbmcgYW5vbnltb3VzIGZ1bmN0aW9uc1wiXG4gICAgKTtcbiAgICByZXR1cm4gSGFzaGluZy5oYXNoKGhhbmRsZXIudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5XG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgbWV0YWRhdGEga2V5IGJ5IHByZWZpeGluZyB3aXRoIHRoZSByZWZsZWN0aW9uIG5hbWVzcGFjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIG9wZXJhdGlvbiBrZXkgc3RyaW5nIHRvIHByZWZpeFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxseSBxdWFsaWZpZWQgbWV0YWRhdGEga2V5XG4gICAqL1xuICBzdGF0aWMga2V5KHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIE9wZXJhdGlvbktleXMuUkVGTEVDVCArIHN0cjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9wZXJhdGlvbiBoYW5kbGVycyBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgYW5kIG9wZXJhdGlvblxuICAgKiBAc3VtbWFyeSBHZXRzIHJlZ2lzdGVyZWQgaGFuZGxlcnMgZnJvbSB0aGUgb3BlcmF0aW9ucyByZWdpc3RyeSBmb3IgYSBnaXZlbiB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gTW9kZWwgdHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFIgLSBSZXBvc2l0b3J5IHR5cGUgZXh0ZW5kaW5nIElSZXBvc2l0b3J5XG4gICAqIEB0ZW1wbGF0ZSBWIC0gTWV0YWRhdGEgdHlwZSwgZGVmYXVsdHMgdG8gb2JqZWN0XG4gICAqIEB0ZW1wbGF0ZSBGIC0gUmVwb3NpdG9yeSBmbGFncyBleHRlbmRpbmcgUmVwb3NpdG9yeUZsYWdzXG4gICAqIEB0ZW1wbGF0ZSBDIC0gQ29udGV4dCB0eXBlIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55Pn0gdGFyZ2V0TmFtZSAtIFRoZSB0YXJnZXQgY2xhc3MgbmFtZSBvciBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BLZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIGdldCBoYW5kbGVycyBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24ga2V5IHRvIGdldCBoYW5kbGVycyBmb3JcbiAgICogQHJldHVybiB7YW55fSBUaGUgcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQsIHByb3BlcnR5LCBhbmQgb3BlcmF0aW9uXG4gICAqL1xuICBzdGF0aWMgZ2V0PFxuICAgIE0gZXh0ZW5kcyBNb2RlbCxcbiAgICBSIGV4dGVuZHMgSVJlcG9zaXRvcnk8TSwgRiwgQz4sXG4gICAgViA9IG9iamVjdCxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPihcbiAgICB0YXJnZXROYW1lOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BLZXk6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gT3BlcmF0aW9ucy5yZWdpc3RyeS5nZXQ8TSwgUiwgViwgRiwgQz4oXG4gICAgICB0YXJnZXROYW1lLFxuICAgICAgcHJvcEtleSxcbiAgICAgIG9wZXJhdGlvblxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgb3IgaW5pdGlhbGl6ZXMgdGhlIG9wZXJhdGlvbnMgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZXhpc3RpbmcgcmVnaXN0cnkgb3IgY3JlYXRlcyBhIG5ldyBvbmUgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgKiBAcmV0dXJuIHtPcGVyYXRpb25zUmVnaXN0cnl9IFRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPcFJlZ2lzdHJ5KCkge1xuICAgIGlmICghT3BlcmF0aW9ucy5yZWdpc3RyeSkgT3BlcmF0aW9ucy5yZWdpc3RyeSA9IG5ldyBPcGVyYXRpb25zUmVnaXN0cnkoKTtcbiAgICByZXR1cm4gT3BlcmF0aW9ucy5yZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIGZvciBhIHNwZWNpZmljIHRhcmdldCBhbmQgb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSBoYW5kbGVyIHRvIHRoZSBvcGVyYXRpb25zIHJlZ2lzdHJ5IGZvciBhIGdpdmVuIHRhcmdldCwgcHJvcGVydHksIGFuZCBvcGVyYXRpb25cbiAgICogQHRlbXBsYXRlIFYgLSBNb2RlbCB0eXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbkhhbmRsZXI8ViwgYW55LCBhbnk+fSBoYW5kbGVyIC0gVGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHBhcmFtIHtWfSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG1vZGVsIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wS2V5IC0gVGhlIHByb3BlcnR5IGtleSB0byByZWdpc3RlciB0aGUgaGFuZGxlciBmb3JcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxWIGV4dGVuZHMgTW9kZWw+KFxuICAgIGhhbmRsZXI6IE9wZXJhdGlvbkhhbmRsZXI8ViwgYW55LCBhbnk+LFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICB0YXJnZXQ6IFYsXG4gICAgcHJvcEtleTogc3RyaW5nIHwgc3ltYm9sXG4gICkge1xuICAgIE9wZXJhdGlvbnMuZ2V0T3BSZWdpc3RyeSgpLnJlZ2lzdGVyKFxuICAgICAgaGFuZGxlciBhcyBhbnksXG4gICAgICBvcGVyYXRpb24sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wS2V5XG4gICAgKTtcbiAgfVxufVxuIl19