UNPKG

@elsikora/nestjs-crud-automator

Version:

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

160 lines (157 loc) 10.7 kB
import { ApiControllerGetListQueryPlanCompiler } from '../class/api/controller/get-list/query/plan-compiler.class.js'; import '../constant/filter/operator-registry.constant.js'; import '../enum/decorator/api/action.enum.js'; import '../enum/decorator/api/authentication-type.enum.js'; import '../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js'; import '../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js'; import '../enum/decorator/api/controller/relation-reference-shape.enum.js'; import '../enum/decorator/api/controller/request/target.enum.js'; import '../enum/decorator/api/controller/request/transformer-type.enum.js'; import '../enum/decorator/api/controller/response-target.enum.js'; import '../enum/decorator/api/dto-type.enum.js'; import '../enum/decorator/api/function/context-storage-kind.enum.js'; import '../enum/decorator/api/function/subscriber-transaction-expectation.enum.js'; import '../enum/decorator/api/function/transaction/event-status.enum.js'; import '../enum/decorator/api/function/transaction/failure-stage.enum.js'; import '../enum/decorator/api/function/transaction/mode.enum.js'; import '../enum/decorator/api/function/transaction/outcome.enum.js'; import '../enum/decorator/api/function/transaction/owner-kind.enum.js'; import '../enum/decorator/api/function/transaction/trace-type.enum.js'; import '../enum/decorator/api/function/type.enum.js'; import '../enum/decorator/api/on-type.enum.js'; import '../enum/decorator/api/property/data-type.enum.js'; import '../enum/decorator/api/property/date/identifier.enum.js'; import '../enum/decorator/api/property/date/type.enum.js'; import '../enum/decorator/api/property/desribe-type.enum.js'; import '../enum/decorator/api/property/number-type.enum.js'; import '../enum/decorator/api/property/string-type.enum.js'; import '../enum/decorator/api/route/subscriber-authorization-expectation.enum.js'; import { EApiRouteType } from '../enum/decorator/api/route/type.enum.js'; import '../enum/filter/operand.enum.js'; import '../enum/filter/operation.enum.js'; import '../enum/filter/order-direction.enum.js'; import { Controller } from '@nestjs/common'; import { ApiRouteRuntime } from '../class/api/route-runtime.class.js'; import { CONTROLLER_API_DECORATOR_CONSTANT } from '../constant/decorator/api/controller.constant.js'; import '../constant/decorator/api/function.constant.js'; import { ApiTags } from '@nestjs/swagger'; import { ApiControllerApplyDecorators } from '../utility/api/controller/apply/decorators.utility.js'; import { ApiControllerApplyMetadata } from '../utility/api/controller/apply/metadata.utility.js'; import '../constant/utility/dto/constant.js'; import { ErrorException } from '../utility/error/exception.utility.js'; import '../enum/utility/manual-dto-property-metadata-decorator.enum.js'; import 'class-transformer'; import 'class-validator'; import { GenerateEntityInformation } from '../utility/generate-entity-information.utility.js'; import '../external/tslib/tslib.es6.js'; import 'lodash/random.js'; import '@nestjs/swagger/dist/constants.js'; import '../validator/must-match-one-of-schemas.validator.js'; import '../constant/interface/api/property/default-string-format.constant.js'; import 'typeorm'; import 'reflect-metadata'; import '../validator/all-or-none-of-listed-properties.validator.js'; import '../validator/has/paired-custom-suffixes-fields.validator.js'; import '../class/utility/dto/exception/details/foreign-key-violation.class.js'; import '../class/utility/dto/exception/details/unique-violation.class.js'; import '../validator/is-regular-expression.validator.js'; import 'node:crypto'; import '../enum/utility/exception-details-type.enum.js'; import { ApiControllerGetMethodName } from '../utility/api/controller/get/method-name.utility.js'; import '../class/api/function/context-storage.class.js'; import '../enum/utility/error-string/action.enum.js'; import '../enum/utility/error-string/composite-action.enum.js'; import '../enum/utility/get-default-string-format-properties-bigint-string-sign.enum.js'; import { ApiControllerWriteDtoSwagger } from '../utility/api/controller/write/dto-swagger.utility.js'; import { ApiControllerWriteMethod } from '../utility/api/controller/write/method.utility.js'; import '../constant/utility/api/get-default-string-format-properties/bigint-string/sign/default.constant.js'; import '../constant/utility/api/get-default-string-format-properties/bigint-string/sign/properties.constant.js'; import '../constant/utility/api/get-default-string-format-properties/customizer-map.constant.js'; import 'lodash/cloneDeep.js'; import '@nestjs/common/constants.js'; import '@nestjs/common/enums/route-paramtypes.enum.js'; import { ApiControllerGetListQueryPlanGet } from '../utility/api/controller/get-list/query/plan/get.utility.js'; import { ApiControllerGetListQueryPlanSet } from '../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(properties.entity); if (!this.ENTITY.primaryKey) { throw ErrorException(`Primary key for entity ${this.properties.entity.name ?? "UnknownResource"} not found`); } Controller(this.properties.path ?? (this.properties.entity.name ? this.properties.entity.name.toLowerCase() : "UnknownResource"))(this.target); ApiTags(this.properties.name ?? this.properties.entity.name ?? "UnknownResource")(this.target); Reflect.defineMetadata(CONTROLLER_API_DECORATOR_CONSTANT.ENTITY_METADATA_KEY, this.properties.entity, this.target); Reflect.defineMetadata(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 = ApiControllerGetMethodName(method); let queryPlan; ApiControllerWriteMethod(this, this.targetPrototype, method, this.properties, this.ENTITY); if (method === EApiRouteType.GET_LIST) { queryPlan = ApiControllerGetListQueryPlanCompiler.compile(this.target, this.properties.entity, this.ENTITY, routeConfig); if (queryPlan) { ApiControllerGetListQueryPlanSet(this.targetPrototype, methodName, queryPlan); } } const targetMethod = this.targetPrototype[methodName]; ApiControllerApplyMetadata(this.target, this.targetPrototype, this.ENTITY, this.properties, method, methodName, routeConfig, queryPlan); if (this.properties.routes[method]?.generation?.shouldWriteToController !== false) { ApiControllerApplyDecorators(targetMethod, this.ENTITY, this.properties, method, methodName, routeConfig, routeDecorators, queryPlan); } ApiControllerWriteDtoSwagger(this.target, this.ENTITY, this.properties, method, routeConfig, this.ENTITY, queryPlan); } } init() { for (const method of Object.values(EApiRouteType)) { this.createMethod(method); } } [EApiRouteType.CREATE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (body, headers, ip, authenticationRequest) { return (await ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, body, headers, ip } })); }, "name", { value: methodName }); } [EApiRouteType.DELETE](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { await ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, parameters } }); }, "name", { value: methodName }); } [EApiRouteType.GET](method, methodName, properties, entityMetadata) { this.targetPrototype[methodName] = Object.defineProperty(async function (parameters, headers, ip, authenticationRequest) { return (await ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, parameters } })); }, "name", { value: methodName }); } [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 = ApiControllerGetListQueryPlanGet(Object.getPrototypeOf(this), methodName); const runtimeQuery = queryPlan && !queryPlan.filter.isLegacy && requestQuery ? requestQuery : query; return (await ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, headers, ip, query: runtimeQuery } })); }, "name", { value: methodName }); } [EApiRouteType.PARTIAL_UPDATE](method, methodName, properties, entityMetadata) { this.defineUpdateRouteMethod(method, methodName, properties, entityMetadata); } [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 ApiRouteRuntime.executeGenerated({ controller: this, entityMetadata, method, methodName, properties, targets: { authenticationRequest, body, headers, ip, parameters } })); }, "name", { value: methodName }); } } export { ApiControllerFactory }; //# sourceMappingURL=api-controller.factory.js.map