@solidxai/core 0.1.13-beta.7 → 0.1.13-beta.8
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/.claude/settings.local.json +16 -0
- package/CHANGELOG.md +548 -0
- package/CLAUDE.md +26 -0
- package/dist/constants/draft-publish-fields.d.ts +2 -0
- package/dist/constants/draft-publish-fields.d.ts.map +1 -0
- package/dist/constants/draft-publish-fields.js +5 -0
- package/dist/constants/draft-publish-fields.js.map +1 -0
- package/dist/constants/media-file-types.d.ts +9 -0
- package/dist/constants/media-file-types.d.ts.map +1 -1
- package/dist/constants/media-file-types.js +27 -1
- package/dist/constants/media-file-types.js.map +1 -1
- package/dist/controllers/action-metadata.controller.d.ts +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/agent-event.controller.d.ts +1 -1
- package/dist/controllers/agent-event.controller.js +1 -1
- package/dist/controllers/agent-session.controller.d.ts +1 -1
- package/dist/controllers/agent-session.controller.js +1 -1
- package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
- package/dist/controllers/dashboard-user-layout.controller.js +1 -1
- package/dist/controllers/email-template.controller.d.ts +1 -1
- package/dist/controllers/email-template.controller.js +1 -1
- package/dist/controllers/export-template.controller.d.ts +1 -1
- package/dist/controllers/export-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-template.controller.js +6 -4
- package/dist/controllers/export-template.controller.js.map +1 -1
- package/dist/controllers/export-transaction.controller.d.ts +1 -1
- package/dist/controllers/export-transaction.controller.js +1 -1
- package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
- package/dist/controllers/import-transaction-error-log.controller.js +1 -1
- package/dist/controllers/import-transaction.controller.d.ts +1 -1
- package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction.controller.js +7 -7
- package/dist/controllers/import-transaction.controller.js.map +1 -1
- package/dist/controllers/list-of-values.controller.d.ts +1 -1
- package/dist/controllers/list-of-values.controller.js +1 -1
- package/dist/controllers/locale.controller.d.ts +1 -1
- package/dist/controllers/locale.controller.js +1 -1
- package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
- package/dist/controllers/mcp-audit-log.controller.js +1 -1
- package/dist/controllers/media.controller.d.ts +1 -1
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +12 -7
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/model-sequence.controller.d.ts +1 -1
- package/dist/controllers/model-sequence.controller.js +1 -1
- package/dist/controllers/module-package.controller.d.ts.map +1 -1
- package/dist/controllers/module-package.controller.js +2 -3
- package/dist/controllers/module-package.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message.controller.d.ts +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/permission-metadata.controller.d.ts +1 -1
- package/dist/controllers/permission-metadata.controller.js +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -1
- package/dist/controllers/role-metadata.controller.js +1 -1
- package/dist/controllers/saved-filters.controller.d.ts +1 -1
- package/dist/controllers/saved-filters.controller.js +1 -1
- package/dist/controllers/scheduled-job.controller.d.ts +1 -1
- package/dist/controllers/scheduled-job.controller.js +1 -1
- package/dist/controllers/security-rule.controller.d.ts +1 -1
- package/dist/controllers/security-rule.controller.js +1 -1
- package/dist/controllers/sms-template.controller.d.ts +1 -1
- package/dist/controllers/sms-template.controller.js +1 -1
- package/dist/controllers/user-activity-history.controller.d.ts +1 -1
- package/dist/controllers/user-activity-history.controller.js +1 -1
- package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
- package/dist/controllers/user-view-metadata.controller.js +1 -1
- package/dist/controllers/user.controller.d.ts +2 -2
- package/dist/controllers/user.controller.js +2 -2
- package/dist/controllers/view-metadata.controller.d.ts +2 -2
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/workflow-definition.controller.d.ts +1 -1
- package/dist/controllers/workflow-definition.controller.js +1 -1
- package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
- package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution-log.controller.js +1 -1
- package/dist/controllers/workflow-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution.controller.js +1 -1
- package/dist/controllers/workflow-secret.controller.d.ts +1 -1
- package/dist/controllers/workflow-secret.controller.js +1 -1
- package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-step-execution.controller.js +1 -1
- package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
- package/dist/dtos/basic-filters.dto.d.ts +0 -1
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js +1 -6
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/entities/common.entity.d.ts +4 -0
- package/dist/entities/common.entity.d.ts.map +1 -1
- package/dist/entities/common.entity.js +25 -1
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/user.entity.js +2 -2
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/factories/mail.factory.d.ts.map +1 -1
- package/dist/factories/mail.factory.js +4 -0
- package/dist/factories/mail.factory.js.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
- package/dist/helpers/file-download.helper.d.ts +9 -0
- package/dist/helpers/file-download.helper.d.ts.map +1 -0
- package/dist/helpers/file-download.helper.js +14 -0
- package/dist/helpers/file-download.helper.js.map +1 -0
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +30 -1
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/solid-registry.js +1 -1
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +3 -1
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +8 -2
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +2 -0
- package/dist/services/authentication.service.d.ts +4 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +52 -4
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +1 -0
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +8 -0
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +5 -2
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +30 -32
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +11 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +79 -66
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/datasource-introspection.service.d.ts.map +1 -1
- package/dist/services/datasource-introspection.service.js.map +1 -1
- package/dist/services/draft-publish-helper.service.d.ts +52 -0
- package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
- package/dist/services/draft-publish-helper.service.js +368 -0
- package/dist/services/draft-publish-helper.service.js.map +1 -0
- package/dist/services/internationalisation-helper.service.d.ts +19 -0
- package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
- package/dist/services/internationalisation-helper.service.js +107 -0
- package/dist/services/internationalisation-helper.service.js.map +1 -0
- package/dist/services/locale.service.d.ts +1 -1
- package/dist/services/media.service.d.ts +2 -1
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +28 -2
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/metadata-validation.service.d.ts +7 -0
- package/dist/services/metadata-validation.service.d.ts.map +1 -0
- package/dist/services/metadata-validation.service.js +42 -0
- package/dist/services/metadata-validation.service.js.map +1 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +2 -1
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/object.utils.d.ts +2 -0
- package/dist/services/object.utils.d.ts.map +1 -0
- package/dist/services/object.utils.js +11 -0
- package/dist/services/object.utils.js.map +1 -0
- package/dist/services/settings/default-settings-provider.service.d.ts +6 -6
- package/dist/services/settings/default-settings-provider.service.js +3 -3
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/user.service.d.ts +2 -2
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +9 -3
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +1 -2
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +3 -55
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/workflow-definition.service.d.ts +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +10 -1
- package/dist/solid-core.module.js.map +1 -1
- package/package.json +1 -1
- package/src/constants/draft-publish-fields.ts +5 -0
- package/src/constants/media-file-types.ts +50 -0
- package/src/controllers/export-template.controller.ts +5 -3
- package/src/controllers/import-transaction.controller.ts +6 -6
- package/src/controllers/media.controller.ts +17 -6
- package/src/controllers/module-package.controller.ts +2 -3
- package/src/dtos/basic-filters.dto.ts +0 -4
- package/src/entities/common.entity.ts +20 -0
- package/src/entities/user.entity.ts +2 -2
- package/src/factories/mail.factory.ts +7 -1
- package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
- package/src/helpers/file-download.helper.ts +31 -0
- package/src/helpers/model-metadata-helper.service.ts +32 -1
- package/src/helpers/solid-registry.ts +1 -1
- package/src/index.ts +2 -0
- package/src/seeders/module-test-data.service.ts +6 -0
- package/src/seeders/seed-data/solid-core-metadata.json +2 -0
- package/src/services/1.js +6 -0
- package/src/services/authentication.service.ts +76 -5
- package/src/services/chatter-message.service.ts +16 -0
- package/src/services/crud-helper.service.ts +16 -34
- package/src/services/crud.service.ts +98 -103
- package/src/services/datasource-introspection.service.ts +5 -0
- package/src/services/draft-publish-helper.service.ts +529 -0
- package/src/services/internationalisation-helper.service.ts +148 -0
- package/src/services/media.service.ts +48 -3
- package/src/services/metadata-validation.service.ts +39 -0
- package/src/services/model-metadata.service.ts +4 -1
- package/src/services/object.utils.ts +10 -0
- package/src/services/settings/default-settings-provider.service.ts +3 -3
- package/src/services/user.service.ts +18 -3
- package/src/services/view-metadata.service.ts +5 -145
- package/src/solid-core.module.ts +16 -3
- package/dist-tests/api/authenticate.spec.js +0 -119
- package/dist-tests/api/authenticate.spec.js.map +0 -1
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
- package/dist-tests/api/ping.spec.js +0 -21
- package/dist-tests/api/ping.spec.js.map +0 -1
- package/dist-tests/helpers/auth.js +0 -41
- package/dist-tests/helpers/auth.js.map +0 -1
- package/dist-tests/helpers/env.js +0 -11
- package/dist-tests/helpers/env.js.map +0 -1
- package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +0 -136
- package/docs/agent-builder/team-ready-note-agent-builder.md +0 -305
- package/docs/agent-hub-grooming.md +0 -301
- package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
- package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
- package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
- package/docs/datasource-introspection-ddl-analysis.md +0 -326
- package/docs/datasource-introspection-implementation-plan.md +0 -306
- package/docs/grouping-enhancements.md +0 -89
- package/docs/java-spring/README.md +0 -3
- package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
- package/docs/module-package-import-handoff.md +0 -691
- package/docs/seed-changes.md +0 -65
- package/docs/test-data-workflow.md +0 -200
- package/docs/type-declaration-import-issue.md +0 -24
- package/docs/workflow/business-automation-example-notes.md +0 -309
- package/docs/workflow/control-flow-node-addition-sop.md +0 -324
- package/docs/workflow/data-engineering-pipeline-example-notes.md +0 -330
- package/docs/workflow/foreach-example-notes.md +0 -187
- package/docs/workflow/hello-world-example-notes.md +0 -271
- package/docs/workflow/kestra-concepts-plugins-blueprints.md +0 -315
- package/docs/workflow/loop-until-example-notes.md +0 -198
- package/docs/workflow/microservices-and-apis-example-notes.md +0 -264
- package/docs/workflow/samples.md +0 -25
- package/docs/workflow/what-is-kestra.md +0 -79
- package/docs/workflow/workflow-core-module-handoff-summary.md +0 -191
- package/docs/workflow/workflow-module-brd.md +0 -185
- package/docs/workflow/workflow-module-domain-model.md +0 -252
- package/docs/workflow/workflow-module-metadata-dsl.md +0 -302
- package/docs/workflow/workflow-module-technical-spec.md +0 -293
- package/docs/workflow/workflow-node-type-contracts.md +0 -635
- package/docs/workflow/workflow-node-ui-metadata-contract.md +0 -1262
- package/docs/workflow/workflow-solidx-model-field-spec.md +0 -284
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basic-filters.dto.d.ts","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,oBAAY,gBAAgB;IACxB,SAAS,cAAc;IACvB,SAAS,cAAc;CAC1B;AAED,qBAAa,cAAe,SAAQ,kBAAkB;IAIlD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAI3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAI5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAI/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAI7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAYlC,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAI5C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAIjC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IAIjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"basic-filters.dto.d.ts","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,oBAAY,gBAAgB;IACxB,SAAS,cAAc;IACvB,SAAS,cAAc;CAC1B;AAED,qBAAa,cAAe,SAAQ,kBAAkB;IAIlD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAI3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAI5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAI/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAI7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAYlC,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAI5C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAIjC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IAIjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAK5B"}
|
|
@@ -22,7 +22,7 @@ var SoftDeleteFilter;
|
|
|
22
22
|
})(SoftDeleteFilter || (exports.SoftDeleteFilter = SoftDeleteFilter = {}));
|
|
23
23
|
class BasicFilterDto extends pagination_query_dto_1.PaginationQueryDto {
|
|
24
24
|
static _OPENAPI_METADATA_FACTORY() {
|
|
25
|
-
return { fields: { required: false, type: () => [String] }, sort: { required: false, type: () => [String] }, groupBy: { required: false, type: () => [String] }, aggregates: { required: false, type: () => [String] }, populate: { required: false, type: () => [String] }, populateMedia: { required: false, type: () => [String] }, showSoftDeleted: { required: false, enum: require("./basic-filters.dto").SoftDeleteFilter }, populateGroup: { required: false, type: () => Boolean }, groupFilter: { required: false, type: () => require("./basic-group-filters.dto").BasicGroupFilterDto }, locale: { required: false, type: () => String }
|
|
25
|
+
return { fields: { required: false, type: () => [String] }, sort: { required: false, type: () => [String] }, groupBy: { required: false, type: () => [String] }, aggregates: { required: false, type: () => [String] }, populate: { required: false, type: () => [String] }, populateMedia: { required: false, type: () => [String] }, showSoftDeleted: { required: false, enum: require("./basic-filters.dto").SoftDeleteFilter }, populateGroup: { required: false, type: () => Boolean }, groupFilter: { required: false, type: () => require("./basic-group-filters.dto").BasicGroupFilterDto }, locale: { required: false, type: () => String } };
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
exports.BasicFilterDto = BasicFilterDto;
|
|
@@ -80,9 +80,4 @@ __decorate([
|
|
|
80
80
|
(0, swagger_1.ApiProperty)({ description: "locale" }),
|
|
81
81
|
__metadata("design:type", String)
|
|
82
82
|
], BasicFilterDto.prototype, "locale", void 0);
|
|
83
|
-
__decorate([
|
|
84
|
-
(0, class_validator_1.IsOptional)(),
|
|
85
|
-
(0, swagger_1.ApiProperty)({ description: "status publish draft" }),
|
|
86
|
-
__metadata("design:type", String)
|
|
87
|
-
], BasicFilterDto.prototype, "status", void 0);
|
|
88
83
|
//# sourceMappingURL=basic-filters.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basic-filters.dto.js","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,6CAA8C;AAC9C,qDAAqD;AACrD,iEAA4D;AAE5D,uEAAgE;AAEhE,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,2CAAuB,CAAA;IACvB,2CAAuB,CAAA;AAC3B,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,MAAa,cAAe,SAAQ,yCAAkB;;;;
|
|
1
|
+
{"version":3,"file":"basic-filters.dto.js","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,6CAA8C;AAC9C,qDAAqD;AACrD,iEAA4D;AAE5D,uEAAgE;AAEhE,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,2CAAuB,CAAA;IACvB,2CAAuB,CAAA;AAC3B,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,MAAa,cAAe,SAAQ,yCAAkB;;;;CAqDrD;AArDD,wCAqDC;AAjDY;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACZ;AAIlB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;4CACZ;AAIhB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;;+CACZ;AAInB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;;kDACZ;AAItB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;;gDACZ;AAIpB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACZ;AAYzB;IANR,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,gBAAgB,CAAC;IACxB,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,gBAAgB;KACzB,CAAC;;uDAC0C;AAInC;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACb;AAIjC;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;8BAC9B,6CAAmB;mDAAA;AAIxB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACd","sourcesContent":["\nimport { ApiProperty } from \"@nestjs/swagger\";\nimport { IsEnum, IsOptional } from \"class-validator\";\nimport { PaginationQueryDto } from \"./pagination-query.dto\";\nimport { Timestamp } from \"typeorm\";\nimport { BasicGroupFilterDto } from \"./basic-group-filters.dto\";\n\nexport enum SoftDeleteFilter {\n INCLUSIVE = \"inclusive\",\n EXCLUSIVE = \"exclusive\",\n}\n\nexport class BasicFilterDto extends PaginationQueryDto {\n\n @IsOptional()\n @ApiProperty({ description: \"Fields\" })\n readonly fields?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"sort\" })\n readonly sort?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"groupBy\" })\n readonly groupBy?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"aggregates\" })\n readonly aggregates?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populate\" })\n readonly populate?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populateMedia\" })\n readonly populateMedia?: string[];\n\n // @IsOptional()\n // @ApiProperty({ description: \"filters\" })\n // readonly filters: any[];\n\n @IsOptional()\n @IsEnum(SoftDeleteFilter)\n @ApiProperty({\n description: \"showSoftDeleted\",\n enum: SoftDeleteFilter,\n })\n readonly showSoftDeleted?: SoftDeleteFilter;\n\n @IsOptional()\n @ApiProperty({ description: \"populateGroup\" })\n readonly populateGroup?: boolean;\n\n @IsOptional()\n @ApiProperty({ description: \"groupFilter\" })\n groupFilter?: BasicGroupFilterDto\n\n @IsOptional()\n @ApiProperty({ description: \"locale\" })\n readonly locale?: string;\n\n // @IsOptional()\n // @ApiProperty({ description: \"default locale id\" })\n // readonly defaultEntityLocaleId?: number;\n}\n"]}
|
|
@@ -5,6 +5,10 @@ export declare abstract class CommonEntity {
|
|
|
5
5
|
deletedAt: Date;
|
|
6
6
|
deletedTracker: string;
|
|
7
7
|
publishedAt: Date;
|
|
8
|
+
isPublished: boolean;
|
|
9
|
+
isLatest: boolean;
|
|
10
|
+
initialEntityVersionId: number;
|
|
11
|
+
publishedTracker: string;
|
|
8
12
|
localeName: string;
|
|
9
13
|
defaultEntityLocaleId: number;
|
|
10
14
|
createdBy: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.entity.d.ts","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":"AAIA,8BACsB,YAAY;IAG9B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAIhB,SAAS,EAAE,IAAI,CAAC;IAGhB,cAAc,EAAE,MAAM,CAAC;IAIvB,WAAW,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"common.entity.d.ts","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":"AAIA,8BACsB,YAAY;IAG9B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAIhB,SAAS,EAAE,IAAI,CAAC;IAGhB,cAAc,EAAE,MAAM,CAAC;IAIvB,WAAW,EAAE,IAAI,CAAC;IAKlB,WAAW,EAAE,OAAO,CAAC;IAKrB,QAAQ,EAAE,OAAO,CAAC;IAKlB,sBAAsB,EAAE,MAAM,CAAC;IAK/B,gBAAgB,EAAE,MAAM,CAAC;IAIzB,UAAU,EAAE,MAAM,CAAC;IAInB,qBAAqB,EAAE,MAAM,CAAC;IAc9B,SAAS,EAAE,MAAM,CAAC;IAIlB,SAAS,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -16,7 +16,7 @@ const local_date_time_transformer_1 = require("../transformers/typeorm/local-dat
|
|
|
16
16
|
const typeorm_1 = require("typeorm");
|
|
17
17
|
let CommonEntity = class CommonEntity {
|
|
18
18
|
static _OPENAPI_METADATA_FACTORY() {
|
|
19
|
-
return { id: { required: true, type: () => Number }, createdAt: { required: true, type: () => Date }, updatedAt: { required: true, type: () => Date }, deletedAt: { required: true, type: () => Date }, deletedTracker: { required: true, type: () => String }, publishedAt: { required: true, type: () => Date }, localeName: { required: true, type: () => String }, defaultEntityLocaleId: { required: true, type: () => Number }, createdBy: { required: true, type: () => Number }, updatedBy: { required: true, type: () => Number } };
|
|
19
|
+
return { id: { required: true, type: () => Number }, createdAt: { required: true, type: () => Date }, updatedAt: { required: true, type: () => Date }, deletedAt: { required: true, type: () => Date }, deletedTracker: { required: true, type: () => String }, publishedAt: { required: true, type: () => Date }, isPublished: { required: true, type: () => Boolean }, isLatest: { required: true, type: () => Boolean }, initialEntityVersionId: { required: true, type: () => Number }, publishedTracker: { required: true, type: () => String }, localeName: { required: true, type: () => String }, defaultEntityLocaleId: { required: true, type: () => Number }, createdBy: { required: true, type: () => Number }, updatedBy: { required: true, type: () => Number } };
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
exports.CommonEntity = CommonEntity;
|
|
@@ -47,6 +47,30 @@ __decorate([
|
|
|
47
47
|
(0, typeorm_1.Column)({ name: 'published_at', default: null, nullable: true, transformer: local_date_time_transformer_1.LocalDateTimeTransformer }),
|
|
48
48
|
__metadata("design:type", Date)
|
|
49
49
|
], CommonEntity.prototype, "publishedAt", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
(0, class_transformer_1.Expose)(),
|
|
52
|
+
(0, typeorm_1.Column)({ name: 'is_published', default: false }),
|
|
53
|
+
(0, typeorm_1.Index)(),
|
|
54
|
+
__metadata("design:type", Boolean)
|
|
55
|
+
], CommonEntity.prototype, "isPublished", void 0);
|
|
56
|
+
__decorate([
|
|
57
|
+
(0, class_transformer_1.Expose)(),
|
|
58
|
+
(0, typeorm_1.Column)({ name: 'is_latest', default: true }),
|
|
59
|
+
(0, typeorm_1.Index)(),
|
|
60
|
+
__metadata("design:type", Boolean)
|
|
61
|
+
], CommonEntity.prototype, "isLatest", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
(0, class_transformer_1.Expose)(),
|
|
64
|
+
(0, typeorm_1.Column)({ type: "int", name: 'initial_entity_version_id', default: null, nullable: true }),
|
|
65
|
+
(0, typeorm_1.Index)(),
|
|
66
|
+
__metadata("design:type", Number)
|
|
67
|
+
], CommonEntity.prototype, "initialEntityVersionId", void 0);
|
|
68
|
+
__decorate([
|
|
69
|
+
(0, class_transformer_1.Expose)(),
|
|
70
|
+
(0, typeorm_1.Column)({ name: 'published_tracker', default: "na" }),
|
|
71
|
+
(0, typeorm_1.Index)(),
|
|
72
|
+
__metadata("design:type", String)
|
|
73
|
+
], CommonEntity.prototype, "publishedTracker", void 0);
|
|
50
74
|
__decorate([
|
|
51
75
|
(0, class_transformer_1.Expose)(),
|
|
52
76
|
(0, typeorm_1.Column)({ type: "varchar", name: 'locale_name', default: null }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.entity.js","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,yDAAoD;AACpD,qGAAgG;AAChG,qCAAsH;AAG/G,IAAe,YAAY,GAA3B,MAAe,YAAY;;;;
|
|
1
|
+
{"version":3,"file":"common.entity.js","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,yDAAoD;AACpD,qGAAgG;AAChG,qCAAsH;AAG/G,IAAe,YAAY,GAA3B,MAAe,YAAY;;;;CAmEjC,CAAA;AAnEqB,oCAAY;AAG9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCAClC;AAGV;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAGhB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAIhB;IAFC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;IAC/E,IAAA,eAAK,GAAE;8BACG,IAAI;+CAAC;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;oDACpC;AAIvB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BAC1F,IAAI;iDAAC;AAKlB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChD,IAAA,eAAK,GAAE;;iDACa;AAKrB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAA,eAAK,GAAE;;8CACU;AAKlB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzF,IAAA,eAAK,GAAE;;4DACuB;AAK/B;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpD,IAAA,eAAK,GAAE;;sDACiB;AAIzB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;gDAC7C;AAInB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;2DAC3C;AAc9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;AAIlB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;uBAlEA,YAAY;IADjC,IAAA,2BAAO,GAAE;GACY,YAAY,CAmEjC","sourcesContent":["import { Exclude, Expose } from \"class-transformer\";\nimport { LocalDateTimeTransformer } from \"src/transformers/typeorm/local-date-time-transformer\";\nimport { Column, CreateDateColumn, DeleteDateColumn, Index, PrimaryGeneratedColumn, UpdateDateColumn } from \"typeorm\";\n\n@Exclude()\nexport abstract class CommonEntity {\n @Expose()\n @PrimaryGeneratedColumn({ type: 'integer' })\n id: number\n\n @CreateDateColumn({ name: \"created_at\", transformer: LocalDateTimeTransformer })\n createdAt: Date;\n\n @UpdateDateColumn({ name: \"updated_at\", transformer: LocalDateTimeTransformer })\n updatedAt: Date;\n\n @DeleteDateColumn({ name: \"deleted_at\", transformer: LocalDateTimeTransformer })\n @Index()\n deletedAt: Date;\n\n @Column({ name: \"deletedTracker\", default: \"not-deleted\" })\n deletedTracker: string;\n\n @Expose()\n @Column({ name: 'published_at', default: null, nullable: true, transformer: LocalDateTimeTransformer })\n publishedAt: Date;\n\n @Expose()\n @Column({ name: 'is_published', default: false })\n @Index()\n isPublished: boolean;\n\n @Expose()\n @Column({ name: 'is_latest', default: true })\n @Index()\n isLatest: boolean;\n\n @Expose()\n @Column({ type: \"int\", name: 'initial_entity_version_id', default: null, nullable: true })\n @Index()\n initialEntityVersionId: number;\n\n @Expose()\n @Column({ name: 'published_tracker', default: \"na\" })\n @Index()\n publishedTracker: string;\n\n @Expose()\n @Column({ type: \"varchar\", name: 'locale_name', default: null })\n localeName: string;\n\n @Expose()\n @Column({ type: \"int\", name: 'default_entity_locale_id', default: null })\n defaultEntityLocaleId: number;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // createdBy: User;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // updatedBy: User;\n\n @Expose()\n @Column({ name: `created_by_id`, nullable: true })\n createdBy: number;\n\n @Expose()\n @Column({ name: `updated_by_id`, nullable: true })\n updatedBy: number;\n}\n"]}
|
|
@@ -44,13 +44,13 @@ __decorate([
|
|
|
44
44
|
__metadata("design:type", String)
|
|
45
45
|
], User.prototype, "username", void 0);
|
|
46
46
|
__decorate([
|
|
47
|
-
(0, typeorm_1.Index)(),
|
|
47
|
+
(0, typeorm_1.Index)({ unique: true }),
|
|
48
48
|
(0, typeorm_1.Column)({ type: "varchar", nullable: true }),
|
|
49
49
|
(0, class_transformer_1.Expose)(),
|
|
50
50
|
__metadata("design:type", String)
|
|
51
51
|
], User.prototype, "email", void 0);
|
|
52
52
|
__decorate([
|
|
53
|
-
(0, typeorm_1.Index)(),
|
|
53
|
+
(0, typeorm_1.Index)({ unique: true }),
|
|
54
54
|
(0, typeorm_1.Column)({ type: "varchar", nullable: true }),
|
|
55
55
|
(0, class_transformer_1.Expose)(),
|
|
56
56
|
__metadata("design:type", String)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../src/entities/user.entity.ts"],"names":[],"mappings":"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","sourcesContent":["import { CommonEntity } from \"src/entities/common.entity\"\nimport { Entity, Column, Index, JoinTable, ManyToMany, OneToMany, TableInheritance } from \"typeorm\";\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { UserViewMetadata } from 'src/entities/user-view-metadata.entity'\nimport { UserApiKey } from 'src/entities/user-api-key.entity'\nimport { Exclude, Expose } from \"class-transformer\";\n\n/**\n * Serialization is locked down twice over, and both halves are load-bearing:\n *\n * - The class-level `@Exclude()` below makes User itself an allowlist: only `@Expose()`d\n * properties are serialized.\n * - Every other property additionally carries its own `@Exclude()`. That looks redundant\n * here, and for `User` it is - but class-transformer resolves the *class-level* strategy\n * with a direct lookup on the exact constructor (MetadataStorage.getStrategy), so a\n * subclass inherits nothing and falls back to `exposeAll`. Since this entity is a\n * `@TableInheritance` root that consuming projects extend (see\n * IExtensionUserCreationProvider), an extension user that forgets its own `@Exclude()`\n * would otherwise serialize the password hash and every OAuth/verification token.\n * Property-level metadata *is* walked up the prototype chain, so the per-property\n * decorators are what actually protect subclasses.\n *\n * Keep both. Adding a new column? Give it `@Expose()` or `@Exclude()` - never neither.\n */\n@Entity(\"ss_user\")\n@TableInheritance({ column: { type: \"varchar\", name: \"type\", default: \"User\" } })\n@Exclude()\nexport class User extends CommonEntity {\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n fullName: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n @Expose()\n username: string;\n\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n email: string;\n\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n mobile: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n password: string;\n\n @Column({ nullable: true, default: true })\n @Expose()\n forcePasswordChange: boolean = true;\n\n @Column({ type: \"varchar\", default: \"local\" })\n @Exclude()\n lastLoginProvider: string = \"local\";\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n accessCode: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryProfilePicture: string;\n\n @Index()\n @Column({ default: true })\n @Expose()\n active: boolean = true;\n\n @Column({ nullable: true })\n @Exclude()\n forgotPasswordConfirmedAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n verificationTokenOnForgotPassword: string;\n\n @Column({ nullable: true })\n @Exclude()\n verificationTokenOnForgotPasswordExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n customPayload: string;\n\n @ManyToMany(() => RoleMetadata, roleMetadata => roleMetadata.users, { cascade: true })\n @JoinTable()\n @Expose()\n roles: RoleMetadata[];\n\n @OneToMany(() => UserViewMetadata, userViewMetadata => userViewMetadata.user, { cascade: true })\n @Exclude()\n userViewMetadata: UserViewMetadata[];\n\n @Exclude()\n @Column({ type: \"varchar\", default: \"bcrypt\" })\n passwordScheme: string;\n\n @Exclude()\n @Column({ type: \"int\", default: 1 })\n passwordSchemeVersion: number;\n\n @Exclude()\n @Column({ nullable: true })\n rehashedAt: Date;\n\n @Expose()\n @Column({ type: \"int\", default: 0 })\n failedLoginAttempts: number = 0;\n\n @Expose()\n _media: any;\n\n @Column({ default: false })\n @Expose()\n isAllowedToGenerateApiKeys: boolean = false;\n\n @OneToMany(() => UserApiKey, key => key.user)\n @Expose()\n apiKeys: UserApiKey[];\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../src/entities/user.entity.ts"],"names":[],"mappings":"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","sourcesContent":["import { CommonEntity } from \"src/entities/common.entity\"\nimport { Entity, Column, Index, JoinTable, ManyToMany, OneToMany, TableInheritance } from \"typeorm\";\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { UserViewMetadata } from 'src/entities/user-view-metadata.entity'\nimport { UserApiKey } from 'src/entities/user-api-key.entity'\nimport { Exclude, Expose } from \"class-transformer\";\n\n/**\n * Serialization is locked down twice over, and both halves are load-bearing:\n *\n * - The class-level `@Exclude()` below makes User itself an allowlist: only `@Expose()`d\n * properties are serialized.\n * - Every other property additionally carries its own `@Exclude()`. That looks redundant\n * here, and for `User` it is - but class-transformer resolves the *class-level* strategy\n * with a direct lookup on the exact constructor (MetadataStorage.getStrategy), so a\n * subclass inherits nothing and falls back to `exposeAll`. Since this entity is a\n * `@TableInheritance` root that consuming projects extend (see\n * IExtensionUserCreationProvider), an extension user that forgets its own `@Exclude()`\n * would otherwise serialize the password hash and every OAuth/verification token.\n * Property-level metadata *is* walked up the prototype chain, so the per-property\n * decorators are what actually protect subclasses.\n *\n * Keep both. Adding a new column? Give it `@Expose()` or `@Exclude()` - never neither.\n */\n@Entity(\"ss_user\")\n@TableInheritance({ column: { type: \"varchar\", name: \"type\", default: \"User\" } })\n@Exclude()\nexport class User extends CommonEntity {\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n fullName: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n @Expose()\n username: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n email: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n mobile: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n password: string;\n\n @Column({ nullable: true, default: true })\n @Expose()\n forcePasswordChange: boolean = true;\n\n @Column({ type: \"varchar\", default: \"local\" })\n @Exclude()\n lastLoginProvider: string = \"local\";\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n accessCode: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryProfilePicture: string;\n\n @Index()\n @Column({ default: true })\n @Expose()\n active: boolean = true;\n\n @Column({ nullable: true })\n @Exclude()\n forgotPasswordConfirmedAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n verificationTokenOnForgotPassword: string;\n\n @Column({ nullable: true })\n @Exclude()\n verificationTokenOnForgotPasswordExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n customPayload: string;\n\n @ManyToMany(() => RoleMetadata, roleMetadata => roleMetadata.users, { cascade: true })\n @JoinTable()\n @Expose()\n roles: RoleMetadata[];\n\n @OneToMany(() => UserViewMetadata, userViewMetadata => userViewMetadata.user, { cascade: true })\n @Exclude()\n userViewMetadata: UserViewMetadata[];\n\n @Exclude()\n @Column({ type: \"varchar\", default: \"bcrypt\" })\n passwordScheme: string;\n\n @Exclude()\n @Column({ type: \"int\", default: 1 })\n passwordSchemeVersion: number;\n\n @Exclude()\n @Column({ nullable: true })\n rehashedAt: Date;\n\n @Expose()\n @Column({ type: \"int\", default: 0 })\n failedLoginAttempts: number = 0;\n\n @Expose()\n _media: any;\n\n @Column({ default: false })\n @Expose()\n isAllowedToGenerateApiKeys: boolean = false;\n\n @OneToMany(() => UserApiKey, key => key.user)\n @Expose()\n apiKeys: UserApiKey[];\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail.factory.d.ts","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAQ9D,qBACa,WAAW;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEvC,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc;IAGnD,cAAc,IAAI,KAAK;
|
|
1
|
+
{"version":3,"file":"mail.factory.d.ts","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAQ9D,qBACa,WAAW;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEvC,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc;IAGnD,cAAc,IAAI,KAAK;CAoB1B"}
|
|
@@ -31,6 +31,10 @@ let MailFactory = class MailFactory {
|
|
|
31
31
|
this.logger.error("No mail providers are registered.");
|
|
32
32
|
}
|
|
33
33
|
const mailServiceProvider = mailProviders.find(provider => provider.name === mailServiceName);
|
|
34
|
+
if (!mailServiceProvider?.instance) {
|
|
35
|
+
const registeredProviders = mailProviders.map((provider) => provider?.name).filter(Boolean).join(", ");
|
|
36
|
+
throw new Error(`Mail provider "${mailServiceName}" is not registered. Registered providers: ${registeredProviders || "none"}`);
|
|
37
|
+
}
|
|
34
38
|
return mailServiceProvider.instance;
|
|
35
39
|
}
|
|
36
40
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mail.factory.js","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,uCAAyC;AACzC,8DAA2D;AAE3D,iEAA8D;AAG9D,SAAS,IAAI,CAAC,CAAU;IACpB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAIM,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEpB,YACqB,SAAoB,EACpB,aAA4B,EAC5B,cAA8B;QAF9B,cAAS,GAAT,SAAS,CAAW;QACpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,mBAAc,GAAd,cAAc,CAAgB;QAJlC,WAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAKxD,CAAC;IAEL,cAAc;QACV,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAmB,eAAe,CAAC,IAAI,kBAAkB,CAAC;QACpH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mail.factory.js","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,uCAAyC;AACzC,8DAA2D;AAE3D,iEAA8D;AAG9D,SAAS,IAAI,CAAC,CAAU;IACpB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAIM,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEpB,YACqB,SAAoB,EACpB,aAA4B,EAC5B,cAA8B;QAF9B,cAAS,GAAT,SAAS,CAAW;QACpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,mBAAc,GAAd,cAAc,CAAgB;QAJlC,WAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAKxD,CAAC;IAEL,cAAc;QACV,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAmB,eAAe,CAAC,IAAI,kBAAkB,CAAC;QACpH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QAC9F,IAAI,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC;YACjC,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvG,MAAM,IAAI,KAAK,CACX,kBAAkB,eAAe,8CAA8C,mBAAmB,IAAI,MAAM,EAAE,CACjH,CAAC;QACN,CAAC;QAED,OAAO,mBAAmB,CAAC,QAAiB,CAAC;IACjD,CAAC;CAEJ,CAAA;AA5BY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAIuB,gBAAS;QACL,8BAAa;QACZ,gCAAc;GAL1C,WAAW,CA4BvB","sourcesContent":["import { Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigType } from \"@nestjs/config\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IMail } from \"src/interfaces\";\nimport { SettingService } from \"src/services/setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nfunction norm(s?: string) {\n return s?.trim().toLowerCase();\n}\n\n// This factory will be use to return a mail service instance, using the configured environment variables\n@Injectable()\nexport class MailFactory {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n private readonly moduleRef: ModuleRef, // Use the module ref to dynamically resolve the mail service\n private readonly solidRegistry: SolidRegistry,\n private readonly settingService: SettingService,\n ) { }\n\n getMailService(): IMail {\n const mailServiceName = this.settingService.getConfigValue<SolidCoreSetting>(\"emailProvider\") ?? \"SMTPEMailService\";\n const mailProviders = this.solidRegistry.getMailProviders();\n // Return the instance which matches the mailServiceName\n if (!mailProviders.length) {\n // throw new Error(\"No mail providers are registered.\");\n this.logger.error(\"No mail providers are registered.\");\n }\n\n const mailServiceProvider = mailProviders.find(provider => provider.name === mailServiceName);\n if (!mailServiceProvider?.instance) {\n const registeredProviders = mailProviders.map((provider) => provider?.name).filter(Boolean).join(\", \");\n throw new Error(\n `Mail provider \"${mailServiceName}\" is not registered. Registered providers: ${registeredProviders || \"none\"}`,\n );\n }\n\n return mailServiceProvider.instance as IMail;\n }\n\n}\n"]}
|
|
@@ -17,6 +17,7 @@ export declare class MediaFieldCrudManager implements FieldCrudManager {
|
|
|
17
17
|
private resolveMediaType;
|
|
18
18
|
validate(dto: any, files: Array<Express.Multer.File>): ValidationError[];
|
|
19
19
|
private applyValidations;
|
|
20
|
+
private validateDangerousFiles;
|
|
20
21
|
private validateMediaSingle;
|
|
21
22
|
private validateMediaMultiple;
|
|
22
23
|
transformForCreate(dto: any): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGnE,oBAAY,cAAc;IACtB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;CAClC;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CACxC;AA6DD,qBAAa,qBAAsB,YAAW,gBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAGvD,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"MediaFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGnE,oBAAY,cAAc;IACtB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;CAClC;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CACxC;AA6DD,qBAAa,qBAAsB,YAAW,gBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAGvD,OAAO,CAAC,gBAAgB;IA2BxB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,EAAE;IAKxE,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,mBAAmB;IAiD3B,OAAO,CAAC,qBAAqB;IAW7B,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAKpC"}
|
|
@@ -56,15 +56,12 @@ class MediaFieldCrudManager {
|
|
|
56
56
|
constructor(options) {
|
|
57
57
|
this.options = options;
|
|
58
58
|
}
|
|
59
|
-
resolveMediaType(
|
|
60
|
-
|
|
61
|
-
if (ext && media_file_types_1.DANGEROUS_EXTENSIONS.has(ext)) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
const mt = (mimetype || '').toLowerCase().trim();
|
|
65
|
-
if (mt === 'image/svg+xml' || mt === 'text/html' || mt === 'application/xhtml+xml') {
|
|
59
|
+
resolveMediaType(file) {
|
|
60
|
+
if ((0, media_file_types_1.isDangerousMediaFile)(file)) {
|
|
66
61
|
return null;
|
|
67
62
|
}
|
|
63
|
+
const ext = (0, media_file_types_1.getLowercaseFileExtension)((0, media_file_types_1.getUploadedFileName)(file));
|
|
64
|
+
const mt = (file.mimetype || '').toLowerCase().trim();
|
|
68
65
|
if (mt && MIME_TO_MEDIA_TYPE[mt]) {
|
|
69
66
|
return MIME_TO_MEDIA_TYPE[mt];
|
|
70
67
|
}
|
|
@@ -84,15 +81,25 @@ class MediaFieldCrudManager {
|
|
|
84
81
|
return this.applyValidations(fieldFiles);
|
|
85
82
|
}
|
|
86
83
|
applyValidations(fieldFiles) {
|
|
84
|
+
const errors = this.validateDangerousFiles(fieldFiles);
|
|
87
85
|
switch (this.options.type) {
|
|
88
86
|
case SolidMediaType.mediaSingle:
|
|
89
|
-
return this.validateMediaSingle(fieldFiles);
|
|
87
|
+
return [...errors, ...this.validateMediaSingle(fieldFiles)];
|
|
90
88
|
case SolidMediaType.mediaMultiple:
|
|
91
|
-
return this.validateMediaMultiple(fieldFiles);
|
|
89
|
+
return [...errors, ...this.validateMediaMultiple(fieldFiles)];
|
|
92
90
|
default:
|
|
93
|
-
return
|
|
91
|
+
return errors;
|
|
94
92
|
}
|
|
95
93
|
}
|
|
94
|
+
validateDangerousFiles(fieldFiles) {
|
|
95
|
+
return fieldFiles
|
|
96
|
+
.filter(fieldFile => (0, media_file_types_1.isDangerousMediaFile)(fieldFile))
|
|
97
|
+
.map(fieldFile => ({
|
|
98
|
+
field: this.options.fieldName,
|
|
99
|
+
error: `${this.options.fieldName} file type not allowed. ` +
|
|
100
|
+
`${(0, media_file_types_1.getUploadedFileName)(fieldFile) || 'File'} is a potentially dangerous file type.`
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
96
103
|
validateMediaSingle(fieldFiles) {
|
|
97
104
|
const errors = [];
|
|
98
105
|
if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {
|
|
@@ -123,7 +130,7 @@ class MediaFieldCrudManager {
|
|
|
123
130
|
const allowedFileTypes = this.options.mediaTypes;
|
|
124
131
|
for (let i = 0; i < fieldFiles.length; i++) {
|
|
125
132
|
const fieldFile = fieldFiles[i];
|
|
126
|
-
const resolvedType = this.resolveMediaType(fieldFile
|
|
133
|
+
const resolvedType = this.resolveMediaType(fieldFile);
|
|
127
134
|
if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {
|
|
128
135
|
errors.push({
|
|
129
136
|
field: this.options.fieldName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MediaFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldCrudManager, ValidationError } from \"src/interfaces\";\nimport { DANGEROUS_EXTENSIONS, EXT_TO_MEDIA_TYPE, MediaCategory } from \"src/constants/media-file-types\";\n\nexport enum SolidMediaType {\n mediaSingle = 'mediaSingle',\n mediaMultiple = 'mediaMultiple'\n}\n\nexport interface MediaFieldOptions {\n type: SolidMediaType;\n required: boolean | undefined | null;\n fieldName: string | undefined | null;\n mediaMaxSizeKb: number | undefined | null;\n mediaTypes: string[];\n isUpdate: boolean | undefined | null;\n}\n\ntype MediaType = MediaCategory;\n\nconst MIME_TO_MEDIA_TYPE: Record<string, MediaType> = {\n // Images\n 'image/png': 'image',\n 'image/jpeg': 'image',\n 'image/jpg': 'image',\n 'image/webp': 'image',\n 'image/gif': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/heic': 'image',\n 'image/heif': 'image',\n\n // Audio\n 'audio/mpeg': 'audio', // mp3\n 'audio/mp3': 'audio',\n 'audio/wav': 'audio',\n 'audio/x-wav': 'audio',\n 'audio/webm': 'audio',\n 'audio/ogg': 'audio',\n 'audio/aac': 'audio',\n 'audio/mp4': 'audio', // m4a often shows as audio/mp4\n 'audio/x-m4a': 'audio',\n 'audio/flac': 'audio',\n\n // Video\n 'video/mp4': 'video',\n 'video/mpeg': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video', // mov\n 'video/x-msvideo': 'video', // avi\n 'video/x-matroska': 'video',// mkv\n 'video/3gpp': 'video',\n 'video/3gpp2': 'video',\n\n // Documents / files (treat as \"file\")\n 'application/pdf': 'pdf',\n 'text/plain': 'file',\n 'text/markdown': 'file',\n 'application/json': 'file',\n 'text/csv': 'file',\n\n // Office\n 'application/msword': 'file', // doc\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file', // docx\n 'application/vnd.ms-excel': 'file', // xls\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file', // xlsx\n 'application/vnd.ms-powerpoint': 'file', // ppt\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file', // pptx,\n\n // Archives (optional)\n 'application/zip': 'file',\n 'application/x-zip-compressed': 'file',\n 'application/x-rar-compressed': 'file',\n 'application/x-7z-compressed': 'file',\n};\n\nexport class MediaFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: MediaFieldOptions) {\n }\n\n private resolveMediaType(mimetype?: string, filename?: string): MediaType | null {\n const ext = (filename || '').split('.').pop()?.toLowerCase();\n if (ext && DANGEROUS_EXTENSIONS.has(ext)) {\n return null;\n }\n\n const mt = (mimetype || '').toLowerCase().trim();\n if (mt === 'image/svg+xml' || mt === 'text/html' || mt === 'application/xhtml+xml') {\n return null;\n }\n if (mt && MIME_TO_MEDIA_TYPE[mt]) {\n return MIME_TO_MEDIA_TYPE[mt];\n }\n\n // Some libs may send \"image/*\" etc. Treat broad families safely.\n if (mt.startsWith('image/')) return 'image';\n if (mt.startsWith('audio/')) return 'audio';\n if (mt.startsWith('video/')) return 'video';\n\n // Fallback to extension if provided (also covers generic/unrecognized\n // mimetypes such as application/octet-stream).\n if (ext && EXT_TO_MEDIA_TYPE[ext]) {\n return EXT_TO_MEDIA_TYPE[ext];\n }\n\n return null;\n }\n\n validate(dto: any, files: Array<Express.Multer.File>): ValidationError[] {\n const fieldFiles = files.filter(file => file.fieldname === this.options.fieldName);\n return this.applyValidations(fieldFiles);\n }\n\n private applyValidations(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n switch (this.options.type) {\n case SolidMediaType.mediaSingle:\n return this.validateMediaSingle(fieldFiles);\n case SolidMediaType.mediaMultiple:\n return this.validateMediaMultiple(fieldFiles);\n default:\n return [];\n }\n }\n\n private validateMediaSingle(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n if (fieldFiles.length > 1) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} must be a single file`\n });\n }\n // validate size\n if (this.options.mediaMaxSizeKb) {\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n const fieldFileSizeInBytes = Math.ceil(fieldFile.size / 1024);\n if (fieldFileSizeInBytes > this.options.mediaMaxSizeKb) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`\n });\n }\n }\n }\n // validate type\n if (this.options.mediaTypes && this.options.mediaTypes.length > 0) {\n const allowedFileTypes = this.options.mediaTypes as MediaType[];\n\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n\n const resolvedType = this.resolveMediaType(fieldFile.mimetype, fieldFile.originalname ?? fieldFile.filename ?? '');\n if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `Allowed: ${allowedFileTypes.join(', ')}. ` +\n `Received mimetype: ${fieldFile.mimetype}${resolvedType ? ` (mapped to ${resolvedType})` : ''}`\n });\n }\n }\n }\n\n return errors;\n }\n\n private validateMediaMultiple(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MediaFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldCrudManager, ValidationError } from \"src/interfaces\";\nimport { EXT_TO_MEDIA_TYPE, getLowercaseFileExtension, getUploadedFileName, isDangerousMediaFile, MediaCategory } from \"src/constants/media-file-types\";\n\nexport enum SolidMediaType {\n mediaSingle = 'mediaSingle',\n mediaMultiple = 'mediaMultiple'\n}\n\nexport interface MediaFieldOptions {\n type: SolidMediaType;\n required: boolean | undefined | null;\n fieldName: string | undefined | null;\n mediaMaxSizeKb: number | undefined | null;\n mediaTypes: string[];\n isUpdate: boolean | undefined | null;\n}\n\ntype MediaType = MediaCategory;\n\nconst MIME_TO_MEDIA_TYPE: Record<string, MediaType> = {\n // Images\n 'image/png': 'image',\n 'image/jpeg': 'image',\n 'image/jpg': 'image',\n 'image/webp': 'image',\n 'image/gif': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/heic': 'image',\n 'image/heif': 'image',\n\n // Audio\n 'audio/mpeg': 'audio', // mp3\n 'audio/mp3': 'audio',\n 'audio/wav': 'audio',\n 'audio/x-wav': 'audio',\n 'audio/webm': 'audio',\n 'audio/ogg': 'audio',\n 'audio/aac': 'audio',\n 'audio/mp4': 'audio', // m4a often shows as audio/mp4\n 'audio/x-m4a': 'audio',\n 'audio/flac': 'audio',\n\n // Video\n 'video/mp4': 'video',\n 'video/mpeg': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video', // mov\n 'video/x-msvideo': 'video', // avi\n 'video/x-matroska': 'video',// mkv\n 'video/3gpp': 'video',\n 'video/3gpp2': 'video',\n\n // Documents / files (treat as \"file\")\n 'application/pdf': 'pdf',\n 'text/plain': 'file',\n 'text/markdown': 'file',\n 'application/json': 'file',\n 'text/csv': 'file',\n\n // Office\n 'application/msword': 'file', // doc\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file', // docx\n 'application/vnd.ms-excel': 'file', // xls\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file', // xlsx\n 'application/vnd.ms-powerpoint': 'file', // ppt\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file', // pptx,\n\n // Archives (optional)\n 'application/zip': 'file',\n 'application/x-zip-compressed': 'file',\n 'application/x-rar-compressed': 'file',\n 'application/x-7z-compressed': 'file',\n};\n\nexport class MediaFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: MediaFieldOptions) {\n }\n\n private resolveMediaType(file: Express.Multer.File): MediaType | null {\n // Belt-and-braces: dangerous files are already rejected outright by\n // validateDangerousFiles, but never let one resolve to a usable category.\n if (isDangerousMediaFile(file)) {\n return null;\n }\n\n const ext = getLowercaseFileExtension(getUploadedFileName(file));\n const mt = (file.mimetype || '').toLowerCase().trim();\n if (mt && MIME_TO_MEDIA_TYPE[mt]) {\n return MIME_TO_MEDIA_TYPE[mt];\n }\n\n // Some libs may send \"image/*\" etc. Treat broad families safely.\n if (mt.startsWith('image/')) return 'image';\n if (mt.startsWith('audio/')) return 'audio';\n if (mt.startsWith('video/')) return 'video';\n\n // Fallback to extension if provided (also covers generic/unrecognized\n // mimetypes such as application/octet-stream).\n if (ext && EXT_TO_MEDIA_TYPE[ext]) {\n return EXT_TO_MEDIA_TYPE[ext];\n }\n\n return null;\n }\n\n validate(dto: any, files: Array<Express.Multer.File>): ValidationError[] {\n const fieldFiles = files.filter(file => file.fieldname === this.options.fieldName);\n return this.applyValidations(fieldFiles);\n }\n\n private applyValidations(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n // Runs for every media field type and regardless of the admin-configured mediaTypes\n // allowlist - a dangerous upload is never acceptable, so this must not sit behind\n // the optional type checks below.\n const errors = this.validateDangerousFiles(fieldFiles);\n\n switch (this.options.type) {\n case SolidMediaType.mediaSingle:\n return [...errors, ...this.validateMediaSingle(fieldFiles)];\n case SolidMediaType.mediaMultiple:\n return [...errors, ...this.validateMediaMultiple(fieldFiles)];\n default:\n return errors;\n }\n }\n\n private validateDangerousFiles(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n return fieldFiles\n .filter(fieldFile => isDangerousMediaFile(fieldFile))\n .map(fieldFile => ({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `${getUploadedFileName(fieldFile) || 'File'} is a potentially dangerous file type.`\n }));\n }\n\n private validateMediaSingle(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n if (fieldFiles.length > 1) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} must be a single file`\n });\n }\n // validate size\n if (this.options.mediaMaxSizeKb) {\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n const fieldFileSizeInBytes = Math.ceil(fieldFile.size / 1024);\n if (fieldFileSizeInBytes > this.options.mediaMaxSizeKb) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`\n });\n }\n }\n }\n // validate type\n if (this.options.mediaTypes && this.options.mediaTypes.length > 0) {\n const allowedFileTypes = this.options.mediaTypes as MediaType[];\n\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n\n const resolvedType = this.resolveMediaType(fieldFile);\n if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `Allowed: ${allowedFileTypes.join(', ')}. ` +\n `Received mimetype: ${fieldFile.mimetype}${resolvedType ? ` (mapped to ${resolvedType})` : ''}`\n });\n }\n }\n }\n\n return errors;\n }\n\n private validateMediaMultiple(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Response } from "express";
|
|
2
|
+
export interface FileDownloadHeaderOptions {
|
|
3
|
+
fileName: string;
|
|
4
|
+
mimeType: string;
|
|
5
|
+
disposition?: "inline" | "attachment";
|
|
6
|
+
crossOriginResourcePolicy?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function setFileDownloadHeaders(res: Response, options: FileDownloadHeaderOptions): void;
|
|
9
|
+
//# sourceMappingURL=file-download.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-download.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/file-download.helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAEtC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAe9F"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setFileDownloadHeaders = setFileDownloadHeaders;
|
|
4
|
+
function setFileDownloadHeaders(res, options) {
|
|
5
|
+
const disposition = options.disposition ?? "attachment";
|
|
6
|
+
res.setHeader("Content-Disposition", `${disposition}; filename="${options.fileName}"`);
|
|
7
|
+
res.setHeader("Content-Type", options.mimeType);
|
|
8
|
+
res.setHeader("Access-Control-Expose-Headers", "Content-Disposition, Content-Type");
|
|
9
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
10
|
+
if (options.crossOriginResourcePolicy) {
|
|
11
|
+
res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=file-download.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-download.helper.js","sourceRoot":"","sources":["../../src/helpers/file-download.helper.ts"],"names":[],"mappings":";;AAeA,wDAeC;AAfD,SAAgB,sBAAsB,CAAC,GAAa,EAAE,OAAkC;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAExD,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,GAAG,WAAW,eAAe,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,mCAAmC,CAAC,CAAC;IAKpF,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;QACtC,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;AACH,CAAC","sourcesContent":["import type { Response } from \"express\";\n\nexport interface FileDownloadHeaderOptions {\n fileName: string;\n mimeType: string;\n /** Defaults to 'attachment'; only pass 'inline' for types known safe to render. */\n disposition?: \"inline\" | \"attachment\";\n /** Opt in for assets loaded cross-origin by the UI (e.g. media served to :3000). */\n crossOriginResourcePolicy?: boolean;\n}\n\n/**\n * Single place that stamps the response headers for every streamed file download, so the\n * security headers can't be applied to one endpoint and forgotten on the next.\n */\nexport function setFileDownloadHeaders(res: Response, options: FileDownloadHeaderOptions): void {\n const disposition = options.disposition ?? \"attachment\";\n\n res.setHeader(\"Content-Disposition\", `${disposition}; filename=\"${options.fileName}\"`);\n res.setHeader(\"Content-Type\", options.mimeType);\n res.setHeader(\"Access-Control-Expose-Headers\", \"Content-Disposition, Content-Type\");\n\n // Prevent the browser from ever content-sniffing a served file into something more\n // dangerous than its declared Content-Type (e.g. rendering a mislabeled upload as HTML\n // and executing embedded script).\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n\n if (options.crossOriginResourcePolicy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", \"cross-origin\");\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata-helper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-metadata-helper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBACa,0BAA0B;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAIzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAPtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;gBAGjD,QAAQ,EAAE,aAAa,EAIvB,iBAAiB,EAAE,uBAAuB;IAI/D,uBAAuB,CAAC,eAAe,GAAE,eAAsC,GAAG,GAAG,EAAE;IAmBvF,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,8BAA8B;IA8FtC,OAAO,CAAC,4CAA4C;IA+B9C,kBAAkB,CAAC,SAAS,EAAE,GAAG;CAwB1C"}
|
|
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
16
16
|
exports.ModelMetadataHelperService = void 0;
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const lodash_1 = require("lodash");
|
|
19
|
+
const draft_publish_fields_1 = require("../constants/draft-publish-fields");
|
|
19
20
|
const legacy_common_entity_with_existing_id_entity_1 = require("../entities/legacy-common.entity-with-existing-id.entity");
|
|
20
21
|
const legacy_table_type_enum_1 = require("../enums/legacy-table-type.enum");
|
|
21
22
|
const model_metadata_repository_1 = require("../repository/model-metadata.repository");
|
|
@@ -87,6 +88,32 @@ let ModelMetadataHelperService = ModelMetadataHelperService_1 = class ModelMetad
|
|
|
87
88
|
isSystem: true,
|
|
88
89
|
enableAuditTracking: true
|
|
89
90
|
},
|
|
91
|
+
{
|
|
92
|
+
name: "isPublished",
|
|
93
|
+
displayName: "Is Published",
|
|
94
|
+
type: "boolean",
|
|
95
|
+
isSystem: true,
|
|
96
|
+
enableAuditTracking: true
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "isLatest",
|
|
100
|
+
displayName: "Is Latest",
|
|
101
|
+
type: "boolean",
|
|
102
|
+
isSystem: true,
|
|
103
|
+
enableAuditTracking: true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "initialEntityVersionId",
|
|
107
|
+
displayName: "Initial Entity Version Id",
|
|
108
|
+
type: "int",
|
|
109
|
+
isSystem: true,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "publishedTracker",
|
|
113
|
+
displayName: "Published Tracker",
|
|
114
|
+
type: "shortText",
|
|
115
|
+
isSystem: true,
|
|
116
|
+
},
|
|
90
117
|
{
|
|
91
118
|
name: "localeName",
|
|
92
119
|
displayName: "Locale",
|
|
@@ -116,7 +143,9 @@ let ModelMetadataHelperService = ModelMetadataHelperService_1 = class ModelMetad
|
|
|
116
143
|
];
|
|
117
144
|
}
|
|
118
145
|
getSystemFieldsMetadataMappingForLegacyTable(withId = true) {
|
|
119
|
-
const
|
|
146
|
+
const legacyExcludedFieldNames = draft_publish_fields_1.DRAFT_PUBLISH_VERSIONING_FIELD_NAMES;
|
|
147
|
+
const systemFieldsMetadata = this.getSystemFieldsMetadataMapping()
|
|
148
|
+
.filter(field => !legacyExcludedFieldNames.includes(field.name));
|
|
120
149
|
if (!withId) {
|
|
121
150
|
const index = systemFieldsMetadata.findIndex(field => field.name === 'id');
|
|
122
151
|
if (index !== -1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata-helper.service.js","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Return the system fields metadata for a model\n\nimport { forwardRef, Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { _ } from \"lodash\";\nimport { LEGACY_TABLE_FIELDS_PREFIX } from \"src/entities/legacy-common.entity-with-existing-id.entity\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { SolidRegistry } from \"./solid-registry\";\n\n@Injectable()\nexport class ModelMetadataHelperService {\n private readonly logger = new Logger(ModelMetadataHelperService.name);\n\n constructor(\n private readonly registry: SolidRegistry,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n ) {\n }\n\n getSystemFieldsMetadata(legacyTableType: LegacyTableType = LegacyTableType.NONE): any[] {\n let systemFieldsMetadata: any[];\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(true);\n }\n else if (legacyTableType === LegacyTableType.EXISTING_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(false);\n }\n else {\n systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n }\n\n this.checkWithRegistry(systemFieldsMetadata);\n\n return systemFieldsMetadata;\n }\n\n // TODO: Do an additional check and add a warning if the common entity keys and system field metadata keys don't match exactly\n // Ideally this should be reflection based code\n private checkWithRegistry(systemFieldsMetadata: ({ name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; isSystem: boolean; ormType?: undefined; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType: string; relationCoModelSingularName: string; relationCreateInverse: boolean; relationCascade: string; relationModelModuleName: string; })[]) {\n const commonEntityKeys = this.registry.getCommonEntityKeys();\n const systemFieldNames = systemFieldsMetadata.map(field => field.name);\n const missingKeys = commonEntityKeys.filter(key => !systemFieldNames.includes(key));\n if (missingKeys.length > 0) {\n this.logger.warn(`Missing system fields metadata for common entity keys: ${missingKeys.join(', ')}`);\n }\n }\n\n private getSystemFieldsMetadataMapping() {\n return [\n {\n name: \"id\",\n displayName: \"Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdAt\",\n displayName: \"Created At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"updatedAt\",\n displayName: \"Updated At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedAt\",\n displayName: \"Deleted At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedTracker\",\n displayName: \"Deleted Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"publishedAt\",\n displayName: \"Published At\",\n type: \"datetime\",\n isSystem: true,\n enableAuditTracking:true\n },\n {\n name: \"localeName\",\n displayName: \"Locale\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"defaultEntityLocaleId\",\n displayName: \"Default Entity Locale Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdBy\",\n displayName: \"Created By\",\n type: \"int\",\n isSystem: true,\n columnName: \"created_by_id\",\n },\n {\n name: \"updatedBy\",\n displayName: \"Updated By\",\n type: \"int\",\n isSystem: true,\n columnName: \"updated_by_id\",\n }\n ];\n }\n\n private getSystemFieldsMetadataMappingForLegacyTable(withId: boolean=true) {\n const systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n if (!withId) {\n // Remove the id field metadata\n const index = systemFieldsMetadata.findIndex(field => field.name === 'id');\n if (index !== -1) {\n systemFieldsMetadata.splice(index, 1);\n }\n }\n\n // For legacy table, system fields, remove the ormType atribute from the metadata\n // systemFieldsMetadata.forEach(field => {\n // delete field.ormType;\n // });\n\n // Except for createdBy and updatedBy fields, for which we need to keep the columnName as created_by_id and updated_by_id respectively,\n // we need to add a columnName attribute with legacy prefix concatenated with the kebab cased field name of the system field\n systemFieldsMetadata.forEach(field => {\n if (field.name === 'createdBy' || field.name === 'updatedBy') {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}_id`;\n } else {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}`;\n }\n });\n return systemFieldsMetadata;\n }\n\n async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields: any[] = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"model-metadata-helper.service.js","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Return the system fields metadata for a model\n\nimport { forwardRef, Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { _ } from \"lodash\";\nimport { DRAFT_PUBLISH_VERSIONING_FIELD_NAMES } from \"src/constants/draft-publish-fields\";\nimport { LEGACY_TABLE_FIELDS_PREFIX } from \"src/entities/legacy-common.entity-with-existing-id.entity\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { SolidRegistry } from \"./solid-registry\";\n\n@Injectable()\nexport class ModelMetadataHelperService {\n private readonly logger = new Logger(ModelMetadataHelperService.name);\n\n constructor(\n private readonly registry: SolidRegistry,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n ) {\n }\n\n getSystemFieldsMetadata(legacyTableType: LegacyTableType = LegacyTableType.NONE): any[] {\n let systemFieldsMetadata: any[];\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(true);\n }\n else if (legacyTableType === LegacyTableType.EXISTING_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(false);\n }\n else {\n systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n }\n\n this.checkWithRegistry(systemFieldsMetadata);\n\n return systemFieldsMetadata;\n }\n\n // TODO: Do an additional check and add a warning if the common entity keys and system field metadata keys don't match exactly\n // Ideally this should be reflection based code\n private checkWithRegistry(systemFieldsMetadata: ({ name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; isSystem: boolean; ormType?: undefined; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType: string; relationCoModelSingularName: string; relationCreateInverse: boolean; relationCascade: string; relationModelModuleName: string; })[]) {\n const commonEntityKeys = this.registry.getCommonEntityKeys();\n const systemFieldNames = systemFieldsMetadata.map(field => field.name);\n const missingKeys = commonEntityKeys.filter(key => !systemFieldNames.includes(key));\n if (missingKeys.length > 0) {\n this.logger.warn(`Missing system fields metadata for common entity keys: ${missingKeys.join(', ')}`);\n }\n }\n\n private getSystemFieldsMetadataMapping() {\n return [\n {\n name: \"id\",\n displayName: \"Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdAt\",\n displayName: \"Created At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"updatedAt\",\n displayName: \"Updated At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedAt\",\n displayName: \"Deleted At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedTracker\",\n displayName: \"Deleted Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"publishedAt\",\n displayName: \"Published At\",\n type: \"datetime\",\n isSystem: true,\n enableAuditTracking:true\n },\n {\n name: \"isPublished\",\n displayName: \"Is Published\",\n type: \"boolean\",\n isSystem: true,\n enableAuditTracking: true\n },\n {\n name: \"isLatest\",\n displayName: \"Is Latest\",\n type: \"boolean\",\n isSystem: true,\n enableAuditTracking: true\n },\n {\n name: \"initialEntityVersionId\",\n displayName: \"Initial Entity Version Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"publishedTracker\",\n displayName: \"Published Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"localeName\",\n displayName: \"Locale\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"defaultEntityLocaleId\",\n displayName: \"Default Entity Locale Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdBy\",\n displayName: \"Created By\",\n type: \"int\",\n isSystem: true,\n columnName: \"created_by_id\",\n },\n {\n name: \"updatedBy\",\n displayName: \"Updated By\",\n type: \"int\",\n isSystem: true,\n columnName: \"updated_by_id\",\n }\n ];\n }\n\n private getSystemFieldsMetadataMappingForLegacyTable(withId: boolean=true) {\n // Legacy tables don't have the draft/publish versioning columns, so exclude\n // them from the legacy system fields metadata mapping.\n const legacyExcludedFieldNames: readonly string[] = DRAFT_PUBLISH_VERSIONING_FIELD_NAMES;\n const systemFieldsMetadata = this.getSystemFieldsMetadataMapping()\n .filter(field => !legacyExcludedFieldNames.includes(field.name));\n if (!withId) {\n // Remove the id field metadata\n const index = systemFieldsMetadata.findIndex(field => field.name === 'id');\n if (index !== -1) {\n systemFieldsMetadata.splice(index, 1);\n }\n }\n\n // For legacy table, system fields, remove the ormType atribute from the metadata\n // systemFieldsMetadata.forEach(field => {\n // delete field.ormType;\n // });\n\n // Except for createdBy and updatedBy fields, for which we need to keep the columnName as created_by_id and updated_by_id respectively,\n // we need to add a columnName attribute with legacy prefix concatenated with the kebab cased field name of the system field\n systemFieldsMetadata.forEach(field => {\n if (field.name === 'createdBy' || field.name === 'updatedBy') {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}_id`;\n } else {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}`;\n }\n });\n return systemFieldsMetadata;\n }\n\n async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields: any[] = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n}"]}
|
|
@@ -278,7 +278,7 @@ let SolidRegistry = SolidRegistry_1 = class SolidRegistry {
|
|
|
278
278
|
return this.auditableModels.has(modelSingularName.toLowerCase());
|
|
279
279
|
}
|
|
280
280
|
getCommonEntityKeys() {
|
|
281
|
-
return ['id', 'createdAt', 'updatedAt', 'deletedAt', 'createdBy', 'updatedBy', 'deletedTracker', 'localeName', 'defaultEntityLocaleId', 'publishedAt'];
|
|
281
|
+
return ['id', 'createdAt', 'updatedAt', 'deletedAt', 'createdBy', 'updatedBy', 'deletedTracker', 'localeName', 'defaultEntityLocaleId', 'publishedAt', 'isPublished', 'isLatest', 'initialEntityVersionId', 'publishedTracker'];
|
|
282
282
|
}
|
|
283
283
|
getAllSettingsProviderInstance() {
|
|
284
284
|
const settingsProviders = this.getSettingsProviders();
|