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