@neohm/nestend 6.4.0 → 6.5.0
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/README.md +45 -3
- package/dist/admin/controllers/admin.report.controller.d.ts +25 -0
- package/dist/admin/controllers/admin.report.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.report.controller.js +145 -0
- package/dist/admin/controllers/admin.report.controller.js.map +1 -0
- package/dist/admin/controllers/admin.tenant.report.controller.d.ts +20 -0
- package/dist/admin/controllers/admin.tenant.report.controller.d.ts.map +1 -0
- package/dist/admin/controllers/admin.tenant.report.controller.js +92 -0
- package/dist/admin/controllers/admin.tenant.report.controller.js.map +1 -0
- package/dist/admin/dtos/add.report.dto.d.ts +35 -0
- package/dist/admin/dtos/add.report.dto.d.ts.map +1 -0
- package/dist/admin/dtos/add.report.dto.js +216 -0
- package/dist/admin/dtos/add.report.dto.js.map +1 -0
- package/dist/admin/dtos/assign.tenant.report.dto.d.ts +9 -0
- package/dist/admin/dtos/assign.tenant.report.dto.d.ts.map +1 -0
- package/dist/admin/dtos/assign.tenant.report.dto.js +57 -0
- package/dist/admin/dtos/assign.tenant.report.dto.js.map +1 -0
- package/dist/admin/dtos/report.catalogue.list.dto.d.ts +4 -0
- package/dist/admin/dtos/report.catalogue.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/report.catalogue.list.dto.js +8 -0
- package/dist/admin/dtos/report.catalogue.list.dto.js.map +1 -0
- package/dist/admin/dtos/set.report.script.dto.d.ts +6 -0
- package/dist/admin/dtos/set.report.script.dto.d.ts.map +1 -0
- package/dist/admin/dtos/set.report.script.dto.js +43 -0
- package/dist/admin/dtos/set.report.script.dto.js.map +1 -0
- package/dist/admin/dtos/tenant.report.list.dto.d.ts +6 -0
- package/dist/admin/dtos/tenant.report.list.dto.d.ts.map +1 -0
- package/dist/admin/dtos/tenant.report.list.dto.js +34 -0
- package/dist/admin/dtos/tenant.report.list.dto.js.map +1 -0
- package/dist/admin/es6.classes.d.ts +16 -5
- package/dist/admin/es6.classes.d.ts.map +1 -1
- package/dist/admin/es6.classes.js +33 -1
- package/dist/admin/es6.classes.js.map +1 -1
- package/dist/admin/libraries/report.catalogue.list.processor.d.ts +11 -0
- package/dist/admin/libraries/report.catalogue.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/report.catalogue.list.processor.js +82 -0
- package/dist/admin/libraries/report.catalogue.list.processor.js.map +1 -0
- package/dist/admin/libraries/report.data.processor.d.ts +20 -0
- package/dist/admin/libraries/report.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/report.data.processor.js +203 -0
- package/dist/admin/libraries/report.data.processor.js.map +1 -0
- package/dist/admin/libraries/report.script.data.processor.d.ts +20 -0
- package/dist/admin/libraries/report.script.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/report.script.data.processor.js +109 -0
- package/dist/admin/libraries/report.script.data.processor.js.map +1 -0
- package/dist/admin/libraries/tenant.report.data.processor.d.ts +20 -0
- package/dist/admin/libraries/tenant.report.data.processor.d.ts.map +1 -0
- package/dist/admin/libraries/tenant.report.data.processor.js +134 -0
- package/dist/admin/libraries/tenant.report.data.processor.js.map +1 -0
- package/dist/admin/libraries/tenant.report.list.processor.d.ts +13 -0
- package/dist/admin/libraries/tenant.report.list.processor.d.ts.map +1 -0
- package/dist/admin/libraries/tenant.report.list.processor.js +68 -0
- package/dist/admin/libraries/tenant.report.list.processor.js.map +1 -0
- package/dist/admin/services/admin.report.service.d.ts +9 -0
- package/dist/admin/services/admin.report.service.d.ts.map +1 -0
- package/dist/admin/services/admin.report.service.js +75 -0
- package/dist/admin/services/admin.report.service.js.map +1 -0
- package/dist/app.module.d.ts.map +1 -1
- package/dist/app.module.js +2 -0
- package/dist/app.module.js.map +1 -1
- package/dist/auth/controllers/auth.controller.d.ts +12 -2
- package/dist/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/auth/controllers/auth.controller.js +43 -6
- package/dist/auth/controllers/auth.controller.js.map +1 -1
- package/dist/auth/dtos/change.password.dto.d.ts +1 -0
- package/dist/auth/dtos/change.password.dto.d.ts.map +1 -1
- package/dist/auth/dtos/change.password.dto.js +10 -0
- package/dist/auth/dtos/change.password.dto.js.map +1 -1
- package/dist/auth/dtos/request.password.change.dto.d.ts +4 -0
- package/dist/auth/dtos/request.password.change.dto.d.ts.map +1 -0
- package/dist/auth/dtos/request.password.change.dto.js +26 -0
- package/dist/auth/dtos/request.password.change.dto.js.map +1 -0
- package/dist/auth/enums/password.change.default.enum.d.ts +6 -0
- package/dist/auth/enums/password.change.default.enum.d.ts.map +1 -0
- package/dist/auth/enums/password.change.default.enum.js +10 -0
- package/dist/auth/enums/password.change.default.enum.js.map +1 -0
- package/dist/auth/processors/change.password.data.processor.d.ts +4 -1
- package/dist/auth/processors/change.password.data.processor.d.ts.map +1 -1
- package/dist/auth/processors/change.password.data.processor.js +26 -1
- package/dist/auth/processors/change.password.data.processor.js.map +1 -1
- package/dist/auth/processors/request.password.change.data.processor.d.ts +18 -0
- package/dist/auth/processors/request.password.change.data.processor.d.ts.map +1 -0
- package/dist/auth/processors/request.password.change.data.processor.js +56 -0
- package/dist/auth/processors/request.password.change.data.processor.js.map +1 -0
- package/dist/auth/types/auth.types.d.ts +7 -1
- package/dist/auth/types/auth.types.d.ts.map +1 -1
- package/dist/common/common.module.d.ts.map +1 -1
- package/dist/common/common.module.js +3 -0
- package/dist/common/common.module.js.map +1 -1
- package/dist/common/dtos/otp.generation.dto.d.ts +9 -0
- package/dist/common/dtos/otp.generation.dto.d.ts.map +1 -0
- package/dist/common/dtos/otp.generation.dto.js +55 -0
- package/dist/common/dtos/otp.generation.dto.js.map +1 -0
- package/dist/common/dtos/otp.verification.dto.d.ts +5 -0
- package/dist/common/dtos/otp.verification.dto.d.ts.map +1 -0
- package/dist/common/dtos/otp.verification.dto.js +25 -0
- package/dist/common/dtos/otp.verification.dto.js.map +1 -0
- package/dist/common/entities/system.otp.entity.d.ts +13 -0
- package/dist/common/entities/system.otp.entity.d.ts.map +1 -0
- package/dist/common/entities/system.otp.entity.js +55 -0
- package/dist/common/entities/system.otp.entity.js.map +1 -0
- package/dist/common/enums/encryption.enum.d.ts +2 -1
- package/dist/common/enums/encryption.enum.d.ts.map +1 -1
- package/dist/common/enums/encryption.enum.js +1 -0
- package/dist/common/enums/encryption.enum.js.map +1 -1
- package/dist/common/enums/otp.enum.d.ts +21 -0
- package/dist/common/enums/otp.enum.d.ts.map +1 -0
- package/dist/common/enums/otp.enum.js +29 -0
- package/dist/common/enums/otp.enum.js.map +1 -0
- package/dist/common/es6.classes.d.ts +4 -2
- package/dist/common/es6.classes.d.ts.map +1 -1
- package/dist/common/es6.classes.js +7 -0
- package/dist/common/es6.classes.js.map +1 -1
- package/dist/common/services/encryption.service.d.ts +1 -0
- package/dist/common/services/encryption.service.d.ts.map +1 -1
- package/dist/common/services/encryption.service.js +4 -0
- package/dist/common/services/encryption.service.js.map +1 -1
- package/dist/common/services/list.filter.service.d.ts.map +1 -1
- package/dist/common/services/list.filter.service.js +1 -1
- package/dist/common/services/list.filter.service.js.map +1 -1
- package/dist/common/services/otp.service.d.ts +16 -0
- package/dist/common/services/otp.service.d.ts.map +1 -0
- package/dist/common/services/otp.service.js +107 -0
- package/dist/common/services/otp.service.js.map +1 -0
- package/dist/common/subscribers/common.subscriber.d.ts +1 -0
- package/dist/common/subscribers/common.subscriber.d.ts.map +1 -1
- package/dist/common/subscribers/common.subscriber.js +4 -1
- package/dist/common/subscribers/common.subscriber.js.map +1 -1
- package/dist/common/validators/otp.patterns.d.ts +2 -0
- package/dist/common/validators/otp.patterns.d.ts.map +1 -0
- package/dist/common/validators/otp.patterns.js +5 -0
- package/dist/common/validators/otp.patterns.js.map +1 -0
- package/dist/constants/entity.constants.d.ts +6 -0
- package/dist/constants/entity.constants.d.ts.map +1 -1
- package/dist/constants/entity.constants.js +6 -0
- package/dist/constants/entity.constants.js.map +1 -1
- package/dist/constants/entity.maps.d.ts +12 -0
- package/dist/constants/entity.maps.d.ts.map +1 -1
- package/dist/constants/entity.maps.js +12 -0
- package/dist/constants/entity.maps.js.map +1 -1
- package/dist/document/services/document.service.d.ts.map +1 -1
- package/dist/document/services/document.service.js +6 -1
- package/dist/document/services/document.service.js.map +1 -1
- package/dist/global/utilities/environment.util.d.ts +1 -0
- package/dist/global/utilities/environment.util.d.ts.map +1 -1
- package/dist/global/utilities/environment.util.js +5 -0
- package/dist/global/utilities/environment.util.js.map +1 -1
- package/dist/global/utilities/migration.utility.d.ts +1 -0
- package/dist/global/utilities/migration.utility.d.ts.map +1 -1
- package/dist/global/utilities/migration.utility.js +8 -2
- package/dist/global/utilities/migration.utility.js.map +1 -1
- package/dist/global/utilities/seeder.utility.d.ts.map +1 -1
- package/dist/global/utilities/seeder.utility.js +1 -1
- package/dist/global/utilities/seeder.utility.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -6
- package/dist/index.js.map +1 -1
- package/dist/migrations/1749600000047.CreateSysOtpsTable.d.ts +6 -0
- package/dist/migrations/1749600000047.CreateSysOtpsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000047.CreateSysOtpsTable.js +36 -0
- package/dist/migrations/1749600000047.CreateSysOtpsTable.js.map +1 -0
- package/dist/migrations/1749600000048.SeedOtpActivityConstants.d.ts +6 -0
- package/dist/migrations/1749600000048.SeedOtpActivityConstants.d.ts.map +1 -0
- package/dist/migrations/1749600000048.SeedOtpActivityConstants.js +30 -0
- package/dist/migrations/1749600000048.SeedOtpActivityConstants.js.map +1 -0
- package/dist/migrations/1749600000049.CreateSysScriptsTable.d.ts +6 -0
- package/dist/migrations/1749600000049.CreateSysScriptsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000049.CreateSysScriptsTable.js +22 -0
- package/dist/migrations/1749600000049.CreateSysScriptsTable.js.map +1 -0
- package/dist/migrations/1749600000050.CreateSysReportDetailsTable.d.ts +6 -0
- package/dist/migrations/1749600000050.CreateSysReportDetailsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000050.CreateSysReportDetailsTable.js +49 -0
- package/dist/migrations/1749600000050.CreateSysReportDetailsTable.js.map +1 -0
- package/dist/migrations/1749600000051.CreateSysReportSheetsTable.d.ts +6 -0
- package/dist/migrations/1749600000051.CreateSysReportSheetsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000051.CreateSysReportSheetsTable.js +38 -0
- package/dist/migrations/1749600000051.CreateSysReportSheetsTable.js.map +1 -0
- package/dist/migrations/1749600000052.CreateTnReportDetailsTable.d.ts +6 -0
- package/dist/migrations/1749600000052.CreateTnReportDetailsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000052.CreateTnReportDetailsTable.js +32 -0
- package/dist/migrations/1749600000052.CreateTnReportDetailsTable.js.map +1 -0
- package/dist/migrations/1749600000053.CreateTnTenantReportsTable.d.ts +6 -0
- package/dist/migrations/1749600000053.CreateTnTenantReportsTable.d.ts.map +1 -0
- package/dist/migrations/1749600000053.CreateTnTenantReportsTable.js +38 -0
- package/dist/migrations/1749600000053.CreateTnTenantReportsTable.js.map +1 -0
- package/dist/notification/es6.classes.d.ts +2 -1
- package/dist/notification/es6.classes.d.ts.map +1 -1
- package/dist/notification/es6.classes.js +2 -0
- package/dist/notification/es6.classes.js.map +1 -1
- package/dist/notification/jobs/password.change.otp.mail.job.d.ts +13 -0
- package/dist/notification/jobs/password.change.otp.mail.job.d.ts.map +1 -0
- package/dist/notification/jobs/password.change.otp.mail.job.js +49 -0
- package/dist/notification/jobs/password.change.otp.mail.job.js.map +1 -0
- package/dist/notification/notification.module.d.ts.map +1 -1
- package/dist/notification/notification.module.js +3 -1
- package/dist/notification/notification.module.js.map +1 -1
- package/dist/report/controllers/report.controller.d.ts +22 -0
- package/dist/report/controllers/report.controller.d.ts.map +1 -0
- package/dist/report/controllers/report.controller.js +123 -0
- package/dist/report/controllers/report.controller.js.map +1 -0
- package/dist/report/controllers/tenant.report.controller.d.ts +15 -0
- package/dist/report/controllers/tenant.report.controller.d.ts.map +1 -0
- package/dist/report/controllers/tenant.report.controller.js +71 -0
- package/dist/report/controllers/tenant.report.controller.js.map +1 -0
- package/dist/report/dtos/generated.report.list.dto.d.ts +4 -0
- package/dist/report/dtos/generated.report.list.dto.d.ts.map +1 -0
- package/dist/report/dtos/generated.report.list.dto.js +8 -0
- package/dist/report/dtos/generated.report.list.dto.js.map +1 -0
- package/dist/report/dtos/report.drilldown.dto.d.ts +5 -0
- package/dist/report/dtos/report.drilldown.dto.d.ts.map +1 -0
- package/dist/report/dtos/report.drilldown.dto.js +33 -0
- package/dist/report/dtos/report.drilldown.dto.js.map +1 -0
- package/dist/report/dtos/report.list.dto.d.ts +4 -0
- package/dist/report/dtos/report.list.dto.d.ts.map +1 -0
- package/dist/report/dtos/report.list.dto.js +8 -0
- package/dist/report/dtos/report.list.dto.js.map +1 -0
- package/dist/report/dtos/report.run.dto.d.ts +4 -0
- package/dist/report/dtos/report.run.dto.d.ts.map +1 -0
- package/dist/report/dtos/report.run.dto.js +30 -0
- package/dist/report/dtos/report.run.dto.js.map +1 -0
- package/dist/report/entities/report.detail.entity.d.ts +25 -0
- package/dist/report/entities/report.detail.entity.d.ts.map +1 -0
- package/dist/report/entities/report.detail.entity.js +92 -0
- package/dist/report/entities/report.detail.entity.js.map +1 -0
- package/dist/report/entities/report.sheet.entity.d.ts +13 -0
- package/dist/report/entities/report.sheet.entity.d.ts.map +1 -0
- package/dist/report/entities/report.sheet.entity.js +53 -0
- package/dist/report/entities/report.sheet.entity.js.map +1 -0
- package/dist/report/entities/script.entity.d.ts +9 -0
- package/dist/report/entities/script.entity.d.ts.map +1 -0
- package/dist/report/entities/script.entity.js +41 -0
- package/dist/report/entities/script.entity.js.map +1 -0
- package/dist/report/entities/tenant.report.detail.entity.d.ts +14 -0
- package/dist/report/entities/tenant.report.detail.entity.d.ts.map +1 -0
- package/dist/report/entities/tenant.report.detail.entity.js +53 -0
- package/dist/report/entities/tenant.report.detail.entity.js.map +1 -0
- package/dist/report/entities/tenant.report.entity.d.ts +16 -0
- package/dist/report/entities/tenant.report.entity.d.ts.map +1 -0
- package/dist/report/entities/tenant.report.entity.js +61 -0
- package/dist/report/entities/tenant.report.entity.js.map +1 -0
- package/dist/report/enums/report.default.enum.d.ts +49 -0
- package/dist/report/enums/report.default.enum.d.ts.map +1 -0
- package/dist/report/enums/report.default.enum.js +66 -0
- package/dist/report/enums/report.default.enum.js.map +1 -0
- package/dist/report/es6.classes.d.ts +20 -0
- package/dist/report/es6.classes.d.ts.map +1 -0
- package/dist/report/es6.classes.js +32 -0
- package/dist/report/es6.classes.js.map +1 -0
- package/dist/report/jobs/generate.tenant.report.job.d.ts +21 -0
- package/dist/report/jobs/generate.tenant.report.job.d.ts.map +1 -0
- package/dist/report/jobs/generate.tenant.report.job.js +120 -0
- package/dist/report/jobs/generate.tenant.report.job.js.map +1 -0
- package/dist/report/jobs/link.tenant.report.document.job.d.ts +12 -0
- package/dist/report/jobs/link.tenant.report.document.job.d.ts.map +1 -0
- package/dist/report/jobs/link.tenant.report.document.job.js +58 -0
- package/dist/report/jobs/link.tenant.report.document.job.js.map +1 -0
- package/dist/report/libraries/generated.report.list.processor.d.ts +14 -0
- package/dist/report/libraries/generated.report.list.processor.d.ts.map +1 -0
- package/dist/report/libraries/generated.report.list.processor.js +70 -0
- package/dist/report/libraries/generated.report.list.processor.js.map +1 -0
- package/dist/report/libraries/report.access.predicates.d.ts +6 -0
- package/dist/report/libraries/report.access.predicates.d.ts.map +1 -0
- package/dist/report/libraries/report.access.predicates.js +12 -0
- package/dist/report/libraries/report.access.predicates.js.map +1 -0
- package/dist/report/libraries/report.drilldown.list.processor.d.ts +13 -0
- package/dist/report/libraries/report.drilldown.list.processor.d.ts.map +1 -0
- package/dist/report/libraries/report.drilldown.list.processor.js +37 -0
- package/dist/report/libraries/report.drilldown.list.processor.js.map +1 -0
- package/dist/report/libraries/tenant.report.list.processor.d.ts +14 -0
- package/dist/report/libraries/tenant.report.list.processor.d.ts.map +1 -0
- package/dist/report/libraries/tenant.report.list.processor.js +59 -0
- package/dist/report/libraries/tenant.report.list.processor.js.map +1 -0
- package/dist/report/report.module.d.ts +7 -0
- package/dist/report/report.module.d.ts.map +1 -0
- package/dist/report/report.module.js +90 -0
- package/dist/report/report.module.js.map +1 -0
- package/dist/report/services/report.service.d.ts +35 -0
- package/dist/report/services/report.service.d.ts.map +1 -0
- package/dist/report/services/report.service.js +177 -0
- package/dist/report/services/report.service.js.map +1 -0
- package/dist/report/subscribers/tenant.report.document.subscriber.d.ts +14 -0
- package/dist/report/subscribers/tenant.report.document.subscriber.d.ts.map +1 -0
- package/dist/report/subscribers/tenant.report.document.subscriber.js +43 -0
- package/dist/report/subscribers/tenant.report.document.subscriber.js.map +1 -0
- package/dist/report/subscribers/tenant.report.subscriber.d.ts +13 -0
- package/dist/report/subscribers/tenant.report.subscriber.d.ts.map +1 -0
- package/dist/report/subscribers/tenant.report.subscriber.js +37 -0
- package/dist/report/subscribers/tenant.report.subscriber.js.map +1 -0
- package/dist/report/types/report.types.d.ts +71 -0
- package/dist/report/types/report.types.d.ts.map +1 -0
- package/dist/report/types/report.types.js +3 -0
- package/dist/report/types/report.types.js.map +1 -0
- package/dist/report/utilities/report.catalogue.d.ts +6 -0
- package/dist/report/utilities/report.catalogue.d.ts.map +1 -0
- package/dist/report/utilities/report.catalogue.js +29 -0
- package/dist/report/utilities/report.catalogue.js.map +1 -0
- package/dist/report/utilities/report.run.parameters.d.ts +7 -0
- package/dist/report/utilities/report.run.parameters.d.ts.map +1 -0
- package/dist/report/utilities/report.run.parameters.js +78 -0
- package/dist/report/utilities/report.run.parameters.js.map +1 -0
- package/dist/report/utilities/report.script.d.ts +11 -0
- package/dist/report/utilities/report.script.d.ts.map +1 -0
- package/dist/report/utilities/report.script.js +31 -0
- package/dist/report/utilities/report.script.js.map +1 -0
- package/dist/report/utilities/report.workbook.d.ts +8 -0
- package/dist/report/utilities/report.workbook.d.ts.map +1 -0
- package/dist/report/utilities/report.workbook.js +52 -0
- package/dist/report/utilities/report.workbook.js.map +1 -0
- package/dist/report/validators/report.patterns.d.ts +5 -0
- package/dist/report/validators/report.patterns.d.ts.map +1 -0
- package/dist/report/validators/report.patterns.js +110 -0
- package/dist/report/validators/report.patterns.js.map +1 -0
- package/package.json +6 -1
package/README.md
CHANGED
|
@@ -115,9 +115,11 @@ these are free to change without a breaking release.
|
|
|
115
115
|
| Audit | `AuditService` | `saveAuditLog(old, new)` with changed-value diffing into `sys_audit_logs` |
|
|
116
116
|
| Cache | `CacheService` | Redis, TTL objects (`{days, hours, min}`), transparent encryption |
|
|
117
117
|
| Encryption | `EncryptionService` | AES-256-GCM, scrypt-derived keys |
|
|
118
|
+
| One-time codes | `OtpService`, `OtpActivity`, `SystemOtpEntity` | 6-digit codes per activity on one row (`sys_otps`, activities are `sys_constants` rows); keyed digest only, single use, expiry, 5 guesses; always `000000` when `SERVER_ENV` is set and not `production` |
|
|
118
119
|
| System properties | `SystemPropertyModule`, `SystemPropertyService` | cached + optionally encrypted key/value settings in `sys_properties` |
|
|
119
120
|
| Documents | `DocumentModule`, `DocumentService`, `S3BucketDocumentService`, `MinioBucketDocumentService` | `POST /api/documents/upload` (multipart) or `uploadDocument(multerFiles) → links[]`; driver chosen via `DOCUMENT_STORAGE_DRIVER`; `sys_document_uploads` is the file, `sys_documents` the link to one of your records (`system_generated` marks the ones the backend produced itself) |
|
|
120
121
|
| PDF documents | `PdfService`, `PdfTemplateService`, `ProcessPdfDocument`, `PdfTemplateEntity`, `PdfRenderOptions` | templates in `sys_pdf_templates` rendered to HTML by a remote service, rasterized by headless Chromium (`renderHtmlToPdf(html) → Buffer`, honours the document's own `@page` rules and paginates to any length), then stored — `ProcessPdfDocument` writes both rows and flags the `sys_documents` one `system_generated`; optional peer dep `puppeteer` |
|
|
122
|
+
| Reports | `ReportModule`, `ReportService`, `ReportDetailEntity`, `TenantReportEntity`, `GenerateTenantReportJob` | SQL reports per tenant, gated by scope (plan) and permission: live `summary` / `drilldown`, or generative Excel workbooks stored as documents; optional peer dep `exceljs` — see [Reports](#reports) |
|
|
121
123
|
| HTTP | `CommonController`, `GlobalExceptionFilter`, common DTOs | health endpoint base controller, uniform error envelope |
|
|
122
124
|
| Raw SQL | `SqlService`, `SqlTarget` | named `:key` placeholders always bound as driver params, `:...key` array expansion; runs on the read replica (`DB_READ_*`) with transparent primary fallback; `fetchOne`/`fetchScalar`/`exists`/`count`/`paginate` helpers |
|
|
123
125
|
| List endpoints | `CommonListProcessor`, `CommonListFilterDto`, `FilterDto`, `CommonListFilterConfig` | allowlisted columns, parameterised operators (`eq`…`isNull`), typed value casting (`str`/`num`/`date`/`bool`/`null`), multi-sort + paginated on the read replica |
|
|
@@ -135,7 +137,7 @@ unless marked **required**.
|
|
|
135
137
|
|
|
136
138
|
| Variable | Default | Description |
|
|
137
139
|
| ------------ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
138
|
-
| `SERVER_ENV` | `development` | Runtime environment (`development` / `staging` / `production` / `test`). Swagger docs at `/docs` are mounted in every value **except** `production`. |
|
|
140
|
+
| `SERVER_ENV` | `development` | Runtime environment (`development` / `staging` / `production` / `test`). Swagger docs at `/docs` are mounted in every value **except** `production`. Set and not `production` → every OTP is `000000`. |
|
|
139
141
|
| `PORT` | `8000` | HTTP port the server listens on |
|
|
140
142
|
|
|
141
143
|
### Database (PostgreSQL)
|
|
@@ -229,8 +231,12 @@ const { user } = await this.authService.validateAccess(
|
|
|
229
231
|
|
|
230
232
|
`AuthController` (mounted at `/auth`) exposes the ready-made flows: `POST
|
|
231
233
|
/auth/login`, `/auth/google`, `/auth/register`, `/auth/refresh`, `/auth/logout`,
|
|
232
|
-
`/auth/change-password`, and `GET /auth/me` (user, roles in the session's
|
|
233
|
-
organization, `organizations` to switch to, pending `invitations`).
|
|
234
|
+
`/auth/change-password/request` + `/auth/change-password`, and `GET /auth/me` (user, roles in the session's
|
|
235
|
+
organization, `organizations` to switch to, pending `invitations`). A password change is
|
|
236
|
+
confirmed by a mailed code: `/request` checks `current_password` and mails a 6-digit OTP
|
|
237
|
+
(template `password-change-otp` — seed it), then `/change-password` takes
|
|
238
|
+
`current_password`, `new_password` and `otp`. Replacing the initial one-time password
|
|
239
|
+
needs no `otp`. Passwords are hashed/verified via
|
|
234
240
|
`AuthUtility` (bcrypt); the write flows use the processor lifecycle. Credential
|
|
235
241
|
misses spend the same bcrypt work as a wrong password
|
|
236
242
|
(`AuthUtility.compareAgainstDummy()`), so response timing does not reveal
|
|
@@ -1076,6 +1082,38 @@ comma-separated values and cast each part; `isNull` reads its value truthily
|
|
|
1076
1082
|
Invalid identifiers, operators, or values raise `OperationException` before any
|
|
1077
1083
|
SQL runs. Results come back as `{ records, total, page, limit, total_pages }`.
|
|
1078
1084
|
|
|
1085
|
+
## Reports
|
|
1086
|
+
|
|
1087
|
+
`ReportModule` serves SQL reports to tenant members at `api/reports`, and their generated workbooks at `api/tenant-reports`;
|
|
1088
|
+
the back office manages them through `AdminModule`.
|
|
1089
|
+
|
|
1090
|
+
```ts
|
|
1091
|
+
imports: [DocumentModule, ReportModule] // generation stores workbooks as documents
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
- **Catalogue** (`sys_report_details`): `is_generative`, a script (`sys_scripts`),
|
|
1095
|
+
`scope_id` (the tenant must hold it — through its plan or a grant), `permission_id`
|
|
1096
|
+
(the member must hold it), drilldown `columns`, and for generative reports
|
|
1097
|
+
`sys_report_sheets` (one workbook sheet each, optionally with its own script).
|
|
1098
|
+
- **Per tenant** (`tn_report_details`): which reports a tenant gets, with `parameters`
|
|
1099
|
+
bound into the scripts.
|
|
1100
|
+
- **Scripts** are one SELECT that must use `:tenant_id` (always the session tenant,
|
|
1101
|
+
never overridable); they run on the read replica wrapped in a subquery.
|
|
1102
|
+
- **Run-time parameters** (custom predicates such as a date range): a report declares
|
|
1103
|
+
them (`name`, `type` — `date`, `datetime`, `number`, `string`, `boolean` —,
|
|
1104
|
+
`required`, `default`), its scripts use them as `:from_date` / `:to_date`, and
|
|
1105
|
+
`summary`, `drilldown` and `generate` take `parameters: { from_date, to_date }`.
|
|
1106
|
+
Values are type-checked and bound; neither `tenant_id` nor the tenant's back-office
|
|
1107
|
+
parameters can be overridden. A generation keeps the values it used.
|
|
1108
|
+
- **Live reports**: `POST :id/summary` (≤ 1000 rows) and `POST :id/drilldown`
|
|
1109
|
+
(paged/filtered/sorted over the declared columns).
|
|
1110
|
+
- **Generative reports**: `POST :id/generate` inserts a `tn_tenant_reports` row; its
|
|
1111
|
+
subscriber queues `GenerateTenantReportJob`, which builds the `.xlsx` (needs
|
|
1112
|
+
`yarn add exceljs`) and stores it privately attached to the row. The new
|
|
1113
|
+
`sys_documents` row queues `LinkTenantReportDocumentJob`, which sets
|
|
1114
|
+
`document_id` / `is_generated`. `GET /api/tenant-reports/:id` returns a short-lived
|
|
1115
|
+
`download_url`.
|
|
1116
|
+
|
|
1079
1117
|
## Admin Module
|
|
1080
1118
|
|
|
1081
1119
|
`AdminModule` is the back-office surface — tenant onboarding, client/admin user
|
|
@@ -1122,6 +1160,9 @@ pass the actor to a processor.
|
|
|
1122
1160
|
| `POST /admin/tenant-users/:id/memberships/:tenantId/deactivate` · `/reactivate` | admin | `TenantMembershipService.setMemberActive` |
|
|
1123
1161
|
| `POST /admin/system-users` | super admin | `SystemUserDataProcessor` (upsert — send `id` to update) |
|
|
1124
1162
|
| `POST /admin/system-users/list` | content reader | `SystemUserListProcessor` (scoped to `user_type = system.user`) |
|
|
1163
|
+
| `POST /admin/reports` · `/list` · `GET`/`DELETE /:id` | super admin / content reader | `ReportDataProcessor` (sheets replace), `ReportCatalogueListProcessor` |
|
|
1164
|
+
| `POST /admin/reports/:id/script` · `/:id/sheets/:sheetId/script` | super admin | `ReportScriptDataProcessor` — add or edit; needs `:tenant_id`, dry-run on save |
|
|
1165
|
+
| `POST /admin/tenant-reports` · `/list` · `DELETE /:id` | admin / content reader | `TenantReportDataProcessor` — enable a report for a tenant with its `parameters` |
|
|
1125
1166
|
| `GET /admin/system-users/:id` | content reader | the row |
|
|
1126
1167
|
| `DELETE /admin/system-users/:id` | super admin | `SystemUserService.delete` (revokes live sessions) |
|
|
1127
1168
|
| `POST /admin/users` | super admin | `AdminUserDataProcessor` |
|
|
@@ -1319,6 +1360,7 @@ its remediation status live outside the package (`security-audit/`).
|
|
|
1319
1360
|
`GET /api/admin/scheduled-tasks/jobs`), ≥ 60 s period, 5-field cron.
|
|
1320
1361
|
- `sendMail` throws when `AWS_SES_FROM_ADDRESS` is unset outside development/test.
|
|
1321
1362
|
- Impersonation login returns no refresh token; OTP accounts are limited to change-password until it is replaced.
|
|
1363
|
+
- `POST /auth/change-password` needs `otp` from `POST /auth/change-password/request` (except when replacing a one-time password).
|
|
1322
1364
|
|
|
1323
1365
|
## License
|
|
1324
1366
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ListFilterService } from '../../common/services/list.filter.service';
|
|
2
|
+
import { SqlService } from '../../common/services/sql.service';
|
|
3
|
+
import { ScriptEntity } from '../../report/entities/script.entity';
|
|
4
|
+
import type { ReportDetail } from '../../report/types/report.types';
|
|
5
|
+
import { AddReportDto } from '../dtos/add.report.dto';
|
|
6
|
+
import { ReportCatalogueListDto } from '../dtos/report.catalogue.list.dto';
|
|
7
|
+
import { SetReportScriptDto } from '../dtos/set.report.script.dto';
|
|
8
|
+
import { AdminAccessService } from '../services/admin.access.service';
|
|
9
|
+
import { AdminReportService } from '../services/admin.report.service';
|
|
10
|
+
export declare class AdminReportController {
|
|
11
|
+
private readonly adminAccessService;
|
|
12
|
+
private readonly listFilterService;
|
|
13
|
+
private readonly sqlService;
|
|
14
|
+
private readonly adminReportService;
|
|
15
|
+
constructor(adminAccessService: AdminAccessService, listFilterService: ListFilterService, sqlService: SqlService, adminReportService: AdminReportService);
|
|
16
|
+
save(dto: AddReportDto): Promise<ReportDetail>;
|
|
17
|
+
list(dto: ReportCatalogueListDto): Promise<import("../..").CommonListResult>;
|
|
18
|
+
detail(id: string): Promise<ReportDetail>;
|
|
19
|
+
setScript(id: string, dto: SetReportScriptDto): Promise<ScriptEntity>;
|
|
20
|
+
setSheetScript(id: string, sheetId: string, dto: SetReportScriptDto): Promise<ScriptEntity>;
|
|
21
|
+
remove(id: string): Promise<{
|
|
22
|
+
success: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=admin.report.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.report.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.report.controller.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAInE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAOtE,qBAIa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAHlB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB;IASnD,IAAI,CAAS,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAetD,IAAI,CAAS,GAAG,EAAE,sBAAsB;IAaxC,MAAM,CAA6B,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAcrE,SAAS,CACe,EAAE,EAAE,MAAM,EAC9B,GAAG,EAAE,kBAAkB,GAC9B,OAAO,CAAC,YAAY,CAAC;IAelB,cAAc,CACU,EAAE,EAAE,MAAM,EACL,OAAO,EAAE,MAAM,EACxC,GAAG,EAAE,kBAAkB,GAC9B,OAAO,CAAC,YAAY,CAAC;IAelB,MAAM,CAA6B,EAAE,EAAE,MAAM;;;CAKpD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AdminReportController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const strict_validation_pipe_1 = require("../../common/pipes/strict.validation.pipe");
|
|
19
|
+
const list_filter_service_1 = require("../../common/services/list.filter.service");
|
|
20
|
+
const sql_service_1 = require("../../common/services/sql.service");
|
|
21
|
+
const report_detail_entity_1 = require("../../report/entities/report.detail.entity");
|
|
22
|
+
const report_catalogue_1 = require("../../report/utilities/report.catalogue");
|
|
23
|
+
const add_report_dto_1 = require("../dtos/add.report.dto");
|
|
24
|
+
const report_catalogue_list_dto_1 = require("../dtos/report.catalogue.list.dto");
|
|
25
|
+
const set_report_script_dto_1 = require("../dtos/set.report.script.dto");
|
|
26
|
+
const report_catalogue_list_processor_1 = require("../libraries/report.catalogue.list.processor");
|
|
27
|
+
const report_data_processor_1 = require("../libraries/report.data.processor");
|
|
28
|
+
const report_script_data_processor_1 = require("../libraries/report.script.data.processor");
|
|
29
|
+
const admin_access_service_1 = require("../services/admin.access.service");
|
|
30
|
+
const admin_report_service_1 = require("../services/admin.report.service");
|
|
31
|
+
let AdminReportController = class AdminReportController {
|
|
32
|
+
constructor(adminAccessService, listFilterService, sqlService, adminReportService) {
|
|
33
|
+
this.adminAccessService = adminAccessService;
|
|
34
|
+
this.listFilterService = listFilterService;
|
|
35
|
+
this.sqlService = sqlService;
|
|
36
|
+
this.adminReportService = adminReportService;
|
|
37
|
+
}
|
|
38
|
+
async save(dto) {
|
|
39
|
+
const access = await this.adminAccessService.validateSuperAdmin();
|
|
40
|
+
const report = await new report_data_processor_1.ReportDataProcessor(access).process(dto);
|
|
41
|
+
return report_catalogue_1.ReportCatalogue.detail(report_detail_entity_1.ReportDetailEntity.getRepository().manager, report.id);
|
|
42
|
+
}
|
|
43
|
+
async list(dto) {
|
|
44
|
+
await this.adminAccessService.validateContentReader();
|
|
45
|
+
return new report_catalogue_list_processor_1.ReportCatalogueListProcessor(this.listFilterService).process(dto);
|
|
46
|
+
}
|
|
47
|
+
async detail(id) {
|
|
48
|
+
await this.adminAccessService.validateContentReader();
|
|
49
|
+
return report_catalogue_1.ReportCatalogue.detail(report_detail_entity_1.ReportDetailEntity.getRepository().manager, id);
|
|
50
|
+
}
|
|
51
|
+
async setScript(id, dto) {
|
|
52
|
+
const access = await this.adminAccessService.validateSuperAdmin();
|
|
53
|
+
return new report_script_data_processor_1.ReportScriptDataProcessor(access, this.sqlService).process(id, null, dto);
|
|
54
|
+
}
|
|
55
|
+
async setSheetScript(id, sheetId, dto) {
|
|
56
|
+
const access = await this.adminAccessService.validateSuperAdmin();
|
|
57
|
+
return new report_script_data_processor_1.ReportScriptDataProcessor(access, this.sqlService).process(id, sheetId, dto);
|
|
58
|
+
}
|
|
59
|
+
async remove(id) {
|
|
60
|
+
const { user } = await this.adminAccessService.validateSuperAdmin();
|
|
61
|
+
await this.adminReportService.deleteReport(id, user);
|
|
62
|
+
return { success: true };
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.AdminReportController = AdminReportController;
|
|
66
|
+
__decorate([
|
|
67
|
+
(0, common_1.Post)(),
|
|
68
|
+
(0, swagger_1.ApiOperation)({
|
|
69
|
+
summary: 'Define a report, or update an existing one.',
|
|
70
|
+
description: "Send an `id` to edit; omit it to define one. `identifier` is fixed once created. `sheets`, when sent, replace the report's sheets (send a sheet's `id` to keep it and its script). Scripts are set through `POST :id/script`. Requires the global super admin role.",
|
|
71
|
+
}),
|
|
72
|
+
__param(0, (0, common_1.Body)()),
|
|
73
|
+
__metadata("design:type", Function),
|
|
74
|
+
__metadata("design:paramtypes", [add_report_dto_1.AddReportDto]),
|
|
75
|
+
__metadata("design:returntype", Promise)
|
|
76
|
+
], AdminReportController.prototype, "save", null);
|
|
77
|
+
__decorate([
|
|
78
|
+
(0, common_1.Post)('list'),
|
|
79
|
+
(0, swagger_1.ApiOperation)({
|
|
80
|
+
summary: 'List, search and filter reports.',
|
|
81
|
+
description: 'Rows carry `has_script`, `sheets` and `tenants` (tenants it is enabled for). Requires at least the global content reader role.',
|
|
82
|
+
}),
|
|
83
|
+
__param(0, (0, common_1.Body)()),
|
|
84
|
+
__metadata("design:type", Function),
|
|
85
|
+
__metadata("design:paramtypes", [report_catalogue_list_dto_1.ReportCatalogueListDto]),
|
|
86
|
+
__metadata("design:returntype", Promise)
|
|
87
|
+
], AdminReportController.prototype, "list", null);
|
|
88
|
+
__decorate([
|
|
89
|
+
(0, common_1.Get)(':id'),
|
|
90
|
+
(0, swagger_1.ApiOperation)({
|
|
91
|
+
summary: 'One report, in full.',
|
|
92
|
+
description: "With its `script`, `scope`, `permission`, `sheets` (each with its own `script`, null = the report's) and `tenant_count`. Requires at least the global content reader role.",
|
|
93
|
+
}),
|
|
94
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseUUIDPipe)),
|
|
95
|
+
__metadata("design:type", Function),
|
|
96
|
+
__metadata("design:paramtypes", [String]),
|
|
97
|
+
__metadata("design:returntype", Promise)
|
|
98
|
+
], AdminReportController.prototype, "detail", null);
|
|
99
|
+
__decorate([
|
|
100
|
+
(0, common_1.Post)(':id/script'),
|
|
101
|
+
(0, swagger_1.ApiOperation)({
|
|
102
|
+
summary: "Add the report's script, or edit it.",
|
|
103
|
+
description: "One SELECT that narrows by `:tenant_id`; other `:name` placeholders take the tenant's parameters. It is dry-run on save, so syntax and column errors come back on `script`. Requires the global super admin role.",
|
|
104
|
+
}),
|
|
105
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseUUIDPipe)),
|
|
106
|
+
__param(1, (0, common_1.Body)()),
|
|
107
|
+
__metadata("design:type", Function),
|
|
108
|
+
__metadata("design:paramtypes", [String, set_report_script_dto_1.SetReportScriptDto]),
|
|
109
|
+
__metadata("design:returntype", Promise)
|
|
110
|
+
], AdminReportController.prototype, "setScript", null);
|
|
111
|
+
__decorate([
|
|
112
|
+
(0, common_1.Post)(':id/sheets/:sheetId/script'),
|
|
113
|
+
(0, swagger_1.ApiOperation)({
|
|
114
|
+
summary: "Add a sheet's own script, or edit it.",
|
|
115
|
+
description: "Same rules as the report's script. A sheet without one runs the report's. Requires the global super admin role.",
|
|
116
|
+
}),
|
|
117
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseUUIDPipe)),
|
|
118
|
+
__param(1, (0, common_1.Param)('sheetId', common_1.ParseUUIDPipe)),
|
|
119
|
+
__param(2, (0, common_1.Body)()),
|
|
120
|
+
__metadata("design:type", Function),
|
|
121
|
+
__metadata("design:paramtypes", [String, String, set_report_script_dto_1.SetReportScriptDto]),
|
|
122
|
+
__metadata("design:returntype", Promise)
|
|
123
|
+
], AdminReportController.prototype, "setSheetScript", null);
|
|
124
|
+
__decorate([
|
|
125
|
+
(0, common_1.Delete)(':id'),
|
|
126
|
+
(0, swagger_1.ApiOperation)({
|
|
127
|
+
summary: 'Delete a report.',
|
|
128
|
+
description: 'Soft delete, with its sheets. Refused while any tenant has it enabled — remove those first. Requires the global super admin role.',
|
|
129
|
+
}),
|
|
130
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseUUIDPipe)),
|
|
131
|
+
__metadata("design:type", Function),
|
|
132
|
+
__metadata("design:paramtypes", [String]),
|
|
133
|
+
__metadata("design:returntype", Promise)
|
|
134
|
+
], AdminReportController.prototype, "remove", null);
|
|
135
|
+
exports.AdminReportController = AdminReportController = __decorate([
|
|
136
|
+
(0, swagger_1.ApiTags)('Admin - Reports'),
|
|
137
|
+
(0, swagger_1.ApiBearerAuth)(),
|
|
138
|
+
(0, common_1.UsePipes)(strict_validation_pipe_1.StrictValidationPipe),
|
|
139
|
+
(0, common_1.Controller)('api/admin/reports'),
|
|
140
|
+
__metadata("design:paramtypes", [admin_access_service_1.AdminAccessService,
|
|
141
|
+
list_filter_service_1.ListFilterService,
|
|
142
|
+
sql_service_1.SqlService,
|
|
143
|
+
admin_report_service_1.AdminReportService])
|
|
144
|
+
], AdminReportController);
|
|
145
|
+
//# sourceMappingURL=admin.report.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.report.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.report.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ListFilterService } from '../../common/services/list.filter.service';
|
|
2
|
+
import { SqlService } from '../../common/services/sql.service';
|
|
3
|
+
import { TenantReportDetailEntity } from '../../report/entities/tenant.report.detail.entity';
|
|
4
|
+
import { AssignTenantReportDto } from '../dtos/assign.tenant.report.dto';
|
|
5
|
+
import { TenantReportListDto } from '../dtos/tenant.report.list.dto';
|
|
6
|
+
import { AdminAccessService } from '../services/admin.access.service';
|
|
7
|
+
import { AdminReportService } from '../services/admin.report.service';
|
|
8
|
+
export declare class AdminTenantReportController {
|
|
9
|
+
private readonly adminAccessService;
|
|
10
|
+
private readonly listFilterService;
|
|
11
|
+
private readonly sqlService;
|
|
12
|
+
private readonly adminReportService;
|
|
13
|
+
constructor(adminAccessService: AdminAccessService, listFilterService: ListFilterService, sqlService: SqlService, adminReportService: AdminReportService);
|
|
14
|
+
save(dto: AssignTenantReportDto): Promise<TenantReportDetailEntity>;
|
|
15
|
+
list(dto: TenantReportListDto): Promise<import("../..").CommonListResult>;
|
|
16
|
+
remove(id: string): Promise<{
|
|
17
|
+
success: boolean;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=admin.tenant.report.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.tenant.report.controller.d.ts","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.report.controller.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAMtE,qBAIa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBAHlB,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,kBAAkB;IASnD,IAAI,CACA,GAAG,EAAE,qBAAqB,GACjC,OAAO,CAAC,wBAAwB,CAAC;IAW9B,IAAI,CAAS,GAAG,EAAE,mBAAmB;IAarC,MAAM,CAA6B,EAAE,EAAE,MAAM;;;CAKpD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.AdminTenantReportController = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
18
|
+
const strict_validation_pipe_1 = require("../../common/pipes/strict.validation.pipe");
|
|
19
|
+
const list_filter_service_1 = require("../../common/services/list.filter.service");
|
|
20
|
+
const sql_service_1 = require("../../common/services/sql.service");
|
|
21
|
+
const assign_tenant_report_dto_1 = require("../dtos/assign.tenant.report.dto");
|
|
22
|
+
const tenant_report_list_dto_1 = require("../dtos/tenant.report.list.dto");
|
|
23
|
+
const tenant_report_data_processor_1 = require("../libraries/tenant.report.data.processor");
|
|
24
|
+
const tenant_report_list_processor_1 = require("../libraries/tenant.report.list.processor");
|
|
25
|
+
const admin_access_service_1 = require("../services/admin.access.service");
|
|
26
|
+
const admin_report_service_1 = require("../services/admin.report.service");
|
|
27
|
+
let AdminTenantReportController = class AdminTenantReportController {
|
|
28
|
+
constructor(adminAccessService, listFilterService, sqlService, adminReportService) {
|
|
29
|
+
this.adminAccessService = adminAccessService;
|
|
30
|
+
this.listFilterService = listFilterService;
|
|
31
|
+
this.sqlService = sqlService;
|
|
32
|
+
this.adminReportService = adminReportService;
|
|
33
|
+
}
|
|
34
|
+
async save(dto) {
|
|
35
|
+
const access = await this.adminAccessService.validateAdmin();
|
|
36
|
+
return new tenant_report_data_processor_1.TenantReportDataProcessor(access, this.sqlService).process(dto);
|
|
37
|
+
}
|
|
38
|
+
async list(dto) {
|
|
39
|
+
await this.adminAccessService.validateContentReader();
|
|
40
|
+
return new tenant_report_list_processor_1.AdminTenantReportListProcessor(this.listFilterService).process(dto);
|
|
41
|
+
}
|
|
42
|
+
async remove(id) {
|
|
43
|
+
const { user } = await this.adminAccessService.validateAdmin();
|
|
44
|
+
await this.adminReportService.disableTenantReport(id, user);
|
|
45
|
+
return { success: true };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.AdminTenantReportController = AdminTenantReportController;
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, common_1.Post)(),
|
|
51
|
+
(0, swagger_1.ApiOperation)({
|
|
52
|
+
summary: 'Enable a report for a tenant, or edit that enablement.',
|
|
53
|
+
description: "Send an `id` to edit; `tenant_id` and `report_id` are fixed once created, and a report is enabled at most once per tenant. `parameters` must bind every placeholder of the report's scripts besides `:tenant_id`. Members still need the report's scope and permission. Requires the global admin role.",
|
|
54
|
+
}),
|
|
55
|
+
__param(0, (0, common_1.Body)()),
|
|
56
|
+
__metadata("design:type", Function),
|
|
57
|
+
__metadata("design:paramtypes", [assign_tenant_report_dto_1.AssignTenantReportDto]),
|
|
58
|
+
__metadata("design:returntype", Promise)
|
|
59
|
+
], AdminTenantReportController.prototype, "save", null);
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, common_1.Post)('list'),
|
|
62
|
+
(0, swagger_1.ApiOperation)({
|
|
63
|
+
summary: 'List reports enabled per tenant.',
|
|
64
|
+
description: 'Send `tenant_id` or `report_id` to narrow to one tenant or one report. Requires at least the global content reader role.',
|
|
65
|
+
}),
|
|
66
|
+
__param(0, (0, common_1.Body)()),
|
|
67
|
+
__metadata("design:type", Function),
|
|
68
|
+
__metadata("design:paramtypes", [tenant_report_list_dto_1.TenantReportListDto]),
|
|
69
|
+
__metadata("design:returntype", Promise)
|
|
70
|
+
], AdminTenantReportController.prototype, "list", null);
|
|
71
|
+
__decorate([
|
|
72
|
+
(0, common_1.Delete)(':id'),
|
|
73
|
+
(0, swagger_1.ApiOperation)({
|
|
74
|
+
summary: 'Disable a report for a tenant.',
|
|
75
|
+
description: 'Soft delete; its generated workbooks stay stored but can no longer be opened. Requires the global admin role.',
|
|
76
|
+
}),
|
|
77
|
+
__param(0, (0, common_1.Param)('id', common_1.ParseUUIDPipe)),
|
|
78
|
+
__metadata("design:type", Function),
|
|
79
|
+
__metadata("design:paramtypes", [String]),
|
|
80
|
+
__metadata("design:returntype", Promise)
|
|
81
|
+
], AdminTenantReportController.prototype, "remove", null);
|
|
82
|
+
exports.AdminTenantReportController = AdminTenantReportController = __decorate([
|
|
83
|
+
(0, swagger_1.ApiTags)('Admin - Tenant Reports'),
|
|
84
|
+
(0, swagger_1.ApiBearerAuth)(),
|
|
85
|
+
(0, common_1.UsePipes)(strict_validation_pipe_1.StrictValidationPipe),
|
|
86
|
+
(0, common_1.Controller)('api/admin/tenant-reports'),
|
|
87
|
+
__metadata("design:paramtypes", [admin_access_service_1.AdminAccessService,
|
|
88
|
+
list_filter_service_1.ListFilterService,
|
|
89
|
+
sql_service_1.SqlService,
|
|
90
|
+
admin_report_service_1.AdminReportService])
|
|
91
|
+
], AdminTenantReportController);
|
|
92
|
+
//# sourceMappingURL=admin.tenant.report.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.tenant.report.controller.js","sourceRoot":"","sources":["../../../src/admin/controllers/admin.tenant.report.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAQwB;AACxB,6CAAuE;AACvE,sFAAiF;AACjF,mFAA8E;AAC9E,mEAA+D;AAE/D,+EAAyE;AACzE,2EAAqE;AACrE,4FAAsF;AACtF,4FAA2F;AAC3F,2EAAsE;AACtE,2EAAsE;AAU/D,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACtC,YACmB,kBAAsC,EACtC,iBAAoC,EACpC,UAAsB,EACtB,kBAAsC;QAHtC,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,eAAU,GAAV,UAAU,CAAY;QACtB,uBAAkB,GAAlB,kBAAkB,CAAoB;IACtD,CAAC;IAQE,AAAN,KAAK,CAAC,IAAI,CACA,GAA0B;QAElC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC7D,OAAO,IAAI,wDAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;IAQK,AAAN,KAAK,CAAC,IAAI,CAAS,GAAwB;QACzC,MAAM,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,CAAC;QACtD,OAAO,IAAI,6DAA8B,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CACvE,GAAG,CACJ,CAAC;IACJ,CAAC;IAQK,AAAN,KAAK,CAAC,MAAM,CAA6B,EAAU;QACjD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AA7CY,kEAA2B;AAchC;IANL,IAAA,aAAI,GAAE;IACN,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,wDAAwD;QACjE,WAAW,EACT,ySAAyS;KAC5S,CAAC;IAEC,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,gDAAqB;;uDAInC;AAQK;IANL,IAAA,aAAI,EAAC,MAAM,CAAC;IACZ,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,kCAAkC;QAC3C,WAAW,EACT,0HAA0H;KAC7H,CAAC;IACU,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,4CAAmB;;uDAK1C;AAQK;IANL,IAAA,eAAM,EAAC,KAAK,CAAC;IACb,IAAA,sBAAY,EAAC;QACZ,OAAO,EAAE,gCAAgC;QACzC,WAAW,EACT,+GAA+G;KAClH,CAAC;IACY,WAAA,IAAA,cAAK,EAAC,IAAI,EAAE,sBAAa,CAAC,CAAA;;;;yDAIvC;sCA5CU,2BAA2B;IAJvC,IAAA,iBAAO,EAAC,wBAAwB,CAAC;IACjC,IAAA,uBAAa,GAAE;IACf,IAAA,iBAAQ,EAAC,6CAAoB,CAAC;IAC9B,IAAA,mBAAU,EAAC,0BAA0B,CAAC;qCAGE,yCAAkB;QACnB,uCAAiB;QACxB,wBAAU;QACF,yCAAkB;GAL9C,2BAA2B,CA6CvC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CommonDataDto } from '../../common/dtos/common.data.dto';
|
|
2
|
+
import { FilterValueTypeEnum } from '../../common/enums/filter.value.type.enum';
|
|
3
|
+
import { ReportParameterType } from '../../report/enums/report.default.enum';
|
|
4
|
+
export declare class ReportColumnDto {
|
|
5
|
+
identifier: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
type?: FilterValueTypeEnum;
|
|
8
|
+
searchable?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class ReportParameterDefinitionDto {
|
|
11
|
+
name: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
type: ReportParameterType;
|
|
14
|
+
required?: boolean;
|
|
15
|
+
default?: string | number | boolean | null;
|
|
16
|
+
}
|
|
17
|
+
export declare class ReportSheetItemDto {
|
|
18
|
+
id?: string;
|
|
19
|
+
name: string;
|
|
20
|
+
sort_order?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare class AddReportDto extends CommonDataDto {
|
|
23
|
+
identifier: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
is_generative?: boolean;
|
|
27
|
+
scope_id?: string | null;
|
|
28
|
+
permission_id?: string | null;
|
|
29
|
+
columns?: ReportColumnDto[];
|
|
30
|
+
parameters?: ReportParameterDefinitionDto[];
|
|
31
|
+
is_active?: boolean;
|
|
32
|
+
sort_order?: number;
|
|
33
|
+
sheets?: ReportSheetItemDto[];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=add.report.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.report.dto.d.ts","sourceRoot":"","sources":["../../../src/admin/dtos/add.report.dto.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAEL,mBAAmB,EACpB,MAAM,wCAAwC,CAAC;AAQhD,qBAAa,eAAe;IAM1B,UAAU,EAAE,MAAM,CAAC;IAMnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAKd,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAK3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAGD,qBAAa,4BAA4B;IAMvC,IAAI,EAAE,MAAM,CAAC;IAMb,KAAK,CAAC,EAAE,MAAM,CAAC;IAIf,IAAI,EAAE,mBAAmB,CAAC;IAK1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IASnB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CAC5C;AAGD,qBAAa,kBAAkB;IAI7B,EAAE,CAAC,EAAE,MAAM,CAAC;IAMZ,IAAI,EAAE,MAAM,CAAC;IAOb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,qBAAa,YAAa,SAAQ,aAAa;IAS7C,UAAU,EAAE,MAAM,CAAC;IAMnB,IAAI,EAAE,MAAM,CAAC;IAMb,WAAW,CAAC,EAAE,MAAM,CAAC;IAQrB,aAAa,CAAC,EAAE,OAAO,CAAC;IASxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IASzB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAS9B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAa5B,UAAU,CAAC,EAAE,4BAA4B,EAAE,CAAC;IAK5C,SAAS,CAAC,EAAE,OAAO,CAAC;IAOpB,UAAU,CAAC,EAAE,MAAM,CAAC;IAWpB,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC/B"}
|