@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
114 lines (110 loc) • 6.63 kB
JavaScript
;
var node_crypto = require('node:crypto');
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 NO_READ_PLAN = Object.freeze({});
const identityParametersDtoCache = new WeakMap();
/**
* Generates a PARAMETERS DTO for a GET identity alias and optional inherited read scope.
* @param {IApiEntity<E>} entityMetadata - Entity metadata supplying field decorators.
* @param {IApiControllerIdentityPlan} identityPlan - Compiled identity alias plan.
* @param {IApiControllerReadPlan} [readPlan] - Optional compiled owner-scope plan.
* @param {IApiControllerPropertiesRouteAutoDtoConfig} [dtoConfig] - Auto DTO validators.
* @param {Type<IAuthGuard>} [currentGuard] - Route authentication guard.
* @returns {Type<unknown>} Generated PARAMETERS DTO.
* @template E - Entity type.
*/
function DtoGenerateIdentityReadParameters(entityMetadata, identityPlan, readPlan, dtoConfig, currentGuard) {
let readPlanCache = identityParametersDtoCache.get(identityPlan);
if (!readPlanCache) {
readPlanCache = new WeakMap();
identityParametersDtoCache.set(identityPlan, readPlanCache);
}
const readPlanKey = readPlan ?? NO_READ_PLAN;
let guardCache = readPlanCache.get(readPlanKey);
if (!guardCache) {
guardCache = new Map();
readPlanCache.set(readPlanKey, 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 = [{ field: identityPlan.field, parameter: identityPlan.parameter }, ...(readPlan?.parameters ?? [])];
class GeneratedIdentityReadParametersDTO {
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,
});
}
}
}
const combinedSignature = readPlan ? node_crypto.createHash("sha256").update(identityPlan.signature).update(":").update(readPlan.signature).digest("hex") : undefined;
const schemaName = readPlan ? `${identityPlan.controllerName}${entityMetadata.name ?? "UnknownResource"}GetParameters${combinedSignature}DTO` : identityPlan.schemaName;
Object.defineProperty(GeneratedIdentityReadParametersDTO, "name", { value: 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 identity/read field ${parameter.field} not found`);
}
const decorators = buildDecorator_utility.DtoBuildDecorator(type_enum.EApiRouteType.GET, metadata, entityMetadata, dtoType_enum.EApiDtoType.PARAMETERS, parameter.parameter, currentGuard);
if (decorators) {
for (const decorator of decorators) {
decorator(GeneratedIdentityReadParametersDTO.prototype, parameter.parameter);
}
}
}
if (dtoConfig?.validators) {
for (const validator of dtoConfig.validators) {
classValidator.Validate(validator.constraintClass, validator.options)(GeneratedIdentityReadParametersDTO.prototype, "object");
}
}
dtoConfigCache.set(dtoConfig, GeneratedIdentityReadParametersDTO);
return GeneratedIdentityReadParametersDTO;
}
exports.DtoGenerateIdentityReadParameters = DtoGenerateIdentityReadParameters;
//# sourceMappingURL=identity-read-parameters.utility.js.map