@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
|
@@ -1,42 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ConfigType } from "@nestjs/config";
|
|
1
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
3
2
|
import { ModuleRef } from "@nestjs/core";
|
|
4
3
|
import { SolidRegistry } from "src/helpers/solid-registry";
|
|
5
4
|
import { IWhatsAppTransport } from "src/interfaces";
|
|
6
5
|
import { SettingService } from "src/services/setting.service";
|
|
7
6
|
import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
|
|
8
7
|
|
|
9
|
-
function norm(s?: string) {
|
|
10
|
-
return s?.trim().toLowerCase();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// This factory will be use to return a mail service instance, using the configured environment variables
|
|
14
8
|
@Injectable()
|
|
15
9
|
export class WhatsAppFactory {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
10
|
+
private readonly logger = new Logger(WhatsAppFactory.name);
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly moduleRef: ModuleRef,
|
|
14
|
+
private readonly solidRegistry: SolidRegistry,
|
|
15
|
+
private readonly settingService: SettingService,
|
|
16
|
+
) {}
|
|
17
|
+
|
|
18
|
+
getWhatsappService(name?: string): IWhatsAppTransport {
|
|
19
|
+
const providerKey =
|
|
20
|
+
name ||
|
|
21
|
+
this.settingService.getConfigValue<SolidCoreSetting>("whatsappProvider");
|
|
22
|
+
|
|
23
|
+
if (!providerKey) {
|
|
24
|
+
throw new Error("Unable to resolve whatsapp provider");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const whatsappProviders = this.solidRegistry.getWhatsappProviders();
|
|
28
|
+
|
|
29
|
+
if (!whatsappProviders.length) {
|
|
30
|
+
throw new Error("No whatsapp providers are registered.");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const whatsappServiceProvider = whatsappProviders.find((provider) =>
|
|
34
|
+
provider.name?.toLowerCase().includes(providerKey.toLowerCase()),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
if (!whatsappServiceProvider) {
|
|
38
|
+
throw new Error(`WhatsApp provider '${providerKey}' not found`);
|
|
40
39
|
}
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
return whatsappServiceProvider.instance as IWhatsAppTransport;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ValidationPipe } from '@nestjs/common';
|
|
2
2
|
import { NestFactory } from '@nestjs/core';
|
|
3
|
+
import { WsAdapter } from '@nestjs/platform-ws';
|
|
3
4
|
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
|
|
4
5
|
import { NextFunction, Request, Response } from 'express';
|
|
5
6
|
import helmet from 'helmet';
|
|
@@ -8,7 +9,7 @@ import { existsSync } from 'fs';
|
|
|
8
9
|
import { resolve } from 'path';
|
|
9
10
|
import { WINSTON_MODULE_NEST_PROVIDER, WinstonModule } from 'nest-winston';
|
|
10
11
|
import { CommandFactory } from 'nest-commander';
|
|
11
|
-
import {
|
|
12
|
+
import { createWinstonLoggerConfig } from '../winston.logger';
|
|
12
13
|
import { WrapResponseInterceptor } from '../interceptors/wrap-response.interceptor';
|
|
13
14
|
import { buildDefaultCorsOptions } from './cors.helper';
|
|
14
15
|
import { buildDefaultSecurityHeaderOptions, buildPermissionsPolicyHeader, PermissionsPolicyConfig } from './security.helper';
|
|
@@ -49,6 +50,8 @@ export interface SolidBootstrapOptions {
|
|
|
49
50
|
swagger?: SolidSwaggerOptions | false;
|
|
50
51
|
/** Permissions-Policy header overrides (merged with defaults). */
|
|
51
52
|
permissionsPolicyOverrides?: Partial<PermissionsPolicyConfig>;
|
|
53
|
+
/** Show full NestJS init logs during bootstrap (route mapping, module deps, pollers). Defaults to false. */
|
|
54
|
+
verboseBootstrap?: boolean;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
/**
|
|
@@ -69,11 +72,12 @@ export async function bootstrapSolidApp(
|
|
|
69
72
|
): Promise<void> {
|
|
70
73
|
registerGlobalProcessHandlers();
|
|
71
74
|
|
|
72
|
-
const { globalPrefix = 'api', swagger = {}, permissionsPolicyOverrides = {} } = options;
|
|
75
|
+
const { globalPrefix = 'api', swagger = {}, permissionsPolicyOverrides = {}, verboseBootstrap = false } = options;
|
|
73
76
|
|
|
77
|
+
const startTime = Date.now();
|
|
74
78
|
const appModule = await appModuleFactory();
|
|
75
79
|
const app = await NestFactory.create(appModule, {
|
|
76
|
-
logger: WinstonModule.createLogger(
|
|
80
|
+
logger: WinstonModule.createLogger({ ...createWinstonLoggerConfig(), level: verboseBootstrap ? 'debug' : 'error' }),
|
|
77
81
|
});
|
|
78
82
|
|
|
79
83
|
const apiEnabled = parseBooleanEnv('API_ENABLED', true);
|
|
@@ -114,9 +118,6 @@ export async function bootstrapSolidApp(
|
|
|
114
118
|
next();
|
|
115
119
|
});
|
|
116
120
|
|
|
117
|
-
// Winston logger
|
|
118
|
-
app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));
|
|
119
|
-
|
|
120
121
|
const port = process.env.PORT || 3000;
|
|
121
122
|
|
|
122
123
|
if (globalPrefix) {
|
|
@@ -178,7 +179,16 @@ export async function bootstrapSolidApp(
|
|
|
178
179
|
const types = require('pg').types;
|
|
179
180
|
types.setTypeParser(types.builtins.INT8, (val: string) => parseInt(val));
|
|
180
181
|
|
|
182
|
+
app.useWebSocketAdapter(new WsAdapter(app));
|
|
183
|
+
|
|
181
184
|
await app.listen(port);
|
|
185
|
+
|
|
186
|
+
// Wire up Winston as the runtime logger only AFTER listen — this suppresses all
|
|
187
|
+
// framework init noise (route mapping, module deps, onModuleInit) during boot.
|
|
188
|
+
app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER));
|
|
189
|
+
|
|
190
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
|
|
191
|
+
app.get(WINSTON_MODULE_NEST_PROVIDER).log(`\x1b[32mServer started on port ${port} in ${elapsed}s\x1b[0m`, 'Bootstrap');
|
|
182
192
|
}
|
|
183
193
|
|
|
184
194
|
// ---- CLI bootstrap ----
|
|
@@ -4,6 +4,7 @@ import { spawn } from 'child_process';
|
|
|
4
4
|
export type CommandWithArgs = {
|
|
5
5
|
command: string;
|
|
6
6
|
args: string[];
|
|
7
|
+
cwd?: string;
|
|
7
8
|
};
|
|
8
9
|
|
|
9
10
|
@Injectable()
|
|
@@ -43,6 +44,7 @@ export class CommandService {
|
|
|
43
44
|
const child = spawn(command, spawnArgs, {
|
|
44
45
|
shell: isWindows, // Use shell on Windows to handle .cmd files
|
|
45
46
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
47
|
+
cwd: commandWithArgs.cwd,
|
|
46
48
|
});
|
|
47
49
|
|
|
48
50
|
let stdout = '';
|
|
@@ -20,7 +20,7 @@ export class BigIntFieldCrudManager implements FieldCrudManager {
|
|
|
20
20
|
if (typeof fieldValue === 'string' || typeof fieldValue === 'number') {
|
|
21
21
|
fieldValue = BigInt(fieldValue);
|
|
22
22
|
}
|
|
23
|
-
} catch (err) {
|
|
23
|
+
} catch (err: any) {
|
|
24
24
|
return [{ field: this.options.fieldName, error: 'Invalid numeric value' }];
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -119,7 +119,7 @@ export class SelectionDynamicFieldCrudManager implements FieldCrudManager {
|
|
|
119
119
|
}
|
|
120
120
|
return false;
|
|
121
121
|
}
|
|
122
|
-
catch (error) {
|
|
122
|
+
catch (error: any) {
|
|
123
123
|
// Use the values method as a fallback, if the value method is not implemented
|
|
124
124
|
const values = await providerInstance.values('', ctxt);
|
|
125
125
|
const isValid = values.some(v => v.value === fieldValue);
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
# Field Quality Checks And Fixes
|
|
2
|
+
|
|
3
|
+
This checklist tracks backend issues and logical enhancements for each field type in `solid-core-module`.
|
|
4
|
+
|
|
5
|
+
Use it for backend concerns only:
|
|
6
|
+
|
|
7
|
+
- CRUD validation
|
|
8
|
+
- transformation and normalization
|
|
9
|
+
- persistence behavior
|
|
10
|
+
- relation semantics
|
|
11
|
+
- field-level correctness and consistency
|
|
12
|
+
|
|
13
|
+
Frontend widget and rendering concerns belong in `solid-core-ui`.
|
|
14
|
+
|
|
15
|
+
## `shortText`
|
|
16
|
+
|
|
17
|
+
- [ ] Resolve the `length` versus `max` contract for `shortText` and document one clear meaning for each attribute.
|
|
18
|
+
- [ ] Decide whether backend validation should also enforce `min`, so `shortText` constraints remain consistent even outside generated form flows.
|
|
19
|
+
- [ ] Return the configured regex mismatch message when `regexPatternNotMatchingErrorMsg` is present instead of always using a generic regex error.
|
|
20
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `shortText` field.
|
|
21
|
+
- [ ] Decide whether `shortText` should support optional normalization such as trimming or whitespace collapsing, and keep that decision consistent across comparable text field types.
|
|
22
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
23
|
+
- [ ] Add targeted coverage for partial update behavior, empty string versus null handling, regex validation, and max-length enforcement.
|
|
24
|
+
- [ ] Review whether the text-oriented managers share enough behavior to justify a common validation utility or base manager without weakening field-specific semantics.
|
|
25
|
+
|
|
26
|
+
## `longText`
|
|
27
|
+
|
|
28
|
+
- [ ] Decide whether backend validation should also enforce `min` and `max`, so `longText` constraints remain consistent outside generated form flows.
|
|
29
|
+
- [ ] Return the configured regex mismatch message when `regexPatternNotMatchingErrorMsg` is present instead of always using a generic regex error.
|
|
30
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `longText` field.
|
|
31
|
+
- [ ] Decide whether `longText` should support optional normalization such as trimming trailing whitespace while preserving intentional line breaks.
|
|
32
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
33
|
+
- [ ] Add targeted coverage for multiline content, regex validation, partial updates, and empty string versus null handling.
|
|
34
|
+
- [ ] Review whether the text-oriented managers share enough behavior to justify a common validation utility or base manager without weakening field-specific semantics.
|
|
35
|
+
|
|
36
|
+
## `richText`
|
|
37
|
+
|
|
38
|
+
- [ ] Decide whether backend validation should also enforce `min` and `max`, so `richText` constraints remain consistent outside generated form flows.
|
|
39
|
+
- [ ] Return the configured regex mismatch message when `regexPatternNotMatchingErrorMsg` is present instead of always using a generic regex error.
|
|
40
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `richText` field.
|
|
41
|
+
- [ ] Decide whether `richText` should support optional normalization or sanitization at save time, and define that behavior explicitly.
|
|
42
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
43
|
+
- [ ] Add targeted coverage for rich HTML-like content, regex validation, partial updates, and empty string versus null handling.
|
|
44
|
+
- [ ] Review whether the text-oriented managers share enough behavior to justify a common validation utility or base manager without weakening field-specific semantics.
|
|
45
|
+
|
|
46
|
+
## `json`
|
|
47
|
+
|
|
48
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `json` field.
|
|
49
|
+
- [ ] Decide whether backend validation should accept only stringified JSON or also handle already-parsed object and array payloads more explicitly.
|
|
50
|
+
- [ ] Review whether the current JSON validation error should distinguish between invalid JSON syntax and unsupported runtime value shapes.
|
|
51
|
+
- [ ] Decide whether normalization or canonical stringification should happen before persistence for comparable JSON values.
|
|
52
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
53
|
+
- [ ] Add targeted coverage for object payloads, array payloads, stringified JSON payloads, invalid JSON, partial updates, and empty string versus null handling.
|
|
54
|
+
|
|
55
|
+
## `int`
|
|
56
|
+
|
|
57
|
+
- [ ] Fix the current min/max activation rule, because backend validation only applies numeric bounds when the configured value is greater than `0`, which skips valid `0` and negative thresholds.
|
|
58
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits an `int` field.
|
|
59
|
+
- [ ] Decide whether the CRUD layer should normalize numeric strings into integers more explicitly before validation and persistence.
|
|
60
|
+
- [ ] Review whether integer fields should reject decimal-shaped inputs more clearly when values arrive from metadata-driven clients as strings.
|
|
61
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
62
|
+
- [ ] Add targeted coverage for `0`, negative values, numeric strings, invalid decimal-like input, min/max bounds, and partial update behavior.
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
## `bigint`
|
|
66
|
+
|
|
67
|
+
- [ ] Clarify the authored support surface for `bigint`, because the CRUD manager contains numeric bound logic while the authored field surface does not currently present `min` and `max` in the same way as `int` and `decimal`.
|
|
68
|
+
- [ ] Fix or clarify the current numeric-bound activation rule if bigint bounds are intended to be supported, since the logic only applies bounds when the configured value is greater than `0`.
|
|
69
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `bigint` field.
|
|
70
|
+
- [ ] Decide what the canonical runtime contract should be for bigint inputs: native `bigint`, numeric strings, or finite JavaScript numbers.
|
|
71
|
+
- [ ] Review whether accepting finite JavaScript numbers for bigint validation is sufficient when exact large-integer fidelity matters.
|
|
72
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
73
|
+
- [ ] Add targeted coverage for numeric strings, very large values, invalid numeric input, bound handling, null handling, and partial update behavior.
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
## `decimal`
|
|
77
|
+
|
|
78
|
+
- [ ] Fix the current min/max activation rule, because backend validation only applies numeric bounds when the configured value is greater than `0`, which skips valid `0` and negative thresholds.
|
|
79
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `decimal` field.
|
|
80
|
+
- [ ] Decide whether the CRUD layer should normalize numeric strings into decimal numbers more explicitly before validation and persistence.
|
|
81
|
+
- [ ] Review whether decimal fields need an explicit precision-and-scale contract instead of relying entirely on the persistence-layer `ormType`.
|
|
82
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
83
|
+
- [ ] Add targeted coverage for `0`, negative values, fractional values, numeric strings, invalid numeric input, min/max bounds, and partial update behavior.
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
## `boolean`
|
|
87
|
+
|
|
88
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `boolean` field.
|
|
89
|
+
- [ ] Decide whether boolean CRUD validation should accept only runtime booleans or also normalize `"true"` and `"false"` string payloads when they arrive from metadata-driven clients.
|
|
90
|
+
- [ ] Review whether the required validation path should distinguish more clearly between an omitted value and an explicit `false` value, especially for partial updates.
|
|
91
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
92
|
+
- [ ] Add targeted coverage for `true`, `false`, null, empty string, string booleans, and partial update behavior.
|
|
93
|
+
|
|
94
|
+
## `date`
|
|
95
|
+
|
|
96
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `date` field.
|
|
97
|
+
- [ ] Review whether the CRUD layer should accept only runtime `Date` objects or also normalize common serialized date inputs more explicitly before validation.
|
|
98
|
+
- [ ] Decide whether `date` and `datetime` should continue to share the same backend validation path or receive more distinct normalization and validation behavior.
|
|
99
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
100
|
+
- [ ] Add targeted coverage for `Date` objects, serialized date strings, null handling, invalid date inputs, and partial update behavior.
|
|
101
|
+
|
|
102
|
+
## `datetime`
|
|
103
|
+
|
|
104
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `datetime` field.
|
|
105
|
+
- [ ] Review whether the CRUD layer should accept only runtime `Date` objects or also normalize common serialized datetime inputs more explicitly before validation.
|
|
106
|
+
- [ ] Decide whether `date` and `datetime` should continue to share the same backend validation path or receive more distinct normalization and validation behavior.
|
|
107
|
+
- [ ] Review whether timezone normalization rules should be documented and enforced more explicitly at save time.
|
|
108
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
109
|
+
- [ ] Add targeted coverage for `Date` objects, serialized datetime strings, null handling, timezone-sensitive values, invalid datetime inputs, and partial update behavior.
|
|
110
|
+
|
|
111
|
+
## `time`
|
|
112
|
+
|
|
113
|
+
- [ ] Add an explicit CRUD-manager path for `SolidFieldType.time`, since the field currently has core UI support but is not routed through a dedicated backend field manager.
|
|
114
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `time` field.
|
|
115
|
+
- [ ] Decide what canonical persisted shape `time` should use: pure time string, database-native time value, or a normalized timestamp-derived representation.
|
|
116
|
+
- [ ] Review whether the CRUD layer should normalize common time inputs such as `HH:mm:ss`, ISO timestamps, and UI-submitted values more explicitly before validation and persistence.
|
|
117
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
118
|
+
- [ ] Add targeted coverage for `HH:mm:ss` inputs, ISO-style inputs, invalid time values, null handling, and partial update behavior.
|
|
119
|
+
|
|
120
|
+
## `email`
|
|
121
|
+
|
|
122
|
+
- [ ] Decide whether backend validation should also enforce `min`, so email constraints remain consistent outside generated form flows.
|
|
123
|
+
- [ ] Return the configured regex mismatch message when `regexPatternNotMatchingErrorMsg` is present instead of always using a generic regex error.
|
|
124
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits an `email` field.
|
|
125
|
+
- [ ] Decide whether email values should support optional normalization such as trimming and lowercasing before persistence.
|
|
126
|
+
- [ ] Review whether uniqueness should receive any pre-save validation support at the CRUD layer or continue to rely entirely on persistence-layer constraints.
|
|
127
|
+
- [ ] Add targeted coverage for max-length enforcement, regex overrides, invalid email formats, null handling, and partial update behavior.
|
|
128
|
+
|
|
129
|
+
## `password`
|
|
130
|
+
|
|
131
|
+
- [ ] Return the configured regex mismatch message when `regexPatternNotMatchingErrorMsg` is present instead of always using a generic password-regex error.
|
|
132
|
+
- [ ] Review whether password validation should produce clearer error messages for min, max, regex, and confirm-password mismatch failures.
|
|
133
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` on password fields, including whether it should be ignored entirely for secure create flows.
|
|
134
|
+
- [ ] Review whether password hashing and password-update flows should share a more explicit single contract across create and update operations.
|
|
135
|
+
- [ ] Decide whether password normalization should include trimming or whether exact raw user input should always be preserved before hashing.
|
|
136
|
+
- [ ] Add targeted coverage for create-required behavior, update-optional behavior, confirm-password mismatch, hashing behavior, regex fallback behavior, and partial update behavior.
|
|
137
|
+
|
|
138
|
+
## `selectionStatic`
|
|
139
|
+
|
|
140
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `selectionStatic` field, especially for multi-select fields.
|
|
141
|
+
- [ ] Decide whether the CRUD layer should normalize single-select and multi-select payloads into one consistent stored shape before persistence.
|
|
142
|
+
- [ ] Review whether the current `selectionStaticValues` parsing should validate malformed `value:label` entries more explicitly instead of assuming a valid authored format.
|
|
143
|
+
- [ ] Add clearer error messaging when the submitted value has the wrong type versus when it is simply not part of the authored option set.
|
|
144
|
+
- [ ] Review whether numeric selection values need more explicit normalization, especially when values can arrive as strings from metadata-driven clients.
|
|
145
|
+
- [ ] Add targeted coverage for single-select string values, single-select numeric values, JSON-stringified multi-select arrays, invalid option tokens, malformed arrays, and partial update behavior.
|
|
146
|
+
|
|
147
|
+
## `selectionDynamic`
|
|
148
|
+
|
|
149
|
+
- [ ] Clarify and implement the expected behavior for `defaultValue` when a create payload omits a `selectionDynamic` field, especially for multi-select fields.
|
|
150
|
+
- [ ] Review whether the CRUD layer should normalize single-select and multi-select payloads into one consistent stored shape before persistence.
|
|
151
|
+
- [ ] Add clearer error messaging when the submitted value has the wrong type, when the provider rejects the value, and when the provider itself cannot be resolved.
|
|
152
|
+
- [ ] Review whether numeric selection values need more explicit normalization, especially when values can arrive as strings from metadata-driven clients.
|
|
153
|
+
- [ ] Clarify how `validateOnSave` in `selectionDynamicProviderCtxt` should be treated as part of the supported field contract and whether more provider-context keys should be validated.
|
|
154
|
+
- [ ] Add targeted coverage for provider-backed single-select values, JSON-stringified multi-select arrays, invalid provider names, `validateOnSave: false`, invalid option values, and partial update behavior.
|
|
155
|
+
|
|
156
|
+
## `many-to-one`
|
|
157
|
+
|
|
158
|
+
- [ ] Review pending.
|
|
159
|
+
|
|
160
|
+
## `one-to-many`
|
|
161
|
+
|
|
162
|
+
- [ ] Review pending.
|
|
163
|
+
|
|
164
|
+
## `many-to-many`
|
|
165
|
+
|
|
166
|
+
- [ ] Review pending.
|
|
167
|
+
|
|
168
|
+
## `mediaSingle`
|
|
169
|
+
|
|
170
|
+
- [ ] Review pending.
|
|
171
|
+
|
|
172
|
+
## `mediaMultiple`
|
|
173
|
+
|
|
174
|
+
- [ ] Review pending.
|
|
175
|
+
|
|
176
|
+
## `computed`
|
|
177
|
+
|
|
178
|
+
- [ ] Review pending.
|
|
@@ -23,7 +23,7 @@ export class ModuleMetadataHelperService {
|
|
|
23
23
|
const fileContent = await fs.readFile(configFilePath, 'utf8');
|
|
24
24
|
return JSON.parse(fileContent);
|
|
25
25
|
}
|
|
26
|
-
catch (error) {
|
|
26
|
+
catch (error: any) {
|
|
27
27
|
this.logger.error(`module metadata configuration non existent at: ${configFilePath}`);
|
|
28
28
|
}
|
|
29
29
|
|
package/src/index.ts
CHANGED
|
@@ -29,6 +29,7 @@ export * from './decorators/settings-provider.decorator'
|
|
|
29
29
|
export * from './decorators/extension-user-creation-provider.decorator'
|
|
30
30
|
|
|
31
31
|
export * from './dtos/post-chatter-message.dto'
|
|
32
|
+
export * from './dtos/update-chatter-note-message.dto'
|
|
32
33
|
export * from './dtos/security-rule-config.dto'
|
|
33
34
|
export * from './dtos/basic-filters.dto'
|
|
34
35
|
export * from './dtos/solid-request-context.dto'
|
|
@@ -49,6 +50,7 @@ export * from './dtos/create-mq-message-queue.dto'
|
|
|
49
50
|
export * from './dtos/create-mq-message.dto'
|
|
50
51
|
export * from './dtos/create-agent-session.dto'
|
|
51
52
|
export * from './dtos/create-agent-event.dto'
|
|
53
|
+
export * from './dtos/create-mcp-audit-log.dto'
|
|
52
54
|
export * from './dtos/create-scheduled-job.dto'
|
|
53
55
|
export * from './dtos/create-permission-metadata.dto'
|
|
54
56
|
export * from './dtos/create-role-metadata.dto'
|
|
@@ -89,6 +91,7 @@ export * from './dtos/update-mq-message-queue.dto'
|
|
|
89
91
|
export * from './dtos/update-mq-message.dto'
|
|
90
92
|
export * from './dtos/update-agent-session.dto'
|
|
91
93
|
export * from './dtos/update-agent-event.dto'
|
|
94
|
+
export * from './dtos/update-mcp-audit-log.dto'
|
|
92
95
|
export * from './dtos/update-scheduled-job.dto'
|
|
93
96
|
export * from './dtos/update-permission-metadata.dto'
|
|
94
97
|
export * from './dtos/update-role-metadata.dto'
|
|
@@ -122,6 +125,7 @@ export * from './entities/mq-message-queue.entity'
|
|
|
122
125
|
export * from './entities/mq-message.entity'
|
|
123
126
|
export * from './entities/agent-session.entity'
|
|
124
127
|
export * from './entities/agent-event.entity'
|
|
128
|
+
export * from './entities/mcp-audit-log.entity'
|
|
125
129
|
export * from './entities/scheduled-job.entity'
|
|
126
130
|
export * from './entities/permission-metadata.entity'
|
|
127
131
|
export * from './entities/role-metadata.entity'
|
|
@@ -297,6 +301,7 @@ export * from './services/mq-message-queue.service'
|
|
|
297
301
|
export * from './services/mq-message.service'
|
|
298
302
|
export * from './services/agent-session.service'
|
|
299
303
|
export * from './services/agent-event.service'
|
|
304
|
+
export * from './services/mcp-audit-log.service'
|
|
300
305
|
export * from './services/scheduled-job.service'
|
|
301
306
|
export * from './services/pdf.service'
|
|
302
307
|
export * from './services/permission-metadata.service'
|
|
@@ -318,6 +323,7 @@ export * from './services/solid-introspect.service'
|
|
|
318
323
|
export * from './services/user.service'
|
|
319
324
|
export * from './services/view-metadata.service'
|
|
320
325
|
export * from './services/whatsapp/Msg91WhatsappService' //rename
|
|
326
|
+
export * from './services/whatsapp/GupshupOtpWhatsappService'
|
|
321
327
|
export * from './services/setting.service'
|
|
322
328
|
export * from './services/encryption.service'
|
|
323
329
|
export * from './services/info.service'
|
package/src/interfaces.ts
CHANGED
|
@@ -42,6 +42,7 @@ export interface ValidationError {
|
|
|
42
42
|
export interface MediaStorageProvider<T> {
|
|
43
43
|
store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]>;
|
|
44
44
|
delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void>;
|
|
45
|
+
deleteByMediaRecord(media: Media): Promise<void>;
|
|
45
46
|
retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]>;
|
|
46
47
|
storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]>;
|
|
47
48
|
// delete(file: string): Promise<void>;
|
|
@@ -121,8 +122,6 @@ export interface CodeGenerationOptions {
|
|
|
121
122
|
fieldIdsForRemoval?: number[];
|
|
122
123
|
fieldNamesForRemoval?: string[];
|
|
123
124
|
dryRun?: boolean;
|
|
124
|
-
fieldIdsForRefresh?: number[];
|
|
125
|
-
fieldNamesForRefresh?: string[];
|
|
126
125
|
}
|
|
127
126
|
|
|
128
127
|
export interface TriggerMcpClientOptions {
|
|
@@ -450,4 +449,3 @@ export interface AuditQueuePayload {
|
|
|
450
449
|
updatedColumnNames?: string[];
|
|
451
450
|
userId?: number | null;
|
|
452
451
|
}
|
|
453
|
-
|
|
@@ -35,7 +35,7 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
|
|
|
35
35
|
|
|
36
36
|
switch (p.eventType) {
|
|
37
37
|
case 'insert':
|
|
38
|
-
await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
|
|
38
|
+
await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
|
|
39
39
|
break;
|
|
40
40
|
case 'update':
|
|
41
41
|
await this.chatterMessageService.postAuditMessageOnUpdate(
|
|
@@ -43,10 +43,12 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
|
|
|
43
43
|
p.modelName,
|
|
44
44
|
p.before,
|
|
45
45
|
(p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
|
|
46
|
+
false,
|
|
47
|
+
p.userId,
|
|
46
48
|
);
|
|
47
49
|
break;
|
|
48
50
|
case 'delete':
|
|
49
|
-
await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
|
|
51
|
+
await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
|
|
50
52
|
break;
|
|
51
53
|
}
|
|
52
54
|
}
|
|
@@ -60,7 +60,7 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
|
|
|
60
60
|
// Fallback
|
|
61
61
|
nestedResponse = String(raw);
|
|
62
62
|
}
|
|
63
|
-
} catch (err) {
|
|
63
|
+
} catch (err: any) {
|
|
64
64
|
this.triggerMcpClientSubscriberLogger.error("Error processing AI response:", err);
|
|
65
65
|
nestedResponse = `Error handling response: ${err?.message || String(err)}`;
|
|
66
66
|
}
|
|
@@ -33,7 +33,7 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
|
|
|
33
33
|
|
|
34
34
|
switch (p.eventType) {
|
|
35
35
|
case 'insert':
|
|
36
|
-
await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
|
|
36
|
+
await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
|
|
37
37
|
break;
|
|
38
38
|
case 'update':
|
|
39
39
|
await this.chatterMessageService.postAuditMessageOnUpdate(
|
|
@@ -41,10 +41,12 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
|
|
|
41
41
|
p.modelName,
|
|
42
42
|
p.before,
|
|
43
43
|
(p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
|
|
44
|
+
false,
|
|
45
|
+
p.userId,
|
|
44
46
|
);
|
|
45
47
|
break;
|
|
46
48
|
case 'delete':
|
|
47
|
-
await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
|
|
49
|
+
await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
|
|
48
50
|
break;
|
|
49
51
|
}
|
|
50
52
|
}
|
|
@@ -33,13 +33,20 @@ export class ChatterQueueSubscriberRedis extends RedisSubscriber<any> {
|
|
|
33
33
|
|
|
34
34
|
switch (p.eventType) {
|
|
35
35
|
case 'insert':
|
|
36
|
-
await this.chatterMessageService.postAuditMessageOnInsert(p.after,
|
|
36
|
+
await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
|
|
37
37
|
break;
|
|
38
38
|
case 'update':
|
|
39
|
-
await this.chatterMessageService.postAuditMessageOnUpdate(
|
|
39
|
+
await this.chatterMessageService.postAuditMessageOnUpdate(
|
|
40
|
+
p.after,
|
|
41
|
+
p.modelName,
|
|
42
|
+
p.before,
|
|
43
|
+
(p.updatedColumnNames || []).map(n => ({ propertyName: n })),
|
|
44
|
+
false,
|
|
45
|
+
p.userId,
|
|
46
|
+
);
|
|
40
47
|
break;
|
|
41
48
|
case 'delete':
|
|
42
|
-
await this.chatterMessageService.postAuditMessageOnDelete(p.
|
|
49
|
+
await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
|
|
43
50
|
break;
|
|
44
51
|
}
|
|
45
52
|
}
|
|
@@ -1,14 +1,57 @@
|
|
|
1
|
-
|
|
2
1
|
import { User } from "../entities/user.entity";
|
|
3
2
|
import { OnEvent } from "@nestjs/event-emitter";
|
|
4
3
|
import { Injectable, Logger } from "@nestjs/common";
|
|
5
4
|
import { EventDetails, EventType } from "../interfaces";
|
|
5
|
+
import { WhatsAppFactory } from "src/factories/whatsapp.factory";
|
|
6
6
|
|
|
7
7
|
@Injectable()
|
|
8
8
|
export class UserRegistrationListener {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
private readonly logger = new Logger(UserRegistrationListener.name);
|
|
10
|
+
|
|
11
|
+
constructor(private readonly whatsAppFactory: WhatsAppFactory) {}
|
|
12
|
+
|
|
13
|
+
@OnEvent(EventType.USER_REGISTERED)
|
|
14
|
+
async handleUserRegistration(event: EventDetails<User>) {
|
|
15
|
+
this.logger.log(`User registered with details: ${JSON.stringify(event.payload)}`);
|
|
16
|
+
|
|
17
|
+
const notifyTo = process.env.WHATSAPP_EVENT_NOTIFY_TO;
|
|
18
|
+
if (!notifyTo) {
|
|
19
|
+
this.logger.debug("WHATSAPP_EVENT_NOTIFY_TO not set. Skipping registration WhatsApp notification.");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const whatsappService = this.whatsAppFactory.getWhatsappService();
|
|
25
|
+
const username = event.payload?.username || "User";
|
|
26
|
+
const userId = event.payload?.id || "N/A";
|
|
27
|
+
|
|
28
|
+
await whatsappService.sendWhatsAppMessage(
|
|
29
|
+
notifyTo,
|
|
30
|
+
"registration_event",
|
|
31
|
+
{
|
|
32
|
+
payload: {
|
|
33
|
+
channel: "whatsapp",
|
|
34
|
+
source: process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE,
|
|
35
|
+
destination: notifyTo,
|
|
36
|
+
"src.name": process.env.COMMON_GUPSHUP_APP_NAME || "solidx",
|
|
37
|
+
message: {
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `New user registered: ${username} (id: ${userId})`,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
this.logger.log(`Sent registration WhatsApp notification to ${notifyTo}`);
|
|
46
|
+
} catch (error: any) {
|
|
47
|
+
const status = error?.response?.status;
|
|
48
|
+
const responseData = error?.response?.data;
|
|
49
|
+
const errorMessage = error?.message;
|
|
50
|
+
const stack = error?.stack;
|
|
51
|
+
|
|
52
|
+
this.logger.error(
|
|
53
|
+
`Failed to send registration WhatsApp notification to ${notifyTo}. status=${status ?? "unknown"}, response=${typeof responseData === "object" ? JSON.stringify(responseData) : responseData}, message=${errorMessage}, stack=${stack}`,
|
|
54
|
+
);
|
|
13
55
|
}
|
|
14
|
-
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Injectable } from '@nestjs/common';
|
|
2
|
+
import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
|
|
3
|
+
import { RequestContextService } from 'src/services/request-context.service';
|
|
4
|
+
import { DataSource } from 'typeorm';
|
|
5
|
+
import { SecurityRuleRepository } from './security-rule.repository';
|
|
6
|
+
import { SolidBaseRepository } from './solid-base.repository';
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class McpAuditLogRepository extends SolidBaseRepository<McpAuditLog> {
|
|
10
|
+
constructor(
|
|
11
|
+
readonly dataSource: DataSource,
|
|
12
|
+
readonly requestContextService: RequestContextService,
|
|
13
|
+
readonly securityRuleRepository: SecurityRuleRepository,
|
|
14
|
+
) {
|
|
15
|
+
super(McpAuditLog, dataSource, requestContextService, securityRuleRepository);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -56,7 +56,7 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
|
|
|
56
56
|
|
|
57
57
|
evaluatedRules.push(evaluatedRule);
|
|
58
58
|
|
|
59
|
-
} catch (error) {
|
|
59
|
+
} catch (error: any) {
|
|
60
60
|
this.logger.error(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
|
|
61
61
|
this.logger.error(error.stack);
|
|
62
62
|
throw error;
|