@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/refresh-model.command.d.ts +1 -7
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +4 -49
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/refresh-module.command.d.ts +0 -2
- package/dist/commands/refresh-module.command.d.ts.map +1 -1
- package/dist/commands/refresh-module.command.js +3 -16
- package/dist/commands/refresh-module.command.js.map +1 -1
- package/dist/commands/test-data.command.d.ts +2 -0
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +32 -6
- package/dist/commands/test-data.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +2 -0
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +17 -0
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
- package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/gupshup-webhook.controller.js +87 -0
- package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
- package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
- package/dist/controllers/mcp-audit-log.controller.js +147 -0
- package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
- package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.d.ts +1 -1
- package/dist/controllers/model-metadata.controller.js +2 -2
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
- package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
- package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
- package/dist/dtos/update-chatter-note-message.dto.js +34 -0
- package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
- package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
- package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
- package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
- package/dist/dtos/update-user.dto.d.ts +1 -0
- package/dist/dtos/update-user.dto.d.ts.map +1 -1
- package/dist/dtos/update-user.dto.js +7 -1
- package/dist/dtos/update-user.dto.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +0 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
- package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
- package/dist/entities/mcp-audit-log.entity.js +90 -0
- package/dist/entities/mcp-audit-log.entity.js.map +1 -0
- package/dist/entities/user.entity.js +1 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +13 -11
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts +1 -0
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +8 -3
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/command.service.d.ts +1 -0
- package/dist/helpers/command.service.d.ts.map +1 -1
- package/dist/helpers/command.service.js +1 -0
- package/dist/helpers/command.service.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -2
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
- package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
- package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
- package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
- package/dist/listeners/user-registration.listener.d.ts +5 -2
- package/dist/listeners/user-registration.listener.d.ts.map +1 -1
- package/dist/listeners/user-registration.listener.js +37 -4
- package/dist/listeners/user-registration.listener.js.map +1 -1
- package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
- package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
- package/dist/repository/mcp-audit-log.repository.js +34 -0
- package/dist/repository/mcp-audit-log.repository.js.map +1 -0
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +9 -0
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +155 -18
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +381 -2
- package/dist/services/authentication.service.d.ts +6 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +145 -15
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +13 -4
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +117 -37
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/mcp-audit-log.service.d.ts +12 -0
- package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
- package/dist/services/mcp-audit-log.service.js +38 -0
- package/dist/services/mcp-audit-log.service.js.map +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +4 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +24 -24
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +19 -2
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +119 -4
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user.service.js +1 -1
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
- package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
- package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
- package/dist/solid-core.module.d.ts +2 -2
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -6
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/console-reporter.d.ts +10 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +21 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/reporter.types.d.ts +7 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.js.map +1 -1
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +20 -1
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/dist/winston.logger.d.ts +5 -0
- package/dist/winston.logger.d.ts.map +1 -1
- package/dist/winston.logger.js +6 -4
- package/dist/winston.logger.js.map +1 -1
- package/dist-tests/api/authenticate.spec.js +119 -0
- package/dist-tests/api/authenticate.spec.js.map +1 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
- package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
- package/dist-tests/api/ping.spec.js +21 -0
- package/dist-tests/api/ping.spec.js.map +1 -0
- package/dist-tests/helpers/auth.js +41 -0
- package/dist-tests/helpers/auth.js.map +1 -0
- package/dist-tests/helpers/env.js +11 -0
- package/dist-tests/helpers/env.js.map +1 -0
- package/docs/grouping-enhancements.md +89 -0
- package/docs/java-spring/README.md +3 -0
- package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
- package/docs/seed-changes.md +65 -0
- package/docs/test-data-workflow.md +200 -0
- package/docs/type-declaration-import-issue.md +24 -0
- package/package.json +8 -8
- package/src/commands/refresh-model.command.ts +6 -51
- package/src/commands/refresh-module.command.ts +3 -16
- package/src/commands/test-data.command.ts +29 -6
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/chatter-message.controller.ts +12 -0
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/gupshup-webhook.controller.ts +91 -0
- package/src/controllers/mcp-audit-log.controller.ts +70 -0
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
- package/src/dtos/update-chatter-note-message.dto.ts +14 -0
- package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
- package/src/dtos/update-user.dto.ts +4 -0
- package/src/entities/chatter-message-details.entity.ts +1 -2
- package/src/entities/mcp-audit-log.entity.ts +55 -0
- package/src/entities/user.entity.ts +1 -1
- package/src/factories/whatsapp.factory.ts +33 -32
- package/src/helpers/bootstrap.helper.ts +16 -6
- package/src/helpers/command.service.ts +2 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/field-quality-check-fixes.md +178 -0
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/index.ts +6 -0
- package/src/interfaces.ts +1 -3
- package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
- package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
- package/src/listeners/user-registration.listener.ts +49 -6
- package/src/repository/mcp-audit-log.repository.ts +17 -0
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/module-test-data.service.ts +186 -17
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +381 -2
- package/src/services/authentication.service.ts +267 -44
- package/src/services/chatter-message.service.ts +140 -40
- package/src/services/crud.service.ts +1 -1
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +1 -1
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/mcp-audit-log.service.ts +19 -0
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
- package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
- package/src/services/model-metadata.service.ts +36 -34
- package/src/services/module-metadata.service.ts +19 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +1 -1
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +4 -4
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +119 -4
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/user.service.ts +1 -1
- package/src/services/view-metadata.service.ts +25 -8
- package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
- package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
- package/src/solid-core.module.ts +213 -196
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/README.md +15 -0
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/console-reporter.ts +27 -0
- package/src/testing/reporter/reporter.types.ts +7 -0
- package/src/testing/reporter/webhook-reporter.ts +1 -1
- package/src/testing/runner/run-from-metadata.ts +19 -1
- package/src/winston.logger.ts +5 -7
- package/.claude/settings.local.json +0 -15
- package/src/services/1.js +0 -6
|
@@ -238,7 +238,7 @@ export class ModuleMetadataSeederService {
|
|
|
238
238
|
|
|
239
239
|
//FIXME: Handle displaying the created users credentials in a better way.
|
|
240
240
|
// this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
|
|
241
|
-
} catch (error) {
|
|
241
|
+
} catch (error: any) {
|
|
242
242
|
this.logSeedFailureForCli(error, {
|
|
243
243
|
moduleName: currentModule,
|
|
244
244
|
step: currentStep,
|
|
@@ -463,7 +463,7 @@ export class ModuleMetadataSeederService {
|
|
|
463
463
|
await this.createPermissionIfNotExists(permissionName);
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
-
} catch (error) {
|
|
466
|
+
} catch (error: any) {
|
|
467
467
|
this.logger.error(error);
|
|
468
468
|
}
|
|
469
469
|
}
|
|
@@ -544,7 +544,7 @@ export class ModuleMetadataSeederService {
|
|
|
544
544
|
moduleRoot = path.dirname(
|
|
545
545
|
require.resolve('@solidxai/core/package.json'),
|
|
546
546
|
);
|
|
547
|
-
} catch (err) {
|
|
547
|
+
} catch (err: any) {
|
|
548
548
|
this.logger.debug(
|
|
549
549
|
'Could not resolve @solidxai/core from node_modules, assuming local execution',
|
|
550
550
|
);
|
|
@@ -610,7 +610,7 @@ export class ModuleMetadataSeederService {
|
|
|
610
610
|
moduleRoot = path.dirname(
|
|
611
611
|
require.resolve('@solidxai/core/package.json'),
|
|
612
612
|
);
|
|
613
|
-
} catch (err) {
|
|
613
|
+
} catch (err: any) {
|
|
614
614
|
this.logger.debug(
|
|
615
615
|
'Could not resolve @solidxai/core from node_modules, assuming local execution',
|
|
616
616
|
);
|
|
@@ -19,11 +19,12 @@ import { ModelMetadataService } from 'src/services/model-metadata.service';
|
|
|
19
19
|
import { RoleMetadataService } from 'src/services/role-metadata.service';
|
|
20
20
|
import { UserService } from 'src/services/user.service';
|
|
21
21
|
import { getMediaStorageProvider } from 'src/services/mediaStorageProviders';
|
|
22
|
-
import { TestingRoleSpec, TestingUserSpec } from 'src/testing/contracts/testing-metadata.types';
|
|
22
|
+
import { TestingDataRecord, TestingRoleSpec, TestingUserSpec } from 'src/testing/contracts/testing-metadata.types';
|
|
23
23
|
|
|
24
24
|
@Injectable()
|
|
25
25
|
export class ModuleTestDataService {
|
|
26
26
|
private readonly logger = new Logger(ModuleTestDataService.name);
|
|
27
|
+
private static readonly TEARDOWN_RETRY_ATTEMPTS = 5;
|
|
27
28
|
|
|
28
29
|
constructor(
|
|
29
30
|
private readonly moduleRef: ModuleRef,
|
|
@@ -50,6 +51,25 @@ export class ModuleTestDataService {
|
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
|
|
54
|
+
async removeTestData(modulesToTest?: string[]): Promise<void> {
|
|
55
|
+
const testDataFiles = this.testDataFiles;
|
|
56
|
+
const filteredFiles = modulesToTest?.length ? testDataFiles.filter((file) => modulesToTest.includes(file.moduleMetadata?.name)) : testDataFiles;
|
|
57
|
+
|
|
58
|
+
if (filteredFiles.length === 0) {
|
|
59
|
+
this.logger.warn('No modules matched the provided modulesToTest list.');
|
|
60
|
+
console.log('No modules matched the provided modulesToTest list.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
for (const overallMetadata of filteredFiles) {
|
|
65
|
+
const moduleName = overallMetadata?.moduleMetadata?.name ?? 'unknown';
|
|
66
|
+
this.logger.log(`Removing test data for module: ${moduleName}`);
|
|
67
|
+
console.log(`Removing test data for module: ${moduleName}`);
|
|
68
|
+
await this.unlinkTestData(overallMetadata);
|
|
69
|
+
console.log(`✔ Test data unlink complete for module: ${moduleName}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
53
73
|
async createTestDatasources(): Promise<void> {
|
|
54
74
|
const manifestPath = path.join(process.cwd(), '.solidx-test-manifest');
|
|
55
75
|
if (fs.existsSync(manifestPath)) {
|
|
@@ -198,7 +218,7 @@ export class ModuleTestDataService {
|
|
|
198
218
|
|
|
199
219
|
const testingRoles: TestingRoleSpec[] = overallMetadata?.testing?.roles ?? [];
|
|
200
220
|
const testingUsers: TestingUserSpec[] = overallMetadata?.testing?.users ?? [];
|
|
201
|
-
const testingData:
|
|
221
|
+
const testingData: TestingDataRecord[] = overallMetadata?.testing?.data ?? [];
|
|
202
222
|
|
|
203
223
|
if (testingRoles.length > 0) {
|
|
204
224
|
await this.seedTestRoles(testingRoles);
|
|
@@ -289,16 +309,21 @@ export class ModuleTestDataService {
|
|
|
289
309
|
// Upsert entity, capturing the saved result for post-save steps
|
|
290
310
|
let savedEntity: any;
|
|
291
311
|
const userKeyField = modelDef.userKeyFieldUserKey;
|
|
312
|
+
const recordUserKeyValue = entry.recUserKeyValue ?? payload[userKeyField];
|
|
313
|
+
const recordLabel = `${modelUserKey}.${userKeyField}=${recordUserKeyValue}`;
|
|
292
314
|
if (userKeyField && payload[userKeyField] !== undefined) {
|
|
293
315
|
const existing = await entityRepo.findOne({
|
|
294
316
|
where: { [userKeyField]: payload[userKeyField] },
|
|
295
317
|
});
|
|
296
318
|
if (existing) {
|
|
319
|
+
console.log(`Updating test data record: ${recordLabel}`);
|
|
297
320
|
savedEntity = await entityRepo.save(entityRepo.merge(existing, payload));
|
|
298
321
|
} else {
|
|
322
|
+
console.log(`Creating test data record: ${recordLabel}`);
|
|
299
323
|
savedEntity = await entityRepo.save(entityRepo.create(payload));
|
|
300
324
|
}
|
|
301
325
|
} else {
|
|
326
|
+
console.log(`Creating test data record without user key lookup: ${modelUserKey}`);
|
|
302
327
|
savedEntity = await entityRepo.save(entityRepo.create(payload));
|
|
303
328
|
}
|
|
304
329
|
|
|
@@ -312,6 +337,59 @@ export class ModuleTestDataService {
|
|
|
312
337
|
}
|
|
313
338
|
}
|
|
314
339
|
|
|
340
|
+
private async unlinkTestData(overallMetadata: any): Promise<void> {
|
|
341
|
+
const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
|
|
342
|
+
if (!moduleMetadata) {
|
|
343
|
+
throw new Error('Module metadata missing from test data payload.');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const testingData: TestingDataRecord[] = overallMetadata?.testing?.data ?? [];
|
|
347
|
+
if (testingData.length === 0) {
|
|
348
|
+
this.logger.debug(`No test data found for ${moduleMetadata.name}`);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const modelsByName = new Map<string, CreateModelMetadataDto>(
|
|
353
|
+
(moduleMetadata.models ?? []).map((m) => [m.singularName, m]),
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
for (const entry of [...testingData].reverse()) {
|
|
357
|
+
const modelUserKey = entry.modelUserKey;
|
|
358
|
+
const modelDef = modelsByName.get(modelUserKey);
|
|
359
|
+
if (!modelDef) {
|
|
360
|
+
throw new Error(`Test data modelUserKey not found in metadata: ${modelUserKey}`);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const userKeyField = modelDef.userKeyFieldUserKey;
|
|
364
|
+
if (!userKeyField) {
|
|
365
|
+
throw new Error(`Cannot unlink test data for model ${modelUserKey} because userKeyFieldUserKey is not configured.`);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const userKeyValue = entry.data?.[userKeyField];
|
|
369
|
+
if (userKeyValue === undefined || userKeyValue === null || userKeyValue === '') {
|
|
370
|
+
throw new Error(
|
|
371
|
+
`Cannot unlink test data for model ${modelUserKey} because testing.data entry is missing the actual user key field "${userKeyField}" in data.`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
const recordLabel = `${modelUserKey}.${userKeyField}=${userKeyValue}`;
|
|
375
|
+
|
|
376
|
+
const entityRepo = this.resolveRepository(modelUserKey);
|
|
377
|
+
const existing = typeof entityRepo.findOneByUserKey === 'function'
|
|
378
|
+
? await entityRepo.findOneByUserKey(userKeyValue)
|
|
379
|
+
: await entityRepo.findOne({ where: { [userKeyField]: userKeyValue } });
|
|
380
|
+
|
|
381
|
+
if (!existing) {
|
|
382
|
+
console.log(`Skipping unlink; test data record not found: ${recordLabel}`);
|
|
383
|
+
this.logger.debug(`Test data record not found for unlink: ${modelUserKey}.${userKeyField}=${userKeyValue}`);
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
console.log(`Deleting test data record: ${recordLabel}`);
|
|
388
|
+
await entityRepo.remove(existing);
|
|
389
|
+
this.logger.debug(`Removed test data record: ${modelUserKey}.${userKeyField}=${userKeyValue}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
315
393
|
private async seedTestRoles(roles: TestingRoleSpec[]): Promise<void> {
|
|
316
394
|
const roleService = this.moduleRef.get(RoleMetadataService, { strict: false });
|
|
317
395
|
if (!roleService) {
|
|
@@ -665,31 +743,122 @@ export class ModuleTestDataService {
|
|
|
665
743
|
private async dropTestDatabaseObjects(databases: Record<string, string>): Promise<void> {
|
|
666
744
|
const entries = Object.entries(databases);
|
|
667
745
|
for (const [dsName, dbName] of entries) {
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
}
|
|
746
|
+
await this.dropTestDatabaseObjectsWithRetry(dsName, dbName);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
672
749
|
|
|
673
|
-
|
|
750
|
+
private async dropTestDatabaseObjectsWithRetry(dsName: string, dbName: string): Promise<void> {
|
|
751
|
+
let lastError: unknown;
|
|
752
|
+
|
|
753
|
+
for (let attempt = 1; attempt <= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS; attempt += 1) {
|
|
754
|
+
console.log(`Attempting to tear down "${dbName}" on datasource "${dsName}" (${attempt}/${ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS})...`);
|
|
674
755
|
|
|
675
|
-
const queryRunner = dataSource.createQueryRunner();
|
|
676
756
|
try {
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
|
|
684
|
-
} else {
|
|
685
|
-
throw new Error(`Unsupported database type for test data deletion: ${type}`);
|
|
757
|
+
await this.dropSingleTestDatabaseObject(dsName, dbName);
|
|
758
|
+
return;
|
|
759
|
+
} catch (error) {
|
|
760
|
+
lastError = error;
|
|
761
|
+
if (attempt >= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS) {
|
|
762
|
+
throw error;
|
|
686
763
|
}
|
|
764
|
+
|
|
765
|
+
await this.sleep(this.teardownRetryDelayMs(attempt));
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
private teardownRetryDelayMs(attempt: number): number {
|
|
773
|
+
const baseMs = 500;
|
|
774
|
+
const incrementMs = 350;
|
|
775
|
+
const jitterMs = Math.floor(Math.random() * 250);
|
|
776
|
+
return baseMs + ((attempt - 1) * incrementMs) + jitterMs;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
private async sleep(ms: number): Promise<void> {
|
|
780
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
private async dropSingleTestDatabaseObject(dsName: string, dbName: string): Promise<void> {
|
|
784
|
+
const dataSource = this.resolveDataSourceByName(dsName);
|
|
785
|
+
|
|
786
|
+
if (dataSource.options.type === 'postgres') {
|
|
787
|
+
await this.dropPostgresDatabase(dataSource, dbName);
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
if (!dataSource.isInitialized) {
|
|
792
|
+
await dataSource.initialize();
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const queryRunner = dataSource.createQueryRunner();
|
|
796
|
+
try {
|
|
797
|
+
const type = dataSource.options.type;
|
|
798
|
+
if (type === 'mssql') {
|
|
799
|
+
await this.dropMssqlSchema(queryRunner, dbName);
|
|
800
|
+
} else if (type === 'mysql' || type === 'mariadb') {
|
|
801
|
+
await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
|
|
802
|
+
} else {
|
|
803
|
+
throw new Error(`Unsupported database type for test data deletion: ${type}`);
|
|
804
|
+
}
|
|
805
|
+
} finally {
|
|
806
|
+
await queryRunner.release();
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
private async dropPostgresDatabase(dataSource: DataSource, dbName: string): Promise<void> {
|
|
811
|
+
if (dataSource.isInitialized) {
|
|
812
|
+
await dataSource.destroy();
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
const adminDataSource = new DataSource({
|
|
816
|
+
...(dataSource.options as any),
|
|
817
|
+
database: this.resolvePostgresMaintenanceDatabase(dataSource),
|
|
818
|
+
name: `${String(dataSource.name ?? 'default')}_teardown_admin_${Date.now()}`,
|
|
819
|
+
synchronize: false,
|
|
820
|
+
migrationsRun: false,
|
|
821
|
+
entities: [],
|
|
822
|
+
subscribers: [],
|
|
823
|
+
migrations: [],
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
try {
|
|
827
|
+
await adminDataSource.initialize();
|
|
828
|
+
const queryRunner = adminDataSource.createQueryRunner();
|
|
829
|
+
try {
|
|
830
|
+
await queryRunner.query(
|
|
831
|
+
`SELECT pg_terminate_backend(pid)
|
|
832
|
+
FROM pg_stat_activity
|
|
833
|
+
WHERE datname = $1
|
|
834
|
+
AND pid <> pg_backend_pid()`,
|
|
835
|
+
[dbName],
|
|
836
|
+
);
|
|
837
|
+
await queryRunner.query(`DROP DATABASE IF EXISTS "${dbName}"`);
|
|
687
838
|
} finally {
|
|
688
839
|
await queryRunner.release();
|
|
689
840
|
}
|
|
841
|
+
} finally {
|
|
842
|
+
if (adminDataSource.isInitialized) {
|
|
843
|
+
await adminDataSource.destroy();
|
|
844
|
+
}
|
|
690
845
|
}
|
|
691
846
|
}
|
|
692
847
|
|
|
848
|
+
private resolvePostgresMaintenanceDatabase(dataSource: DataSource): string {
|
|
849
|
+
const configured = process.env.POSTGRES_MAINTENANCE_DATABASE?.trim();
|
|
850
|
+
if (configured) {
|
|
851
|
+
return configured;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
const currentDb = String((dataSource.options as any)?.database ?? '').trim();
|
|
855
|
+
if (currentDb && currentDb !== 'postgres') {
|
|
856
|
+
return 'postgres';
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
return 'template1';
|
|
860
|
+
}
|
|
861
|
+
|
|
693
862
|
private async dropMssqlSchema(queryRunner: ReturnType<DataSource['createQueryRunner']>, schemaName: string): Promise<void> {
|
|
694
863
|
const foreignKeys: Array<{ fk_name: string; table_name: string }> = await queryRunner.query(
|
|
695
864
|
`SELECT fk.name AS fk_name, t.name AS table_name
|