@solidxai/core 0.1.10-beta.25 → 0.1.10-beta.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/controllers/action-metadata.controller.d.ts +1 -20
- package/dist/controllers/action-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/agent-event.controller.d.ts +1 -20
- package/dist/controllers/agent-event.controller.d.ts.map +1 -1
- package/dist/controllers/agent-session.controller.d.ts +1 -20
- package/dist/controllers/agent-session.controller.d.ts.map +1 -1
- package/dist/controllers/ai-interaction.controller.d.ts +1 -20
- package/dist/controllers/ai-interaction.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message-details.controller.d.ts +1 -20
- package/dist/controllers/chatter-message-details.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +1 -20
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -20
- package/dist/controllers/dashboard-user-layout.controller.d.ts.map +1 -1
- package/dist/controllers/email-template.controller.d.ts +1 -20
- package/dist/controllers/email-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-template.controller.d.ts +1 -20
- package/dist/controllers/export-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-transaction.controller.d.ts +1 -20
- package/dist/controllers/export-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -20
- package/dist/controllers/import-transaction-error-log.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction.controller.d.ts +1 -20
- package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/list-of-values.controller.d.ts +1 -20
- package/dist/controllers/list-of-values.controller.d.ts.map +1 -1
- package/dist/controllers/locale.controller.d.ts +1 -20
- package/dist/controllers/locale.controller.d.ts.map +1 -1
- package/dist/controllers/mcp-audit-log.controller.d.ts +1 -20
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.d.ts +1 -20
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.d.ts +1 -20
- package/dist/controllers/menu-item-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +10 -30
- package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-sequence.controller.d.ts +1 -20
- package/dist/controllers/model-sequence.controller.d.ts.map +1 -1
- package/dist/controllers/module-metadata-explorer.controller.d.ts +171 -0
- package/dist/controllers/module-metadata-explorer.controller.d.ts.map +1 -0
- package/dist/controllers/module-metadata-explorer.controller.js +143 -0
- package/dist/controllers/module-metadata-explorer.controller.js.map +1 -0
- package/dist/controllers/module-metadata.controller.d.ts +5 -0
- package/dist/controllers/module-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/module-metadata.controller.js +12 -0
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/module-package.controller.d.ts +622 -0
- package/dist/controllers/module-package.controller.d.ts.map +1 -0
- package/dist/controllers/module-package.controller.js +150 -0
- package/dist/controllers/module-package.controller.js.map +1 -0
- package/dist/controllers/mq-message-queue.controller.d.ts +1 -20
- package/dist/controllers/mq-message-queue.controller.d.ts.map +1 -1
- package/dist/controllers/mq-message.controller.d.ts +1 -20
- package/dist/controllers/mq-message.controller.d.ts.map +1 -1
- package/dist/controllers/permission-metadata.controller.d.ts +1 -20
- package/dist/controllers/permission-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -20
- package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/saved-filters.controller.d.ts +1 -20
- package/dist/controllers/saved-filters.controller.d.ts.map +1 -1
- package/dist/controllers/scheduled-job.controller.d.ts +1 -20
- package/dist/controllers/scheduled-job.controller.d.ts.map +1 -1
- package/dist/controllers/security-rule.controller.d.ts +1 -20
- package/dist/controllers/security-rule.controller.d.ts.map +1 -1
- package/dist/controllers/sms-template.controller.d.ts +1 -20
- package/dist/controllers/sms-template.controller.d.ts.map +1 -1
- package/dist/controllers/user-activity-history.controller.d.ts +1 -20
- package/dist/controllers/user-activity-history.controller.d.ts.map +1 -1
- package/dist/controllers/user-view-metadata.controller.d.ts +1 -20
- package/dist/controllers/user-view-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/user.controller.d.ts +1 -20
- package/dist/controllers/user.controller.d.ts.map +1 -1
- package/dist/controllers/view-metadata.controller.d.ts +1 -20
- package/dist/controllers/view-metadata.controller.d.ts.map +1 -1
- package/dist/dtos/confirm-module-package-import.dto.d.ts +4 -0
- package/dist/dtos/confirm-module-package-import.dto.d.ts.map +1 -0
- package/dist/dtos/confirm-module-package-import.dto.js +34 -0
- package/dist/dtos/confirm-module-package-import.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-references-query.dto.d.ts +10 -0
- package/dist/dtos/metadata-explorer-references-query.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-references-query.dto.js +69 -0
- package/dist/dtos/metadata-explorer-references-query.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-search-query.dto.d.ts +8 -0
- package/dist/dtos/metadata-explorer-search-query.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-search-query.dto.js +55 -0
- package/dist/dtos/metadata-explorer-search-query.dto.js.map +1 -0
- package/dist/dtos/metadata-explorer-write.dto.d.ts +4 -0
- package/dist/dtos/metadata-explorer-write.dto.d.ts.map +1 -0
- package/dist/dtos/metadata-explorer-write.dto.js +30 -0
- package/dist/dtos/metadata-explorer-write.dto.js.map +1 -0
- package/dist/dtos/run-module-package-build.dto.d.ts +5 -0
- package/dist/dtos/run-module-package-build.dto.d.ts.map +1 -0
- package/dist/dtos/run-module-package-build.dto.js +38 -0
- package/dist/dtos/run-module-package-build.dto.js.map +1 -0
- package/dist/dtos/run-module-package-seed.dto.d.ts +4 -0
- package/dist/dtos/run-module-package-seed.dto.d.ts.map +1 -0
- package/dist/dtos/run-module-package-seed.dto.js +34 -0
- package/dist/dtos/run-module-package-seed.dto.js.map +1 -0
- package/dist/helpers/command.service.js +1 -1
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.d.ts +2 -0
- package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js +14 -12
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module.helper.d.ts.map +1 -1
- package/dist/helpers/module.helper.js +11 -6
- package/dist/helpers/module.helper.js.map +1 -1
- package/dist/helpers/typeorm-migration-helpers.d.ts +12 -0
- package/dist/helpers/typeorm-migration-helpers.d.ts.map +1 -0
- package/dist/helpers/typeorm-migration-helpers.js +119 -0
- package/dist/helpers/typeorm-migration-helpers.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +57 -38
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.js +1 -1
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2364 -1106
- package/dist/services/crud-helper.service.d.ts +18 -0
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +59 -0
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +1 -21
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +9 -75
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +2 -2
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- package/dist/services/media.service.d.ts +1 -20
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +31 -2
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +5 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +15 -30
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +249 -29
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata-explorer.service.d.ts +161 -0
- package/dist/services/module-metadata-explorer.service.d.ts.map +1 -0
- package/dist/services/module-metadata-explorer.service.js +485 -0
- package/dist/services/module-metadata-explorer.service.js.map +1 -0
- package/dist/services/module-metadata.service.d.ts +7 -0
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +121 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/module-package.service.d.ts +266 -0
- package/dist/services/module-package.service.d.ts.map +1 -0
- package/dist/services/module-package.service.js +980 -0
- package/dist/services/module-package.service.js.map +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +10 -2
- package/dist/solid-core.module.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +438 -0
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +146 -0
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +172 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/module-package-import-handoff.md +691 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +2 -1
- package/src/controllers/module-metadata-explorer.controller.ts +83 -0
- package/src/controllers/module-metadata.controller.ts +6 -0
- package/src/controllers/module-package.controller.ts +102 -0
- package/src/dtos/confirm-module-package-import.dto.ts +12 -0
- package/src/dtos/metadata-explorer-references-query.dto.ts +39 -0
- package/src/dtos/metadata-explorer-search-query.dto.ts +28 -0
- package/src/dtos/metadata-explorer-write.dto.ts +11 -0
- package/src/dtos/run-module-package-build.dto.ts +14 -0
- package/src/dtos/run-module-package-seed.dto.ts +12 -0
- package/src/helpers/command.service.ts +1 -1
- package/src/helpers/module-metadata-helper.service.ts +19 -21
- package/src/helpers/module.helper.ts +12 -9
- package/src/helpers/typeorm-migration-helpers.ts +163 -0
- package/src/index.ts +8 -0
- package/src/seeders/module-metadata-seeder.service.ts +63 -38
- package/src/seeders/module-test-data.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +2365 -1107
- package/src/services/crud-helper.service.ts +72 -0
- package/src/services/crud.service.ts +11 -104
- package/src/services/dashboard-providers/README.md +1 -1
- package/src/services/genai/ingest-metadata.service.ts +3 -3
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +37 -2
- package/src/services/mediaStorageProviders/file-storage-provider.ts +5 -1
- package/src/services/model-metadata.service.ts +302 -98
- package/src/services/module-metadata-explorer.service.ts +670 -0
- package/src/services/module-metadata.service.ts +136 -10
- package/src/services/module-package.service.ts +1171 -0
- package/src/solid-core.module.ts +10 -2
- package/.claude/settings.local.json +0 -15
- package/CLAUDE.md +0 -26
- package/dist/services/database/database-bootstrap.service.d.ts +0 -12
- package/dist/services/database/database-bootstrap.service.d.ts.map +0 -1
- package/dist/services/database/database-bootstrap.service.js +0 -115
- package/dist/services/database/database-bootstrap.service.js.map +0 -1
- package/sql/default/mariadb/proc_CleanupModelMetadata.sql +0 -153
- package/sql/default/mariadb/proc_CleanupModuleMetadata.sql +0 -56
- package/sql/default/mssql/proc_CleanupModuleMetadata.sql +0 -78
- package/sql/default/mysql/proc_CleanupModelMetadata.sql +0 -153
- package/sql/default/mysql/proc_CleanupModuleMetadata.sql +0 -56
- package/sql/default/postgres/proc_CleanupModelMetadata.sql +0 -148
- package/sql/default/postgres/proc_CleanupModuleMetadata.sql +0 -50
- package/sql/default/postgres/scratchpad.sql.txt +0 -12
- package/src/services/1.js +0 -6
- package/src/services/database/database-bootstrap.service.ts +0 -91
|
@@ -68,5 +68,23 @@ export declare class CrudHelperService {
|
|
|
68
68
|
hasDeletePermissionOnModel: (activeUser: ActiveUserData, modelName: string) => boolean;
|
|
69
69
|
hasCreatePermissionOnModel: (activeUser: ActiveUserData, modelName: string) => boolean;
|
|
70
70
|
hasRecoverPermissionOnModel: (activeUser: ActiveUserData, modelName: string) => boolean;
|
|
71
|
+
pagedResponse<T>(offset: number | undefined, limit: number | undefined, count: number, entities: T[]): {
|
|
72
|
+
meta: {
|
|
73
|
+
totalRecords: number;
|
|
74
|
+
currentPage: number;
|
|
75
|
+
nextPage: number;
|
|
76
|
+
prevPage: number;
|
|
77
|
+
totalPages: number;
|
|
78
|
+
perPage: number;
|
|
79
|
+
};
|
|
80
|
+
records: T[];
|
|
81
|
+
};
|
|
82
|
+
executeGroupPipeline<T>(filterQb: SelectQueryBuilder<T>, basicFilterDto: BasicFilterDto, alias: string, createQbFn: () => Promise<SelectQueryBuilder<T>>, postProcessEntities?: (entities: T[]) => Promise<void>): Promise<{
|
|
83
|
+
meta: {
|
|
84
|
+
totalRecords: number;
|
|
85
|
+
};
|
|
86
|
+
groupMeta: any[];
|
|
87
|
+
groupRecords: any[];
|
|
88
|
+
}>;
|
|
71
89
|
}
|
|
72
90
|
//# sourceMappingURL=crud-helper.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"crud-helper.service.d.ts","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -644,6 +644,65 @@ class CrudHelperService {
|
|
|
644
644
|
const rawResults = await filteredQB.getRawMany();
|
|
645
645
|
return rawResults.length;
|
|
646
646
|
}
|
|
647
|
+
pagedResponse(offset, limit, count, entities) {
|
|
648
|
+
const safeLimit = limit ?? count ?? 0;
|
|
649
|
+
const safeOffset = offset ?? 0;
|
|
650
|
+
const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;
|
|
651
|
+
const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;
|
|
652
|
+
const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;
|
|
653
|
+
const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;
|
|
654
|
+
return {
|
|
655
|
+
meta: {
|
|
656
|
+
totalRecords: count,
|
|
657
|
+
currentPage,
|
|
658
|
+
nextPage,
|
|
659
|
+
prevPage,
|
|
660
|
+
totalPages,
|
|
661
|
+
perPage: safeLimit ? +safeLimit : 0,
|
|
662
|
+
},
|
|
663
|
+
records: entities,
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
async executeGroupPipeline(filterQb, basicFilterDto, alias, createQbFn, postProcessEntities) {
|
|
667
|
+
const groupByFields = this.normalize(basicFilterDto.groupBy);
|
|
668
|
+
if (!groupByFields.length)
|
|
669
|
+
throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
|
|
670
|
+
if (basicFilterDto.populateGroup) {
|
|
671
|
+
const hasRelationGroup = groupByFields.some(f => f.includes('.'));
|
|
672
|
+
if (hasRelationGroup)
|
|
673
|
+
throw new common_1.BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');
|
|
674
|
+
}
|
|
675
|
+
const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } = this.applyGroupBySelections(filterQb, groupByFields, alias);
|
|
676
|
+
const aggregateAliasMap = this.applyAggregates(filterQb, basicFilterDto.aggregates, alias);
|
|
677
|
+
this.applyGroupSortingAndPagination(filterQb, basicFilterDto.sort, { ...groupAliasMap, ...aggregateAliasMap }, basicFilterDto.limit, basicFilterDto.offset);
|
|
678
|
+
const groupByResult = await filterQb.getRawMany();
|
|
679
|
+
const totalGroups = await this.countGroups(filterQb);
|
|
680
|
+
const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));
|
|
681
|
+
const groupMeta = [];
|
|
682
|
+
const groupRecords = [];
|
|
683
|
+
for (const group of groupByResult) {
|
|
684
|
+
groupMeta.push(this.createGroupMeta(group, aggregateAliasSet, groupByFields, groupAliasMap, groupFormatMap));
|
|
685
|
+
if (basicFilterDto.populateGroup) {
|
|
686
|
+
let groupQb = await createQbFn();
|
|
687
|
+
const { groupBy: _gb, aggregates: _agg, ...rest } = basicFilterDto;
|
|
688
|
+
const groupFilterDto = {
|
|
689
|
+
...rest,
|
|
690
|
+
...basicFilterDto.groupFilter,
|
|
691
|
+
groupBy: undefined,
|
|
692
|
+
aggregates: undefined,
|
|
693
|
+
sort: basicFilterDto.groupFilter?.sort,
|
|
694
|
+
};
|
|
695
|
+
groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);
|
|
696
|
+
groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
|
|
697
|
+
const [entities, count] = await groupQb.getManyAndCount();
|
|
698
|
+
if (postProcessEntities)
|
|
699
|
+
await postProcessEntities(entities);
|
|
700
|
+
const groupData = this.pagedResponse(basicFilterDto.groupFilter?.offset, basicFilterDto.groupFilter?.limit, count, entities);
|
|
701
|
+
groupRecords.push(this.createGroupRecords(group, aggregateAliasSet, groupData, groupByFields, groupAliasMap, groupFormatMap));
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
return { meta: { totalRecords: totalGroups }, groupMeta, groupRecords };
|
|
705
|
+
}
|
|
647
706
|
}
|
|
648
707
|
exports.CrudHelperService = CrudHelperService;
|
|
649
708
|
//# sourceMappingURL=crud-helper.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud-helper.service.js","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from '../helpers/string.helper';\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { BadRequestException, Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\n\nexport enum FilterCombinator {\n AND = '$and',\n OR = '$or'\n}\n\nexport enum UserIdFields {\n CREATED_BY = 'createdBy',\n UPDATED_BY = 'updatedBy'\n}\n\nexport class CrudHelperService {\n constructor(\n ) { }\n private readonly logger = new Logger(CrudHelperService.name);\n\n private orderOptions(sort: any[] = []) {\n const orderOptions = {};\n sort.forEach((s: string) => {\n const parts = s.split(':');\n let order: string | undefined;\n let field: string;\n if (parts.length > 1) {\n order = parts.pop();\n field = parts.join(':');\n } else {\n field = parts[0];\n }\n const normalizedOrder = order ? order.toUpperCase() : 'ASC';\n if (!['ASC', 'DESC'].includes(normalizedOrder)) {\n throw new Error(`Invalid sort order provided: ${order}`);\n }\n orderOptions[field] = normalizedOrder;\n });\n return orderOptions;\n }\n\n applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {\n const normalizedFilters = this.normalizeObjectKeys(filters);\n if (normalizedFilters.$and) {\n normalizedFilters.$and.forEach((andFilter: any) => {\n qb.andWhere(\n new Brackets(subQb => {\n this.applyFilters(subQb, andFilter, alias, selectQb);\n })\n );\n });\n } else if (normalizedFilters.$or) {\n normalizedFilters.$or.forEach((orFilter: any) => {\n qb.orWhere(new Brackets(subQb => {\n this.applyFilters(subQb, orFilter, alias, selectQb);\n }));\n });\n } else {\n // For individual conditions\n Object.keys(normalizedFilters).forEach(key => {\n const primaryFilterObj = normalizedFilters[key];\n const normalizedPrimaryFilterObj = this.normalizeObjectKeys(primaryFilterObj);\n\n const [rawField, funcAlias] = key.split(':');\n\n // Get the operator or field from the key\n const operatorOrField = Object.keys(normalizedPrimaryFilterObj)[0];\n // if the key is an operator, then build the query based on the operator\n if (operatorOrField.startsWith('$')) {\n const operator = operatorOrField;\n let columnExpression: string | undefined;\n if (funcAlias) {\n try {\n columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${rawField}`, funcAlias);\n } catch {\n throw new BadRequestException(`Unsupported field function '${funcAlias}'. Supported functions are: day, week, month, year.`);\n }\n }\n this.buildOperatorQuery(qb, alias, rawField, normalizedPrimaryFilterObj, operator, columnExpression);\n return;\n }\n else { // Recursively call the applyFilters method to handle nested conditions\n if (funcAlias) {\n throw new BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);\n }\n const joinField = `${alias}.${rawField}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, rawField);\n this.applyFilters(qb, primaryFilterObj, rawField, selectQb);\n }\n });\n }\n }\n\n private buildOperatorQuery(qb: any, alias: string, field: string, normalizedPrimaryOperatorObj: any, operator: string, columnExpression?: string) {\n const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;\n const colExpr = columnExpression ?? `${alias}.${field}`;\n switch (operator) {\n case '$eq':\n qb.andWhere(`${colExpr} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });\n break;\n case '$eqi':\n qb.andWhere(`LOWER(${colExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });\n break;\n case '$ne':\n qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei':\n qb.andWhere(`LOWER(${colExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });\n break;\n case '$gt':\n qb.andWhere(`${colExpr} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });\n break;\n case '$gte':\n qb.andWhere(`${colExpr} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });\n break;\n case '$lt':\n qb.andWhere(`${colExpr} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });\n break;\n case '$lte':\n qb.andWhere(`${colExpr} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });\n break;\n case '$in':\n qb.andWhere(`${colExpr} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });\n break;\n case '$notIn':\n qb.andWhere(`${colExpr} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });\n break;\n case '$contains':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });\n break;\n case '$notContains':\n qb.andWhere(`${colExpr} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });\n break;\n case '$containsi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });\n break;\n case '$notContainsi':\n qb.andWhere(`LOWER(${colExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });\n break;\n case '$null':\n qb.andWhere(`${colExpr} IS NULL`);\n break;\n case '$notNull':\n qb.andWhere(`${colExpr} IS NOT NULL`);\n break;\n case '$between':\n qb.andWhere(`${colExpr} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });\n break;\n case '$startsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });\n break;\n case '$startsWithi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });\n break;\n case '$endsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });\n break;\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq\n private normalizeObjectKeys(obj: any): any {\n return Object.keys(obj).reduce((acc, key) => {\n // Transform the key by removing surrounding brackets\n const newKey = key.replace(/^\\[(.*)\\]$/, '$1');\n // Assign the value to the transformed key in the accumulator object\n acc[newKey] = obj[key];\n return acc;\n }, {});\n }\n\n normalize(value: string | string[]): string[] {\n if (!value) return []; // if the value is nullish, then return an empty array\n return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array\n }\n\n private normalizeAndFilterPopulateAttributes(value: string | string[]): string[] {\n // Normalize and remove the userId fields from the populate filter, since they are handled separately\n const normalized = this.normalize(value);\n return normalized.filter(item => item !== UserIdFields.CREATED_BY && item !== UserIdFields.UPDATED_BY);\n }\n\n extractUserIdFieldsFromPopulate(value: string | string[]): UserIdFields[] {\n const normalized = this.normalize(value);\n return normalized.filter(item => item === UserIdFields.CREATED_BY || item === UserIdFields.UPDATED_BY);\n }\n\n private isRelationJoined(queryBuilder: SelectQueryBuilder<any>, joinProperty: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.entityOrProperty === joinProperty);\n }\n\n private hasJoins(queryBuilder: SelectQueryBuilder<any>): boolean {\n return queryBuilder.expressionMap.joinAttributes.length > 0;\n }\n\n buildFilterQuery(\n qb: SelectQueryBuilder<any>,\n basicFilterDto: BasicFilterDto,\n entityAlias: string,\n internationalisation?: boolean,\n draftPublishWorkflow?: boolean,\n moduleRef?: any,\n filterCombinator: FilterCombinator = FilterCombinator.AND,\n applyPagination: boolean = true,\n applySorting: boolean = true\n ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any\n let { limit, offset, showSoftDeleted, filters } = basicFilterDto;\n const { fields, sort, populate = [], populateMedia = [], locale, status } = basicFilterDto;\n\n // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)\n const normalizedFields = this.normalize(fields);\n const normalizedAndFilteredPopulateAttributes = this.normalizeAndFilterPopulateAttributes(populate);\n const normalizedPopulateMedia = this.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedAndFilteredPopulateAttributes.push(...additionalPopulate.filter((relation) => !normalizedAndFilteredPopulateAttributes.includes(relation)));\n\n const normalizedSort = this.normalize(sort);\n\n // Depending upon the populate option, apply the join clause\n if (normalizedAndFilteredPopulateAttributes && normalizedAndFilteredPopulateAttributes.length) {\n this.buildPopulateQuery(normalizedAndFilteredPopulateAttributes, entityAlias, qb);\n }\n\n if (filters) {\n if (filterCombinator === FilterCombinator.AND) {\n qb.andWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n } else if (filterCombinator === FilterCombinator.OR) {\n qb.orWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n }\n }\n\n let finalLocale = locale\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used. \n if (!finalLocale) {\n //Get default locale from registry\n const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });\n const defaultLocale = solidRegistry.getDefaultLocale();\n if(defaultLocale){\n finalLocale = defaultLocale.locale;\n }else{\n finalLocale = 'en';\n }\n }\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow && status) {\n if (basicFilterDto.status === 'published') {\n qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);\n } else if (basicFilterDto.status === 'draft') {\n qb.andWhere(`${entityAlias}.publishedAt IS NULL`);\n }\n }\n // Depending upon the select option, apply the select clause\n if (normalizedFields && normalizedFields.length) {\n qb.select(normalizedFields.map(field => {\n // If the field contains a (, do not prefix the entity alias\n return this.wrapFieldWithAlias(field, entityAlias);\n }));\n }\n\n // Depending upon the order option, apply the order by clause\n if (applySorting && normalizedSort && normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n if (orderOptions) {\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n const field = String(key);\n if (field.includes('.')) {\n const { alias, property } = this.ensureRelationPathJoined(qb, entityAlias, field.split('.'));\n qb.addOrderBy(`${alias}.${property}`, value);\n } else {\n qb.addOrderBy(`${entityAlias}.${field}`, value);\n }\n });\n }\n }\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n qb.where(`${entityAlias}.deletedAt IS NOT NULL`);\n }\n\n // Apply the pagination options & handle the case when the query has joins\n if (applyPagination) {\n if (limit) this.hasJoins(qb) ? qb.take(limit) : qb.limit(limit);\n if (offset) this.hasJoins(qb) ? qb.skip(offset) : qb.offset(offset);\n }\n return qb;\n }\n\n additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia: string[]) {\n // Populate relations containing the media field\n return normalizedPopulateMedia\n .filter(pm => pm.includes(\".\"))\n .map((pm) => {\n const mediaPathParts = pm.split('.');\n if (mediaPathParts.length <= 1) return pm;\n return mediaPathParts.slice(0, -1).join('.');\n });\n }\n\n private buildPopulateQuery(normalizedPopulate: string[], entityAlias: string, qb: SelectQueryBuilder<any>) {\n normalizedPopulate.forEach((relation) => {\n this.buildJoinQueryForRelation(qb, entityAlias, relation);\n });\n return qb;\n }\n\n private sanitizeAlias(alias: string) {\n return alias.replace(/[^a-zA-Z0-9_]/g, '_');\n }\n\n private isAliasJoined(queryBuilder: SelectQueryBuilder<any>, alias: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.alias?.name === alias);\n }\n\n private getExistingJoinAlias(qb: SelectQueryBuilder<any>, joinProperty: string): string | undefined {\n const existingJoin = qb.expressionMap.joinAttributes.find(join => join.entityOrProperty === joinProperty);\n return existingJoin?.alias?.name;\n }\n\n private ensureRelationPathJoined(qb: SelectQueryBuilder<any>, rootAlias: string, pathParts: string[]) {\n const mainAlias =\n qb.expressionMap?.mainAlias?.name ||\n qb.expressionMap?.aliases?.find(a => a.metadata)?.name ||\n qb.expressionMap?.aliases?.[0]?.name;\n let parentAlias = mainAlias || rootAlias;\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n const joinProperty = `${parentAlias}.${part}`;\n const existingAlias = this.getExistingJoinAlias(qb, joinProperty);\n const joinAlias = existingAlias ?? this.sanitizeAlias(`${parentAlias}_${part}`);\n if (!existingAlias && !this.isRelationJoined(qb, joinProperty) && !this.isAliasJoined(qb, joinAlias)) {\n qb.leftJoin(joinProperty, joinAlias);\n }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: pathParts[pathParts.length - 1] };\n }\n\n private getDriver(qb: SelectQueryBuilder<any>) {\n return qb.connection.options.type as string;\n }\n\n private buildDateGranularityExpression(driver: string, columnExpr: string, granularity: string) {\n switch (driver) {\n case 'postgres':\n case 'cockroachdb':\n return `DATE_TRUNC('${granularity}', ${columnExpr})`;\n case 'mysql':\n case 'mariadb':\n switch (granularity) {\n case 'day': return `DATE(${columnExpr})`;\n case 'week': return `STR_TO_DATE(DATE_FORMAT(${columnExpr}, '%x-%v-1'), '%x-%v-%w')`;\n case 'month': return `DATE_FORMAT(${columnExpr}, '%Y-%m-01')`;\n case 'year': return `DATE_FORMAT(${columnExpr}, '%Y-01-01')`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n case 'mssql':\n case 'sqlserver':\n switch (granularity) {\n case 'day': return `CONVERT(date, ${columnExpr})`;\n case 'week': return `DATEADD(week, DATEDIFF(week, 0, ${columnExpr}), 0)`;\n case 'month': return `DATEFROMPARTS(YEAR(${columnExpr}), MONTH(${columnExpr}), 1)`;\n case 'year': return `DATEFROMPARTS(YEAR(${columnExpr}), 1, 1)`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n default:\n throw new Error(`Granularity not supported for driver ${driver}`);\n }\n }\n\n private buildGroupByExpression(qb: SelectQueryBuilder<any>, rootAlias: string, field: string) {\n const parts = field.split(':');\n const rawField = parts[0];\n const granularity = parts[1];\n const format = parts[2];\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const groupExpr = granularity ? this.buildDateGranularityExpression(this.getDriver(qb), columnExpr, granularity) : columnExpr;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}${granularity ? '_' + granularity : ''}`);\n return { groupExpr, selectAlias, sourceKey: field, format };\n }\n\n applyGroupBySelections(\n qb: SelectQueryBuilder<any>,\n groupBy: string[],\n entityAlias: string\n ) {\n const aliasMap: Record<string, string> = {};\n const formatMap: Record<string, string | undefined> = {};\n const expressionMap: Record<string, string> = {};\n qb.select([]);\n groupBy.forEach((field) => {\n const { groupExpr, selectAlias, sourceKey, format } = this.buildGroupByExpression(qb, entityAlias, field);\n qb.addSelect(groupExpr, selectAlias);\n qb.addGroupBy(groupExpr);\n aliasMap[sourceKey] = selectAlias;\n formatMap[selectAlias] = format;\n expressionMap[selectAlias] = groupExpr;\n });\n return { aliasMap, formatMap, expressionMap };\n }\n\n private buildAggregateExpression(qb: SelectQueryBuilder<any>, rootAlias: string, aggregate: string) {\n const [rawField, rawFn] = aggregate.split(':');\n const fn = (rawFn || 'count').toLowerCase();\n if ((!rawField || rawField.toLowerCase() === 'count') && fn === 'count') {\n return { expression: 'COUNT(*)', selectAlias: 'count' };\n }\n if (!rawField) throw new Error(`Invalid aggregate specification: ${aggregate}`);\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}_${fn}`);\n let expression = '';\n switch (fn) {\n case 'count': expression = `COUNT(${columnExpr})`; break;\n case 'count_distinct': expression = `COUNT(DISTINCT ${columnExpr})`; break;\n case 'sum': expression = `SUM(${columnExpr})`; break;\n case 'avg': expression = `AVG(${columnExpr})`; break;\n case 'min': expression = `MIN(${columnExpr})`; break;\n case 'max': expression = `MAX(${columnExpr})`; break;\n default: throw new Error(`Unsupported aggregate function ${fn}`);\n }\n return { expression, selectAlias, sourceKey: aggregate };\n }\n\n applyAggregates(\n qb: SelectQueryBuilder<any>,\n aggregates: string[] | undefined,\n entityAlias: string\n ) {\n const aggregateList = this.normalize(aggregates);\n const aggregateAliasMap: Record<string, string> = {};\n if (!aggregateList.length) {\n qb.addSelect('COUNT(*)', 'count');\n aggregateAliasMap['count'] = 'count';\n return aggregateAliasMap;\n }\n aggregateList.forEach((agg) => {\n const { expression, selectAlias, sourceKey } = this.buildAggregateExpression(qb, entityAlias, agg);\n qb.addSelect(expression, selectAlias);\n aggregateAliasMap[sourceKey] = selectAlias;\n });\n return aggregateAliasMap;\n }\n\n applyGroupSortingAndPagination(\n qb: SelectQueryBuilder<any>,\n sort: string[] | undefined,\n aliasMap: Record<string, string>,\n limit?: number,\n offset?: number\n ) {\n const normalizedSort = this.normalize(sort);\n if (normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n const resolvedKey = aliasMap[key] || key as string;\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`\"${resolvedKey}\"`, value);\n });\n }\n const hasLimit = limit !== undefined && limit !== null;\n const hasOffset = offset !== undefined && offset !== null;\n\n // Use both take/skip and limit/offset to ensure pagination is applied even when joins are present.\n if (hasLimit) {\n qb.take(limit);\n qb.limit(limit);\n }\n if (hasOffset) {\n qb.skip(offset);\n qb.offset(offset);\n }\n }\n\n async countGroups(qb: SelectQueryBuilder<any>) {\n const clone = qb.clone();\n clone.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n const rows = await clone.getRawMany();\n return rows.length;\n }\n\n private buildJoinQueryForRelation(qb: SelectQueryBuilder<any>, entityAlias: string, relation: string) {\n // We split the joinProperty to get the alias of the entity we are joining\n const relationParts = relation.split('.');\n let parentAlias = entityAlias;\n relationParts.forEach((part, i) => {\n const joinProperty = `${parentAlias}.${part}`;\n // Check if the relation is already joined, if not then join it\n if (!this.isRelationJoined(qb, joinProperty)) {\n const joinAlias = relationParts.slice(0, i + 1).join('_');\n qb.leftJoinAndSelect(joinProperty, joinAlias);\n }\n else {\n // Since in populate, we are create a unique alias based on the relation path\n //If the join is already present, it is probably because of the relation being passed in the where filter i.e applyFilters method\n qb.addSelect(`${part}`);\n }\n parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(field: string, entityAlias: string): string {\n if (!this.isAggregateField(field)) return `${entityAlias}.${field}`;\n // For aggregate fields, extract the field name from the aggregate function & wrap it with the entity alias, if it is not already wrapped\n const fieldParts = field.split('(');\n const aggregateFunction = fieldParts[0];\n const fieldName = fieldParts[1].replace(')', '');\n return `${aggregateFunction}(${entityAlias}.${fieldName})`;\n }\n\n isAggregateField(field: string): boolean {\n return field.includes('(');\n }\n\n isAggregateFieldKey(key: string, aggregateAliases: Set<string>): boolean {\n return aggregateAliases.has(key);\n }\n\n getFieldFromQueryFieldKey(queryFieldKey: string, alias: string): string {\n return queryFieldKey.replace(`${alias}_`, '');\n }\n\n buildGroupByRecordsQuery(\n qb: SelectQueryBuilder<any>,\n group: any,\n alias: string,\n groupAliasMap: Record<string, string> = {},\n aggregateAliasMap: Record<string, string> = {},\n groupExpressionMap: Record<string, string> = {}\n ): SelectQueryBuilder<any> {\n const rootAlias = qb.expressionMap?.mainAlias?.name\n ?? qb.expressionMap?.aliases?.find(a => a.metadata)?.name\n ?? qb.expressionMap?.aliases?.[0]?.name\n ?? (qb as any).alias\n ?? alias;\n qb.andWhere(new Brackets(qb => {\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n const reverseGroupAliasMap = Object.entries(groupAliasMap).reduce((acc, [sourceKey, aliasKey]) => {\n acc[aliasKey] = sourceKey;\n return acc;\n }, {} as Record<string, string>);\n for (const key in group) {\n if (group.hasOwnProperty(key) && !this.isAggregateFieldKey(key, aggregateAliasSet)) {\n const value = group[key];\n const sourceField = reverseGroupAliasMap[key] || key;\n const cleanedField = sourceField.split(':')[0];\n const pathParts = cleanedField.split('.');\n const { alias: resolvedAlias, property } = this.ensureRelationPathJoined(qb as any, rootAlias, pathParts);\n const paramKey = this.sanitizeAlias(`${resolvedAlias}_${property}_${key}`);\n const expr = (sourceField.includes(':') && groupExpressionMap[key])\n ? groupExpressionMap[key]\n : `${resolvedAlias}.${property}`;\n qb.andWhere(`${expr} = :${paramKey}`, { [paramKey]: value });\n }\n }\n }));\n return qb;\n }\n\n private formatGroupValue(value: any, format?: string) {\n if (!format) return value;\n if (value === null || value === undefined) return value;\n const dateVal = value instanceof Date ? value : new Date(value);\n if (isNaN(dateVal.getTime())) return value;\n switch (format) {\n case 'MMM':\n return dateVal.toLocaleString('en', { month: 'short' });\n case 'MMMM':\n return dateVal.toLocaleString('en', { month: 'long' });\n case 'YYYY':\n return dateVal.getFullYear();\n case 'YYYY-MM':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}`;\n case 'YYYY-MM-DD':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}-${String(dateVal.getDate()).padStart(2, '0')}`;\n default:\n return value;\n }\n }\n\n private getGroupFieldValues(\n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): Array<{ rawVal: any; alias: string; granularity?: string }> {\n return groupByFields\n .map(field => {\n const parts = field.split(':');\n const granularity = parts[1];\n const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\\./g, '_'));\n const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\\./g, '_')];\n return { rawVal, alias, granularity };\n })\n .filter(({ rawVal }) => rawVal !== undefined && rawVal !== null);\n }\n\n private normalizeGroupValue(value: any, granularity?: string): any {\n if (!granularity) return value;\n return this.formatGroupValue(value, 'YYYY-MM-DD');\n }\n\n getGroupName(\n group: any,\n aggregateAliases: Set<string>,\n groupByFields: string[],\n groupAliasMap: Record<string, string>,\n groupFormatMap: Record<string, string | undefined>\n ): string {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n\n if (fieldValues.length === 0) {\n return Object.keys(group)\n .filter(key => !this.isAggregateFieldKey(key, aggregateAliases))\n .map(key => group[key])\n .join('_');\n }\n\n return fieldValues\n .map(({ rawVal, alias }) => this.formatGroupValue(rawVal, groupFormatMap[alias]))\n .join('_');\n }\n\n getGroupValue( \n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): any {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n if (fieldValues.length === 1) return this.normalizeGroupValue(fieldValues[0].rawVal, fieldValues[0].granularity);\n return fieldValues.map(({ rawVal, granularity }) => this.normalizeGroupValue(rawVal, granularity)).join('_');\n }\n\n createGroupRecords(group: any, aggregateAliases: Set<string>, groupData: any, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n return {\n groupName,\n groupData\n }\n }\n createGroupMeta(group: any, aggregateAliases: Set<string>, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n const groupValue = this.getGroupValue(group, groupByFields, groupAliasMap);\n const groupAggregateValues = {}\n for (const key in group) {\n if (group.hasOwnProperty(key) && this.isAggregateFieldKey(key, aggregateAliases)) {\n const value = group[key];\n groupAggregateValues[key] = value;\n }\n }\n return {\n groupName,\n groupValue,\n ...groupAggregateValues\n };\n }\n\n async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any\n const { limit, offset, ...rest } = basicFilterDto;\n const filteredDto = { ...rest, limit: undefined, offset: undefined };\n\n const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, undefined, undefined, undefined, FilterCombinator.AND, false, false);\n\n const groupByFields = this.normalize(filteredDto.groupBy);\n\n if (!groupByFields || groupByFields.length === 0) {\n throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n }\n\n this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);\n this.applyAggregates(filteredQB, ['count'], entityAlias);\n filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n\n const rawResults = await filteredQB.getRawMany();\n return rawResults.length;\n }\n\n hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasWritePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`, `${classify(modelName)}Controller.insertMany`, `${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUpdatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasPublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUnpublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasDeletePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.delete`, `${classify(modelName)}Controller.deleteMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasCreatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasRecoverPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.recover`, `${classify(modelName)}Controller.recoverMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"crud-helper.service.js","sourceRoot":"","sources":["../../src/services/crud-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, SelectQueryBuilder, WhereExpressionBuilder } from \"typeorm\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { classify } from '../helpers/string.helper';\nimport { ActiveUserData } from \"src/interfaces/active-user-data.interface\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { BadRequestException, Logger } from \"@nestjs/common\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\n\nexport enum FilterCombinator {\n AND = '$and',\n OR = '$or'\n}\n\nexport enum UserIdFields {\n CREATED_BY = 'createdBy',\n UPDATED_BY = 'updatedBy'\n}\n\nexport class CrudHelperService {\n constructor(\n ) { }\n private readonly logger = new Logger(CrudHelperService.name);\n\n private orderOptions(sort: any[] = []) {\n const orderOptions = {};\n sort.forEach((s: string) => {\n const parts = s.split(':');\n let order: string | undefined;\n let field: string;\n if (parts.length > 1) {\n order = parts.pop();\n field = parts.join(':');\n } else {\n field = parts[0];\n }\n const normalizedOrder = order ? order.toUpperCase() : 'ASC';\n if (!['ASC', 'DESC'].includes(normalizedOrder)) {\n throw new Error(`Invalid sort order provided: ${order}`);\n }\n orderOptions[field] = normalizedOrder;\n });\n return orderOptions;\n }\n\n applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {\n const normalizedFilters = this.normalizeObjectKeys(filters);\n if (normalizedFilters.$and) {\n normalizedFilters.$and.forEach((andFilter: any) => {\n qb.andWhere(\n new Brackets(subQb => {\n this.applyFilters(subQb, andFilter, alias, selectQb);\n })\n );\n });\n } else if (normalizedFilters.$or) {\n normalizedFilters.$or.forEach((orFilter: any) => {\n qb.orWhere(new Brackets(subQb => {\n this.applyFilters(subQb, orFilter, alias, selectQb);\n }));\n });\n } else {\n // For individual conditions\n Object.keys(normalizedFilters).forEach(key => {\n const primaryFilterObj = normalizedFilters[key];\n const normalizedPrimaryFilterObj = this.normalizeObjectKeys(primaryFilterObj);\n\n const [rawField, funcAlias] = key.split(':');\n\n // Get the operator or field from the key\n const operatorOrField = Object.keys(normalizedPrimaryFilterObj)[0];\n // if the key is an operator, then build the query based on the operator\n if (operatorOrField.startsWith('$')) {\n const operator = operatorOrField;\n let columnExpression: string | undefined;\n if (funcAlias) {\n try {\n columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${rawField}`, funcAlias);\n } catch {\n throw new BadRequestException(`Unsupported field function '${funcAlias}'. Supported functions are: day, week, month, year.`);\n }\n }\n this.buildOperatorQuery(qb, alias, rawField, normalizedPrimaryFilterObj, operator, columnExpression);\n return;\n }\n else { // Recursively call the applyFilters method to handle nested conditions\n if (funcAlias) {\n throw new BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);\n }\n const joinField = `${alias}.${rawField}`;\n if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, rawField);\n this.applyFilters(qb, primaryFilterObj, rawField, selectQb);\n }\n });\n }\n }\n\n private buildOperatorQuery(qb: any, alias: string, field: string, normalizedPrimaryOperatorObj: any, operator: string, columnExpression?: string) {\n const uniqueFieldAlias = `${alias}_${field}_${Math.floor(Math.random() * 1000)}`;\n const colExpr = columnExpression ?? `${alias}.${field}`;\n switch (operator) {\n case '$eq':\n qb.andWhere(`${colExpr} = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eq });\n break;\n case '$eqi':\n qb.andWhere(`LOWER(${colExpr}) = :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$eqi.toLowerCase() });\n break;\n case '$ne':\n qb.andWhere(`${colExpr} != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$ne });\n break;\n case '$nei':\n qb.andWhere(`LOWER(${colExpr}) != :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$nei.toLowerCase() });\n break;\n case '$gt':\n qb.andWhere(`${colExpr} > :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gt });\n break;\n case '$gte':\n qb.andWhere(`${colExpr} >= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$gte });\n break;\n case '$lt':\n qb.andWhere(`${colExpr} < :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lt });\n break;\n case '$lte':\n qb.andWhere(`${colExpr} <= :${uniqueFieldAlias}`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$lte });\n break;\n case '$in':\n qb.andWhere(`${colExpr} IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$in });\n break;\n case '$notIn':\n qb.andWhere(`${colExpr} NOT IN (:...${uniqueFieldAlias})`, { [uniqueFieldAlias]: normalizedPrimaryOperatorObj.$notIn });\n break;\n case '$contains':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$contains}%` });\n break;\n case '$notContains':\n qb.andWhere(`${colExpr} NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContains}%` });\n break;\n case '$containsi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$containsi.toLowerCase()}%` });\n break;\n case '$notContainsi':\n qb.andWhere(`LOWER(${colExpr}) NOT LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$notContainsi.toLowerCase()}%` });\n break;\n case '$null':\n qb.andWhere(`${colExpr} IS NULL`);\n break;\n case '$notNull':\n qb.andWhere(`${colExpr} IS NOT NULL`);\n break;\n case '$between':\n qb.andWhere(`${colExpr} BETWEEN :${uniqueFieldAlias}0 AND :${uniqueFieldAlias}1`, { [`${uniqueFieldAlias}0`]: normalizedPrimaryOperatorObj.$between[0], [`${uniqueFieldAlias}1`]: normalizedPrimaryOperatorObj.$between[1] });\n break;\n case '$startsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWith}%` });\n break;\n case '$startsWithi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `${normalizedPrimaryOperatorObj.$startsWithi.toLowerCase()}%` });\n break;\n case '$endsWith':\n qb.andWhere(`${colExpr} LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWith}` });\n break;\n case '$endsWithi':\n qb.andWhere(`LOWER(${colExpr}) LIKE :${uniqueFieldAlias}`, { [uniqueFieldAlias]: `%${normalizedPrimaryOperatorObj.$endsWithi.toLowerCase()}` });\n break;\n default:\n throw new Error(`Operator ${operator} is not supported`);\n }\n }\n\n // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq\n private normalizeObjectKeys(obj: any): any {\n return Object.keys(obj).reduce((acc, key) => {\n // Transform the key by removing surrounding brackets\n const newKey = key.replace(/^\\[(.*)\\]$/, '$1');\n // Assign the value to the transformed key in the accumulator object\n acc[newKey] = obj[key];\n return acc;\n }, {});\n }\n\n normalize(value: string | string[]): string[] {\n if (!value) return []; // if the value is nullish, then return an empty array\n return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array\n }\n\n private normalizeAndFilterPopulateAttributes(value: string | string[]): string[] {\n // Normalize and remove the userId fields from the populate filter, since they are handled separately\n const normalized = this.normalize(value);\n return normalized.filter(item => item !== UserIdFields.CREATED_BY && item !== UserIdFields.UPDATED_BY);\n }\n\n extractUserIdFieldsFromPopulate(value: string | string[]): UserIdFields[] {\n const normalized = this.normalize(value);\n return normalized.filter(item => item === UserIdFields.CREATED_BY || item === UserIdFields.UPDATED_BY);\n }\n\n private isRelationJoined(queryBuilder: SelectQueryBuilder<any>, joinProperty: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.entityOrProperty === joinProperty);\n }\n\n private hasJoins(queryBuilder: SelectQueryBuilder<any>): boolean {\n return queryBuilder.expressionMap.joinAttributes.length > 0;\n }\n\n buildFilterQuery(\n qb: SelectQueryBuilder<any>,\n basicFilterDto: BasicFilterDto,\n entityAlias: string,\n internationalisation?: boolean,\n draftPublishWorkflow?: boolean,\n moduleRef?: any,\n filterCombinator: FilterCombinator = FilterCombinator.AND,\n applyPagination: boolean = true,\n applySorting: boolean = true\n ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any\n let { limit, offset, showSoftDeleted, filters } = basicFilterDto;\n const { fields, sort, populate = [], populateMedia = [], locale, status } = basicFilterDto;\n\n // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)\n const normalizedFields = this.normalize(fields);\n const normalizedAndFilteredPopulateAttributes = this.normalizeAndFilterPopulateAttributes(populate);\n const normalizedPopulateMedia = this.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedAndFilteredPopulateAttributes.push(...additionalPopulate.filter((relation) => !normalizedAndFilteredPopulateAttributes.includes(relation)));\n\n const normalizedSort = this.normalize(sort);\n\n // Depending upon the populate option, apply the join clause\n if (normalizedAndFilteredPopulateAttributes && normalizedAndFilteredPopulateAttributes.length) {\n this.buildPopulateQuery(normalizedAndFilteredPopulateAttributes, entityAlias, qb);\n }\n\n if (filters) {\n if (filterCombinator === FilterCombinator.AND) {\n qb.andWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n } else if (filterCombinator === FilterCombinator.OR) {\n qb.orWhere(new Brackets(whereQb => {\n this.applyFilters(whereQb, filters, entityAlias, qb);\n }));\n }\n }\n\n let finalLocale = locale\n if (internationalisation) {\n // If locale is not provided in the filter dto, then assume it is the default locale to be used. \n if (!finalLocale) {\n //Get default locale from registry\n const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });\n const defaultLocale = solidRegistry.getDefaultLocale();\n if(defaultLocale){\n finalLocale = defaultLocale.locale;\n }else{\n finalLocale = 'en';\n }\n }\n qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });\n }\n\n if (draftPublishWorkflow && status) {\n if (basicFilterDto.status === 'published') {\n qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);\n } else if (basicFilterDto.status === 'draft') {\n qb.andWhere(`${entityAlias}.publishedAt IS NULL`);\n }\n }\n // Depending upon the select option, apply the select clause\n if (normalizedFields && normalizedFields.length) {\n qb.select(normalizedFields.map(field => {\n // If the field contains a (, do not prefix the entity alias\n return this.wrapFieldWithAlias(field, entityAlias);\n }));\n }\n\n // Depending upon the order option, apply the order by clause\n if (applySorting && normalizedSort && normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n if (orderOptions) {\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n const value = orderOptions[key] as 'ASC' | 'DESC';\n const field = String(key);\n if (field.includes('.')) {\n const { alias, property } = this.ensureRelationPathJoined(qb, entityAlias, field.split('.'));\n qb.addOrderBy(`${alias}.${property}`, value);\n } else {\n qb.addOrderBy(`${entityAlias}.${field}`, value);\n }\n });\n }\n }\n\n if (showSoftDeleted === 'inclusive') {\n qb.withDeleted();\n }\n\n if (showSoftDeleted === 'exclusive') {\n qb.withDeleted();\n qb.where(`${entityAlias}.deletedAt IS NOT NULL`);\n }\n\n // Apply the pagination options & handle the case when the query has joins\n if (applyPagination) {\n if (limit) this.hasJoins(qb) ? qb.take(limit) : qb.limit(limit);\n if (offset) this.hasJoins(qb) ? qb.skip(offset) : qb.offset(offset);\n }\n return qb;\n }\n\n additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia: string[]) {\n // Populate relations containing the media field\n return normalizedPopulateMedia\n .filter(pm => pm.includes(\".\"))\n .map((pm) => {\n const mediaPathParts = pm.split('.');\n if (mediaPathParts.length <= 1) return pm;\n return mediaPathParts.slice(0, -1).join('.');\n });\n }\n\n private buildPopulateQuery(normalizedPopulate: string[], entityAlias: string, qb: SelectQueryBuilder<any>) {\n normalizedPopulate.forEach((relation) => {\n this.buildJoinQueryForRelation(qb, entityAlias, relation);\n });\n return qb;\n }\n\n private sanitizeAlias(alias: string) {\n return alias.replace(/[^a-zA-Z0-9_]/g, '_');\n }\n\n private isAliasJoined(queryBuilder: SelectQueryBuilder<any>, alias: string): boolean {\n return queryBuilder.expressionMap.joinAttributes.some(join => join.alias?.name === alias);\n }\n\n private getExistingJoinAlias(qb: SelectQueryBuilder<any>, joinProperty: string): string | undefined {\n const existingJoin = qb.expressionMap.joinAttributes.find(join => join.entityOrProperty === joinProperty);\n return existingJoin?.alias?.name;\n }\n\n private ensureRelationPathJoined(qb: SelectQueryBuilder<any>, rootAlias: string, pathParts: string[]) {\n const mainAlias =\n qb.expressionMap?.mainAlias?.name ||\n qb.expressionMap?.aliases?.find(a => a.metadata)?.name ||\n qb.expressionMap?.aliases?.[0]?.name;\n let parentAlias = mainAlias || rootAlias;\n for (let i = 0; i < pathParts.length - 1; i++) {\n const part = pathParts[i];\n const joinProperty = `${parentAlias}.${part}`;\n const existingAlias = this.getExistingJoinAlias(qb, joinProperty);\n const joinAlias = existingAlias ?? this.sanitizeAlias(`${parentAlias}_${part}`);\n if (!existingAlias && !this.isRelationJoined(qb, joinProperty) && !this.isAliasJoined(qb, joinAlias)) {\n qb.leftJoin(joinProperty, joinAlias);\n }\n parentAlias = joinAlias;\n }\n return { alias: parentAlias, property: pathParts[pathParts.length - 1] };\n }\n\n private getDriver(qb: SelectQueryBuilder<any>) {\n return qb.connection.options.type as string;\n }\n\n private buildDateGranularityExpression(driver: string, columnExpr: string, granularity: string) {\n switch (driver) {\n case 'postgres':\n case 'cockroachdb':\n return `DATE_TRUNC('${granularity}', ${columnExpr})`;\n case 'mysql':\n case 'mariadb':\n switch (granularity) {\n case 'day': return `DATE(${columnExpr})`;\n case 'week': return `STR_TO_DATE(DATE_FORMAT(${columnExpr}, '%x-%v-1'), '%x-%v-%w')`;\n case 'month': return `DATE_FORMAT(${columnExpr}, '%Y-%m-01')`;\n case 'year': return `DATE_FORMAT(${columnExpr}, '%Y-01-01')`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n case 'mssql':\n case 'sqlserver':\n switch (granularity) {\n case 'day': return `CONVERT(date, ${columnExpr})`;\n case 'week': return `DATEADD(week, DATEDIFF(week, 0, ${columnExpr}), 0)`;\n case 'month': return `DATEFROMPARTS(YEAR(${columnExpr}), MONTH(${columnExpr}), 1)`;\n case 'year': return `DATEFROMPARTS(YEAR(${columnExpr}), 1, 1)`;\n default: throw new Error(`Unsupported granularity ${granularity} for driver ${driver}`);\n }\n default:\n throw new Error(`Granularity not supported for driver ${driver}`);\n }\n }\n\n private buildGroupByExpression(qb: SelectQueryBuilder<any>, rootAlias: string, field: string) {\n const parts = field.split(':');\n const rawField = parts[0];\n const granularity = parts[1];\n const format = parts[2];\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const groupExpr = granularity ? this.buildDateGranularityExpression(this.getDriver(qb), columnExpr, granularity) : columnExpr;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}${granularity ? '_' + granularity : ''}`);\n return { groupExpr, selectAlias, sourceKey: field, format };\n }\n\n applyGroupBySelections(\n qb: SelectQueryBuilder<any>,\n groupBy: string[],\n entityAlias: string\n ) {\n const aliasMap: Record<string, string> = {};\n const formatMap: Record<string, string | undefined> = {};\n const expressionMap: Record<string, string> = {};\n qb.select([]);\n groupBy.forEach((field) => {\n const { groupExpr, selectAlias, sourceKey, format } = this.buildGroupByExpression(qb, entityAlias, field);\n qb.addSelect(groupExpr, selectAlias);\n qb.addGroupBy(groupExpr);\n aliasMap[sourceKey] = selectAlias;\n formatMap[selectAlias] = format;\n expressionMap[selectAlias] = groupExpr;\n });\n return { aliasMap, formatMap, expressionMap };\n }\n\n private buildAggregateExpression(qb: SelectQueryBuilder<any>, rootAlias: string, aggregate: string) {\n const [rawField, rawFn] = aggregate.split(':');\n const fn = (rawFn || 'count').toLowerCase();\n if ((!rawField || rawField.toLowerCase() === 'count') && fn === 'count') {\n return { expression: 'COUNT(*)', selectAlias: 'count' };\n }\n if (!rawField) throw new Error(`Invalid aggregate specification: ${aggregate}`);\n const pathParts = rawField.split('.');\n const { alias, property } = this.ensureRelationPathJoined(qb, rootAlias, pathParts);\n const columnExpr = `${alias}.${property}`;\n const selectAlias = this.sanitizeAlias(`${rawField.replace(/\\./g, '_')}_${fn}`);\n let expression = '';\n switch (fn) {\n case 'count': expression = `COUNT(${columnExpr})`; break;\n case 'count_distinct': expression = `COUNT(DISTINCT ${columnExpr})`; break;\n case 'sum': expression = `SUM(${columnExpr})`; break;\n case 'avg': expression = `AVG(${columnExpr})`; break;\n case 'min': expression = `MIN(${columnExpr})`; break;\n case 'max': expression = `MAX(${columnExpr})`; break;\n default: throw new Error(`Unsupported aggregate function ${fn}`);\n }\n return { expression, selectAlias, sourceKey: aggregate };\n }\n\n applyAggregates(\n qb: SelectQueryBuilder<any>,\n aggregates: string[] | undefined,\n entityAlias: string\n ) {\n const aggregateList = this.normalize(aggregates);\n const aggregateAliasMap: Record<string, string> = {};\n if (!aggregateList.length) {\n qb.addSelect('COUNT(*)', 'count');\n aggregateAliasMap['count'] = 'count';\n return aggregateAliasMap;\n }\n aggregateList.forEach((agg) => {\n const { expression, selectAlias, sourceKey } = this.buildAggregateExpression(qb, entityAlias, agg);\n qb.addSelect(expression, selectAlias);\n aggregateAliasMap[sourceKey] = selectAlias;\n });\n return aggregateAliasMap;\n }\n\n applyGroupSortingAndPagination(\n qb: SelectQueryBuilder<any>,\n sort: string[] | undefined,\n aliasMap: Record<string, string>,\n limit?: number,\n offset?: number\n ) {\n const normalizedSort = this.normalize(sort);\n if (normalizedSort.length) {\n const orderOptions = this.orderOptions(normalizedSort);\n const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;\n orderOptionKeys.forEach((key) => {\n const resolvedKey = aliasMap[key] || key as string;\n const value = orderOptions[key] as 'ASC' | 'DESC';\n qb.addOrderBy(`\"${resolvedKey}\"`, value);\n });\n }\n const hasLimit = limit !== undefined && limit !== null;\n const hasOffset = offset !== undefined && offset !== null;\n\n // Use both take/skip and limit/offset to ensure pagination is applied even when joins are present.\n if (hasLimit) {\n qb.take(limit);\n qb.limit(limit);\n }\n if (hasOffset) {\n qb.skip(offset);\n qb.offset(offset);\n }\n }\n\n async countGroups(qb: SelectQueryBuilder<any>) {\n const clone = qb.clone();\n clone.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n const rows = await clone.getRawMany();\n return rows.length;\n }\n\n private buildJoinQueryForRelation(qb: SelectQueryBuilder<any>, entityAlias: string, relation: string) {\n // We split the joinProperty to get the alias of the entity we are joining\n const relationParts = relation.split('.');\n let parentAlias = entityAlias;\n relationParts.forEach((part, i) => {\n const joinProperty = `${parentAlias}.${part}`;\n // Check if the relation is already joined, if not then join it\n if (!this.isRelationJoined(qb, joinProperty)) {\n const joinAlias = relationParts.slice(0, i + 1).join('_');\n qb.leftJoinAndSelect(joinProperty, joinAlias);\n }\n else {\n // Since in populate, we are create a unique alias based on the relation path\n //If the join is already present, it is probably because of the relation being passed in the where filter i.e applyFilters method\n qb.addSelect(`${part}`);\n }\n parentAlias = part; // Update the parent alias for the next iteration\n });\n return qb;\n }\n\n private wrapFieldWithAlias(field: string, entityAlias: string): string {\n if (!this.isAggregateField(field)) return `${entityAlias}.${field}`;\n // For aggregate fields, extract the field name from the aggregate function & wrap it with the entity alias, if it is not already wrapped\n const fieldParts = field.split('(');\n const aggregateFunction = fieldParts[0];\n const fieldName = fieldParts[1].replace(')', '');\n return `${aggregateFunction}(${entityAlias}.${fieldName})`;\n }\n\n isAggregateField(field: string): boolean {\n return field.includes('(');\n }\n\n isAggregateFieldKey(key: string, aggregateAliases: Set<string>): boolean {\n return aggregateAliases.has(key);\n }\n\n getFieldFromQueryFieldKey(queryFieldKey: string, alias: string): string {\n return queryFieldKey.replace(`${alias}_`, '');\n }\n\n buildGroupByRecordsQuery(\n qb: SelectQueryBuilder<any>,\n group: any,\n alias: string,\n groupAliasMap: Record<string, string> = {},\n aggregateAliasMap: Record<string, string> = {},\n groupExpressionMap: Record<string, string> = {}\n ): SelectQueryBuilder<any> {\n const rootAlias = qb.expressionMap?.mainAlias?.name\n ?? qb.expressionMap?.aliases?.find(a => a.metadata)?.name\n ?? qb.expressionMap?.aliases?.[0]?.name\n ?? (qb as any).alias\n ?? alias;\n qb.andWhere(new Brackets(qb => {\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n const reverseGroupAliasMap = Object.entries(groupAliasMap).reduce((acc, [sourceKey, aliasKey]) => {\n acc[aliasKey] = sourceKey;\n return acc;\n }, {} as Record<string, string>);\n for (const key in group) {\n if (group.hasOwnProperty(key) && !this.isAggregateFieldKey(key, aggregateAliasSet)) {\n const value = group[key];\n const sourceField = reverseGroupAliasMap[key] || key;\n const cleanedField = sourceField.split(':')[0];\n const pathParts = cleanedField.split('.');\n const { alias: resolvedAlias, property } = this.ensureRelationPathJoined(qb as any, rootAlias, pathParts);\n const paramKey = this.sanitizeAlias(`${resolvedAlias}_${property}_${key}`);\n const expr = (sourceField.includes(':') && groupExpressionMap[key])\n ? groupExpressionMap[key]\n : `${resolvedAlias}.${property}`;\n qb.andWhere(`${expr} = :${paramKey}`, { [paramKey]: value });\n }\n }\n }));\n return qb;\n }\n\n private formatGroupValue(value: any, format?: string) {\n if (!format) return value;\n if (value === null || value === undefined) return value;\n const dateVal = value instanceof Date ? value : new Date(value);\n if (isNaN(dateVal.getTime())) return value;\n switch (format) {\n case 'MMM':\n return dateVal.toLocaleString('en', { month: 'short' });\n case 'MMMM':\n return dateVal.toLocaleString('en', { month: 'long' });\n case 'YYYY':\n return dateVal.getFullYear();\n case 'YYYY-MM':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}`;\n case 'YYYY-MM-DD':\n return `${dateVal.getFullYear()}-${String(dateVal.getMonth() + 1).padStart(2, '0')}-${String(dateVal.getDate()).padStart(2, '0')}`;\n default:\n return value;\n }\n }\n\n private getGroupFieldValues(\n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): Array<{ rawVal: any; alias: string; granularity?: string }> {\n return groupByFields\n .map(field => {\n const parts = field.split(':');\n const granularity = parts[1];\n const alias = groupAliasMap[field] ?? this.sanitizeAlias(field.replace(/\\./g, '_'));\n const rawVal = group[alias] ?? group[field] ?? group[field.replace(/\\./g, '_')];\n return { rawVal, alias, granularity };\n })\n .filter(({ rawVal }) => rawVal !== undefined && rawVal !== null);\n }\n\n private normalizeGroupValue(value: any, granularity?: string): any {\n if (!granularity) return value;\n return this.formatGroupValue(value, 'YYYY-MM-DD');\n }\n\n getGroupName(\n group: any,\n aggregateAliases: Set<string>,\n groupByFields: string[],\n groupAliasMap: Record<string, string>,\n groupFormatMap: Record<string, string | undefined>\n ): string {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n\n if (fieldValues.length === 0) {\n return Object.keys(group)\n .filter(key => !this.isAggregateFieldKey(key, aggregateAliases))\n .map(key => group[key])\n .join('_');\n }\n\n return fieldValues\n .map(({ rawVal, alias }) => this.formatGroupValue(rawVal, groupFormatMap[alias]))\n .join('_');\n }\n\n getGroupValue( \n group: any,\n groupByFields: string[],\n groupAliasMap: Record<string, string>\n ): any {\n const fieldValues = this.getGroupFieldValues(group, groupByFields, groupAliasMap);\n if (fieldValues.length === 1) return this.normalizeGroupValue(fieldValues[0].rawVal, fieldValues[0].granularity);\n return fieldValues.map(({ rawVal, granularity }) => this.normalizeGroupValue(rawVal, granularity)).join('_');\n }\n\n createGroupRecords(group: any, aggregateAliases: Set<string>, groupData: any, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n return {\n groupName,\n groupData\n }\n }\n createGroupMeta(group: any, aggregateAliases: Set<string>, groupByFields: string[], groupAliasMap: Record<string, string>, groupFormatMap: Record<string, string | undefined>) {\n const groupName = this.getGroupName(group, aggregateAliases, groupByFields, groupAliasMap, groupFormatMap);\n const groupValue = this.getGroupValue(group, groupByFields, groupAliasMap);\n const groupAggregateValues = {}\n for (const key in group) {\n if (group.hasOwnProperty(key) && this.isAggregateFieldKey(key, aggregateAliases)) {\n const value = group[key];\n groupAggregateValues[key] = value;\n }\n }\n return {\n groupName,\n groupValue,\n ...groupAggregateValues\n };\n }\n\n async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any\n const { limit, offset, ...rest } = basicFilterDto;\n const filteredDto = { ...rest, limit: undefined, offset: undefined };\n\n const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, undefined, undefined, undefined, FilterCombinator.AND, false, false);\n\n const groupByFields = this.normalize(filteredDto.groupBy);\n\n if (!groupByFields || groupByFields.length === 0) {\n throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n }\n\n this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);\n this.applyAggregates(filteredQB, ['count'], entityAlias);\n filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);\n\n const rawResults = await filteredQB.getRawMany();\n return rawResults.length;\n }\n\n hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasWritePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`, `${classify(modelName)}Controller.insertMany`, `${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUpdatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.update`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasPublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasUnpublishPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.publish`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n hasDeletePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.delete`, `${classify(modelName)}Controller.deleteMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasCreatePermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.create`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n hasRecoverPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {\n const permissionNames = [`${classify(modelName)}Controller.recover`, `${classify(modelName)}Controller.recoverMany`];\n const matchingPermssions = activeUser.permissions.filter((p) => permissionNames.includes(p));\n return matchingPermssions.length > 0\n }\n\n pagedResponse<T>(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {\n const safeLimit = limit ?? count ?? 0;\n const safeOffset = offset ?? 0;\n const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;\n const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;\n const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;\n return {\n meta: {\n totalRecords: count,\n currentPage,\n nextPage,\n prevPage,\n totalPages,\n perPage: safeLimit ? +safeLimit : 0,\n },\n records: entities,\n };\n }\n\n async executeGroupPipeline<T>(\n filterQb: SelectQueryBuilder<T>,\n basicFilterDto: BasicFilterDto,\n alias: string,\n createQbFn: () => Promise<SelectQueryBuilder<T>>,\n postProcessEntities?: (entities: T[]) => Promise<void>\n ): Promise<{ meta: { totalRecords: number }; groupMeta: any[]; groupRecords: any[] }> {\n const groupByFields = this.normalize(basicFilterDto.groupBy);\n if (!groupByFields.length) throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);\n\n if (basicFilterDto.populateGroup) {\n const hasRelationGroup = groupByFields.some(f => f.includes('.'));\n if (hasRelationGroup) throw new BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');\n }\n\n const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } =\n this.applyGroupBySelections(filterQb, groupByFields, alias);\n const aggregateAliasMap = this.applyAggregates(filterQb, basicFilterDto.aggregates, alias);\n this.applyGroupSortingAndPagination(filterQb, basicFilterDto.sort, { ...groupAliasMap, ...aggregateAliasMap }, basicFilterDto.limit, basicFilterDto.offset);\n\n const groupByResult = await filterQb.getRawMany();\n const totalGroups = await this.countGroups(filterQb);\n const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));\n\n const groupMeta = [];\n const groupRecords = [];\n\n for (const group of groupByResult) {\n groupMeta.push(this.createGroupMeta(group, aggregateAliasSet, groupByFields, groupAliasMap, groupFormatMap));\n\n if (basicFilterDto.populateGroup) {\n let groupQb = await createQbFn();\n const { groupBy: _gb, aggregates: _agg, ...rest } = basicFilterDto;\n const groupFilterDto: BasicFilterDto = {\n ...rest,\n ...basicFilterDto.groupFilter,\n groupBy: undefined,\n aggregates: undefined,\n sort: basicFilterDto.groupFilter?.sort,\n };\n groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);\n groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);\n const [entities, count] = await groupQb.getManyAndCount();\n if (postProcessEntities) await postProcessEntities(entities);\n const groupData = this.pagedResponse(basicFilterDto.groupFilter?.offset, basicFilterDto.groupFilter?.limit, count, entities);\n groupRecords.push(this.createGroupRecords(group, aggregateAliasSet, groupData, groupByFields, groupAliasMap, groupFormatMap));\n }\n }\n\n return { meta: { totalRecords: totalGroups }, groupMeta, groupRecords };\n }\n\n}\n"]}
|
|
@@ -33,28 +33,8 @@ export declare class CRUDService<T extends CommonEntity> {
|
|
|
33
33
|
delete(id: number, solidRequestContext?: any): Promise<T>;
|
|
34
34
|
private fieldCrudManager;
|
|
35
35
|
private isSkipComputation;
|
|
36
|
-
find(basicFilterDto: BasicFilterDto, solidRequestContext?: any): Promise<
|
|
37
|
-
meta: {
|
|
38
|
-
totalRecords: number;
|
|
39
|
-
};
|
|
40
|
-
groupMeta: any[];
|
|
41
|
-
groupRecords: any[];
|
|
42
|
-
records?: undefined;
|
|
43
|
-
} | {
|
|
44
|
-
meta: {
|
|
45
|
-
totalRecords: number;
|
|
46
|
-
currentPage: number;
|
|
47
|
-
nextPage: number;
|
|
48
|
-
prevPage: number;
|
|
49
|
-
totalPages: number;
|
|
50
|
-
perPage: number;
|
|
51
|
-
};
|
|
52
|
-
records: T[];
|
|
53
|
-
groupMeta?: undefined;
|
|
54
|
-
groupRecords?: undefined;
|
|
55
|
-
}>;
|
|
36
|
+
find(basicFilterDto: BasicFilterDto, solidRequestContext?: any): Promise<any>;
|
|
56
37
|
private handleNonGroupFind;
|
|
57
|
-
private handleGroupFind;
|
|
58
38
|
private wrapFindResponse;
|
|
59
39
|
private handlePopulateUserIdFields;
|
|
60
40
|
private handlePopulateMedia;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAA2E,MAAM,SAAS,CAAC;AAEjH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAsBlE,OAAO,EAAoB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAkC,MAAM,uBAAuB,CAAC;AAI1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,aAAa,EAA2E,MAAM,SAAS,CAAC;AAEjH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAsBlE,OAAO,EAAoB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAkC,MAAM,uBAAuB,CAAC;AAI1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,qBAAa,WAAW,CAAC,CAAC,SAAS,YAAY;IAQvC,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,8BAA8B,CAAC,EAAE,aAAa;IAX3D,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,iBAAiB,CAAmB;IAC5C,OAAO,CAAC,eAAe,CAAiB;gBAG3B,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,8BAA8B,CAAC,EAAE,aAAa;IAG3D,SAAS,KAAK,oBAAoB,IAAI,oBAAoB,CAEzD;IAED,SAAS,KAAK,iBAAiB,IAAI,iBAAiB,CAEnD;IAED,SAAS,KAAK,gBAAgB,IAAI,gBAAgB,CAEjD;IAED,SAAS,KAAK,cAAc,IAAI,cAAc,CAE7C;YAEa,wBAAwB;IAahC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,GAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAO,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;YAgD5F,SAAS;YAYT,uBAAuB;YAavB,SAAS;IAyBjB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,GAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAO,EAAE,eAAe,GAAE,OAAe,EAAE,mBAAmB,GAAE,GAAQ,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,CAAC,CAAC;IAgE7K,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAE,GAAQ;YA0DxC,gBAAgB;IAmK9B,OAAO,CAAC,iBAAiB;IAQnB,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;YAgDzE,kBAAkB;IAgBhC,OAAO,CAAC,gBAAgB;YAOV,0BAA0B;YAgB1B,mBAAmB;YAkBnB,mBAAmB;IAiCjC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,qBAAqB;IAavB,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,kBAAkB,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAQrG,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,GAAQ,EAAE,mBAAmB,GAAE,GAAQ;IAuClE,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAwC1E,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,UAAU,GAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAO,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAKpH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAiEtE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAE,GAAQ;;;;IAuCjD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAE,GAAQ;;;;IA+CxD,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;IAiCxE,2BAA2B,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASvE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IA0CpE,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,mBAAmB,GAAE,GAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;IAyC5E,OAAO,CAAC,iCAAiC;CAG5C"}
|
|
@@ -400,7 +400,7 @@ class CRUDService {
|
|
|
400
400
|
}
|
|
401
401
|
async find(basicFilterDto, solidRequestContext = {}) {
|
|
402
402
|
const alias = 'entity';
|
|
403
|
-
let { limit, offset, populateMedia
|
|
403
|
+
let { limit, offset, populateMedia } = basicFilterDto;
|
|
404
404
|
const populateUserIdFields = this.crudHelperService.extractUserIdFieldsFromPopulate(basicFilterDto.populate);
|
|
405
405
|
const { singularName, internationalisation, draftPublishWorkflow } = await this.loadModel();
|
|
406
406
|
if (solidRequestContext.activeUser) {
|
|
@@ -412,35 +412,16 @@ class CRUDService {
|
|
|
412
412
|
const requestContextService = this.moduleRef.get(request_context_service_1.RequestContextService, { strict: false });
|
|
413
413
|
requestContextService.setRequestFilter(basicFilterDto);
|
|
414
414
|
var qb = await this.repo.createSecurityRuleAwareQueryBuilder(alias);
|
|
415
|
-
if (basicFilterDto.groupBy) {
|
|
415
|
+
if (basicFilterDto.groupBy?.length) {
|
|
416
416
|
const groupFilterQb = (internationalisation && draftPublishWorkflow)
|
|
417
417
|
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, crud_helper_service_1.FilterCombinator.AND, false, false)
|
|
418
418
|
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, crud_helper_service_1.FilterCombinator.AND, false, false);
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
if (hasRelationGroup) {
|
|
426
|
-
throw new common_1.BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } = this.crudHelperService.applyGroupBySelections(groupFilterQb, groupByFields, alias);
|
|
430
|
-
const aggregateAliasMap = this.crudHelperService.applyAggregates(groupFilterQb, basicFilterDto.aggregates, alias);
|
|
431
|
-
const sortAliasMap = { ...groupAliasMap, ...aggregateAliasMap };
|
|
432
|
-
this.crudHelperService.applyGroupSortingAndPagination(groupFilterQb, basicFilterDto.sort, sortAliasMap, limit, offset);
|
|
433
|
-
const groupByResult = await groupFilterQb.getRawMany();
|
|
434
|
-
const totalGroups = await this.crudHelperService.countGroups(groupFilterQb);
|
|
435
|
-
const groupByFieldsOrdered = this.crudHelperService.normalize(basicFilterDto.groupBy || []);
|
|
436
|
-
const { groupMeta, groupRecords } = await this.handleGroupFind(groupByResult, groupFilter, populateGroup, alias, populateUserIdFields, populateMedia, basicFilterDto, groupAliasMap, aggregateAliasMap, groupByFieldsOrdered, groupFormatMap, groupExpressionMap);
|
|
437
|
-
return {
|
|
438
|
-
meta: {
|
|
439
|
-
"totalRecords": totalGroups
|
|
440
|
-
},
|
|
441
|
-
groupMeta,
|
|
442
|
-
groupRecords,
|
|
443
|
-
};
|
|
419
|
+
return this.crudHelperService.executeGroupPipeline(groupFilterQb, basicFilterDto, alias, () => this.repo.createSecurityRuleAwareQueryBuilder(alias), async (entities) => {
|
|
420
|
+
if (populateUserIdFields?.length)
|
|
421
|
+
await this.handlePopulateUserIdFields(populateUserIdFields, entities);
|
|
422
|
+
if (populateMedia?.length)
|
|
423
|
+
await this.handlePopulateMedia(populateMedia, entities);
|
|
424
|
+
});
|
|
444
425
|
}
|
|
445
426
|
else {
|
|
446
427
|
qb = (internationalisation && draftPublishWorkflow)
|
|
@@ -463,55 +444,8 @@ class CRUDService {
|
|
|
463
444
|
}
|
|
464
445
|
return this.wrapFindResponse(offset, limit, count, entities);
|
|
465
446
|
}
|
|
466
|
-
async handleGroupFind(groupByResult, groupFilter, populateGroup, alias, populateUserIdFields, populateMedia, baseFilterDto, groupAliasMap, aggregateAliasMap, groupByFieldsOrdered, groupFormatMap, groupExpressionMap) {
|
|
467
|
-
const groupMeta = [];
|
|
468
|
-
const groupRecords = [];
|
|
469
|
-
const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));
|
|
470
|
-
for (const group of groupByResult) {
|
|
471
|
-
if (populateGroup) {
|
|
472
|
-
let groupByQb = await this.repo.createSecurityRuleAwareQueryBuilder(alias);
|
|
473
|
-
const groupFilterDto = {
|
|
474
|
-
...baseFilterDto,
|
|
475
|
-
...groupFilter,
|
|
476
|
-
groupBy: undefined,
|
|
477
|
-
aggregates: undefined,
|
|
478
|
-
sort: groupFilter?.sort,
|
|
479
|
-
};
|
|
480
|
-
groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilterDto, alias);
|
|
481
|
-
groupByQb = this.crudHelperService.buildGroupByRecordsQuery(groupByQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
|
|
482
|
-
const [entities, count] = await groupByQb.getManyAndCount();
|
|
483
|
-
if (populateUserIdFields && populateUserIdFields.length > 0) {
|
|
484
|
-
await this.handlePopulateUserIdFields(populateUserIdFields, entities);
|
|
485
|
-
}
|
|
486
|
-
if (populateMedia && populateMedia.length > 0) {
|
|
487
|
-
await this.handlePopulateMedia(populateMedia, entities);
|
|
488
|
-
}
|
|
489
|
-
const groupData = this.wrapFindResponse(groupFilter?.offset, groupFilter?.limit, count, entities);
|
|
490
|
-
groupRecords.push(this.crudHelperService.createGroupRecords(group, aggregateAliasSet, groupData, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
|
|
491
|
-
}
|
|
492
|
-
groupMeta.push(this.crudHelperService.createGroupMeta(group, aggregateAliasSet, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
|
|
493
|
-
}
|
|
494
|
-
return { groupMeta, groupRecords };
|
|
495
|
-
}
|
|
496
447
|
wrapFindResponse(offset, limit, count, entities) {
|
|
497
|
-
|
|
498
|
-
const safeOffset = offset ?? 0;
|
|
499
|
-
const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;
|
|
500
|
-
const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;
|
|
501
|
-
const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;
|
|
502
|
-
const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;
|
|
503
|
-
const r = {
|
|
504
|
-
meta: {
|
|
505
|
-
totalRecords: count,
|
|
506
|
-
currentPage: currentPage,
|
|
507
|
-
nextPage: nextPage,
|
|
508
|
-
prevPage: prevPage,
|
|
509
|
-
totalPages: totalPages,
|
|
510
|
-
perPage: safeLimit ? +safeLimit : 0,
|
|
511
|
-
},
|
|
512
|
-
records: entities
|
|
513
|
-
};
|
|
514
|
-
return r;
|
|
448
|
+
return this.crudHelperService.pagedResponse(offset, limit, count, entities);
|
|
515
449
|
}
|
|
516
450
|
async handlePopulateUserIdFields(userIdFields, entities) {
|
|
517
451
|
const userRepository = this.entityManager.getRepository(user_entity_1.User);
|