@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
98 lines (94 loc) • 6.13 kB
JavaScript
'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