@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
112 lines (108 loc) • 6.22 kB
JavaScript
;
require('../../../constant/decorator/api/function.constant.js');
var propertyDescribe_constant = require('../../../constant/decorator/api/property-describe.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/pagination-mode.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');
var dtoType_enum = 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');
var buildDecorator_utility = require('../build-decorator.utility.js');
var exception_utility = require('../../error/exception.utility.js');
var classValidator = require('class-validator');
const readParametersDtoCache = new WeakMap();
/**
* Generates a cached PARAMETERS DTO for route-local inherited read scope.
* @template E - Entity type owned by the generated route.
* @param {IApiEntity<E>} entityMetadata - Entity metadata used for field decorators.
* @param {EApiRouteType} method - Generated GET or GET_LIST route type.
* @param {IApiControllerReadPlan} readPlan - Validated route-local read plan.
* @param {IApiControllerPropertiesRouteAutoDtoConfig} [dtoConfig] - Optional auto DTO validators.
* @param {Type<IAuthGuard>} [currentGuard] - Authentication guard used for field exposure metadata.
* @returns {Type<unknown>} Cached generated parameters DTO class.
*/
function DtoGenerateReadParameters(entityMetadata, method, readPlan, dtoConfig, currentGuard) {
let guardCache = readParametersDtoCache.get(readPlan);
if (!guardCache) {
guardCache = new Map();
readParametersDtoCache.set(readPlan, guardCache);
}
let dtoConfigCache = guardCache.get(currentGuard);
if (!dtoConfigCache) {
dtoConfigCache = new Map();
guardCache.set(currentGuard, dtoConfigCache);
}
const cached = dtoConfigCache.get(dtoConfig);
if (cached) {
return cached;
}
const parameters = [];
if (method === type_enum.EApiRouteType.GET) {
const primaryKey = entityMetadata.primaryKey;
if (!primaryKey) {
throw exception_utility.ErrorException(`Primary key for entity ${String(entityMetadata.name)} not found in metadata storage`);
}
parameters.push({ field: String(primaryKey.name), parameter: String(primaryKey.name) });
}
parameters.push(...readPlan.parameters);
class GeneratedReadParametersDTO {
constructor() {
for (const parameter of parameters) {
Object.defineProperty(this, parameter.parameter, {
// eslint-disable-next-line @elsikora/typescript/naming-convention
configurable: true,
// eslint-disable-next-line @elsikora/typescript/naming-convention
enumerable: true,
value: undefined,
// eslint-disable-next-line @elsikora/typescript/naming-convention
writable: true,
});
}
}
}
Object.defineProperty(GeneratedReadParametersDTO, "name", { value: readPlan.schemaName });
for (const parameter of parameters) {
const column = entityMetadata.columns.find((candidate) => String(candidate.name) === parameter.field);
const metadata = column?.metadata?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY];
if (!column || !metadata) {
throw exception_utility.ErrorException(`Metadata for generated read scope field ${parameter.field} not found`);
}
const decorators = buildDecorator_utility.DtoBuildDecorator(method, metadata, entityMetadata, dtoType_enum.EApiDtoType.PARAMETERS, parameter.parameter, currentGuard);
if (decorators) {
for (const decorator of decorators) {
decorator(GeneratedReadParametersDTO.prototype, parameter.parameter);
}
}
}
if (dtoConfig?.validators) {
for (const validator of dtoConfig.validators) {
classValidator.Validate(validator.constraintClass, validator.options)(GeneratedReadParametersDTO.prototype, "object");
}
}
dtoConfigCache.set(dtoConfig, GeneratedReadParametersDTO);
return GeneratedReadParametersDTO;
}
exports.DtoGenerateReadParameters = DtoGenerateReadParameters;
//# sourceMappingURL=read-parameters.utility.js.map