@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +18 -0
- package/CURRENT_PROMPT +6 -0
- 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 +506 -49
- 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/adapters/ui/playwright-adapter.d.ts +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
- package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
- package/dist/testing/adapters/ui/playwright-adapter.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/testing/steps/ui/index.d.ts.map +1 -1
- package/dist/testing/steps/ui/index.js +2 -0
- package/dist/testing/steps/ui/index.js.map +1 -1
- package/dist/testing/steps/ui/manual.step.d.ts +3 -0
- package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/manual.step.js +56 -0
- package/dist/testing/steps/ui/manual.step.js.map +1 -0
- 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/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 +208 -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 +506 -49
- 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 +55 -2
- package/src/testing/adapters/ui/playwright-adapter.ts +4 -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/testing/steps/ui/index.ts +2 -0
- package/src/testing/steps/ui/manual.step.ts +80 -0
- package/src/winston.logger.ts +5 -7
|
@@ -50,6 +50,7 @@ import { SettingService } from "./setting.service";
|
|
|
50
50
|
import { UserActivityHistoryService } from "./user-activity-history.service";
|
|
51
51
|
import { UserService } from "./user.service";
|
|
52
52
|
import { SmsFactory } from "src/factories/sms.factory";
|
|
53
|
+
import { WhatsAppFactory } from "src/factories/whatsapp.factory";
|
|
53
54
|
import { SolidRegistry } from "src/helpers/solid-registry";
|
|
54
55
|
|
|
55
56
|
enum LoginProvider {
|
|
@@ -79,6 +80,7 @@ export class AuthenticationService {
|
|
|
79
80
|
private readonly mailServiceFactory: MailFactory,
|
|
80
81
|
// private readonly smsService: Msg91OTPService,
|
|
81
82
|
private readonly smsFactory: SmsFactory,
|
|
83
|
+
private readonly whatsAppFactory: WhatsAppFactory,
|
|
82
84
|
private readonly eventEmitter: EventEmitter2,
|
|
83
85
|
private readonly settingService: SettingService,
|
|
84
86
|
private readonly roleMetadataService: RoleMetadataService,
|
|
@@ -164,6 +166,8 @@ export class AuthenticationService {
|
|
|
164
166
|
"mobile",
|
|
165
167
|
"roles",
|
|
166
168
|
"forcePasswordChange",
|
|
169
|
+
"isAllowedToGenerateApiKeys",
|
|
170
|
+
"failedLoginAttempts",
|
|
167
171
|
]);
|
|
168
172
|
|
|
169
173
|
async signUp(
|
|
@@ -228,9 +232,11 @@ export class AuthenticationService {
|
|
|
228
232
|
userRoles.push(defaultRole);
|
|
229
233
|
}
|
|
230
234
|
await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);
|
|
235
|
+
await this.handlePasswordlessSignupOtp(savedUser, signUpDto, autoGeneratedPwd, repo);
|
|
236
|
+
this.triggerRegistrationEvent(savedUser);
|
|
231
237
|
|
|
232
238
|
return savedUser;
|
|
233
|
-
} catch (err) {
|
|
239
|
+
} catch (err: any) {
|
|
234
240
|
const pgUniqueViolationErrorCode = "23505";
|
|
235
241
|
if (err.code === pgUniqueViolationErrorCode) {
|
|
236
242
|
throw new ConflictException(
|
|
@@ -243,6 +249,42 @@ export class AuthenticationService {
|
|
|
243
249
|
}
|
|
244
250
|
}
|
|
245
251
|
|
|
252
|
+
private async handlePasswordlessSignupOtp<T extends User>(
|
|
253
|
+
user: T,
|
|
254
|
+
signUpDto: SignUpDto,
|
|
255
|
+
autoGeneratedPwd: string,
|
|
256
|
+
repo: Repository<T>,
|
|
257
|
+
): Promise<void> {
|
|
258
|
+
const isPasswordProvided = !!signUpDto.password;
|
|
259
|
+
const isAutoGeneratedPassword = !!autoGeneratedPwd;
|
|
260
|
+
if (isPasswordProvided || isAutoGeneratedPassword) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (!user.mobile) {
|
|
265
|
+
this.logger.warn(
|
|
266
|
+
`Skipping passwordless signup OTP WhatsApp notification for user ${user.username}: mobile is missing.`,
|
|
267
|
+
);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const isPasswordlessRegistrationEnabled =
|
|
272
|
+
await this.isPasswordlessRegistrationEnabled();
|
|
273
|
+
if (!isPasswordlessRegistrationEnabled) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
await this.assignRegistrationOtp(
|
|
278
|
+
PasswordlessRegistrationValidateWhatSources.MOBILE,
|
|
279
|
+
user,
|
|
280
|
+
);
|
|
281
|
+
await repo.save(user);
|
|
282
|
+
await this.notifyUserOnOtpInitiateRegistration(
|
|
283
|
+
user,
|
|
284
|
+
PasswordlessRegistrationValidateWhatSources.MOBILE,
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
246
288
|
/** @deprecated Use IExtensionUserCreationProvider instead. Kept for backward compatibility. */
|
|
247
289
|
async signupForExtensionUser<T extends User>(
|
|
248
290
|
signUpDto: SignUpDto,
|
|
@@ -485,7 +527,7 @@ export class AuthenticationService {
|
|
|
485
527
|
validationSource,
|
|
486
528
|
);
|
|
487
529
|
await this.notifyUserOnOtpInitiateRegistration(user, validationSource);
|
|
488
|
-
} catch (err) {
|
|
530
|
+
} catch (err: any) {
|
|
489
531
|
if (err.code === "23505") {
|
|
490
532
|
throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);
|
|
491
533
|
}
|
|
@@ -614,7 +656,7 @@ export class AuthenticationService {
|
|
|
614
656
|
const companyLogo = await this.getCompanyLogo();
|
|
615
657
|
if (
|
|
616
658
|
registrationValidationSource ===
|
|
617
|
-
|
|
659
|
+
PasswordlessRegistrationValidateWhatSources.EMAIL
|
|
618
660
|
) {
|
|
619
661
|
const mailService = this.mailServiceFactory.getMailService();
|
|
620
662
|
mailService.sendEmailUsingTemplate(
|
|
@@ -644,25 +686,141 @@ export class AuthenticationService {
|
|
|
644
686
|
}
|
|
645
687
|
if (
|
|
646
688
|
registrationValidationSource ===
|
|
647
|
-
|
|
689
|
+
PasswordlessRegistrationValidateWhatSources.MOBILE
|
|
648
690
|
) {
|
|
649
|
-
const
|
|
650
|
-
|
|
691
|
+
const templateParams = {
|
|
692
|
+
solidAppName:
|
|
693
|
+
this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
|
|
694
|
+
otp: user.mobileVerificationTokenOnRegistration,
|
|
695
|
+
mobileVerificationTokenOnRegistration:
|
|
696
|
+
user.mobileVerificationTokenOnRegistration,
|
|
697
|
+
firstName: user.username,
|
|
698
|
+
fullName: user.fullName ? user.fullName : user.username,
|
|
699
|
+
companyLogoUrl: companyLogo,
|
|
700
|
+
};
|
|
701
|
+
|
|
702
|
+
const whatsappDestination = this.normalizeWhatsAppDestination(
|
|
651
703
|
user.mobile,
|
|
652
|
-
"otp-on-register",
|
|
653
|
-
{
|
|
654
|
-
solidAppName:
|
|
655
|
-
this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
|
|
656
|
-
otp: user.mobileVerificationTokenOnRegistration,
|
|
657
|
-
mobileVerificationTokenOnRegistration:
|
|
658
|
-
user.mobileVerificationTokenOnRegistration,
|
|
659
|
-
firstName: user.username,
|
|
660
|
-
fullName: user.fullName ? user.fullName : user.username,
|
|
661
|
-
companyLogoUrl: companyLogo,
|
|
662
|
-
},
|
|
663
|
-
this.settingService.getConfigValue<SolidCoreSetting>("shouldQueueSms"),
|
|
664
704
|
);
|
|
705
|
+
const gupshupTemplateAppName =
|
|
706
|
+
process.env.COMMON_GUPSHUP_APP_NAME || "Gupshup";
|
|
707
|
+
const whatsappTemplateId =
|
|
708
|
+
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
709
|
+
"otpWhatsappTemplateId",
|
|
710
|
+
) || "common_otp";
|
|
711
|
+
const whatsappIndependentEnabled =
|
|
712
|
+
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
713
|
+
"otpWhatsappIndependentEnabled",
|
|
714
|
+
) !== false;
|
|
715
|
+
|
|
716
|
+
let smsSent = false;
|
|
717
|
+
let whatsappSent = false;
|
|
718
|
+
let smsErrorMessage: string | undefined;
|
|
719
|
+
let whatsappErrorMessage: string | undefined;
|
|
720
|
+
|
|
721
|
+
this.logger.debug(
|
|
722
|
+
`OTP SMS send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}`,
|
|
723
|
+
);
|
|
724
|
+
|
|
725
|
+
try {
|
|
726
|
+
const smsService = this.smsFactory.getSmsService();
|
|
727
|
+
await smsService.sendSMSUsingTemplate(
|
|
728
|
+
user.mobile,
|
|
729
|
+
"otp-on-register",
|
|
730
|
+
templateParams,
|
|
731
|
+
false,
|
|
732
|
+
);
|
|
733
|
+
smsSent = true;
|
|
734
|
+
} catch (smsError: any) {
|
|
735
|
+
smsErrorMessage = smsError?.message;
|
|
736
|
+
this.logger.warn(
|
|
737
|
+
`OTP SMS failed: destination=${user.mobile}, message=${smsErrorMessage}`,
|
|
738
|
+
);
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (whatsappIndependentEnabled) {
|
|
742
|
+
if (!whatsappDestination) {
|
|
743
|
+
whatsappErrorMessage = "Normalized WhatsApp destination is empty";
|
|
744
|
+
this.logger.error(
|
|
745
|
+
`Independent OTP WhatsApp skipped: destination=${user.mobile}, message=${whatsappErrorMessage}`,
|
|
746
|
+
);
|
|
747
|
+
} else {
|
|
748
|
+
this.logger.debug(
|
|
749
|
+
`Independent OTP WhatsApp send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
|
|
750
|
+
);
|
|
751
|
+
try {
|
|
752
|
+
await this.sendOtpToWhatsappProvider(
|
|
753
|
+
whatsappDestination,
|
|
754
|
+
String(whatsappTemplateId),
|
|
755
|
+
String(gupshupTemplateAppName),
|
|
756
|
+
String(templateParams.otp || ""),
|
|
757
|
+
);
|
|
758
|
+
whatsappSent = true;
|
|
759
|
+
this.logger.log(
|
|
760
|
+
`Independent OTP WhatsApp success: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
|
|
761
|
+
);
|
|
762
|
+
} catch (waError: any) {
|
|
763
|
+
whatsappErrorMessage = waError?.message;
|
|
764
|
+
this.logger.error(
|
|
765
|
+
`Independent OTP WhatsApp failed: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}, message=${whatsappErrorMessage}`,
|
|
766
|
+
);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
if (!smsSent && !whatsappSent) {
|
|
772
|
+
throw new Error(
|
|
773
|
+
`OTP delivery failed on both channels. smsError=${smsErrorMessage || "unknown"}, whatsappError=${whatsappErrorMessage || "disabled/unknown"}`,
|
|
774
|
+
);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
private normalizeWhatsAppDestination(rawMobile: string): string {
|
|
780
|
+
const raw = (rawMobile || "").trim();
|
|
781
|
+
let sanitized = raw.replace(/[^\d+]/g, "");
|
|
782
|
+
|
|
783
|
+
if (sanitized.startsWith("00")) {
|
|
784
|
+
sanitized = `+${sanitized.slice(2)}`;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
const defaultDialCode = String(
|
|
788
|
+
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
789
|
+
"otpDefaultCountryDialCode",
|
|
790
|
+
) || "",
|
|
791
|
+
).replace(/\D/g, "");
|
|
792
|
+
|
|
793
|
+
if (sanitized.startsWith("+")) {
|
|
794
|
+
const e164Digits = sanitized.slice(1).replace(/\D/g, "");
|
|
795
|
+
if (e164Digits.length >= 8 && e164Digits.length <= 15) {
|
|
796
|
+
return e164Digits;
|
|
797
|
+
}
|
|
665
798
|
}
|
|
799
|
+
|
|
800
|
+
const digits = sanitized.replace(/\D/g, "");
|
|
801
|
+
|
|
802
|
+
if (digits.length >= 11 && digits.length <= 15) {
|
|
803
|
+
return digits;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (digits.length === 10 && defaultDialCode) {
|
|
807
|
+
return `${defaultDialCode}${digits}`;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
return digits;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
private async sendOtpToWhatsappProvider(
|
|
814
|
+
destination: string,
|
|
815
|
+
templateId: string,
|
|
816
|
+
appName: string,
|
|
817
|
+
otp: string,
|
|
818
|
+
): Promise<void> {
|
|
819
|
+
const whatsappService = this.whatsAppFactory.getWhatsappService();
|
|
820
|
+
await whatsappService.sendWhatsAppMessage(destination, null, {
|
|
821
|
+
type: "text",
|
|
822
|
+
text: `${appName} OTP is ${otp}. It is valid for 10 mins.`,
|
|
823
|
+
});
|
|
666
824
|
}
|
|
667
825
|
|
|
668
826
|
async otpConfirmRegistration(confirmSignUpDto: OTPConfirmOTPDto) {
|
|
@@ -765,7 +923,7 @@ export class AuthenticationService {
|
|
|
765
923
|
this.resolvePasswordlessValidationSource();
|
|
766
924
|
if (
|
|
767
925
|
registrationValidationSource ===
|
|
768
|
-
|
|
926
|
+
PasswordlessRegistrationValidateWhatSources.EMAIL
|
|
769
927
|
) {
|
|
770
928
|
if (!user.emailVerifiedOnRegistrationAt) {
|
|
771
929
|
return false;
|
|
@@ -773,7 +931,7 @@ export class AuthenticationService {
|
|
|
773
931
|
}
|
|
774
932
|
if (
|
|
775
933
|
registrationValidationSource ===
|
|
776
|
-
|
|
934
|
+
PasswordlessRegistrationValidateWhatSources.MOBILE
|
|
777
935
|
) {
|
|
778
936
|
if (!user.mobileVerifiedOnRegistrationAt) {
|
|
779
937
|
return false;
|
|
@@ -888,7 +1046,7 @@ export class AuthenticationService {
|
|
|
888
1046
|
const dummyOtp = this.getDummyOtpForUser(user);
|
|
889
1047
|
if (!dummyOtp) {
|
|
890
1048
|
await this.assignLoginOtp(user, type);
|
|
891
|
-
this.notifyUserOnOtpInititateLogin(user, type);
|
|
1049
|
+
await this.notifyUserOnOtpInititateLogin(user, type);
|
|
892
1050
|
}
|
|
893
1051
|
return this.buildLoginOtpResponse(user, type);
|
|
894
1052
|
}
|
|
@@ -1013,21 +1171,88 @@ export class AuthenticationService {
|
|
|
1013
1171
|
);
|
|
1014
1172
|
}
|
|
1015
1173
|
if (loginType === PasswordlessLoginValidateWhatSources.MOBILE) {
|
|
1016
|
-
const
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1174
|
+
const templateParams = {
|
|
1175
|
+
solidAppName:
|
|
1176
|
+
this.settingService.getConfigValue<SolidCoreSetting>("appTitle"),
|
|
1177
|
+
otp: user.mobileVerificationTokenOnLogin,
|
|
1178
|
+
mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,
|
|
1179
|
+
firstName: user.username,
|
|
1180
|
+
fullName: user.fullName ? user.fullName : user.username,
|
|
1181
|
+
companyLogoUrl: companyLogo,
|
|
1182
|
+
};
|
|
1183
|
+
|
|
1184
|
+
const whatsappDestination = this.normalizeWhatsAppDestination(user.mobile);
|
|
1185
|
+
const gupshupTemplateAppName =
|
|
1186
|
+
process.env.COMMON_GUPSHUP_APP_NAME || "Gupshup";
|
|
1187
|
+
const whatsappTemplateId =
|
|
1188
|
+
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
1189
|
+
"otpWhatsappTemplateId",
|
|
1190
|
+
) || "common_otp";
|
|
1191
|
+
const whatsappIndependentEnabled =
|
|
1192
|
+
this.settingService.getConfigValue<SolidCoreSetting>(
|
|
1193
|
+
"otpWhatsappIndependentEnabled",
|
|
1194
|
+
) !== false;
|
|
1195
|
+
|
|
1196
|
+
let smsSent = false;
|
|
1197
|
+
let whatsappSent = false;
|
|
1198
|
+
let smsErrorMessage: string | undefined;
|
|
1199
|
+
let whatsappErrorMessage: string | undefined;
|
|
1200
|
+
|
|
1201
|
+
this.logger.debug(
|
|
1202
|
+
`OTP LOGIN SMS send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}`,
|
|
1030
1203
|
);
|
|
1204
|
+
|
|
1205
|
+
try {
|
|
1206
|
+
const smsService = this.smsFactory.getSmsService();
|
|
1207
|
+
await smsService.sendSMSUsingTemplate(
|
|
1208
|
+
user.mobile,
|
|
1209
|
+
"otp-on-login",
|
|
1210
|
+
templateParams,
|
|
1211
|
+
false,
|
|
1212
|
+
);
|
|
1213
|
+
smsSent = true;
|
|
1214
|
+
} catch (smsError: any) {
|
|
1215
|
+
smsErrorMessage = smsError?.message;
|
|
1216
|
+
this.logger.warn(
|
|
1217
|
+
`OTP LOGIN SMS failed: destination=${user.mobile}, message=${smsErrorMessage}`,
|
|
1218
|
+
);
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
if (whatsappIndependentEnabled) {
|
|
1222
|
+
if (!whatsappDestination) {
|
|
1223
|
+
whatsappErrorMessage = "Normalized WhatsApp destination is empty";
|
|
1224
|
+
this.logger.error(
|
|
1225
|
+
`OTP LOGIN WhatsApp skipped: destination=${user.mobile}, message=${whatsappErrorMessage}`,
|
|
1226
|
+
);
|
|
1227
|
+
} else {
|
|
1228
|
+
this.logger.debug(
|
|
1229
|
+
`OTP LOGIN WhatsApp send attempt: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
|
|
1230
|
+
);
|
|
1231
|
+
try {
|
|
1232
|
+
await this.sendOtpToWhatsappProvider(
|
|
1233
|
+
whatsappDestination,
|
|
1234
|
+
String(whatsappTemplateId),
|
|
1235
|
+
String(gupshupTemplateAppName),
|
|
1236
|
+
String(templateParams.otp || ""),
|
|
1237
|
+
);
|
|
1238
|
+
whatsappSent = true;
|
|
1239
|
+
this.logger.log(
|
|
1240
|
+
`OTP LOGIN WhatsApp success: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}`,
|
|
1241
|
+
);
|
|
1242
|
+
} catch (waError: any) {
|
|
1243
|
+
whatsappErrorMessage = waError?.message;
|
|
1244
|
+
this.logger.error(
|
|
1245
|
+
`OTP LOGIN WhatsApp failed: destination=${user.mobile}, whatsappDestination=${whatsappDestination}, templateId=${whatsappTemplateId}, message=${whatsappErrorMessage}`,
|
|
1246
|
+
);
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
if (!smsSent && !whatsappSent) {
|
|
1252
|
+
throw new Error(
|
|
1253
|
+
`OTP LOGIN delivery failed on both channels. smsError=${smsErrorMessage || "unknown"}, whatsappError=${whatsappErrorMessage || "disabled/unknown"}`,
|
|
1254
|
+
);
|
|
1255
|
+
}
|
|
1031
1256
|
}
|
|
1032
1257
|
}
|
|
1033
1258
|
|
|
@@ -1335,12 +1560,10 @@ export class AuthenticationService {
|
|
|
1335
1560
|
const user = await this.resolveUserByVerificationToken(
|
|
1336
1561
|
confirmForgotPasswordDto.verificationToken,
|
|
1337
1562
|
);
|
|
1338
|
-
if (!user)
|
|
1339
|
-
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
|
|
1563
|
+
if (!user) throw new UnauthorizedException("Invalid verification token");
|
|
1340
1564
|
if (user.lastLoginProvider !== "local")
|
|
1341
1565
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
|
|
1342
|
-
if (!user.active)
|
|
1343
|
-
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);
|
|
1566
|
+
if (!user.active) throw new UnauthorizedException("User is inactive");
|
|
1344
1567
|
|
|
1345
1568
|
// 1) Atomically consume the token (only one request can succeed)
|
|
1346
1569
|
const { affected } = await m
|
|
@@ -1548,7 +1771,7 @@ export class AuthenticationService {
|
|
|
1548
1771
|
accessToken: await this.generateAccessToken(user),
|
|
1549
1772
|
refreshToken: currentRefreshToken,
|
|
1550
1773
|
};
|
|
1551
|
-
} catch (err) {
|
|
1774
|
+
} catch (err: any) {
|
|
1552
1775
|
if (err instanceof InvalidatedRefreshTokenError) {
|
|
1553
1776
|
// Take action: notify user that his refresh token might have been stolen?
|
|
1554
1777
|
throw new UnauthorizedException(ERROR_MESSAGES.ACCESS_DENIED);
|
|
@@ -1599,7 +1822,7 @@ export class AuthenticationService {
|
|
|
1599
1822
|
} else {
|
|
1600
1823
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1601
1824
|
}
|
|
1602
|
-
} catch (error) {
|
|
1825
|
+
} catch (error: any) {
|
|
1603
1826
|
throw new UnauthorizedException(
|
|
1604
1827
|
ERROR_MESSAGES.GOOGLE_OAUTH_PROFILE_FETCH_FAILED,
|
|
1605
1828
|
);
|
|
@@ -1668,7 +1891,7 @@ export class AuthenticationService {
|
|
|
1668
1891
|
} else {
|
|
1669
1892
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1670
1893
|
}
|
|
1671
|
-
} catch (error) {
|
|
1894
|
+
} catch (error: any) {
|
|
1672
1895
|
if (error instanceof UnauthorizedException) {
|
|
1673
1896
|
throw error;
|
|
1674
1897
|
}
|
|
@@ -1733,7 +1956,7 @@ export class AuthenticationService {
|
|
|
1733
1956
|
} else {
|
|
1734
1957
|
throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);
|
|
1735
1958
|
}
|
|
1736
|
-
} catch (error) {
|
|
1959
|
+
} catch (error: any) {
|
|
1737
1960
|
throw new UnauthorizedException("Microsoft OAuth profile fetch failed");
|
|
1738
1961
|
}
|
|
1739
1962
|
}
|
|
@@ -1880,7 +2103,7 @@ export class AuthenticationService {
|
|
|
1880
2103
|
await this.userActivityHistoryService.logEvent("logout", user);
|
|
1881
2104
|
|
|
1882
2105
|
return { message: SUCCESS_MESSAGES.LOGOUT_SUCCESS };
|
|
1883
|
-
} catch (err) {
|
|
2106
|
+
} catch (err: any) {
|
|
1884
2107
|
throw err instanceof UnauthorizedException ||
|
|
1885
2108
|
err instanceof InternalServerErrorException
|
|
1886
2109
|
? err
|