@solidstarters/solid-core 1.2.203 → 1.2.206
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/info.command.d.ts +19 -0
- package/dist/commands/info.command.d.ts.map +1 -0
- package/dist/commands/info.command.js +98 -0
- package/dist/commands/info.command.js.map +1 -0
- package/dist/commands/mcp.command.d.ts.map +1 -1
- package/dist/commands/mcp.command.js +2 -10
- package/dist/commands/mcp.command.js.map +1 -1
- package/dist/commands/seed.command.d.ts.map +1 -1
- package/dist/commands/seed.command.js +2 -11
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/controllers/email-template.controller.d.ts +3 -1
- package/dist/controllers/email-template.controller.d.ts.map +1 -1
- package/dist/controllers/email-template.controller.js +7 -4
- package/dist/controllers/email-template.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.d.ts +4 -5
- package/dist/controllers/google-authentication.controller.d.ts.map +1 -1
- package/dist/controllers/google-authentication.controller.js +21 -14
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/otp-authentication.controller.d.ts +10 -0
- package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
- package/dist/controllers/otp-authentication.controller.js +1 -1
- package/dist/controllers/setting.controller.d.ts +2 -34
- package/dist/controllers/setting.controller.d.ts.map +1 -1
- package/dist/controllers/setting.controller.js +4 -130
- package/dist/controllers/setting.controller.js.map +1 -1
- package/dist/decorators/settings-provider.decorator.d.ts +3 -0
- package/dist/decorators/settings-provider.decorator.d.ts.map +1 -0
- package/dist/decorators/settings-provider.decorator.js +8 -0
- package/dist/decorators/settings-provider.decorator.js.map +1 -0
- package/dist/decorators/solid-password.decorator.d.ts.map +1 -1
- package/dist/decorators/solid-password.decorator.js +3 -3
- package/dist/decorators/solid-password.decorator.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts +3 -4
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +4 -51
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/create-setting.dto.d.ts +3 -0
- package/dist/dtos/create-setting.dto.d.ts.map +1 -1
- package/dist/dtos/create-setting.dto.js +20 -2
- package/dist/dtos/create-setting.dto.js.map +1 -1
- package/dist/dtos/update-setting.dto.d.ts +3 -0
- package/dist/dtos/update-setting.dto.d.ts.map +1 -1
- package/dist/dtos/update-setting.dto.js +19 -1
- package/dist/dtos/update-setting.dto.js.map +1 -1
- package/dist/entities/setting.entity.d.ts +3 -0
- package/dist/entities/setting.entity.d.ts.map +1 -1
- package/dist/entities/setting.entity.js +13 -1
- package/dist/entities/setting.entity.js.map +1 -1
- package/dist/factories/mail.factory.d.ts +3 -4
- package/dist/factories/mail.factory.d.ts.map +1 -1
- package/dist/factories/mail.factory.js +6 -12
- package/dist/factories/mail.factory.js.map +1 -1
- package/dist/factories/sms.factory.d.ts +3 -4
- package/dist/factories/sms.factory.d.ts.map +1 -1
- package/dist/factories/sms.factory.js +6 -12
- package/dist/factories/sms.factory.js.map +1 -1
- package/dist/factories/whatsapp.factory.d.ts +3 -4
- package/dist/factories/whatsapp.factory.d.ts.map +1 -1
- package/dist/factories/whatsapp.factory.js +6 -12
- package/dist/factories/whatsapp.factory.js.map +1 -1
- package/dist/guards/access-token.guard.d.ts +3 -4
- package/dist/guards/access-token.guard.d.ts.map +1 -1
- package/dist/guards/access-token.guard.js +14 -9
- package/dist/guards/access-token.guard.js.map +1 -1
- package/dist/helpers/cors.helper.d.ts +1 -2
- package/dist/helpers/cors.helper.d.ts.map +1 -1
- package/dist/helpers/cors.helper.js +2 -2
- package/dist/helpers/cors.helper.js.map +1 -1
- package/dist/helpers/error-mapper.service.d.ts.map +1 -1
- package/dist/helpers/error-mapper.service.js.map +1 -1
- package/dist/helpers/google-oauth.helper.d.ts +7 -3
- package/dist/helpers/google-oauth.helper.d.ts.map +1 -1
- package/dist/helpers/google-oauth.helper.js +1 -2
- package/dist/helpers/google-oauth.helper.js.map +1 -1
- package/dist/helpers/module.helper.js +0 -2
- package/dist/helpers/module.helper.js.map +1 -1
- package/dist/helpers/solid-registry.d.ts +8 -3
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +32 -9
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +21 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js +8 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/passport-strategies/google-oauth.strategy.d.ts +1 -4
- package/dist/passport-strategies/google-oauth.strategy.d.ts.map +1 -1
- package/dist/passport-strategies/google-oauth.strategy.js +12 -12
- package/dist/passport-strategies/google-oauth.strategy.js.map +1 -1
- package/dist/seeders/email-template-seeder.service.d.ts +3 -4
- package/dist/seeders/email-template-seeder.service.d.ts.map +1 -1
- package/dist/seeders/email-template-seeder.service.js +7 -12
- package/dist/seeders/email-template-seeder.service.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +1 -5
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +23 -23
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +98 -4
- package/dist/seeders/sms-template-seeder.service.d.ts +3 -4
- package/dist/seeders/sms-template-seeder.service.d.ts.map +1 -1
- package/dist/seeders/sms-template-seeder.service.js +7 -12
- package/dist/seeders/sms-template-seeder.service.js.map +1 -1
- package/dist/services/action-metadata.service.d.ts +2 -13
- package/dist/services/action-metadata.service.d.ts.map +1 -1
- package/dist/services/action-metadata.service.js +4 -22
- package/dist/services/action-metadata.service.js.map +1 -1
- package/dist/services/ai-interaction.service.d.ts +2 -13
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +6 -24
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/authentication.service.d.ts +14 -10
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +159 -114
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/bcrypt.service.d.ts +3 -5
- package/dist/services/bcrypt.service.d.ts.map +1 -1
- package/dist/services/bcrypt.service.js +10 -14
- package/dist/services/bcrypt.service.js.map +1 -1
- package/dist/services/chatter-message-details.service.d.ts +2 -13
- package/dist/services/chatter-message-details.service.d.ts.map +1 -1
- package/dist/services/chatter-message-details.service.js +4 -22
- package/dist/services/chatter-message-details.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +2 -13
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +5 -23
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +12 -12
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +25 -17
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/dashboard-question-sql-dataset-config.service.d.ts +2 -13
- package/dist/services/dashboard-question-sql-dataset-config.service.d.ts.map +1 -1
- package/dist/services/dashboard-question-sql-dataset-config.service.js +4 -21
- package/dist/services/dashboard-question-sql-dataset-config.service.js.map +1 -1
- package/dist/services/dashboard-question.service.d.ts +2 -13
- package/dist/services/dashboard-question.service.d.ts.map +1 -1
- package/dist/services/dashboard-question.service.js +4 -21
- package/dist/services/dashboard-question.service.js.map +1 -1
- package/dist/services/dashboard-variable.service.d.ts +2 -13
- package/dist/services/dashboard-variable.service.d.ts.map +1 -1
- package/dist/services/dashboard-variable.service.js +4 -21
- package/dist/services/dashboard-variable.service.js.map +1 -1
- package/dist/services/dashboard.service.d.ts +2 -13
- package/dist/services/dashboard.service.d.ts.map +1 -1
- package/dist/services/dashboard.service.js +4 -21
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/email-template.service.d.ts +2 -13
- package/dist/services/email-template.service.d.ts.map +1 -1
- package/dist/services/email-template.service.js +4 -22
- package/dist/services/email-template.service.js.map +1 -1
- package/dist/services/export-template.service.d.ts +2 -13
- package/dist/services/export-template.service.d.ts.map +1 -1
- package/dist/services/export-template.service.js +4 -21
- package/dist/services/export-template.service.js.map +1 -1
- package/dist/services/export-transaction.service.d.ts +2 -13
- package/dist/services/export-transaction.service.d.ts.map +1 -1
- package/dist/services/export-transaction.service.js +4 -21
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts +11 -0
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +3 -0
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/file/file-service.interface.d.ts +22 -0
- package/dist/services/file/file-service.interface.d.ts.map +1 -0
- package/dist/services/file/file-service.interface.js +5 -0
- package/dist/services/file/file-service.interface.js.map +1 -0
- package/dist/services/file.service.d.ts +1 -4
- package/dist/services/file.service.d.ts.map +1 -1
- package/dist/services/file.service.js +11 -12
- package/dist/services/file.service.js.map +1 -1
- package/dist/services/genai/r2r-helper.service.d.ts +3 -1
- package/dist/services/genai/r2r-helper.service.d.ts.map +1 -1
- package/dist/services/genai/r2r-helper.service.js +11 -7
- package/dist/services/genai/r2r-helper.service.js.map +1 -1
- package/dist/services/import-transaction-error-log.service.d.ts +2 -13
- package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
- package/dist/services/import-transaction-error-log.service.js +4 -22
- package/dist/services/import-transaction-error-log.service.js.map +1 -1
- package/dist/services/import-transaction.service.d.ts +2 -13
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +4 -22
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.d.ts +2 -13
- package/dist/services/list-of-values.service.d.ts.map +1 -1
- package/dist/services/list-of-values.service.js +4 -22
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/locale.service.d.ts +2 -13
- package/dist/services/locale.service.d.ts.map +1 -1
- package/dist/services/locale.service.js +4 -22
- package/dist/services/locale.service.js.map +1 -1
- package/dist/services/mail/elastic-email.service.d.ts +4 -5
- package/dist/services/mail/elastic-email.service.d.ts.map +1 -1
- package/dist/services/mail/elastic-email.service.js +10 -13
- package/dist/services/mail/elastic-email.service.js.map +1 -1
- package/dist/services/mail/smtp-email.service.d.ts +3 -4
- package/dist/services/mail/smtp-email.service.d.ts.map +1 -1
- package/dist/services/mail/smtp-email.service.js +19 -17
- package/dist/services/mail/smtp-email.service.js.map +1 -1
- package/dist/services/media-storage-provider-metadata.service.d.ts +11 -0
- package/dist/services/media-storage-provider-metadata.service.d.ts.map +1 -1
- package/dist/services/media-storage-provider-metadata.service.js +3 -0
- package/dist/services/media-storage-provider-metadata.service.js.map +1 -1
- package/dist/services/media.service.d.ts +2 -9
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +17 -28
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +2 -4
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +2 -11
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +3 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +16 -12
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/index.d.ts +1 -1
- package/dist/services/mediaStorageProviders/index.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/index.js +1 -1
- package/dist/services/mediaStorageProviders/index.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts +2 -13
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +4 -22
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +11 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +3 -0
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/model-sequence.service.d.ts +2 -13
- package/dist/services/model-sequence.service.d.ts.map +1 -1
- package/dist/services/model-sequence.service.js +4 -21
- package/dist/services/model-sequence.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +14 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +13 -6
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/mq-message-queue.service.d.ts +2 -13
- package/dist/services/mq-message-queue.service.d.ts.map +1 -1
- package/dist/services/mq-message-queue.service.js +4 -22
- package/dist/services/mq-message-queue.service.js.map +1 -1
- package/dist/services/mq-message.service.d.ts +2 -13
- package/dist/services/mq-message.service.d.ts.map +1 -1
- package/dist/services/mq-message.service.js +4 -22
- package/dist/services/mq-message.service.js.map +1 -1
- package/dist/services/permission-metadata.service.d.ts +2 -13
- package/dist/services/permission-metadata.service.d.ts.map +1 -1
- package/dist/services/permission-metadata.service.js +4 -22
- package/dist/services/permission-metadata.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts +2 -13
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +4 -23
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/saved-filters.service.d.ts +2 -13
- package/dist/services/saved-filters.service.d.ts.map +1 -1
- package/dist/services/saved-filters.service.js +4 -21
- package/dist/services/saved-filters.service.js.map +1 -1
- package/dist/services/scheduled-job.service.d.ts +2 -13
- package/dist/services/scheduled-job.service.d.ts.map +1 -1
- package/dist/services/scheduled-job.service.js +4 -22
- package/dist/services/scheduled-job.service.js.map +1 -1
- package/dist/services/security-rule.service.d.ts +2 -13
- package/dist/services/security-rule.service.d.ts.map +1 -1
- package/dist/services/security-rule.service.js +5 -23
- package/dist/services/security-rule.service.js.map +1 -1
- package/dist/services/selection-providers/list-of-roles-selectionproviders.service.d.ts +15 -0
- package/dist/services/selection-providers/list-of-roles-selectionproviders.service.d.ts.map +1 -0
- package/dist/services/selection-providers/list-of-roles-selectionproviders.service.js +59 -0
- package/dist/services/selection-providers/list-of-roles-selectionproviders.service.js.map +1 -0
- package/dist/services/setting.service.d.ts +23 -30
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +147 -196
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +1058 -0
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -0
- package/dist/services/settings/default-settings-provider.service.js +139 -0
- package/dist/services/settings/default-settings-provider.service.js.map +1 -0
- package/dist/services/short-url/tiny-url.service.d.ts +3 -4
- package/dist/services/short-url/tiny-url.service.d.ts.map +1 -1
- package/dist/services/short-url/tiny-url.service.js +10 -13
- package/dist/services/short-url/tiny-url.service.js.map +1 -1
- package/dist/services/sms/Msg91BaseSMSService.d.ts +3 -4
- package/dist/services/sms/Msg91BaseSMSService.d.ts.map +1 -1
- package/dist/services/sms/Msg91BaseSMSService.js +3 -3
- package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
- package/dist/services/sms/Msg91OTPService.d.ts +2 -3
- package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
- package/dist/services/sms/Msg91OTPService.js +7 -13
- package/dist/services/sms/Msg91OTPService.js.map +1 -1
- package/dist/services/sms/Msg91SMSService.d.ts +2 -3
- package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
- package/dist/services/sms/Msg91SMSService.js +7 -13
- package/dist/services/sms/Msg91SMSService.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.d.ts +3 -4
- package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
- package/dist/services/sms/TwilioSMSService.js +13 -16
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/sms-template.service.d.ts +2 -13
- package/dist/services/sms-template.service.d.ts.map +1 -1
- package/dist/services/sms-template.service.js +4 -22
- package/dist/services/sms-template.service.js.map +1 -1
- package/dist/services/solid-introspect.service.d.ts +4 -1
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +33 -47
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/textract.service.d.ts +1 -4
- package/dist/services/textract.service.d.ts.map +1 -1
- package/dist/services/textract.service.js +14 -18
- package/dist/services/textract.service.js.map +1 -1
- package/dist/services/user-activity-history.service.d.ts +2 -13
- package/dist/services/user-activity-history.service.d.ts.map +1 -1
- package/dist/services/user-activity-history.service.js +4 -22
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user-view-metadata.service.d.ts +2 -13
- package/dist/services/user-view-metadata.service.d.ts.map +1 -1
- package/dist/services/user-view-metadata.service.js +4 -22
- package/dist/services/user-view-metadata.service.js.map +1 -1
- package/dist/services/user.service.d.ts +2 -15
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +7 -28
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +2 -13
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +5 -23
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/whatsapp/Msg91WhatsappService.d.ts +3 -4
- package/dist/services/whatsapp/Msg91WhatsappService.d.ts.map +1 -1
- package/dist/services/whatsapp/Msg91WhatsappService.js +12 -18
- package/dist/services/whatsapp/Msg91WhatsappService.js.map +1 -1
- package/dist/services/whatsapp/Three60WhatsappService.d.ts +1 -4
- package/dist/services/whatsapp/Three60WhatsappService.d.ts.map +1 -1
- package/dist/services/whatsapp/Three60WhatsappService.js +2 -11
- package/dist/services/whatsapp/Three60WhatsappService.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +11 -47
- package/dist/solid-core.module.js.map +1 -1
- package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -1
- package/dist/transformers/typeorm/local-date-time-transformer.js +4 -2
- package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/commands/info.command.ts +101 -0
- package/src/commands/mcp.command.ts +3 -17
- package/src/commands/seed.command.ts +4 -16
- package/src/controllers/email-template.controller.ts +9 -4
- package/src/controllers/google-authentication.controller.ts +19 -12
- package/src/controllers/setting.controller.ts +6 -81
- package/src/decorators/settings-provider.decorator.ts +7 -0
- package/src/decorators/solid-password.decorator.ts +43 -43
- package/src/dtos/create-role-metadata.dto.ts +4 -81
- package/src/dtos/create-setting.dto.ts +14 -1
- package/src/dtos/update-setting.dto.ts +14 -0
- package/src/entities/setting.entity.ts +15 -1
- package/src/factories/mail.factory.ts +4 -4
- package/src/factories/sms.factory.ts +9 -7
- package/src/factories/whatsapp.factory.ts +4 -4
- package/src/guards/access-token.guard.ts +12 -5
- package/src/helpers/cors.helper.ts +3 -3
- package/src/helpers/error-mapper.service.ts +0 -1
- package/src/helpers/google-oauth.helper.ts +11 -7
- package/src/helpers/module.helper.ts +2 -2
- package/src/helpers/solid-registry.ts +45 -16
- package/src/index.ts +2 -4
- package/src/interfaces.ts +29 -0
- package/src/passport-strategies/google-oauth.strategy.ts +11 -8
- package/src/seeders/email-template-seeder.service.ts +6 -4
- package/src/seeders/module-metadata-seeder.service.ts +40 -28
- package/src/seeders/seed-data/solid-core-metadata.json +99 -5
- package/src/seeders/sms-template-seeder.service.ts +6 -4
- package/src/services/action-metadata.service.ts +4 -16
- package/src/services/ai-interaction.service.ts +6 -17
- package/src/services/authentication.service.ts +173 -111
- package/src/services/bcrypt.service.ts +9 -9
- package/src/services/chatter-message-details.service.ts +5 -17
- package/src/services/chatter-message.service.ts +2 -14
- package/src/services/crud.service.ts +36 -28
- package/src/services/dashboard-question-sql-dataset-config.service.ts +4 -15
- package/src/services/dashboard-question.service.ts +4 -17
- package/src/services/dashboard-variable.service.ts +4 -16
- package/src/services/dashboard.service.ts +2 -13
- package/src/services/email-template.service.ts +3 -15
- package/src/services/export-template.service.ts +4 -18
- package/src/services/export-transaction.service.ts +4 -19
- package/src/services/field-metadata.service.ts +5 -1
- package/src/services/file/file-service.interface.ts +74 -0
- package/src/services/file.service.ts +10 -7
- package/src/services/genai/r2r-helper.service.ts +10 -6
- package/src/services/import-transaction-error-log.service.ts +5 -17
- package/src/services/import-transaction.service.ts +3 -15
- package/src/services/list-of-values.service.ts +3 -16
- package/src/services/locale.service.ts +3 -15
- package/src/services/mail/elastic-email.service.ts +7 -7
- package/src/services/mail/smtp-email.service.ts +19 -11
- package/src/services/media-storage-provider-metadata.service.ts +4 -0
- package/src/services/media.service.ts +39 -22
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +0 -3
- package/src/services/mediaStorageProviders/file-storage-provider.ts +24 -12
- package/src/services/mediaStorageProviders/index.ts +1 -1
- package/src/services/menu-item-metadata.service.ts +5 -17
- package/src/services/model-metadata.service.ts +4 -0
- package/src/services/model-sequence.service.ts +4 -15
- package/src/services/module-metadata.service.ts +13 -4
- package/src/services/mq-message-queue.service.ts +5 -17
- package/src/services/mq-message.service.ts +5 -17
- package/src/services/permission-metadata.service.ts +4 -16
- package/src/services/role-metadata.service.ts +3 -16
- package/src/services/saved-filters.service.ts +2 -13
- package/src/services/scheduled-job.service.ts +3 -15
- package/src/services/security-rule.service.ts +4 -16
- package/src/services/selection-providers/list-of-roles-selectionproviders.service.ts +69 -0
- package/src/services/setting.service.ts +223 -212
- package/src/services/settings/default-settings-provider.service.ts +157 -0
- package/src/services/short-url/tiny-url.service.ts +9 -7
- package/src/services/sms/Msg91BaseSMSService.ts +6 -4
- package/src/services/sms/Msg91OTPService.ts +7 -7
- package/src/services/sms/Msg91SMSService.ts +7 -6
- package/src/services/sms/TwilioSMSService.ts +18 -19
- package/src/services/sms-template.service.ts +3 -15
- package/src/services/solid-introspect.service.ts +45 -66
- package/src/services/textract.service.ts +13 -10
- package/src/services/user-activity-history.service.ts +5 -17
- package/src/services/user-view-metadata.service.ts +5 -17
- package/src/services/user.service.ts +7 -22
- package/src/services/view-metadata.service.ts +3 -15
- package/src/services/whatsapp/Msg91WhatsappService.ts +10 -11
- package/src/services/whatsapp/Three60WhatsappService.ts +0 -3
- package/src/solid-core.module.ts +19 -49
- package/src/transformers/typeorm/local-date-time-transformer.ts +10 -5
- package/dist/config/app-builder.config.d.ts +0 -11
- package/dist/config/app-builder.config.d.ts.map +0 -1
- package/dist/config/app-builder.config.js +0 -13
- package/dist/config/app-builder.config.js.map +0 -1
- package/dist/config/common.config.d.ts +0 -96
- package/dist/config/common.config.d.ts.map +0 -1
- package/dist/config/common.config.js +0 -51
- package/dist/config/common.config.js.map +0 -1
- package/dist/config/iam.config.d.ts +0 -56
- package/dist/config/iam.config.d.ts.map +0 -1
- package/dist/config/iam.config.js +0 -35
- package/dist/config/iam.config.js.map +0 -1
- package/dist/config/jwt.config.d.ts +0 -14
- package/dist/config/jwt.config.d.ts.map +0 -1
- package/dist/config/jwt.config.js +0 -15
- package/dist/config/jwt.config.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +0 -16
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +0 -151
- package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +0 -17
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +0 -80
- package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts +0 -16
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js +0 -74
- package/dist/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts +0 -12
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js +0 -47
- package/dist/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts +0 -16
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js +0 -151
- package/dist/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts +0 -16
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js +0 -75
- package/dist/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +0 -14
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +0 -73
- package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts +0 -14
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js +0 -45
- package/dist/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts +0 -14
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js +0 -51
- package/dist/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.js.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts +0 -12
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.d.ts.map +0 -1
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js +0 -38
- package/dist/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.js.map +0 -1
- package/dist/services/media-storage-provider-metadata-seeder.service.d.ts +0 -8
- package/dist/services/media-storage-provider-metadata-seeder.service.d.ts.map +0 -1
- package/dist/services/media-storage-provider-metadata-seeder.service.js +0 -43
- package/dist/services/media-storage-provider-metadata-seeder.service.js.map +0 -1
- package/src/config/app-builder.config.ts +0 -12
- package/src/config/common.config.ts +0 -55
- package/src/config/iam.config.ts +0 -32
- package/src/config/jwt.config.ts +0 -13
- package/src/services/export_issues.txt +0 -10
- package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +0 -137
- package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +0 -81
- package/src/services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service.ts +0 -69
- package/src/services/genai/mcp-handlers/solid-add-fields-to-model-mcp-handler.service.ts +0 -68
- package/src/services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service.ts +0 -141
- package/src/services/genai/mcp-handlers/solid-create-computed-provider-mcp-handler.service.ts +0 -71
- package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +0 -72
- package/src/services/genai/mcp-handlers/solid-create-model-with-fields-mcp-handler.service.ts +0 -45
- package/src/services/genai/mcp-handlers/solid-create-module-mcp-handler.service.ts +0 -58
- package/src/services/genai/mcp-handlers/solid-update-layout-mcp-handler.service.ts +0 -40
- package/src/services/groupBy.json +0 -92
- package/src/services/media-storage-provider-metadata-seeder.service.ts +0 -33
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HttpService } from '@nestjs/axios';
|
|
2
|
+
import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
|
|
2
3
|
import {
|
|
3
4
|
BadRequestException,
|
|
4
5
|
ConflictException,
|
|
@@ -15,8 +16,6 @@ import { JwtService } from '@nestjs/jwt';
|
|
|
15
16
|
import { InjectDataSource } from '@nestjs/typeorm';
|
|
16
17
|
import { isEmpty, isNotEmpty } from 'class-validator';
|
|
17
18
|
import { randomInt, randomUUID } from 'crypto';
|
|
18
|
-
import commonConfig from 'src/config/common.config';
|
|
19
|
-
import { jwtConfig } from 'src/config/jwt.config';
|
|
20
19
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
21
20
|
import { SUCCESS_MESSAGES } from 'src/constants/success-messages';
|
|
22
21
|
import { CreateUserDto } from 'src/dtos/create-user.dto';
|
|
@@ -25,7 +24,6 @@ import { UserRepository } from 'src/repository/user.repository';
|
|
|
25
24
|
import { Msg91OTPService } from 'src/services/sms/Msg91OTPService';
|
|
26
25
|
import { DataSource, Repository } from 'typeorm';
|
|
27
26
|
import { v4 as uuidv4 } from 'uuid';
|
|
28
|
-
import { iamConfig } from '../config/iam.config';
|
|
29
27
|
import {
|
|
30
28
|
ForgotPasswordSendVerificationTokenOn,
|
|
31
29
|
RegistrationValidationSource,
|
|
@@ -72,10 +70,6 @@ export class AuthenticationService {
|
|
|
72
70
|
private readonly userRepository: UserRepository,
|
|
73
71
|
private readonly hashingService: HashingService,
|
|
74
72
|
private readonly jwtService: JwtService,
|
|
75
|
-
@Inject(jwtConfig.KEY)
|
|
76
|
-
private readonly jwtConfiguration: ConfigType<typeof jwtConfig>,
|
|
77
|
-
@Inject(iamConfig.KEY)
|
|
78
|
-
private readonly iamConfiguration: ConfigType<typeof iamConfig>,
|
|
79
73
|
private readonly refreshTokenIdsStorage: RefreshTokenIdsStorageService,
|
|
80
74
|
private readonly httpService: HttpService,
|
|
81
75
|
// private readonly mailService: SMTPEMailService,
|
|
@@ -85,21 +79,16 @@ export class AuthenticationService {
|
|
|
85
79
|
private readonly eventEmitter: EventEmitter2,
|
|
86
80
|
private readonly settingService: SettingService,
|
|
87
81
|
private readonly roleMetadataService: RoleMetadataService,
|
|
88
|
-
@Inject(commonConfig.KEY)
|
|
89
|
-
private readonly commonConfiguration: ConfigType<typeof commonConfig>,
|
|
90
82
|
private readonly userActivityHistoryService: UserActivityHistoryService,
|
|
83
|
+
|
|
91
84
|
@InjectDataSource()
|
|
92
85
|
private readonly dataSource: DataSource,
|
|
93
86
|
) {
|
|
94
87
|
// this.mailService = this.mailServiceFactory.getMailService();
|
|
95
88
|
}
|
|
96
89
|
|
|
97
|
-
private async getConfig(key: string): Promise<any> {
|
|
98
|
-
return this.settingService.getConfigValue(key);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
90
|
private async getCompanyLogo(): Promise<string> {
|
|
102
|
-
return
|
|
91
|
+
return this.settingService.getConfigValue<SolidCoreSetting>('companylogo');
|
|
103
92
|
}
|
|
104
93
|
|
|
105
94
|
async resolveUser(username: string, email: string) {
|
|
@@ -166,18 +155,21 @@ export class AuthenticationService {
|
|
|
166
155
|
|
|
167
156
|
async signUp(signUpDto: SignUpDto, activeUser: ActiveUserData = null): Promise<User> {
|
|
168
157
|
// If public registrations are disabled and no activeUser is present when invoking signUp then we throw an exception.
|
|
169
|
-
if (!(
|
|
158
|
+
if (!(this.settingService.getConfigValue<SolidCoreSetting>('allowPublicRegistration')) && !activeUser) {
|
|
170
159
|
throw new BadRequestException(ERROR_MESSAGES.PUBLIC_REGISTRATION_DISABLED);
|
|
171
160
|
}
|
|
172
161
|
|
|
173
162
|
try {
|
|
174
|
-
const onForcePasswordChange =
|
|
175
|
-
|
|
163
|
+
const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');
|
|
164
|
+
const activateUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration');
|
|
165
|
+
const defaultRole = this.settingService.getConfigValue<SolidCoreSetting>('defaultRole');
|
|
166
|
+
|
|
167
|
+
var { user, pwd, autoGeneratedPwd } = await this.populateForSignup(new User(), signUpDto, activateUserOnRegistration, onForcePasswordChange);
|
|
176
168
|
const savedUser = await this.userRepository.save(user);
|
|
177
169
|
// Also assign a default role to the newly created user.
|
|
178
170
|
const userRoles = signUpDto.roles ?? [];
|
|
179
|
-
if (signUpDto.username !== 'sa' &&
|
|
180
|
-
userRoles.push(
|
|
171
|
+
if (signUpDto.username !== 'sa' && defaultRole) {
|
|
172
|
+
userRoles.push(defaultRole);
|
|
181
173
|
}
|
|
182
174
|
await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);
|
|
183
175
|
|
|
@@ -195,7 +187,7 @@ export class AuthenticationService {
|
|
|
195
187
|
|
|
196
188
|
async signupForExtensionUser<T extends User, U extends CreateUserDto>(signUpDto: SignUpDto, extensionUserDto: U, extensionUserRepo: Repository<T>): Promise<T> {
|
|
197
189
|
try {
|
|
198
|
-
const onForcePasswordChange =
|
|
190
|
+
const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');
|
|
199
191
|
// Merge the extended signUpDto attributes into the user entity
|
|
200
192
|
//@ts-ignore
|
|
201
193
|
const extensionUser = extensionUserRepo.merge(extensionUserRepo.create() as T, extensionUserDto);
|
|
@@ -218,7 +210,7 @@ export class AuthenticationService {
|
|
|
218
210
|
|
|
219
211
|
private async populateForSignup<T extends User>(user: T, signUpDto: SignUpDto, isUserActive: boolean = true, onForcePasswordChange?: boolean) {
|
|
220
212
|
// const user = new User();
|
|
221
|
-
let autoGeneratedPwdPermission =
|
|
213
|
+
let autoGeneratedPwdPermission = this.settingService.getConfigValue<SolidCoreSetting>('iamAutoGeneratedPassword');
|
|
222
214
|
if (signUpDto.roles && signUpDto.roles.length > 0) {
|
|
223
215
|
for (let i = 0; i < signUpDto.roles.length; i++) {
|
|
224
216
|
const roleName = signUpDto.roles[i];
|
|
@@ -254,7 +246,7 @@ export class AuthenticationService {
|
|
|
254
246
|
else {
|
|
255
247
|
// This means that most likely the system is going to be using password-less login.
|
|
256
248
|
// If that is not the case then we can raise a bad request exception...
|
|
257
|
-
if (!this.isPasswordlessRegistrationEnabled()) {
|
|
249
|
+
if (!await this.isPasswordlessRegistrationEnabled()) {
|
|
258
250
|
this.logger.error('User being created without password, and password less login is also not enabled in the system. Is this intentional?');
|
|
259
251
|
throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);
|
|
260
252
|
}
|
|
@@ -278,7 +270,7 @@ export class AuthenticationService {
|
|
|
278
270
|
// if forcePasswordChange is true, then we trigger an email to the user to change the password, this needs to be done using a queue.
|
|
279
271
|
// Create a new method like notifyUserOnForcePasswordChange, create a new email template we can call it on-force-password-change this template to include the random password
|
|
280
272
|
if (user.forcePasswordChange && autoGeneratedPwd) {
|
|
281
|
-
this.notifyUserOnForcePasswordChange(user, autoGeneratedPwd);
|
|
273
|
+
await this.notifyUserOnForcePasswordChange(user, autoGeneratedPwd);
|
|
282
274
|
}
|
|
283
275
|
|
|
284
276
|
// Send welcome notifications (email/SMS) if enabled.
|
|
@@ -310,16 +302,16 @@ export class AuthenticationService {
|
|
|
310
302
|
user.email,
|
|
311
303
|
'on-force-password-change',
|
|
312
304
|
{
|
|
313
|
-
solidAppName:
|
|
314
|
-
solidAppWebsiteUrl:
|
|
315
|
-
frontendLoginPageUrl:
|
|
305
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
306
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
307
|
+
frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),
|
|
316
308
|
email: user.email,
|
|
317
309
|
fullName: user.fullName,
|
|
318
310
|
userName: user.username,
|
|
319
311
|
password: autoGeneratedPwd,
|
|
320
312
|
companyLogoUrl: companyLogo
|
|
321
313
|
},
|
|
322
|
-
this.
|
|
314
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
323
315
|
null,
|
|
324
316
|
null,
|
|
325
317
|
'user',
|
|
@@ -328,32 +320,34 @@ export class AuthenticationService {
|
|
|
328
320
|
|
|
329
321
|
}
|
|
330
322
|
|
|
331
|
-
private isWelcomeEmailEnabled(): boolean {
|
|
332
|
-
|
|
323
|
+
private async isWelcomeEmailEnabled(): Promise<boolean> {
|
|
324
|
+
const sendWelcomeEmailOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeEmailOnSignup');
|
|
325
|
+
return sendWelcomeEmailOnSignup;
|
|
333
326
|
}
|
|
334
327
|
|
|
335
|
-
private isWelcomeSmsEnabled(): boolean {
|
|
336
|
-
|
|
328
|
+
private async isWelcomeSmsEnabled(): Promise<boolean> {
|
|
329
|
+
const sendWelcomeSmsOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeSmsOnSignup');
|
|
330
|
+
return sendWelcomeSmsOnSignup;
|
|
337
331
|
}
|
|
338
332
|
|
|
339
333
|
private async notifyUserOnSignup(user: User) {
|
|
340
334
|
const companyLogo = await this.getCompanyLogo();
|
|
341
335
|
// Email welcome
|
|
342
|
-
if (this.isWelcomeEmailEnabled()) {
|
|
336
|
+
if (await this.isWelcomeEmailEnabled()) {
|
|
343
337
|
const mailService = this.mailServiceFactory.getMailService();
|
|
344
338
|
mailService.sendEmailUsingTemplate(
|
|
345
339
|
user.email,
|
|
346
340
|
'email-on-signup',
|
|
347
341
|
{
|
|
348
|
-
solidAppName:
|
|
349
|
-
solidAppWebsiteUrl:
|
|
350
|
-
frontendLoginPageUrl:
|
|
342
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
343
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
344
|
+
frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),
|
|
351
345
|
email: user.email,
|
|
352
346
|
fullName: user.fullName,
|
|
353
347
|
userName: user.username,
|
|
354
348
|
companyLogoUrl: companyLogo
|
|
355
349
|
},
|
|
356
|
-
this.
|
|
350
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
357
351
|
null,
|
|
358
352
|
null,
|
|
359
353
|
'user',
|
|
@@ -362,25 +356,28 @@ export class AuthenticationService {
|
|
|
362
356
|
}
|
|
363
357
|
|
|
364
358
|
// SMS welcome
|
|
365
|
-
|
|
359
|
+
const isWelcomeSmsEnabled = await this.isWelcomeSmsEnabled()
|
|
360
|
+
if (isWelcomeSmsEnabled && user.mobile) {
|
|
366
361
|
const smsService = this.smsFactory.getSmsService();
|
|
367
362
|
smsService.sendSMSUsingTemplate(
|
|
368
363
|
user.mobile,
|
|
369
364
|
'text-on-signup',
|
|
370
365
|
{
|
|
371
|
-
solidAppName:
|
|
372
|
-
frontendLoginPageUrl:
|
|
366
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
367
|
+
frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),
|
|
373
368
|
firstName: user.username,
|
|
374
369
|
fullName: user.fullName ? user.fullName : user.username
|
|
375
370
|
},
|
|
376
|
-
this.
|
|
371
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),
|
|
372
|
+
|
|
377
373
|
);
|
|
378
374
|
}
|
|
379
375
|
}
|
|
380
376
|
|
|
381
377
|
async otpInitiateRegistration(signUpDto: OTPSignUpDto) {
|
|
382
378
|
try {
|
|
383
|
-
|
|
379
|
+
const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();
|
|
380
|
+
if (!isPasswordlessRegistrationEnabled) {
|
|
384
381
|
throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);
|
|
385
382
|
}
|
|
386
383
|
// Validate if either mobile or email is present.
|
|
@@ -405,21 +402,23 @@ export class AuthenticationService {
|
|
|
405
402
|
if (isNotEmpty(existingUser) && existingUser.active) {
|
|
406
403
|
throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);
|
|
407
404
|
}
|
|
408
|
-
const
|
|
405
|
+
const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');
|
|
406
|
+
|
|
407
|
+
const finalRegistrationVerificationSources = this.calculateVerificationSources(passwordlessRegistrationValidateWhat, signUpDto);
|
|
409
408
|
let user = existingUser
|
|
410
409
|
if (isEmpty(user)) {
|
|
411
410
|
user = this.createUser(signUpDto);
|
|
412
|
-
this.populateVerificationTokens(finalRegistrationVerificationSources, user);
|
|
411
|
+
await this.populateVerificationTokens(finalRegistrationVerificationSources, user);
|
|
413
412
|
await this.userRepository.save(user);
|
|
414
|
-
await this.userService.addRoleToUser(user.username,
|
|
413
|
+
await this.userService.addRoleToUser(user.username, this.settingService.getConfigValue<SolidCoreSetting>('defaultRole'));
|
|
415
414
|
}
|
|
416
415
|
else {
|
|
417
|
-
this.populateVerificationTokens(finalRegistrationVerificationSources, user);
|
|
416
|
+
await this.populateVerificationTokens(finalRegistrationVerificationSources, user);
|
|
418
417
|
await this.userRepository.save(user);
|
|
419
418
|
}
|
|
420
419
|
|
|
421
420
|
// Send OTP to the user through email or SMS, depending on the configuration.
|
|
422
|
-
this.notifyUserOnOtpInitiateRegistration(user, finalRegistrationVerificationSources);
|
|
421
|
+
await this.notifyUserOnOtpInitiateRegistration(user, finalRegistrationVerificationSources);
|
|
423
422
|
return { message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_REGISTRATION }
|
|
424
423
|
} catch (err) {
|
|
425
424
|
const pgUniqueViolationErrorCode = '23505';
|
|
@@ -450,24 +449,28 @@ export class AuthenticationService {
|
|
|
450
449
|
}
|
|
451
450
|
|
|
452
451
|
// Generate the validation tokens for the user i.e (system configured + user provided)
|
|
453
|
-
private populateVerificationTokens(finalRegistrationValidationSources: string[], user: User) {
|
|
452
|
+
private async populateVerificationTokens(finalRegistrationValidationSources: string[], user: User) {
|
|
454
453
|
if (finalRegistrationValidationSources.length === 0) {
|
|
455
454
|
throw new BadRequestException(ERROR_MESSAGES.VALIDATION_SOURCE_REQUIRED);
|
|
456
455
|
}
|
|
457
456
|
if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.EMAIL)) {
|
|
458
|
-
const { token, expiresAt } = this.otp();
|
|
457
|
+
const { token, expiresAt } = await this.otp();
|
|
459
458
|
user.emailVerificationTokenOnRegistration = token;
|
|
460
459
|
user.emailVerificationTokenOnRegistrationExpiresAt = expiresAt;
|
|
461
|
-
|
|
460
|
+
const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');
|
|
461
|
+
|
|
462
|
+
if (autoLoginUserOnRegistration) {
|
|
462
463
|
user.emailVerificationTokenOnLogin = token;
|
|
463
464
|
user.emailVerificationTokenOnLoginExpiresAt = expiresAt;
|
|
464
465
|
}
|
|
465
466
|
}
|
|
466
467
|
if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.MOBILE)) {
|
|
467
|
-
const { token, expiresAt } = this.otp();
|
|
468
|
+
const { token, expiresAt } = await this.otp();
|
|
468
469
|
user.mobileVerificationTokenOnRegistration = token;
|
|
469
470
|
user.mobileVerificationTokenOnRegistrationExpiresAt = expiresAt;
|
|
470
|
-
|
|
471
|
+
|
|
472
|
+
const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');
|
|
473
|
+
if (autoLoginUserOnRegistration) {
|
|
471
474
|
user.mobileVerificationTokenOnLogin = token;
|
|
472
475
|
user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;
|
|
473
476
|
}
|
|
@@ -476,7 +479,9 @@ export class AuthenticationService {
|
|
|
476
479
|
|
|
477
480
|
private async notifyUserOnOtpInitiateRegistration(user: User, registrationValidationSources: string[]) {
|
|
478
481
|
const companyLogo = await this.getCompanyLogo();
|
|
479
|
-
|
|
482
|
+
const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');
|
|
483
|
+
|
|
484
|
+
if (dummyOtp)
|
|
480
485
|
return; // Do nothing if dummy otp is configured.
|
|
481
486
|
if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {
|
|
482
487
|
const mailService = this.mailServiceFactory.getMailService();
|
|
@@ -484,14 +489,14 @@ export class AuthenticationService {
|
|
|
484
489
|
user.email,
|
|
485
490
|
'otp-on-register',
|
|
486
491
|
{
|
|
487
|
-
solidAppName:
|
|
488
|
-
solidAppWebsiteUrl:
|
|
492
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
493
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
489
494
|
firstName: user.username,
|
|
490
495
|
fullName: user.fullName ? user.fullName : user.username,
|
|
491
496
|
emailVerificationTokenOnRegistration: user.emailVerificationTokenOnRegistration,
|
|
492
497
|
companyLogoUrl: companyLogo
|
|
493
498
|
},
|
|
494
|
-
this.
|
|
499
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
495
500
|
null,
|
|
496
501
|
null,
|
|
497
502
|
'user',
|
|
@@ -504,20 +509,23 @@ export class AuthenticationService {
|
|
|
504
509
|
user.mobile,
|
|
505
510
|
'otp-on-register',
|
|
506
511
|
{
|
|
507
|
-
solidAppName:
|
|
512
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
508
513
|
otp: user.mobileVerificationTokenOnRegistration,
|
|
509
514
|
mobileVerificationTokenOnRegistration: user.mobileVerificationTokenOnRegistration,
|
|
510
515
|
firstName: user.username,
|
|
511
516
|
fullName: user.fullName ? user.fullName : user.username,
|
|
512
517
|
companyLogoUrl: companyLogo
|
|
513
518
|
},
|
|
514
|
-
this.
|
|
519
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),
|
|
520
|
+
|
|
515
521
|
);
|
|
516
522
|
}
|
|
517
523
|
}
|
|
518
524
|
|
|
519
525
|
async otpConfirmRegistration(confirmSignUpDto: OTPConfirmOTPDto) {
|
|
520
|
-
|
|
526
|
+
const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();
|
|
527
|
+
|
|
528
|
+
if (!isPasswordlessRegistrationEnabled) {
|
|
521
529
|
throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);
|
|
522
530
|
}
|
|
523
531
|
|
|
@@ -540,7 +548,7 @@ export class AuthenticationService {
|
|
|
540
548
|
user.emailVerifiedOnRegistrationAt = new Date();
|
|
541
549
|
user.emailVerificationTokenOnRegistration = null;
|
|
542
550
|
user.emailVerificationTokenOnRegistrationExpiresAt = null;
|
|
543
|
-
user.active =
|
|
551
|
+
user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);
|
|
544
552
|
const savedUser: User = await this.userRepository.save(user);
|
|
545
553
|
this.triggerRegistrationEvent(savedUser);
|
|
546
554
|
return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }
|
|
@@ -562,7 +570,7 @@ export class AuthenticationService {
|
|
|
562
570
|
user.mobileVerifiedOnRegistrationAt = new Date();
|
|
563
571
|
user.mobileVerificationTokenOnRegistration = null;
|
|
564
572
|
user.mobileVerificationTokenOnRegistrationExpiresAt = null;
|
|
565
|
-
user.active =
|
|
573
|
+
user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);
|
|
566
574
|
const savedUser: User = await this.userRepository.save(user);
|
|
567
575
|
this.triggerRegistrationEvent(savedUser);
|
|
568
576
|
return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }
|
|
@@ -576,8 +584,10 @@ export class AuthenticationService {
|
|
|
576
584
|
this.eventEmitter.emit(EventType.USER_REGISTERED, event);
|
|
577
585
|
}
|
|
578
586
|
|
|
579
|
-
areRegistrationValidationSourcesVerified(user: User): boolean {
|
|
580
|
-
const
|
|
587
|
+
async areRegistrationValidationSourcesVerified(user: User): Promise<boolean> {
|
|
588
|
+
const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');
|
|
589
|
+
|
|
590
|
+
const registrationValidationSources = passwordlessRegistrationValidateWhat;
|
|
581
591
|
if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {
|
|
582
592
|
if (!user.emailVerifiedOnRegistrationAt) {
|
|
583
593
|
return false;
|
|
@@ -591,11 +601,13 @@ export class AuthenticationService {
|
|
|
591
601
|
return true;
|
|
592
602
|
}
|
|
593
603
|
|
|
594
|
-
private otp(): otp {
|
|
604
|
+
private async otp(): Promise<otp> {
|
|
595
605
|
const now = new Date();
|
|
596
|
-
|
|
606
|
+
const otpExpiry = this.settingService.getConfigValue<SolidCoreSetting>('otpExpiry');
|
|
607
|
+
const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');
|
|
608
|
+
now.setMinutes(now.getMinutes() + otpExpiry);
|
|
597
609
|
return {
|
|
598
|
-
token:
|
|
610
|
+
token: dummyOtp ? dummyOtp : randomInt(100000, 999999).toString(),
|
|
599
611
|
expiresAt: now,
|
|
600
612
|
};
|
|
601
613
|
}
|
|
@@ -621,8 +633,33 @@ export class AuthenticationService {
|
|
|
621
633
|
}
|
|
622
634
|
}
|
|
623
635
|
|
|
636
|
+
private maskEmail(email: string): string {
|
|
637
|
+
if (!email) return null;
|
|
638
|
+
|
|
639
|
+
const [localPart, domain] = email.split('@');
|
|
640
|
+
if (localPart.length <= 2) {
|
|
641
|
+
return `${localPart[0]}***@${domain}`;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
const visibleStart = localPart.slice(0, 2);
|
|
645
|
+
const visibleEnd = localPart.slice(-1);
|
|
646
|
+
return `${visibleStart}***${visibleEnd}@${domain}`;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
private maskMobile(mobile: string): string {
|
|
650
|
+
if (!mobile) return null;
|
|
651
|
+
|
|
652
|
+
if (mobile.length <= 4) {
|
|
653
|
+
return mobile;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
const visibleEnd = mobile.slice(-4);
|
|
657
|
+
return `***${visibleEnd}`;
|
|
658
|
+
}
|
|
659
|
+
|
|
624
660
|
async otpInitiateLogin(signInDto: OTPSignInDto) {
|
|
625
|
-
|
|
661
|
+
const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();
|
|
662
|
+
if (!isPasswordlessRegistrationEnabled) {
|
|
626
663
|
throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);
|
|
627
664
|
}
|
|
628
665
|
|
|
@@ -646,11 +683,17 @@ export class AuthenticationService {
|
|
|
646
683
|
if (!user.active) {
|
|
647
684
|
throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);
|
|
648
685
|
}
|
|
649
|
-
const { token, expiresAt } = this.otp();
|
|
686
|
+
const { token, expiresAt } = await this.otp();
|
|
650
687
|
user.emailVerificationTokenOnLogin = token;
|
|
651
688
|
user.emailVerificationTokenOnLoginExpiresAt = expiresAt;
|
|
652
689
|
await this.userRepository.save(user);
|
|
653
690
|
this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.EMAIL);
|
|
691
|
+
return {
|
|
692
|
+
message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,
|
|
693
|
+
user: {
|
|
694
|
+
email: this.maskEmail(user.email)
|
|
695
|
+
}
|
|
696
|
+
};
|
|
654
697
|
} else if (signInDto.type === RegistrationValidationSource.MOBILE) {
|
|
655
698
|
// const user = await this.userRepository.findOne({
|
|
656
699
|
// where: {
|
|
@@ -668,22 +711,28 @@ export class AuthenticationService {
|
|
|
668
711
|
throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);
|
|
669
712
|
}
|
|
670
713
|
|
|
671
|
-
const { token, expiresAt } = this.otp();
|
|
714
|
+
const { token, expiresAt } = await this.otp();
|
|
672
715
|
user.mobileVerificationTokenOnLogin = token;
|
|
673
716
|
user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;
|
|
674
717
|
await this.userRepository.save(user);
|
|
675
718
|
this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.MOBILE);
|
|
719
|
+
return {
|
|
720
|
+
message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,
|
|
721
|
+
user: {
|
|
722
|
+
mobile: this.maskMobile(user.mobile)
|
|
723
|
+
}
|
|
724
|
+
};
|
|
676
725
|
}
|
|
677
726
|
else {
|
|
678
727
|
throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);
|
|
679
728
|
}
|
|
680
|
-
return { message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN };
|
|
681
729
|
}
|
|
682
730
|
|
|
683
731
|
private async notifyUserOnOtpInititateLogin(user: User, loginType: RegistrationValidationSource) {
|
|
684
732
|
const companyLogo = await this.getCompanyLogo();
|
|
733
|
+
const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');
|
|
685
734
|
|
|
686
|
-
if (
|
|
735
|
+
if (dummyOtp)
|
|
687
736
|
return; // Do nothing if dummy otp is configured.
|
|
688
737
|
if (loginType === RegistrationValidationSource.EMAIL) {
|
|
689
738
|
const mailService = this.mailServiceFactory.getMailService();
|
|
@@ -691,14 +740,14 @@ export class AuthenticationService {
|
|
|
691
740
|
user.email,
|
|
692
741
|
'otp-on-login',
|
|
693
742
|
{
|
|
694
|
-
solidAppName:
|
|
695
|
-
solidAppWebsiteUrl:
|
|
743
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
744
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
696
745
|
firstName: user.username,
|
|
697
746
|
emailVerificationTokenOnLogin: user.emailVerificationTokenOnLogin,
|
|
698
747
|
fullName: user.fullName ? user.fullName : user.username,
|
|
699
748
|
companyLogoUrl: companyLogo
|
|
700
749
|
},
|
|
701
|
-
this.
|
|
750
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
702
751
|
null,
|
|
703
752
|
null,
|
|
704
753
|
'user',
|
|
@@ -711,20 +760,22 @@ export class AuthenticationService {
|
|
|
711
760
|
user.mobile,
|
|
712
761
|
'otp-on-login',
|
|
713
762
|
{
|
|
714
|
-
solidAppName:
|
|
763
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
715
764
|
otp: user.mobileVerificationTokenOnLogin,
|
|
716
765
|
mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,
|
|
717
766
|
firstName: user.username,
|
|
718
767
|
fullName: user.fullName ? user.fullName : user.username,
|
|
719
768
|
companyLogoUrl: companyLogo
|
|
720
769
|
},
|
|
721
|
-
this.
|
|
770
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),
|
|
771
|
+
|
|
722
772
|
);
|
|
723
773
|
}
|
|
724
774
|
}
|
|
725
775
|
|
|
726
776
|
async otpConfirmLogin(confirmSignInDto: OTPConfirmOTPDto) {
|
|
727
|
-
|
|
777
|
+
const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();
|
|
778
|
+
if (!isPasswordlessRegistrationEnabled) {
|
|
728
779
|
throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);
|
|
729
780
|
}
|
|
730
781
|
if (confirmSignInDto.type === RegistrationValidationSource.EMAIL) {
|
|
@@ -859,13 +910,15 @@ export class AuthenticationService {
|
|
|
859
910
|
}
|
|
860
911
|
|
|
861
912
|
// generate uuid token for forgot password
|
|
862
|
-
private generateForgotPasswordToken() {
|
|
913
|
+
private async generateForgotPasswordToken() {
|
|
863
914
|
const expiryTime = new Date();
|
|
864
|
-
|
|
915
|
+
const forgotPasswordVerificationTokenExpiry = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordVerificationTokenExpiry');
|
|
916
|
+
const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');
|
|
917
|
+
expiryTime.setMinutes(expiryTime.getMinutes() + forgotPasswordVerificationTokenExpiry);
|
|
865
918
|
|
|
866
919
|
return {
|
|
867
|
-
token:
|
|
868
|
-
?
|
|
920
|
+
token: dummyOtp
|
|
921
|
+
? dummyOtp
|
|
869
922
|
: uuidv4(), // UUID instead of numeric OTP
|
|
870
923
|
expiresAt: expiryTime,
|
|
871
924
|
};
|
|
@@ -898,11 +951,11 @@ export class AuthenticationService {
|
|
|
898
951
|
// 3. Generate a 6 digit validation token, we send this token to the user over their email & mobile number (controlled using configuration).
|
|
899
952
|
// 4. Save this validation token in new fields on the user record.
|
|
900
953
|
if (isValidUser) {
|
|
901
|
-
const { token, expiresAt } = this.generateForgotPasswordToken();
|
|
954
|
+
const { token, expiresAt } = await this.generateForgotPasswordToken();
|
|
902
955
|
user.verificationTokenOnForgotPassword = token;
|
|
903
956
|
user.verificationTokenOnForgotPasswordExpiresAt = expiresAt;
|
|
904
957
|
await this.userRepository.save(user);
|
|
905
|
-
this.notifyUserOnForgotPassword(user);
|
|
958
|
+
await this.notifyUserOnForgotPassword(user);
|
|
906
959
|
}
|
|
907
960
|
|
|
908
961
|
// 5. Return.
|
|
@@ -924,7 +977,7 @@ export class AuthenticationService {
|
|
|
924
977
|
private async notifyUserOnForgotPassword(user: User) {
|
|
925
978
|
const companyLogo = await this.getCompanyLogo();
|
|
926
979
|
|
|
927
|
-
const forgotPasswordSendVerificationTokenOn = this.
|
|
980
|
+
const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');
|
|
928
981
|
|
|
929
982
|
if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {
|
|
930
983
|
const mailService = this.mailServiceFactory.getMailService();
|
|
@@ -932,15 +985,15 @@ export class AuthenticationService {
|
|
|
932
985
|
user.email,
|
|
933
986
|
'forgot-password',
|
|
934
987
|
{
|
|
935
|
-
solidAppName:
|
|
936
|
-
solidAppWebsiteUrl:
|
|
988
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
989
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
937
990
|
firstName: user.username,
|
|
938
991
|
fullName: user.fullName,
|
|
939
992
|
// TODO: Need to prefix this with the page url where the forgot password page will open up.
|
|
940
|
-
passwordResetLink: `${
|
|
993
|
+
passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,
|
|
941
994
|
companyLogoUrl: companyLogo
|
|
942
995
|
},
|
|
943
|
-
this.
|
|
996
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
944
997
|
null,
|
|
945
998
|
null,
|
|
946
999
|
'user',
|
|
@@ -954,13 +1007,13 @@ export class AuthenticationService {
|
|
|
954
1007
|
user.mobile,
|
|
955
1008
|
'forgot-password',
|
|
956
1009
|
{
|
|
957
|
-
solidAppName:
|
|
1010
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
958
1011
|
otp: user.verificationTokenOnForgotPassword,
|
|
959
1012
|
verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,
|
|
960
1013
|
firstName: user.username,
|
|
961
1014
|
companyLogoUrl: companyLogo
|
|
962
1015
|
},
|
|
963
|
-
this.
|
|
1016
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),
|
|
964
1017
|
);
|
|
965
1018
|
}
|
|
966
1019
|
}
|
|
@@ -999,7 +1052,7 @@ export class AuthenticationService {
|
|
|
999
1052
|
|
|
1000
1053
|
// Check reuse with your existing method (ensure it looks at hashes).
|
|
1001
1054
|
await m.getRepository(User).update({ id: user.id }, { password: pwdHash, passwordScheme: pwdScheme, passwordSchemeVersion: pwdSchemeVersion });
|
|
1002
|
-
this.notifyUserOnPasswordChanged(user);
|
|
1055
|
+
await this.notifyUserOnPasswordChanged(user);
|
|
1003
1056
|
|
|
1004
1057
|
return {
|
|
1005
1058
|
status: 'success',
|
|
@@ -1013,8 +1066,7 @@ export class AuthenticationService {
|
|
|
1013
1066
|
|
|
1014
1067
|
private async notifyUserOnPasswordChanged(user: User) {
|
|
1015
1068
|
const companyLogo = await this.getCompanyLogo();
|
|
1016
|
-
|
|
1017
|
-
const forgotPasswordSendVerificationTokenOn = this.iamConfiguration.forgotPasswordSendVerificationTokenOn;
|
|
1069
|
+
const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');
|
|
1018
1070
|
|
|
1019
1071
|
if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {
|
|
1020
1072
|
const mailService = this.mailServiceFactory.getMailService();
|
|
@@ -1022,16 +1074,16 @@ export class AuthenticationService {
|
|
|
1022
1074
|
user.email,
|
|
1023
1075
|
'password-changed',
|
|
1024
1076
|
{
|
|
1025
|
-
solidAppName:
|
|
1026
|
-
solidAppWebsiteUrl:
|
|
1077
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
1078
|
+
solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),
|
|
1027
1079
|
email: user.email,
|
|
1028
1080
|
firstName: user.username,
|
|
1029
1081
|
fullName: user.fullName,
|
|
1030
1082
|
// TODO: Need to prefix this with the page url where the forgot password page will open up.
|
|
1031
|
-
passwordResetLink: `${
|
|
1083
|
+
passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,
|
|
1032
1084
|
companyLogoUrl: companyLogo
|
|
1033
1085
|
},
|
|
1034
|
-
this.
|
|
1086
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),
|
|
1035
1087
|
null,
|
|
1036
1088
|
null,
|
|
1037
1089
|
'user',
|
|
@@ -1045,13 +1097,13 @@ export class AuthenticationService {
|
|
|
1045
1097
|
user.mobile,
|
|
1046
1098
|
'forgot-password',
|
|
1047
1099
|
{
|
|
1048
|
-
solidAppName:
|
|
1100
|
+
solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),
|
|
1049
1101
|
otp: user.verificationTokenOnForgotPassword,
|
|
1050
1102
|
verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,
|
|
1051
1103
|
firstName: user.username,
|
|
1052
1104
|
companyLogoUrl: companyLogo
|
|
1053
1105
|
},
|
|
1054
|
-
this.
|
|
1106
|
+
this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),
|
|
1055
1107
|
);
|
|
1056
1108
|
}
|
|
1057
1109
|
}
|
|
@@ -1059,8 +1111,8 @@ export class AuthenticationService {
|
|
|
1059
1111
|
async generateTokens(user: User) {
|
|
1060
1112
|
|
|
1061
1113
|
const [accessToken, refreshToken] = await Promise.all([
|
|
1062
|
-
this.generateAccessToken(user),
|
|
1063
|
-
this.generateRefreshToken(user),
|
|
1114
|
+
await this.generateAccessToken(user),
|
|
1115
|
+
await this.generateRefreshToken(user),
|
|
1064
1116
|
]);
|
|
1065
1117
|
|
|
1066
1118
|
return {
|
|
@@ -1074,9 +1126,10 @@ export class AuthenticationService {
|
|
|
1074
1126
|
// const userRoleNames = user.roles.map((role) => role.name).join(';')
|
|
1075
1127
|
const userRoleNames = user.roles.map((role) => role.name);
|
|
1076
1128
|
|
|
1129
|
+
const accessTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>("accessTokenTtl");
|
|
1077
1130
|
const accessToken = await this.signToken<Partial<ActiveUserData>>(
|
|
1078
1131
|
user.id,
|
|
1079
|
-
|
|
1132
|
+
accessTokenTtl,
|
|
1080
1133
|
{ username: user.username, email: user.email, roles: userRoleNames },
|
|
1081
1134
|
);
|
|
1082
1135
|
|
|
@@ -1085,8 +1138,8 @@ export class AuthenticationService {
|
|
|
1085
1138
|
|
|
1086
1139
|
async generateRefreshToken(user: User, previousRefreshToken?: string) {
|
|
1087
1140
|
const refreshTokenId = randomUUID();
|
|
1088
|
-
|
|
1089
|
-
const refreshToken = await this.signToken(user.id,
|
|
1141
|
+
const refreshTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>("refreshTokenTtl");
|
|
1142
|
+
const refreshToken = await this.signToken(user.id, refreshTokenTtl, {
|
|
1090
1143
|
refreshTokenId,
|
|
1091
1144
|
})
|
|
1092
1145
|
|
|
@@ -1098,10 +1151,14 @@ export class AuthenticationService {
|
|
|
1098
1151
|
|
|
1099
1152
|
async refreshTokens(refreshTokenDto: RefreshTokenDto) {
|
|
1100
1153
|
try {
|
|
1154
|
+
const secret = this.settingService.getConfigValue<SolidCoreSetting>("secret");
|
|
1155
|
+
const audience = this.settingService.getConfigValue<SolidCoreSetting>("audience");
|
|
1156
|
+
const issuer = this.settingService.getConfigValue<SolidCoreSetting>("issuer");
|
|
1157
|
+
|
|
1101
1158
|
const { sub } = await this.jwtService.verifyAsync<Pick<ActiveUserData, 'sub'> & { refreshTokenId: string }>(refreshTokenDto.refreshToken, {
|
|
1102
|
-
secret
|
|
1103
|
-
audience
|
|
1104
|
-
issuer
|
|
1159
|
+
secret,
|
|
1160
|
+
audience,
|
|
1161
|
+
issuer,
|
|
1105
1162
|
});
|
|
1106
1163
|
// const user = await this.userRepository.findOneByOrFail({ id: sub });
|
|
1107
1164
|
const user = await this.userRepository.findOne({
|
|
@@ -1144,15 +1201,20 @@ export class AuthenticationService {
|
|
|
1144
1201
|
}
|
|
1145
1202
|
|
|
1146
1203
|
private async signToken<T>(userId: number, expiresIn: number, payload?: T) {
|
|
1204
|
+
const audience = this.settingService.getConfigValue<SolidCoreSetting>("audience");
|
|
1205
|
+
const issuer = this.settingService.getConfigValue<SolidCoreSetting>("issuer");
|
|
1206
|
+
const secret = this.settingService.getConfigValue<SolidCoreSetting>("secret");
|
|
1207
|
+
|
|
1208
|
+
|
|
1147
1209
|
return await this.jwtService.signAsync(
|
|
1148
1210
|
{
|
|
1149
1211
|
sub: userId,
|
|
1150
1212
|
...payload,
|
|
1151
1213
|
},
|
|
1152
1214
|
{
|
|
1153
|
-
audience
|
|
1154
|
-
issuer
|
|
1155
|
-
secret
|
|
1215
|
+
audience,
|
|
1216
|
+
issuer,
|
|
1217
|
+
secret,
|
|
1156
1218
|
expiresIn,
|
|
1157
1219
|
},
|
|
1158
1220
|
);
|
|
@@ -1204,11 +1266,11 @@ export class AuthenticationService {
|
|
|
1204
1266
|
},
|
|
1205
1267
|
...tokens
|
|
1206
1268
|
}
|
|
1207
|
-
|
|
1208
1269
|
}
|
|
1209
1270
|
|
|
1210
1271
|
private async isPasswordlessRegistrationEnabled() {
|
|
1211
|
-
return this.settingService.getConfigValue('passwordlessRegistration');
|
|
1272
|
+
// return this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistration');
|
|
1273
|
+
return this.settingService.getConfigValue<SolidCoreSetting>('passwordLessAuth');
|
|
1212
1274
|
}
|
|
1213
1275
|
|
|
1214
1276
|
//FIXME - Pending implementation
|