UNPKG

@elsikora/nestjs-crud-automator

Version:

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

162 lines (158 loc) 11.2 kB
'use strict'; var planCompiler_class = require('../class/api/controller/get-list/query/plan-compiler.class.js'); require('../constant/filter/operator-registry.constant.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'); require('../enum/decorator/api/function/type.enum.js'); 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'); var type_enum = require('../enum/decorator/api/route/type.enum.js'); require('../enum/filter/operand.enum.js'); require('../enum/filter/operation.enum.js'); require('../enum/filter/order-direction.enum.js'); var common = require('@nestjs/common'); var routeRuntime_class = require('../class/api/route-runtime.class.js'); var controller_constant = require('../constant/decorator/api/controller.constant.js'); require('../constant/decorator/api/function.constant.js'); var swagger = require('@nestjs/swagger'); var decorators_utility = require('../utility/api/controller/apply/decorators.utility.js'); var metadata_utility = require('../utility/api/controller/apply/metadata.utility.js'); require('../constant/utility/dto/constant.js'); var exception_utility = require('../utility/error/exception.utility.js'); require('../enum/utility/manual-dto-property-metadata-decorator.enum.js'); require('class-transformer'); require('class-validator'); var generateEntityInformation_utility = require('../utility/generate-entity-information.utility.js'); require('../external/tslib/tslib.es6.js'); require('lodash/random.js'); require('@nestjs/swagger/dist/constants.js'); require('../validator/must-match-one-of-schemas.validator.js'); require('../constant/interface/api/property/default-string-format.constant.js'); require('typeorm'); require('reflect-metadata'); require('../validator/all-or-none-of-listed-properties.validator.js'); require('../validator/has/paired-custom-suffixes-fields.validator.js'); require('../class/utility/dto/exception/details/foreign-key-violation.class.js'); require('../class/utility/dto/exception/details/unique-violation.class.js'); require('../validator/is-regular-expression.validator.js'); require('node:crypto'); require('../enum/utility/exception-details-type.enum.js'); var methodName_utility = require('../utility/api/controller/get/method-name.utility.js'); require('../class/api/function/context-storage.class.js'); require('../enum/utility/error-string/action.enum.js'); require('../enum/utility/error-string/composite-action.enum.js'); require('../enum/utility/get-default-string-format-properties-bigint-string-sign.enum.js'); var dtoSwagger_utility = require('../utility/api/controller/write/dto-swagger.utility.js'); var method_utility = require('../utility/api/controller/write/method.utility.js'); require('../constant/utility/api/get-default-string-format-properties/bigint-string/sign/default.constant.js'); require('../constant/utility/api/get-default-string-format-properties/bigint-string/sign/properties.constant.js'); require('../constant/utility/api/get-default-string-format-properties/customizer-map.constant.js'); require('lodash/cloneDeep.js'); require('@nestjs/common/constants.js'); require('@nestjs/common/enums/route-paramtypes.enum.js'); var get_utility = require('../utility/api/controller/get-list/query/plan/get.utility.js'); var set_utility = require('../utility/api/controller/get-list/query/plan/set.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); if (!this.ENTITY.primaryKey) { throw exception_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); Reflect.defineMetadata(controller_constant.CONTROLLER_API_DECORATOR_CONSTANT.ENTITY_METADATA_KEY, this.properties.entity, this.target); Reflect.defineMetadata(controller_constant.CONTROLLER_API_DECORATOR_CONSTANT.PROPERTIES_METADATA_KEY, this.properties, this.target); } createMethod(method) { if (!(method in this.properties.routes) || this.properties.routes[method]?.generation?.isEnabled !== false) { const routeConfig = this.properties.routes[method] ?? {}; const routeDecorators = routeConfig.generation?.decorators ?? []; const methodName = methodName_utility.ApiControllerGetMethodName(method); let queryPlan; method_utility.ApiControllerWriteMethod(this, this.targetPrototype, method, this.properties, this.ENTITY); if (method === type_enum.EApiRouteType.GET_LIST) { queryPlan = planCompiler_class.ApiControllerGetListQueryPlanCompiler.compile(this.target, this.properties.entity, this.ENTITY, routeConfig); if (queryPlan) { set_utility.ApiControllerGetListQueryPlanSet(this.targetPrototype, methodName, queryPlan); } } const targetMethod = this.targetPrototype[methodName]; metadata_utility.ApiControllerApplyMetadata(this.target, this.targetPrototype, this.ENTITY, this.properties, method, methodName, routeConfig, queryPlan); if (this.properties.routes[method]?.generation?.shouldWriteToController !== false) { decorators_utility.ApiControllerApplyDecorators(targetMethod, this.ENTITY, this.properties, method, methodName, routeConfig, routeDecorators, queryPlan); } dtoSwagger_utility.ApiControllerWriteDtoSwagger(this.target, this.ENTITY, this.properties, method, routeConfig, this.ENTITY, queryPlan); } } init() { for (const method of Object.values(type_enum.EApiRouteType)) { this.createMethod(method); } } [type_enum.EApiRouteType.CREATE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (body, headers, ip, authenticationRequest) { return (await routeRuntime_class.ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, body, headers, ip } })); }, "name", { value: methodName }); } [type_enum.EApiRouteType.DELETE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { await routeRuntime_class.ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, parameters } }); }, "name", { value: methodName }); } [type_enum.EApiRouteType.GET](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { return (await routeRuntime_class.ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, parameters } })); }, "name", { value: methodName }); } [type_enum.EApiRouteType.GET_LIST](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (query, headers, ip, authenticationRequest) { const requestQueryValue = authenticationRequest && "query" in authenticationRequest ? authenticationRequest.query : undefined; const requestQuery = requestQueryValue && typeof requestQueryValue === "object" && !Array.isArray(requestQueryValue) ? requestQueryValue : undefined; const queryPlan = get_utility.ApiControllerGetListQueryPlanGet(Object.getPrototypeOf(this), methodName); const runtimeQuery = queryPlan && !queryPlan.filter.isLegacy && requestQuery ? requestQuery : query; return (await routeRuntime_class.ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, query: runtimeQuery } })); }, "name", { value: methodName }); } [type_enum.EApiRouteType.PARTIAL_UPDATE](method, methodName, properties, entityMetadata) { this.defineUpdateRouteMethod(method, methodName, properties, entityMetadata); } [type_enum.EApiRouteType.UPDATE](method, methodName, properties, entityMetadata) { this.defineUpdateRouteMethod(method, methodName, properties, entityMetadata); } defineUpdateRouteMethod(method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, body, headers, ip, authenticationRequest) { return (await routeRuntime_class.ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, body, headers, ip, parameters } })); }, "name", { value: methodName }); } } exports.ApiControllerFactory = ApiControllerFactory; //# sourceMappingURL=api-controller.factory.js.map