UNPKG

@elsikora/nestjs-crud-automator

Version:

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

108 lines (104 loc) 6.56 kB
'use strict'; require('../../../constant/decorator/api/function.constant.js'); var propertyDescribe_constant = require('../../../constant/decorator/api/property-describe.constant.js'); var factoryDtoGetListQuery_constant = require('../../../constant/factory-dto-get-list-query.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'); 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'); var desribeType_enum = 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 shouldBeMarked_utility = require('../is/property/should-be-marked.utility.js'); var exception_utility = require('../../error/exception.utility.js'); var generateEntityInformation_utility = require('../../generate-entity-information.utility.js'); /** * Resolves metadata-backed GET_LIST filter properties for legacy or normalized-plan DTO generation. * @param {IApiEntity<E>} entityMetadata - Root entity metadata. * @param {Array<{isPrimary: boolean; metadata: TApiPropertyDescribeProperties; name: keyof E}>} markedProperties - Legacy metadata-visible root properties. * @param {Type<IAuthGuard>} currentGuard - Active route guard used by legacy visibility checks. * @param {IApiControllerGetListQueryPlan} queryPlan - Optional normalized typed query plan. * @returns {Array<object>} Filter properties consumed by the dynamic DTO generator. * @template E - Root entity type. */ function DtoGenerateGetListQueryProperties(entityMetadata, markedProperties, currentGuard, queryPlan) { const queryFilterProperties = []; if (queryPlan && !queryPlan.filter.isLegacy) { for (const field of Object.values(queryPlan.filter.fields)) { if (!field.isEnabled) { continue; } const path = field.path.split("."); let propertyEntityMetadata = entityMetadata; if (path.length === factoryDtoGetListQuery_constant.GET_LIST_QUERY_DTO_FACTORY_CONSTANT.NESTED_FILTER_PATH_SEGMENT_COUNT) { const relationColumn = entityMetadata.columns.find((column) => String(column.name) === path[0]); if (!relationColumn?.relation?.target) { throw exception_utility.ErrorException(`Relation metadata for GET_LIST query field "${field.path}" is unavailable`); } propertyEntityMetadata = generateEntityInformation_utility.GenerateEntityInformation(relationColumn.relation.target); } queryFilterProperties.push({ allowedOperations: field.allowedOperations, entityMetadata: propertyEntityMetadata, metadata: field.metadata, name: field.path, }); } return queryFilterProperties; } for (const property of markedProperties) { if (property.metadata.type !== desribeType_enum.EApiPropertyDescribeType.RELATION) { queryFilterProperties.push({ entityMetadata: entityMetadata, metadata: property.metadata, name: property.name, }); continue; } const relationColumn = entityMetadata.columns.find((column) => column.name == property.name); if (!relationColumn?.relation?.target) continue; let relationEntityMetadata; try { relationEntityMetadata = generateEntityInformation_utility.GenerateEntityInformation(relationColumn.relation.target); } catch { continue; } for (const relationProperty of relationEntityMetadata.columns) { const relationPropertyMetadata = relationProperty.metadata?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY]; if (!relationPropertyMetadata || relationPropertyMetadata.type === desribeType_enum.EApiPropertyDescribeType.RELATION || relationPropertyMetadata.type === desribeType_enum.EApiPropertyDescribeType.OBJECT) continue; if (!relationProperty.isPrimary && !shouldBeMarked_utility.DtoIsPropertyShouldBeMarked(type_enum.EApiRouteType.GET_LIST, dtoType_enum.EApiDtoType.QUERY, relationProperty.name, relationPropertyMetadata, relationProperty.isPrimary, currentGuard)) continue; queryFilterProperties.push({ entityMetadata: relationEntityMetadata, metadata: relationPropertyMetadata, name: `${property.name}.${relationProperty.name}`, }); } } return queryFilterProperties; } exports.DtoGenerateGetListQueryProperties = DtoGenerateGetListQueryProperties; //# sourceMappingURL=get-list-query-properties.utility.js.map