UNPKG

@elsikora/nestjs-crud-automator

Version:

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

430 lines (425 loc) 32 kB
'use strict'; var executor_class = require('../../class/api/subscriber/executor.class.js'); var controller_constant = require('../../constant/decorator/api/controller.constant.js'); var function_constant = require('../../constant/decorator/api/function.constant.js'); require('../../enum/decorator/api/action.enum.js'); require('../../enum/decorator/api/authentication-type.enum.js'); require('../../enum/decorator/api/controller/load-relations-strategy.enum.js'); require('../../enum/decorator/api/controller/request-transformer-type.enum.js'); var dtoType_enum = require('../../enum/decorator/api/dto-type.enum.js'); 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'); var routeType_enum = require('../../enum/decorator/api/route-type.enum.js'); var common = require('@nestjs/common'); var swagger = require('@nestjs/swagger'); var applyDecorators_utility = require('../../utility/api/controller/apply-decorators.utility.js'); var applyMetadata_utility = require('../../utility/api/controller/apply-metadata.utility.js'); var transformFilter_utility = require('../../utility/api/controller/get-list/transform-filter.utility.js'); require('../../enum/filter-operation.enum.js'); require('typeorm/index'); var getPrimaryColumn_utility = require('../../utility/api/controller/get-primary-column.utility.js'); var handleRequestRelations_utility = require('../../utility/api/controller/handle-request-relations.utility.js'); var transformData_utility = require('../../utility/api/controller/transform-data.utility.js'); var validateRequest_utility = require('../../utility/api/controller/validate-request.utility.js'); var writeDtoSwagger_utility = require('../../utility/api/controller/write-dto-swagger.utility.js'); var writeMethod_utility = require('../../utility/api/controller/write-method.utility.js'); require('typeorm'); require('reflect-metadata'); var analize_utility = require('../../utility/dto/analize.utility.js'); require('../../constant/utility/dto/constant.js'); var errorException_utility = require('../../utility/error-exception.utility.js'); require('../../external/tslib/tslib.es6.js'); var classTransformer = require('class-transformer'); require('class-validator'); require('lodash/random'); require('../../validator/is-regular-expression.validator.js'); require('node:crypto'); require('../../validator/must-match-one-of-schemas.validator.js'); var generate_utility = require('../../utility/dto/generate.utility.js'); require('../../enum/filter-order-direction.enum.js'); require('../../validator/all-or-none-of-listed-properties.validator.js'); var generateEntityInformation_utility = require('../../utility/generate-entity-information.utility.js'); class ApiControllerFactory { target; properties; get targetPrototype() { return this.target.prototype; } ENTITY; constructor(target, properties) { this.target = target; this.properties = properties; this.ENTITY = generateEntityInformation_utility.GenerateEntityInformation(properties.entity); analize_utility.analyzeEntityMetadata(this.properties.entity); if (!this.ENTITY.primaryKey) { throw errorException_utility.ErrorException(`Primary key for entity ${this.properties.entity.name ?? "UnknownResource"} not found`); } common.Controller(this.properties.path ?? (this.properties.entity.name ? this.properties.entity.name.toLowerCase() : "UnknownResource"))(this.target); swagger.ApiTags(this.properties.name ?? this.properties.entity.name ?? "UnknownResource")(this.target); } createMethod(method) { if (!(method in this.properties.routes) || this.properties.routes[method]?.isEnabled !== false) { const routeConfig = this.properties.routes[method] ?? {}; const routeDecorators = routeConfig.decorators ?? []; const methodName = `${controller_constant.CONTROLLER_API_DECORATOR_CONSTANT.RESERVED_METHOD_PREFIX}${method}`; writeMethod_utility.ApiControllerWriteMethod(this, this.targetPrototype, method, this.properties, this.ENTITY); const targetMethod = this.targetPrototype[methodName]; applyMetadata_utility.ApiControllerApplyMetadata(this.target, this.targetPrototype, this.ENTITY, this.properties, method, methodName, routeConfig); if (this.properties.routes[method]?.shouldWriteToController !== false) { applyDecorators_utility.ApiControllerApplyDecorators(targetMethod, this.ENTITY, this.properties, method, methodName, routeConfig, routeDecorators); } writeDtoSwagger_utility.ApiControllerWriteDtoSwagger(this.target, this.ENTITY, this.properties, method, routeConfig, this.ENTITY); // Reflect.defineMetadata(PARAMTYPES_METADATA, [routeConfig.dto.request], this.target, methodNameOnController); // Reflect.defineMetadata(PATH_METADATA, `:${this.ENTITY.name}`, this.target, methodNameOnController); /* const dtoProperties: Record<string, unknown> = (Reflect.getMetadata(DECORATORS.API_MODEL_PROPERTIES, routeConfig.dto.request) || {}) as Record<string, unknown>; const dtoPropertiesArray: Array<unknown> = (Reflect.getMetadata(DECORATORS.API_MODEL_PROPERTIES_ARRAY, routeConfig.dto.request) || []) as Array<unknown>; Reflect.defineMetadata(DECORATORS.API_MODEL_PROPERTIES, dtoProperties, routeConfig.dto.request); Reflect.defineMetadata(DECORATORS.API_MODEL_PROPERTIES_ARRAY, dtoPropertiesArray, routeConfig.dto.request); */ } } init() { for (const method of Object.values(routeType_enum.EApiRouteType)) { this.createMethod(method); } } [routeType_enum.EApiRouteType.CREATE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (body, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, body, headers, ip }, ROUTE_TYPE: routeType_enum.EApiRouteType.CREATE, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.CREATE, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { body = beforeResult.body; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { const primaryKey = getPrimaryColumn_utility.ApiControllerGetPrimaryColumn(body, entityMetadata); if (!primaryKey) { await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.CREATE, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, { ...beforeExecutionContext, result: undefined }, new Error("Primary key not found in entity columns")); throw errorException_utility.ErrorException("Primary key not found in entity columns"); } transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { body }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, body); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, body); const createResponse = await this.service.create(body); const dto = generate_utility.DtoGenerate(properties.entity, entityMetadata, method, dtoType_enum.EApiDtoType.RESPONSE, properties.routes[method]?.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], properties.routes[method]?.authentication?.guard); const requestProperties = { relations: properties.routes[method]?.response?.relations, where: { [primaryKey.key]: createResponse[primaryKey.key] }, }; const response = await this.service.get(requestProperties); transformData_utility.ApiControllerTransformData(properties.routes[method]?.response?.transformers, properties, { response }, { authenticationRequest, headers, ip }); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip }, ENTITY: response, result: response, ROUTE_TYPE: routeType_enum.EApiRouteType.CREATE, }; const afterResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, response, routeType_enum.EApiRouteType.CREATE, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); const finalResponse = afterResult ?? response; return classTransformer.plainToInstance(dto, finalResponse, { /* eslint-disable-next-line @elsikora/typescript/naming-convention */ excludeExtraneousValues: true, strategy: "excludeAll", }); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.CREATE, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.CREATE, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } [routeType_enum.EApiRouteType.DELETE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, headers, ip, parameters }, ROUTE_TYPE: routeType_enum.EApiRouteType.DELETE, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.DELETE, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { parameters = beforeResult.parameters; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { const primaryKey = getPrimaryColumn_utility.ApiControllerGetPrimaryColumn(parameters, entityMetadata); if (!primaryKey) { await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.DELETE, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, { ...beforeExecutionContext, result: undefined }, new Error("Primary key not found in entity columns")); throw errorException_utility.ErrorException("Primary key not found in entity columns"); } transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { parameters }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, parameters); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, parameters); const requestCriteria = { [primaryKey.key]: primaryKey.value, }; await this.service.delete(requestCriteria); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, parameters }, ENTITY: entityInstance, result: parameters, ROUTE_TYPE: routeType_enum.EApiRouteType.DELETE, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.DELETE, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, parameters }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.DELETE, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.DELETE, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } [routeType_enum.EApiRouteType.GET](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, headers, ip, parameters }, ROUTE_TYPE: routeType_enum.EApiRouteType.GET, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { parameters = beforeResult.parameters; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { const primaryKey = getPrimaryColumn_utility.ApiControllerGetPrimaryColumn(parameters, entityMetadata); if (!primaryKey) { await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, { ...beforeExecutionContext, result: undefined }, new Error("Primary key not found in entity columns")); throw errorException_utility.ErrorException("Primary key not found in entity columns"); } transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { parameters }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, parameters); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, parameters); const requestProperties = { relations: properties.routes[method]?.response?.relations, where: { [primaryKey.key]: primaryKey.value }, }; const response = await this.service.get(requestProperties); transformData_utility.ApiControllerTransformData(properties.routes[method]?.response?.transformers, properties, { response }, { authenticationRequest, headers, ip }); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, parameters }, ENTITY: response, result: response, ROUTE_TYPE: routeType_enum.EApiRouteType.GET, }; const afterResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, response, routeType_enum.EApiRouteType.GET, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); const finalResponse = afterResult ?? response; const dto = generate_utility.DtoGenerate(properties.entity, entityMetadata, method, dtoType_enum.EApiDtoType.RESPONSE, properties.routes[method]?.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], properties.routes[method]?.authentication?.guard); return classTransformer.plainToInstance(dto, finalResponse, { /* eslint-disable-next-line @elsikora/typescript/naming-convention */ excludeExtraneousValues: true, }); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, parameters }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.GET, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } [routeType_enum.EApiRouteType.GET_LIST](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (query, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, headers, ip, query }, ROUTE_TYPE: routeType_enum.EApiRouteType.GET_LIST, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET_LIST, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { query = beforeResult.query; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { query }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, query); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, query); const { limit, orderBy, orderDirection, page, ...getListQuery } = query; const filter = transformFilter_utility.ApiControllerGetListTransformFilter(getListQuery, entityMetadata); const requestProperties = { relations: properties.routes[method]?.response?.relations, skip: query.limit * (query.page - 1), take: query.limit, where: filter, }; if (orderBy) { requestProperties.order = { [orderBy]: orderDirection ?? function_constant.FUNCTION_API_DECORATOR_CONSTANT.DEFAULT_FILTER_ORDER_BY_DIRECTION }; } const response = await this.service.getList(requestProperties); transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { response }, { authenticationRequest, headers, ip }); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, query }, ENTITY: entityInstance, result: response, ROUTE_TYPE: routeType_enum.EApiRouteType.GET_LIST, }; const afterResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET_LIST, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); const finalResponse = afterResult ?? response; const dto = generate_utility.DtoGenerate(properties.entity, entityMetadata, method, dtoType_enum.EApiDtoType.RESPONSE, properties.routes[method]?.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], properties.routes[method]?.authentication?.guard); return classTransformer.plainToInstance(dto, finalResponse, { // eslint-disable-next-line @elsikora/typescript/naming-convention excludeExtraneousValues: true, }); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, headers, ip, query }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.GET_LIST, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.GET_LIST, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } [routeType_enum.EApiRouteType.PARTIAL_UPDATE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, body, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, body, headers, ip, parameters }, ROUTE_TYPE: routeType_enum.EApiRouteType.PARTIAL_UPDATE, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.PARTIAL_UPDATE, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { parameters = beforeResult.parameters; body = beforeResult.body; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { const primaryKey = getPrimaryColumn_utility.ApiControllerGetPrimaryColumn(parameters, entityMetadata); if (!primaryKey) { await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.PARTIAL_UPDATE, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, { ...beforeExecutionContext, result: undefined }, new Error("Primary key not found in entity columns")); throw errorException_utility.ErrorException("Primary key not found in entity columns"); } transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { body, parameters }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, parameters); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, parameters); const requestCriteria = { [primaryKey.key]: primaryKey.value, }; const response = await this.service.update(requestCriteria, body); transformData_utility.ApiControllerTransformData(properties.routes[method]?.response?.transformers, properties, { response }, { authenticationRequest, headers, ip }); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip, parameters }, ENTITY: response, result: response, ROUTE_TYPE: routeType_enum.EApiRouteType.PARTIAL_UPDATE, }; const afterResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, response, routeType_enum.EApiRouteType.PARTIAL_UPDATE, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); const finalResponse = afterResult ?? response; const dto = generate_utility.DtoGenerate(properties.entity, entityMetadata, method, dtoType_enum.EApiDtoType.RESPONSE, properties.routes[method]?.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], properties.routes[method]?.authentication?.guard); return classTransformer.plainToInstance(dto, finalResponse, { // eslint-disable-next-line @elsikora/typescript/naming-convention excludeExtraneousValues: true, }); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip, parameters }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.PARTIAL_UPDATE, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.PARTIAL_UPDATE, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } [routeType_enum.EApiRouteType.UPDATE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, body, headers, ip, authenticationRequest) { const entityInstance = new properties.entity(); const beforeExecutionContext = { DATA: { entityMetadata, method, methodName, properties }, ENTITY: entityInstance, result: { authenticationRequest, body, headers, ip, parameters }, ROUTE_TYPE: routeType_enum.EApiRouteType.UPDATE, }; const beforeResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.UPDATE, onType_enum.EApiSubscriberOnType.BEFORE, beforeExecutionContext); if (beforeResult) { parameters = beforeResult.parameters; body = beforeResult.body; headers = beforeResult.headers; ip = beforeResult.ip; authenticationRequest = beforeResult.authenticationRequest; } try { const primaryKey = getPrimaryColumn_utility.ApiControllerGetPrimaryColumn(parameters, entityMetadata); if (!primaryKey) { await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.UPDATE, onType_enum.EApiSubscriberOnType.BEFORE_ERROR, { ...beforeExecutionContext, result: undefined }, new Error("Primary key not found in entity columns")); throw errorException_utility.ErrorException("Primary key not found in entity columns"); } transformData_utility.ApiControllerTransformData(properties.routes[method]?.request?.transformers, properties, { body, parameters }, { authenticationRequest, headers, ip }); await validateRequest_utility.ApiControllerValidateRequest(properties.routes[method]?.request?.validators, properties, parameters); await handleRequestRelations_utility.ApiControllerHandleRequestRelations(this, properties, properties.routes[method]?.request?.relations, parameters); const requestCriteria = { [primaryKey.key]: primaryKey.value, }; const response = await this.service.update(requestCriteria, body); transformData_utility.ApiControllerTransformData(properties.routes[method]?.response?.transformers, properties, { response }, { authenticationRequest, headers, ip }); const afterExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip, parameters }, ENTITY: response, result: response, ROUTE_TYPE: routeType_enum.EApiRouteType.UPDATE, }; const afterResult = await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, response, routeType_enum.EApiRouteType.UPDATE, onType_enum.EApiSubscriberOnType.AFTER, afterExecutionContext); const finalResponse = afterResult ?? response; const dto = generate_utility.DtoGenerate(properties.entity, entityMetadata, method, dtoType_enum.EApiDtoType.RESPONSE, properties.routes[method]?.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], properties.routes[method]?.authentication?.guard); return classTransformer.plainToInstance(dto, finalResponse, { // eslint-disable-next-line @elsikora/typescript/naming-convention excludeExtraneousValues: true, }); } catch (error) { const errorExecutionContext = { DATA: { ...beforeExecutionContext.DATA, authenticationRequest, body, headers, ip, parameters }, ENTITY: entityInstance, ROUTE_TYPE: routeType_enum.EApiRouteType.UPDATE, }; await executor_class.ApiSubscriberExecutor.executeRouteSubscribers(this.constructor, entityInstance, routeType_enum.EApiRouteType.UPDATE, onType_enum.EApiSubscriberOnType.AFTER_ERROR, errorExecutionContext, error); throw error; } }, "name", { value: methodName }); } } exports.ApiControllerFactory = ApiControllerFactory; //# sourceMappingURL=controller.factory.js.map