UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

98 lines (94 loc) 6.13 kB
'use strict'; var contextStorage_class = require('./context-storage.class.js'); var serviceContext_factory_class = require('./service-context.factory.class.js'); var executor_class = require('../subscriber/executor.class.js'); require('../../../enum/decorator/api/action.enum.js'); require('../../../enum/decorator/api/authentication-type.enum.js'); require('../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js'); require('../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js'); require('../../../enum/decorator/api/controller/relation-reference-shape.enum.js'); require('../../../enum/decorator/api/controller/request/target.enum.js'); require('../../../enum/decorator/api/controller/request/transformer-type.enum.js'); require('../../../enum/decorator/api/controller/response-target.enum.js'); require('../../../enum/decorator/api/dto-type.enum.js'); require('../../../enum/decorator/api/function/context-storage-kind.enum.js'); require('../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js'); require('../../../enum/decorator/api/function/transaction/event-status.enum.js'); require('../../../enum/decorator/api/function/transaction/failure-stage.enum.js'); require('../../../enum/decorator/api/function/transaction/mode.enum.js'); require('../../../enum/decorator/api/function/transaction/outcome.enum.js'); require('../../../enum/decorator/api/function/transaction/owner-kind.enum.js'); require('../../../enum/decorator/api/function/transaction/trace-type.enum.js'); var type_enum = require('../../../enum/decorator/api/function/type.enum.js'); var onType_enum = require('../../../enum/decorator/api/on-type.enum.js'); require('../../../enum/decorator/api/property/data-type.enum.js'); require('../../../enum/decorator/api/property/date/identifier.enum.js'); require('../../../enum/decorator/api/property/date/type.enum.js'); require('../../../enum/decorator/api/property/desribe-type.enum.js'); require('../../../enum/decorator/api/property/number-type.enum.js'); require('../../../enum/decorator/api/property/string-type.enum.js'); require('../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js'); require('../../../enum/decorator/api/route/type.enum.js'); var functionTransaction_utility = require('../../../utility/api/function-transaction.utility.js'); class ApiFunctionCustomRuntime { static async execute(options) { return await functionTransaction_utility.ApiFunctionExecuteWithTransaction({ action: options.properties.action, callback: async (eventManager) => await ApiFunctionCustomRuntime.executeWithEventManager({ ...options, eventManager }), entity: options.properties.entity, functionType: type_enum.EApiFunctionType.CUSTOM, label: "ApiFunctionCustom", methodName: options.methodName ?? (options.originalMethod.name || "anonymous"), mode: options.transactionMode, onPreflightError: async (eventManager, error) => { await ApiFunctionCustomRuntime.executeErrorSubscribers(options, eventManager, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, error); }, repository: options.target.repository, serviceConstructor: options.target.constructor, }); } static async executeErrorSubscribers(options, eventManager, onType, error) { const entityInstance = new options.properties.entity(); const errorExecutionContext = { action: options.properties.action, DATA: { eventManager, repository: options.target.repository }, ENTITY: entityInstance, FUNCTION_TYPE: type_enum.EApiFunctionType.CUSTOM, }; await executor_class.ApiSubscriberExecutor.executeFunctionErrorSubscribers(options.target.constructor, entityInstance, type_enum.EApiFunctionType.CUSTOM, onType, errorExecutionContext, error, options.properties.action); } static async executeWithEventManager(options) { const entityInstance = new options.properties.entity(); const context = serviceContext_factory_class.ApiFunctionServiceContextFactory.create({ entity: options.properties.entity, eventManager: options.eventManager, target: options.target, }); const executionContext = { action: options.properties.action, DATA: { eventManager: options.eventManager, repository: options.target.repository }, ENTITY: entityInstance, FUNCTION_TYPE: type_enum.EApiFunctionType.CUSTOM, result: options.functionArguments, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeFunctionBeforeSubscribers(options.target.constructor, entityInstance, type_enum.EApiFunctionType.CUSTOM, executionContext, options.properties.action); const finalArguments = beforeResult ?? options.functionArguments; try { const result = await contextStorage_class.ApiFunctionContextStorage.run(context, async () => await options.originalMethod.apply(options.target, finalArguments)); const afterExecutionContext = { action: options.properties.action, DATA: { eventManager: options.eventManager, repository: options.target.repository }, ENTITY: entityInstance, FUNCTION_TYPE: type_enum.EApiFunctionType.CUSTOM, result, }; return (await executor_class.ApiSubscriberExecutor.executeFunctionSubscribers(options.target.constructor, entityInstance, type_enum.EApiFunctionType.CUSTOM, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext, options.properties.action)) ?? result; } catch (error) { await ApiFunctionCustomRuntime.executeErrorSubscribers(options, options.eventManager, onType_enum.EApiSubscriberOnType.AFTER_ERROR, error); throw error; } } } exports.ApiFunctionCustomRuntime = ApiFunctionCustomRuntime; //# sourceMappingURL=custom-runtime.class.js.map