@solidstarters/solid-core 1.2.206 → 1.2.208

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.
Files changed (69) hide show
  1. package/dist/commands/seed.command.js +1 -1
  2. package/dist/commands/seed.command.js.map +1 -1
  3. package/dist/controllers/test.controller.d.ts.map +1 -1
  4. package/dist/controllers/test.controller.js.map +1 -1
  5. package/dist/dtos/create-scheduled-job.dto.d.ts +1 -0
  6. package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
  7. package/dist/dtos/create-scheduled-job.dto.js +7 -1
  8. package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
  9. package/dist/dtos/update-scheduled-job.dto.d.ts +1 -0
  10. package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
  11. package/dist/dtos/update-scheduled-job.dto.js +7 -1
  12. package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
  13. package/dist/entities/scheduled-job.entity.d.ts +1 -0
  14. package/dist/entities/scheduled-job.entity.d.ts.map +1 -1
  15. package/dist/entities/scheduled-job.entity.js +5 -1
  16. package/dist/entities/scheduled-job.entity.js.map +1 -1
  17. package/dist/helpers/command.service.d.ts +6 -1
  18. package/dist/helpers/command.service.d.ts.map +1 -1
  19. package/dist/helpers/command.service.js +34 -11
  20. package/dist/helpers/command.service.js.map +1 -1
  21. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +2 -2
  22. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
  23. package/dist/helpers/schematic.service.d.ts +3 -2
  24. package/dist/helpers/schematic.service.d.ts.map +1 -1
  25. package/dist/helpers/schematic.service.js +32 -27
  26. package/dist/helpers/schematic.service.js.map +1 -1
  27. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  28. package/dist/repository/scheduled-job.repository.js +1 -0
  29. package/dist/repository/scheduled-job.repository.js.map +1 -1
  30. package/dist/seeders/module-metadata-seeder.service.js +1 -1
  31. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  32. package/dist/seeders/seed-data/solid-core-metadata.json +21 -1
  33. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  34. package/dist/seeders/system-fields-seeder.service.js +3 -0
  35. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  36. package/dist/services/authentication.service.js +0 -3
  37. package/dist/services/authentication.service.js.map +1 -1
  38. package/dist/services/file.service.d.ts.map +1 -1
  39. package/dist/services/file.service.js +1 -1
  40. package/dist/services/file.service.js.map +1 -1
  41. package/dist/services/scheduled-jobs/scheduler.service.d.ts +1 -0
  42. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  43. package/dist/services/scheduled-jobs/scheduler.service.js +29 -0
  44. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/docs/type-declaration-import-issue.md +24 -0
  47. package/package.json +2 -1
  48. package/src/commands/seed.command.ts +1 -1
  49. package/src/controllers/test.controller.ts +0 -18
  50. package/src/dtos/create-scheduled-job.dto.ts +4 -0
  51. package/src/dtos/update-scheduled-job.dto.ts +4 -0
  52. package/src/entities/scheduled-job.entity.ts +2 -0
  53. package/src/helpers/command.service.ts +60 -12
  54. package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +2 -2
  55. package/src/helpers/schematic.service.ts +41 -35
  56. package/src/repository/scheduled-job.repository.ts +1 -0
  57. package/src/seeders/module-metadata-seeder.service.ts +1 -1
  58. package/src/seeders/seed-data/solid-core-metadata.json +21 -1
  59. package/src/seeders/system-fields-seeder.service.ts +3 -0
  60. package/src/services/authentication.service.ts +3 -3
  61. package/src/services/file.service.ts +4 -5
  62. package/src/services/scheduled-jobs/scheduler.service.ts +40 -3
  63. package/# Password field.md +0 -8
  64. package/dist/services/file/file-service.interface.d.ts +0 -22
  65. package/dist/services/file/file-service.interface.d.ts.map +0 -1
  66. package/dist/services/file/file-service.interface.js +0 -5
  67. package/dist/services/file/file-service.interface.js.map +0 -1
  68. package/sql-server-changes.txt +0 -88
  69. package/src/services/file/file-service.interface.ts +0 -74
@@ -1 +1 @@
1
- {"version":3,"file":"authentication.service.js","sourceRoot":"","sources":["../../src/services/authentication.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpService } from '@nestjs/axios';\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\nimport {\n BadRequestException,\n ConflictException,\n Inject,\n Injectable,\n InternalServerErrorException,\n Logger,\n NotFoundException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport { ConfigType } from '@nestjs/config';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { JwtService } from '@nestjs/jwt';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport { isEmpty, isNotEmpty } from 'class-validator';\nimport { randomInt, randomUUID } from 'crypto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { SUCCESS_MESSAGES } from 'src/constants/success-messages';\nimport { CreateUserDto } from 'src/dtos/create-user.dto';\nimport { MailFactory } from 'src/factories/mail.factory';\nimport { UserRepository } from 'src/repository/user.repository';\nimport { Msg91OTPService } from 'src/services/sms/Msg91OTPService';\nimport { DataSource, Repository } from 'typeorm';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ForgotPasswordSendVerificationTokenOn,\n RegistrationValidationSource,\n TransactionalRegistrationValidationSource\n} from \"../constants\";\nimport { ChangePasswordDto } from \"../dtos/change-password.dto\";\nimport { ConfirmForgotPasswordDto } from '../dtos/confirm-forgot-password.dto';\nimport { InitiateForgotPasswordDto } from '../dtos/initiate-forgot-password.dto';\nimport { OTPConfirmOTPDto } from '../dtos/otp-confirm-otp.dto';\nimport { OTPSignInDto } from '../dtos/otp-sign-in.dto';\nimport { OTPSignUpDto } from '../dtos/otp-sign-up.dto';\nimport { RefreshTokenDto } from '../dtos/refresh-token.dto';\nimport { SignInDto } from '../dtos/sign-in.dto';\nimport { SignUpDto } from '../dtos/sign-up.dto';\nimport { User } from '../entities/user.entity';\nimport { EventDetails, EventType } from \"../interfaces\";\nimport { ActiveUserData } from '../interfaces/active-user-data.interface';\nimport { HashingService } from './hashing.service';\nimport { InvalidatedRefreshTokenError, RefreshTokenIdsStorageService } from './refresh-token-ids-storage.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { SettingService } from './setting.service';\nimport { UserActivityHistoryService } from './user-activity-history.service';\nimport { UserService } from './user.service';\nimport { SmsFactory } from 'src/factories/sms.factory';\n\nenum LoginProvider {\n LOCAL = 'local',\n GOOGLE = 'google',\n OTP = 'otp',\n}\n\ninterface otp {\n token: string;\n expiresAt: Date;\n}\n\n@Injectable()\nexport class AuthenticationService {\n private readonly logger = new Logger(AuthenticationService.name);\n // private readonly mailService: IMail;\n constructor(\n private readonly userService: UserService,\n // @InjectRepository(User) private readonly userRepository: Repository<User>,\n private readonly userRepository: UserRepository,\n private readonly hashingService: HashingService,\n private readonly jwtService: JwtService,\n private readonly refreshTokenIdsStorage: RefreshTokenIdsStorageService,\n private readonly httpService: HttpService,\n // private readonly mailService: SMTPEMailService,\n private readonly mailServiceFactory: MailFactory,\n // private readonly smsService: Msg91OTPService,\n private readonly smsFactory: SmsFactory,\n private readonly eventEmitter: EventEmitter2,\n private readonly settingService: SettingService,\n private readonly roleMetadataService: RoleMetadataService,\n private readonly userActivityHistoryService: UserActivityHistoryService,\n\n @InjectDataSource()\n private readonly dataSource: DataSource,\n ) {\n // this.mailService = this.mailServiceFactory.getMailService();\n }\n\n private async getCompanyLogo(): Promise<string> {\n return this.settingService.getConfigValue<SolidCoreSetting>('companylogo');\n }\n\n async resolveUser(username: string, email: string) {\n return await this.userRepository.findOne({\n where: [\n { username: username },\n { email: email },\n ],\n relations: {\n roles: true\n }\n });\n }\n\n async updatePasswordDetails(user: User, newPassword: string) {\n user.password = await this.hashingService.hash(newPassword);\n user.passwordScheme = this.hashingService.name();\n user.passwordSchemeVersion = this.hashingService.currentVersion();\n user.rehashedAt = new Date();\n await this.userRepository.update(user.id, {\n password: user.password,\n passwordScheme: user.passwordScheme,\n passwordSchemeVersion: user.passwordSchemeVersion,\n rehashedAt: user.rehashedAt\n });\n return user;\n }\n\n async resolveUserByVerificationToken(token: string) {\n return await this.userRepository.findOne({\n where: { verificationTokenOnForgotPassword: token },\n relations: { roles: true }\n });\n }\n\n async validateUserAndRehashPasswordIfRequired(signInDto: SignInDto) {\n\n const user = await this.resolveUser(signInDto.username, signInDto.email);\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_ACTIVE);\n }\n const isEqual = await this.hashingService.compare(\n signInDto.password,\n user.password,\n user.passwordSchemeVersion\n );\n if (!isEqual) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // If we reach here means that the user has been validated successfully.\n // Now we check if the password needs to be rehashed based on the current hashing scheme and version.\n if (this.hashingService.needsRehash(user.password, user.passwordSchemeVersion)) {\n const rehashedUser = await this.updatePasswordDetails(user, signInDto.password);\n return rehashedUser;\n }\n\n return user;\n }\n\n async signUp(signUpDto: SignUpDto, activeUser: ActiveUserData = null): Promise<User> {\n // If public registrations are disabled and no activeUser is present when invoking signUp then we throw an exception.\n if (!(this.settingService.getConfigValue<SolidCoreSetting>('allowPublicRegistration')) && !activeUser) {\n throw new BadRequestException(ERROR_MESSAGES.PUBLIC_REGISTRATION_DISABLED);\n }\n\n try {\n const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');\n const activateUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration');\n const defaultRole = this.settingService.getConfigValue<SolidCoreSetting>('defaultRole');\n\n var { user, pwd, autoGeneratedPwd } = await this.populateForSignup(new User(), signUpDto, activateUserOnRegistration, onForcePasswordChange);\n const savedUser = await this.userRepository.save(user);\n // Also assign a default role to the newly created user. \n const userRoles = signUpDto.roles ?? [];\n if (signUpDto.username !== 'sa' && defaultRole) {\n userRoles.push(defaultRole);\n }\n await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);\n\n // TODO: make provision to trigger a welcome email also.\n\n return savedUser;\n } catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n throw err;\n }\n }\n\n async signupForExtensionUser<T extends User, U extends CreateUserDto>(signUpDto: SignUpDto, extensionUserDto: U, extensionUserRepo: Repository<T>): Promise<T> {\n try {\n const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');\n // Merge the extended signUpDto attributes into the user entity \n //@ts-ignore \n const extensionUser = extensionUserRepo.merge(extensionUserRepo.create() as T, extensionUserDto);\n var { user, pwd, autoGeneratedPwd } = await this.populateForSignup<T>(extensionUser, signUpDto, extensionUserDto.active ?? true, onForcePasswordChange);\n const savedUser = await extensionUserRepo.save(user);\n\n await this.handlePostSignup(savedUser, signUpDto.roles, pwd, autoGeneratedPwd);\n\n return savedUser;\n }\n catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(parseUniqueConstraintError(err.detail || ERROR_MESSAGES.UNIQUE_CONSTRAINT_VIOLATION));\n }\n throw err;\n }\n }\n\n\n private async populateForSignup<T extends User>(user: T, signUpDto: SignUpDto, isUserActive: boolean = true, onForcePasswordChange?: boolean) {\n // const user = new User();\n let autoGeneratedPwdPermission = this.settingService.getConfigValue<SolidCoreSetting>('iamAutoGeneratedPassword');\n if (signUpDto.roles && signUpDto.roles.length > 0) {\n for (let i = 0; i < signUpDto.roles.length; i++) {\n const roleName = signUpDto.roles[i];\n await this.roleMetadataService.findRoleByName(roleName);\n }\n }\n user.username = signUpDto.username;\n user.email = signUpDto.email;\n user.fullName = signUpDto.fullName;\n user.forcePasswordChange = onForcePasswordChange;\n if (signUpDto.mobile) {\n user.mobile = signUpDto.mobile;\n }\n // this.logger.debug(\"user\", user);\n\n // If password has been specified by the user, then we simply create & activate the user based on the configuration parameter \"activateUserOnRegistration\".\n let pwd = '';\n let autoGeneratedPwd = '';\n\n // User has specified password \n if (signUpDto.password) {\n pwd = await this.hashingService.hash(signUpDto.password);\n }\n // User has not specified password\n else {\n // When user does not specify password, and system is configured to auto generate passwords.\n if (autoGeneratedPwdPermission?.toString().toLowerCase() === 'true') {\n autoGeneratedPwd = this.generatePassword();\n pwd = await this.hashingService.hash(autoGeneratedPwd);\n user.forcePasswordChange = true;\n }\n // When user does not specify password, and system is not configured to auto generate passwords.\n else {\n // This means that most likely the system is going to be using password-less login. \n // If that is not the case then we can raise a bad request exception...\n if (!await this.isPasswordlessRegistrationEnabled()) {\n this.logger.error('User being created without password, and password less login is also not enabled in the system. Is this intentional?');\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Save the hash of the blank password, anyways since passwordless login is enabled it does not matter.\n pwd = await this.hashingService.hash(pwd);\n }\n }\n\n user.password = pwd;\n user.passwordScheme = this.hashingService.name(); // e.g. bcrypt\n user.passwordSchemeVersion = this.hashingService.currentVersion(); // e.g. 1, 2, 3 ...\n user.active = isUserActive;\n return { user, pwd, autoGeneratedPwd };\n }\n\n\n private async handlePostSignup(user: User, roles: string[] = [], pwd: string, autoGeneratedPwd: string) {\n await this.userService.initializeRolesForNewUser(roles, user);\n\n // if forcePasswordChange is true, then we trigger an email to the user to change the password, this needs to be done using a queue. \n // 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\n if (user.forcePasswordChange && autoGeneratedPwd) {\n await this.notifyUserOnForcePasswordChange(user, autoGeneratedPwd);\n }\n\n // Send welcome notifications (email/SMS) if enabled.\n await this.notifyUserOnSignup(user);\n }\n\n\n generatePassword(length: number = 8): string {\n const upperCase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const lowerCase = \"abcdefghijklmnopqrstuvwxyz\";\n const numbers = \"0123456789\";\n const specialChars = \"@$#\";\n const allChars = upperCase + lowerCase + numbers + specialChars;\n\n let password = \"\";\n\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * allChars.length);\n password += allChars[randomIndex];\n }\n\n return password;\n }\n\n private async notifyUserOnForcePasswordChange(user: User, autoGeneratedPwd: string) {\n const companyLogo = await this.getCompanyLogo();\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'on-force-password-change',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n email: user.email,\n fullName: user.fullName,\n userName: user.username,\n password: autoGeneratedPwd,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n\n }\n\n private async isWelcomeEmailEnabled(): Promise<boolean> {\n const sendWelcomeEmailOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeEmailOnSignup');\n return sendWelcomeEmailOnSignup;\n }\n\n private async isWelcomeSmsEnabled(): Promise<boolean> {\n const sendWelcomeSmsOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeSmsOnSignup');\n return sendWelcomeSmsOnSignup;\n }\n\n private async notifyUserOnSignup(user: User) {\n const companyLogo = await this.getCompanyLogo();\n // Email welcome\n if (await this.isWelcomeEmailEnabled()) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'email-on-signup',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n email: user.email,\n fullName: user.fullName,\n userName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n\n // SMS welcome\n const isWelcomeSmsEnabled = await this.isWelcomeSmsEnabled()\n if (isWelcomeSmsEnabled && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'text-on-signup',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpInitiateRegistration(signUpDto: OTPSignUpDto) {\n try {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n // Validate if either mobile or email is present.\n if (isEmpty(signUpDto.mobile) && isEmpty(signUpDto.email)) {\n throw new BadRequestException(ERROR_MESSAGES.REGISTRATION_REQUIRES_CONTACT);\n }\n if (signUpDto.validationSources.includes(TransactionalRegistrationValidationSource.EMAIL) && isEmpty(signUpDto.email)) {\n throw new BadRequestException(ERROR_MESSAGES.EMAIL_REQUIRED_FOR_VALIDATION);\n }\n if (signUpDto.validationSources.includes(TransactionalRegistrationValidationSource.MOBILE) && isEmpty(signUpDto.mobile)) {\n throw new BadRequestException(ERROR_MESSAGES.MOBILE_REQUIRED_FOR_VALIDATION);\n }\n\n // Validate if user already exists.\n const existingUser = await this.userRepository.findOne({ //TODO Perhaps we should use the user service instead of the repository directly.\n where: [\n { email: signUpDto.email, },\n { mobile: signUpDto.mobile, },\n { username: signUpDto.username, }\n ]\n });\n if (isNotEmpty(existingUser) && existingUser.active) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');\n\n const finalRegistrationVerificationSources = this.calculateVerificationSources(passwordlessRegistrationValidateWhat, signUpDto);\n let user = existingUser\n if (isEmpty(user)) {\n user = this.createUser(signUpDto);\n await this.populateVerificationTokens(finalRegistrationVerificationSources, user);\n await this.userRepository.save(user);\n await this.userService.addRoleToUser(user.username, this.settingService.getConfigValue<SolidCoreSetting>('defaultRole'));\n }\n else {\n await this.populateVerificationTokens(finalRegistrationVerificationSources, user);\n await this.userRepository.save(user);\n }\n\n // Send OTP to the user through email or SMS, depending on the configuration.\n await this.notifyUserOnOtpInitiateRegistration(user, finalRegistrationVerificationSources);\n return { message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_REGISTRATION }\n } catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n throw err;\n }\n }\n\n // Create a new user entity.\n private createUser(signUpDto: OTPSignUpDto) {\n const user = new User();\n user.username = signUpDto.username;\n user.email = signUpDto.email;\n user.mobile = signUpDto.mobile;\n user.customPayload = signUpDto.customPayload;\n user.lastLoginProvider = LoginProvider.OTP;\n return user;\n }\n\n private calculateVerificationSources(configuredRegistrationValidationSources: string[], signUpDto: OTPSignUpDto): string[] {\n const finalRegistrationValidationSources = configuredRegistrationValidationSources.filter((source) => source !== RegistrationValidationSource.TRANSACTIONAL);\n if (configuredRegistrationValidationSources.includes(RegistrationValidationSource.TRANSACTIONAL)) {\n finalRegistrationValidationSources.push(...signUpDto.validationSources); // Add the validation sources provided by the user.\n }\n return finalRegistrationValidationSources;\n }\n\n // Generate the validation tokens for the user i.e (system configured + user provided)\n private async populateVerificationTokens(finalRegistrationValidationSources: string[], user: User) {\n if (finalRegistrationValidationSources.length === 0) {\n throw new BadRequestException(ERROR_MESSAGES.VALIDATION_SOURCE_REQUIRED);\n }\n if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.EMAIL)) {\n const { token, expiresAt } = await this.otp();\n user.emailVerificationTokenOnRegistration = token;\n user.emailVerificationTokenOnRegistrationExpiresAt = expiresAt;\n const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');\n\n if (autoLoginUserOnRegistration) {\n user.emailVerificationTokenOnLogin = token;\n user.emailVerificationTokenOnLoginExpiresAt = expiresAt;\n }\n }\n if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.MOBILE)) {\n const { token, expiresAt } = await this.otp();\n user.mobileVerificationTokenOnRegistration = token;\n user.mobileVerificationTokenOnRegistrationExpiresAt = expiresAt;\n\n const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');\n if (autoLoginUserOnRegistration) {\n user.mobileVerificationTokenOnLogin = token;\n user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;\n }\n }\n }\n\n private async notifyUserOnOtpInitiateRegistration(user: User, registrationValidationSources: string[]) {\n const companyLogo = await this.getCompanyLogo();\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n\n if (dummyOtp)\n return; // Do nothing if dummy otp is configured.\n if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'otp-on-register',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n emailVerificationTokenOnRegistration: user.emailVerificationTokenOnRegistration,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n if (registrationValidationSources.includes(RegistrationValidationSource.MOBILE)) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'otp-on-register',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.mobileVerificationTokenOnRegistration,\n mobileVerificationTokenOnRegistration: user.mobileVerificationTokenOnRegistration,\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpConfirmRegistration(confirmSignUpDto: OTPConfirmOTPDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Based on the identifier, validate by query the user table.\n if (confirmSignUpDto.type === RegistrationValidationSource.EMAIL) {\n const user = await this.userRepository.findOne({\n where: {\n email: confirmSignUpDto.identifier,\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (user.emailVerificationTokenOnRegistration !== confirmSignUpDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.emailVerificationTokenOnRegistrationExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.OTP_EXPIRED);\n }\n user.emailVerifiedOnRegistrationAt = new Date();\n user.emailVerificationTokenOnRegistration = null;\n user.emailVerificationTokenOnRegistrationExpiresAt = null;\n user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);\n const savedUser: User = await this.userRepository.save(user);\n this.triggerRegistrationEvent(savedUser);\n return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }\n } else if (confirmSignUpDto.type === RegistrationValidationSource.MOBILE) {\n const user = await this.userRepository.findOne({\n where: {\n mobile: confirmSignUpDto.identifier,\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (user.mobileVerificationTokenOnRegistration !== confirmSignUpDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.mobileVerificationTokenOnRegistrationExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.mobileVerifiedOnRegistrationAt = new Date();\n user.mobileVerificationTokenOnRegistration = null;\n user.mobileVerificationTokenOnRegistrationExpiresAt = null;\n user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);\n const savedUser: User = await this.userRepository.save(user);\n this.triggerRegistrationEvent(savedUser);\n return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }\n }\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n\n private triggerRegistrationEvent(savedUser: User) {\n // Trigger events for user registration.\n const event = new EventDetails<User>(EventType.USER_REGISTERED, savedUser);\n this.eventEmitter.emit(EventType.USER_REGISTERED, event);\n }\n\n async areRegistrationValidationSourcesVerified(user: User): Promise<boolean> {\n const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');\n\n const registrationValidationSources = passwordlessRegistrationValidateWhat;\n if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {\n if (!user.emailVerifiedOnRegistrationAt) {\n return false;\n }\n }\n if (registrationValidationSources.includes(RegistrationValidationSource.MOBILE)) {\n if (!user.mobileVerifiedOnRegistrationAt) {\n return false;\n }\n }\n return true;\n }\n\n private async otp(): Promise<otp> {\n const now = new Date();\n const otpExpiry = this.settingService.getConfigValue<SolidCoreSetting>('otpExpiry');\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n now.setMinutes(now.getMinutes() + otpExpiry);\n return {\n token: dummyOtp ? dummyOtp : randomInt(100000, 999999).toString(),\n expiresAt: now,\n };\n }\n\n async signIn(signInDto: SignInDto) {\n const user = await this.validateUserAndRehashPasswordIfRequired(signInDto);\n\n // TODO: Unset the password etc...\n const tokens = await this.generateTokens(user);\n\n await this.userActivityHistoryService.logEvent('login', user);\n\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private maskEmail(email: string): string {\n if (!email) return null;\n\n const [localPart, domain] = email.split('@');\n if (localPart.length <= 2) {\n return `${localPart[0]}***@${domain}`;\n }\n\n const visibleStart = localPart.slice(0, 2);\n const visibleEnd = localPart.slice(-1);\n return `${visibleStart}***${visibleEnd}@${domain}`;\n }\n\n private maskMobile(mobile: string): string {\n if (!mobile) return null;\n\n if (mobile.length <= 4) {\n return mobile;\n }\n\n const visibleEnd = mobile.slice(-4);\n return `***${visibleEnd}`;\n }\n\n async otpInitiateLogin(signInDto: OTPSignInDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Validate & generate otp token for the user based on the identifier type.\n if (signInDto.type === RegistrationValidationSource.EMAIL) {\n // const user = await this.userRepository.findOne({\n // where: {\n // email: signInDto.identifier,\n // }\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: signInDto.identifier },\n { email: signInDto.identifier },\n ]\n });\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n const { token, expiresAt } = await this.otp();\n user.emailVerificationTokenOnLogin = token;\n user.emailVerificationTokenOnLoginExpiresAt = expiresAt;\n await this.userRepository.save(user);\n this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.EMAIL);\n return {\n message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,\n user: {\n email: this.maskEmail(user.email)\n }\n };\n } else if (signInDto.type === RegistrationValidationSource.MOBILE) {\n // const user = await this.userRepository.findOne({\n // where: {\n // mobile: signInDto.identifier,\n // }\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: signInDto.identifier },\n { mobile: signInDto.identifier },\n ]\n });\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n\n const { token, expiresAt } = await this.otp();\n user.mobileVerificationTokenOnLogin = token;\n user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;\n await this.userRepository.save(user);\n this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.MOBILE);\n return {\n message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,\n user: {\n mobile: this.maskMobile(user.mobile)\n }\n };\n }\n else {\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n }\n\n private async notifyUserOnOtpInititateLogin(user: User, loginType: RegistrationValidationSource) {\n const companyLogo = await this.getCompanyLogo();\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n\n if (dummyOtp)\n return; // Do nothing if dummy otp is configured.\n if (loginType === RegistrationValidationSource.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'otp-on-login',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n emailVerificationTokenOnLogin: user.emailVerificationTokenOnLogin,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n if (loginType === RegistrationValidationSource.MOBILE) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'otp-on-login',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.mobileVerificationTokenOnLogin,\n mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpConfirmLogin(confirmSignInDto: OTPConfirmOTPDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n if (confirmSignInDto.type === RegistrationValidationSource.EMAIL) {\n // const user = await this.userRepository.findOne({\n // where: {\n // email: confirmSignInDto.identifier,\n // },\n // relations: ['roles']\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: confirmSignInDto.identifier },\n { email: confirmSignInDto.identifier },\n ],\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n if (user.emailVerificationTokenOnLogin !== confirmSignInDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.emailVerificationTokenOnLoginExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.emailVerifiedOnLoginAt = new Date();\n user.emailVerificationTokenOnLogin = null;\n user.emailVerificationTokenOnLoginExpiresAt = null;\n await this.userRepository.save(user);\n const { accessToken, refreshToken } = await this.generateTokens(user);\n const { id, username, email, mobile, lastLoginProvider } = user;\n const roles = user.roles.map((role) => role.name);\n return { accessToken, refreshToken, user: { id, username, email, mobile, lastLoginProvider, roles } };\n } else if (confirmSignInDto.type === RegistrationValidationSource.MOBILE) {\n // const user = await this.userRepository.findOne({\n // where: {\n // mobile: confirmSignInDto.identifier,\n // },\n // relations: ['roles']\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: confirmSignInDto.identifier },\n { mobile: confirmSignInDto.identifier },\n ],\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_ACTIVE);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n if (user.mobileVerificationTokenOnLogin !== confirmSignInDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.mobileVerificationTokenOnLoginExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.mobileVerifiedOnLoginAt = new Date();\n user.mobileVerificationTokenOnLogin = null;\n user.mobileVerificationTokenOnLoginExpiresAt = null;\n await this.userRepository.save(user);\n const { accessToken, refreshToken } = await this.generateTokens(user);\n const { id, username, email, mobile, lastLoginProvider } = user;\n const roles = user.roles.map((role) => role.name);\n return { accessToken, refreshToken, user: { id, username, email, mobile, lastLoginProvider, roles } };\n\n }\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n\n async changePassword(changePasswordDto: ChangePasswordDto, activeUser: ActiveUserData) {\n const user = await this.userRepository.findOne({\n where: { id: changePasswordDto.id }\n });\n if (!user) {\n throw new NotFoundException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n\n // 2. Validate if user has used a provider which is \"local\", only then it makes sense for us to initiate the forgot password routine.\n if (user.lastLoginProvider !== 'local') {\n throw new BadRequestException(ERROR_MESSAGES.NON_LOCAL_PROVIDER);\n }\n\n // Check if ID's match\n if (!(user.id === activeUser.sub)) {\n throw new BadRequestException(ERROR_MESSAGES.USER_ID_MISMATCH);\n }\n\n // Check if username's match\n if (!(user.username === activeUser.username)) {\n throw new BadRequestException(ERROR_MESSAGES.USERNAME_MISMATCH);\n }\n\n // Check if old password is matching.\n const isEqual = await this.hashingService.compare(\n changePasswordDto.currentPassword,\n user.password,\n user.passwordSchemeVersion\n );\n if (!isEqual) {\n throw new UnauthorizedException(ERROR_MESSAGES.INCORRECT_CURRENT_PASSWORD);\n }\n\n // Update Password\n const pwdData = await this.userService.hashPassword(\n changePasswordDto.newPassword,\n );\n user.password = changePasswordDto.newPassword;\n\n user.password = pwdData.password;\n user.passwordScheme = pwdData.passwordScheme;\n user.passwordSchemeVersion = pwdData.passwordSchemeVersion;\n // Everytime the user changes the password we reset the forcePasswordChange flag back to false. \n user.forcePasswordChange = false;\n\n await this.userRepository.save(user);\n\n return true;\n }\n\n // generate uuid token for forgot password\n private async generateForgotPasswordToken() {\n const expiryTime = new Date();\n const forgotPasswordVerificationTokenExpiry = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordVerificationTokenExpiry');\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n expiryTime.setMinutes(expiryTime.getMinutes() + forgotPasswordVerificationTokenExpiry);\n\n return {\n token: dummyOtp\n ? dummyOtp\n : uuidv4(), // UUID instead of numeric OTP\n expiresAt: expiryTime,\n };\n }\n\n async initiateForgotPassword(initiateForgotPasswordDto: InitiateForgotPasswordDto) {\n // Steps / Algorithm: \n // 1. Identify the user using the specified \"username\", if not found exit.\n // const user = await this.userRepository.findOne({\n // where: { username: initiateForgotPasswordDto.username, }\n // });\n const user = await this.resolveUser(initiateForgotPasswordDto.username, initiateForgotPasswordDto.email);\n\n let isValidUser = true // Instead of throwing exceptions we will simply return success message, this is to avoid user enumeration attacks.\n if (!user) {\n isValidUser = false\n // throw new NotFoundException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n if (isValidUser && !user?.active) {\n isValidUser = false\n // throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 2. Validate if user has used a provider which is \"local\", only then it makes sense for us to initiate the forgot password routine. \n if (isValidUser && user?.lastLoginProvider !== 'local') {\n isValidUser = false\n // throw new BadRequestException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 3. Generate a 6 digit validation token, we send this token to the user over their email & mobile number (controlled using configuration).\n // 4. Save this validation token in new fields on the user record. \n if (isValidUser) {\n const { token, expiresAt } = await this.generateForgotPasswordToken();\n user.verificationTokenOnForgotPassword = token;\n user.verificationTokenOnForgotPasswordExpiresAt = expiresAt;\n await this.userRepository.save(user);\n await this.notifyUserOnForgotPassword(user);\n }\n\n // 5. Return. \n return {\n status: 'success',\n message: SUCCESS_MESSAGES.FORGOT_PASSWORD_TOKEN_SENT,\n error: '',\n errorCode: '',\n data: {\n user: {\n email: user?.email,\n // mobile: user.mobile,\n // username: user.username,\n },\n }\n }\n }\n\n private async notifyUserOnForgotPassword(user: User) {\n const companyLogo = await this.getCompanyLogo();\n\n const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');\n\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n fullName: user.fullName,\n // TODO: Need to prefix this with the page url where the forgot password page will open up.\n passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n // Assuming all users do not have mobile as mandatory.\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.MOBILE && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.verificationTokenOnForgotPassword,\n verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,\n firstName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n );\n }\n }\n\n async confirmForgotPassword(confirmForgotPasswordDto: ConfirmForgotPasswordDto) {\n return this.dataSource.transaction(async (m) => {\n // Resolve the user id first (by username/email), but DON'T check the token in JS.\n const user = await this.resolveUserByVerificationToken(confirmForgotPasswordDto.verificationToken);\n if (!user) throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n if (user.lastLoginProvider !== 'local') throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n if (!user.active) throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n\n // 1) Atomically consume the token (only one request can succeed)\n const { affected } = await m\n .createQueryBuilder()\n .update(User)\n .set({\n forgotPasswordConfirmedAt: () => 'NOW()',\n verificationTokenOnForgotPassword: () => 'NULL',\n verificationTokenOnForgotPasswordExpiresAt: () => 'NULL',\n })\n .where('id = :id', { id: user.id })\n .andWhere('verificationTokenOnForgotPassword = :token', { token: confirmForgotPasswordDto.verificationToken })\n .andWhere('verificationTokenOnForgotPasswordExpiresAt > NOW()')\n .execute();\n\n if (affected !== 1) {\n // Token invalid/expired/already used (or a parallel call already consumed it)\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 2) Now update the password & history (still inside the same transaction)\n const pwdHash = await this.hashingService.hash(confirmForgotPasswordDto.password);\n const pwdScheme = this.hashingService.name(); // e.g. bcrypt\n const pwdSchemeVersion = this.hashingService.currentVersion(); // e.g. 1, 2, 3 ...\n\n // Check reuse with your existing method (ensure it looks at hashes).\n await m.getRepository(User).update({ id: user.id }, { password: pwdHash, passwordScheme: pwdScheme, passwordSchemeVersion: pwdSchemeVersion });\n await this.notifyUserOnPasswordChanged(user);\n\n return {\n status: 'success',\n message: SUCCESS_MESSAGES.FORGOT_PASSWORD_CONFIRMED,\n error: '',\n errorCode: '',\n data: {},\n };\n });\n }\n\n private async notifyUserOnPasswordChanged(user: User) {\n const companyLogo = await this.getCompanyLogo();\n const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');\n\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'password-changed',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n email: user.email,\n firstName: user.username,\n fullName: user.fullName,\n // TODO: Need to prefix this with the page url where the forgot password page will open up.\n passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n // Assuming all users do not have mobile as mandatory.\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.MOBILE && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.verificationTokenOnForgotPassword,\n verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,\n firstName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n );\n }\n }\n\n async generateTokens(user: User) {\n\n const [accessToken, refreshToken] = await Promise.all([\n await this.generateAccessToken(user),\n await this.generateRefreshToken(user),\n ]);\n\n return {\n accessToken,\n refreshToken,\n };\n }\n\n async generateAccessToken(user: User) {\n\n // const userRoleNames = user.roles.map((role) => role.name).join(';')\n const userRoleNames = user.roles.map((role) => role.name);\n\n const accessTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>(\"accessTokenTtl\");\n const accessToken = await this.signToken<Partial<ActiveUserData>>(\n user.id,\n accessTokenTtl,\n { username: user.username, email: user.email, roles: userRoleNames },\n );\n\n return accessToken;\n }\n\n async generateRefreshToken(user: User, previousRefreshToken?: string) {\n const refreshTokenId = randomUUID();\n const refreshTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>(\"refreshTokenTtl\");\n const refreshToken = await this.signToken(user.id, refreshTokenTtl, {\n refreshTokenId,\n })\n\n // store the refresh token id in the redis storage.\n await this.refreshTokenIdsStorage.insert(user.id, refreshToken, previousRefreshToken);\n\n return refreshToken;\n }\n\n async refreshTokens(refreshTokenDto: RefreshTokenDto) {\n try {\n const secret = this.settingService.getConfigValue<SolidCoreSetting>(\"secret\");\n const audience = this.settingService.getConfigValue<SolidCoreSetting>(\"audience\");\n const issuer = this.settingService.getConfigValue<SolidCoreSetting>(\"issuer\");\n\n const { sub } = await this.jwtService.verifyAsync<Pick<ActiveUserData, 'sub'> & { refreshTokenId: string }>(refreshTokenDto.refreshToken, {\n secret,\n audience,\n issuer,\n });\n // const user = await this.userRepository.findOneByOrFail({ id: sub });\n const user = await this.userRepository.findOne({\n where: {\n id: sub,\n },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.SESSION_INVALID);\n }\n\n // TODO: Replace the if else condition below with a call to validateAndRotate - Done\n // const isValid = await this.refreshTokenIdsStorage.validate(user.id, refreshTokenId);\n // if (isValid) {\n // // Refresh token rotation.\n // await this.refreshTokenIdsStorage.invalidate(user.id);\n // } else {\n // throw new Error('Refresh token is invalid');\n // }\n\n const currentRefreshToken = await this.refreshTokenIdsStorage.validateAndRotate(user, refreshTokenDto.refreshToken);\n\n await this.userActivityHistoryService.logEvent('tokenRefreshed', user);\n\n return {\n accessToken: await this.generateAccessToken(user),\n refreshToken: currentRefreshToken,\n };\n } catch (err) {\n if (err instanceof InvalidatedRefreshTokenError) {\n // Take action: notify user that his refresh token might have been stolen?\n throw new UnauthorizedException(ERROR_MESSAGES.ACCESS_DENIED);\n }\n\n throw new UnauthorizedException(ERROR_MESSAGES.SESSION_EXPIRED);\n }\n }\n\n private async signToken<T>(userId: number, expiresIn: number, payload?: T) {\n const audience = this.settingService.getConfigValue<SolidCoreSetting>(\"audience\");\n const issuer = this.settingService.getConfigValue<SolidCoreSetting>(\"issuer\");\n const secret = this.settingService.getConfigValue<SolidCoreSetting>(\"secret\");\n\n\n return await this.jwtService.signAsync(\n {\n sub: userId,\n ...payload,\n },\n {\n audience,\n issuer,\n secret,\n expiresIn,\n },\n );\n }\n\n // PROVIDER SPECIFIC CODE\n async validateUserUsingGoogle(user: User) {\n try {\n // Make API call to Google OAuth service to fetch user profile\n const response = await this.httpService.axiosRef.get(`https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${user.googleAccessToken}`);\n const userProfile = response.data;\n\n // Ensure the fetched profile email & provider Id match the ones we have stored in the database earlier. \n if (userProfile.email === user.email && userProfile.id === user.googleId) {\n // TODO: remove the access code both from the database.\n return userProfile;\n } else {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);\n }\n } catch (error) {\n throw new UnauthorizedException(ERROR_MESSAGES.GOOGLE_OAUTH_PROFILE_FETCH_FAILED);\n }\n }\n\n async signInUsingGoogle(accessCode: string) {\n const user = await this.userRepository.findOne({\n where: {\n accessCode: accessCode\n },\n relations: {\n roles: true\n }\n });\n\n // Validate the user against the Google oauth provider. \n // If the below call finishes without raising an exception then we have validated the user properly.\n await this.validateUserUsingGoogle(user);\n\n // finally we simply generate the tokens. \n const tokens = await this.generateTokens(user);\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n // forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private async isPasswordlessRegistrationEnabled() {\n // return this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistration');\n return this.settingService.getConfigValue<SolidCoreSetting>('passwordLessAuth');\n }\n\n //FIXME - Pending implementation\n // async logout() {\n // // const user = this.request.user; //TODO: // Access the user from the execution context\n\n // // Invalidate the refresh token\n // // await this.refreshTokenIdsStorage.invalidate(user.id);\n // }\n async logout(refreshToken: string) {\n try {\n // const activeUser = this.requestContextService.getActiveUser();\n // const userId = activeUser?.sub;\n // const user = await this.userRepository.findOne({\n // where: {\n // id: userId,\n // }\n // })\n // // Invalidate refresh token if you store them\n // await this.refreshTokenIdsStorage.invalidate(userId); // ← Your existing logic\n // if (!refreshToken) {\n // throw new UnauthorizedException('Refresh token is required');\n // }\n const payload = this.jwtService.decode(refreshToken) as any;\n\n if (!payload || !payload.sub) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_REFRESH_TOKEN);\n }\n\n const userId = payload.sub;\n await this.refreshTokenIdsStorage.invalidate(userId);\n const user = await this.userRepository.findOne({\n where: {\n id: userId,\n }\n })\n // Log logout event\n await this.userActivityHistoryService.logEvent('logout', user);\n\n return { message: SUCCESS_MESSAGES.LOGOUT_SUCCESS };\n } catch (err) {\n throw err instanceof UnauthorizedException || err instanceof InternalServerErrorException\n ? err\n : new InternalServerErrorException(ERROR_MESSAGES.LOGOUT_FAILED);\n }\n }\n\n\n async activateUser(userId: number) {\n const user = await this.userService.findOne(userId, {});\n if (!user) {\n throw new NotFoundException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n user.active = true;\n await this.userRepository.save(user);\n }\n\n async me(activeUser: ActiveUserData) {\n const user = await this.userRepository.findOne({\n where: {\n id: activeUser.sub,\n },\n relations: {\n roles: true\n }\n });\n\n // const tokens = await this.generateTokens(user);\n\n // Get the refresh token for a user from refresh token storage.\n const refreshTokenState = await this.refreshTokenIdsStorage.getCurrentRefreshTokenState(user.id);\n\n const response = {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n // forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n refreshToken: refreshTokenState.currentRefreshToken,\n // ...tokens\n }\n return response;\n }\n\n}\n\nfunction parseUniqueConstraintError(detail: string): string {\n const match = detail.match(/Key \\(([^)]+)\\)=\\(([^)]+)\\) already exists\\./);\n if (match) {\n const field = match[1];\n const value = match[2];\n const fieldMap: Record<string, string> = {\n username: 'username',\n email: 'email address',\n full_name_user_key: 'full name',\n };\n const friendlyField = fieldMap[field] || field;\n return `A user with ${friendlyField} \"${value}\" already exists.`;\n }\n return detail;\n}\n"]}
1
+ {"version":3,"file":"authentication.service.js","sourceRoot":"","sources":["../../src/services/authentication.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpService } from '@nestjs/axios';\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\nimport {\n BadRequestException,\n ConflictException,\n Inject,\n Injectable,\n InternalServerErrorException,\n Logger,\n NotFoundException,\n UnauthorizedException,\n} from '@nestjs/common';\nimport { ConfigType } from '@nestjs/config';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { JwtService } from '@nestjs/jwt';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport { isEmpty, isNotEmpty } from 'class-validator';\nimport { randomInt, randomUUID } from 'crypto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { SUCCESS_MESSAGES } from 'src/constants/success-messages';\nimport { CreateUserDto } from 'src/dtos/create-user.dto';\nimport { MailFactory } from 'src/factories/mail.factory';\nimport { UserRepository } from 'src/repository/user.repository';\nimport { Msg91OTPService } from 'src/services/sms/Msg91OTPService';\nimport { DataSource, Repository } from 'typeorm';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n ForgotPasswordSendVerificationTokenOn,\n RegistrationValidationSource,\n TransactionalRegistrationValidationSource\n} from \"../constants\";\nimport { ChangePasswordDto } from \"../dtos/change-password.dto\";\nimport { ConfirmForgotPasswordDto } from '../dtos/confirm-forgot-password.dto';\nimport { InitiateForgotPasswordDto } from '../dtos/initiate-forgot-password.dto';\nimport { OTPConfirmOTPDto } from '../dtos/otp-confirm-otp.dto';\nimport { OTPSignInDto } from '../dtos/otp-sign-in.dto';\nimport { OTPSignUpDto } from '../dtos/otp-sign-up.dto';\nimport { RefreshTokenDto } from '../dtos/refresh-token.dto';\nimport { SignInDto } from '../dtos/sign-in.dto';\nimport { SignUpDto } from '../dtos/sign-up.dto';\nimport { User } from '../entities/user.entity';\nimport { EventDetails, EventType } from \"../interfaces\";\nimport { ActiveUserData } from '../interfaces/active-user-data.interface';\nimport { HashingService } from './hashing.service';\nimport { InvalidatedRefreshTokenError, RefreshTokenIdsStorageService } from './refresh-token-ids-storage.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { SettingService } from './setting.service';\nimport { UserActivityHistoryService } from './user-activity-history.service';\nimport { UserService } from './user.service';\nimport { SmsFactory } from 'src/factories/sms.factory';\n\nenum LoginProvider {\n LOCAL = 'local',\n GOOGLE = 'google',\n OTP = 'otp',\n}\n\ninterface otp {\n token: string;\n expiresAt: Date;\n}\n\n@Injectable()\nexport class AuthenticationService {\n private readonly logger = new Logger(AuthenticationService.name);\n // private readonly mailService: IMail;\n constructor(\n private readonly userService: UserService,\n // @InjectRepository(User) private readonly userRepository: Repository<User>,\n private readonly userRepository: UserRepository,\n private readonly hashingService: HashingService,\n private readonly jwtService: JwtService,\n private readonly refreshTokenIdsStorage: RefreshTokenIdsStorageService,\n private readonly httpService: HttpService,\n // private readonly mailService: SMTPEMailService,\n private readonly mailServiceFactory: MailFactory,\n // private readonly smsService: Msg91OTPService,\n private readonly smsFactory: SmsFactory,\n private readonly eventEmitter: EventEmitter2,\n private readonly settingService: SettingService,\n private readonly roleMetadataService: RoleMetadataService,\n private readonly userActivityHistoryService: UserActivityHistoryService,\n\n @InjectDataSource()\n private readonly dataSource: DataSource,\n ) {\n // this.mailService = this.mailServiceFactory.getMailService();\n }\n\n private async getCompanyLogo(): Promise<string> {\n return this.settingService.getConfigValue<SolidCoreSetting>('companylogo');\n }\n\n async resolveUser(username: string, email: string) {\n return await this.userRepository.findOne({\n where: [\n { username: username },\n { email: email },\n ],\n relations: {\n roles: true\n }\n });\n }\n\n async updatePasswordDetails(user: User, newPassword: string) {\n user.password = await this.hashingService.hash(newPassword);\n user.passwordScheme = this.hashingService.name();\n user.passwordSchemeVersion = this.hashingService.currentVersion();\n user.rehashedAt = new Date();\n await this.userRepository.update(user.id, {\n password: user.password,\n passwordScheme: user.passwordScheme,\n passwordSchemeVersion: user.passwordSchemeVersion,\n rehashedAt: user.rehashedAt\n });\n return user;\n }\n\n async resolveUserByVerificationToken(token: string) {\n return await this.userRepository.findOne({\n where: { verificationTokenOnForgotPassword: token },\n relations: { roles: true }\n });\n }\n\n async validateUserAndRehashPasswordIfRequired(signInDto: SignInDto) {\n\n const user = await this.resolveUser(signInDto.username, signInDto.email);\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_ACTIVE);\n }\n const isEqual = await this.hashingService.compare(\n signInDto.password,\n user.password,\n user.passwordSchemeVersion\n );\n if (!isEqual) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // If we reach here means that the user has been validated successfully.\n // Now we check if the password needs to be rehashed based on the current hashing scheme and version.\n if (this.hashingService.needsRehash(user.password, user.passwordSchemeVersion)) {\n const rehashedUser = await this.updatePasswordDetails(user, signInDto.password);\n return rehashedUser;\n }\n\n return user;\n }\n\n async signUp(signUpDto: SignUpDto, activeUser: ActiveUserData = null): Promise<User> {\n // If public registrations are disabled and no activeUser is present when invoking signUp then we throw an exception.\n // if (!(this.settingService.getConfigValue<SolidCoreSetting>('allowPublicRegistration')) && !activeUser) {\n // throw new BadRequestException(ERROR_MESSAGES.PUBLIC_REGISTRATION_DISABLED);\n // }\n\n try {\n const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');\n const activateUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration');\n const defaultRole = this.settingService.getConfigValue<SolidCoreSetting>('defaultRole');\n\n var { user, pwd, autoGeneratedPwd } = await this.populateForSignup(new User(), signUpDto, activateUserOnRegistration, onForcePasswordChange);\n const savedUser = await this.userRepository.save(user);\n // Also assign a default role to the newly created user. \n const userRoles = signUpDto.roles ?? [];\n if (signUpDto.username !== 'sa' && defaultRole) {\n userRoles.push(defaultRole);\n }\n await this.handlePostSignup(savedUser, userRoles, pwd, autoGeneratedPwd);\n\n // TODO: make provision to trigger a welcome email also.\n\n return savedUser;\n } catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n throw err;\n }\n }\n\n async signupForExtensionUser<T extends User, U extends CreateUserDto>(signUpDto: SignUpDto, extensionUserDto: U, extensionUserRepo: Repository<T>): Promise<T> {\n try {\n const onForcePasswordChange = this.settingService.getConfigValue<SolidCoreSetting>('forceChangePasswordOnFirstLogin');\n // Merge the extended signUpDto attributes into the user entity \n //@ts-ignore \n const extensionUser = extensionUserRepo.merge(extensionUserRepo.create() as T, extensionUserDto);\n var { user, pwd, autoGeneratedPwd } = await this.populateForSignup<T>(extensionUser, signUpDto, extensionUserDto.active ?? true, onForcePasswordChange);\n const savedUser = await extensionUserRepo.save(user);\n\n await this.handlePostSignup(savedUser, signUpDto.roles, pwd, autoGeneratedPwd);\n\n return savedUser;\n }\n catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(parseUniqueConstraintError(err.detail || ERROR_MESSAGES.UNIQUE_CONSTRAINT_VIOLATION));\n }\n throw err;\n }\n }\n\n\n private async populateForSignup<T extends User>(user: T, signUpDto: SignUpDto, isUserActive: boolean = true, onForcePasswordChange?: boolean) {\n // const user = new User();\n let autoGeneratedPwdPermission = this.settingService.getConfigValue<SolidCoreSetting>('iamAutoGeneratedPassword');\n if (signUpDto.roles && signUpDto.roles.length > 0) {\n for (let i = 0; i < signUpDto.roles.length; i++) {\n const roleName = signUpDto.roles[i];\n await this.roleMetadataService.findRoleByName(roleName);\n }\n }\n user.username = signUpDto.username;\n user.email = signUpDto.email;\n user.fullName = signUpDto.fullName;\n user.forcePasswordChange = onForcePasswordChange;\n if (signUpDto.mobile) {\n user.mobile = signUpDto.mobile;\n }\n // this.logger.debug(\"user\", user);\n\n // If password has been specified by the user, then we simply create & activate the user based on the configuration parameter \"activateUserOnRegistration\".\n let pwd = '';\n let autoGeneratedPwd = '';\n\n // User has specified password \n if (signUpDto.password) {\n pwd = await this.hashingService.hash(signUpDto.password);\n }\n // User has not specified password\n else {\n // When user does not specify password, and system is configured to auto generate passwords.\n if (autoGeneratedPwdPermission?.toString().toLowerCase() === 'true') {\n autoGeneratedPwd = this.generatePassword();\n pwd = await this.hashingService.hash(autoGeneratedPwd);\n user.forcePasswordChange = true;\n }\n // When user does not specify password, and system is not configured to auto generate passwords.\n else {\n // This means that most likely the system is going to be using password-less login. \n // If that is not the case then we can raise a bad request exception...\n if (!await this.isPasswordlessRegistrationEnabled()) {\n this.logger.error('User being created without password, and password less login is also not enabled in the system. Is this intentional?');\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Save the hash of the blank password, anyways since passwordless login is enabled it does not matter.\n pwd = await this.hashingService.hash(pwd);\n }\n }\n\n user.password = pwd;\n user.passwordScheme = this.hashingService.name(); // e.g. bcrypt\n user.passwordSchemeVersion = this.hashingService.currentVersion(); // e.g. 1, 2, 3 ...\n user.active = isUserActive;\n return { user, pwd, autoGeneratedPwd };\n }\n\n\n private async handlePostSignup(user: User, roles: string[] = [], pwd: string, autoGeneratedPwd: string) {\n await this.userService.initializeRolesForNewUser(roles, user);\n\n // if forcePasswordChange is true, then we trigger an email to the user to change the password, this needs to be done using a queue. \n // 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\n if (user.forcePasswordChange && autoGeneratedPwd) {\n await this.notifyUserOnForcePasswordChange(user, autoGeneratedPwd);\n }\n\n // Send welcome notifications (email/SMS) if enabled.\n await this.notifyUserOnSignup(user);\n }\n\n\n generatePassword(length: number = 8): string {\n const upperCase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const lowerCase = \"abcdefghijklmnopqrstuvwxyz\";\n const numbers = \"0123456789\";\n const specialChars = \"@$#\";\n const allChars = upperCase + lowerCase + numbers + specialChars;\n\n let password = \"\";\n\n for (let i = 0; i < length; i++) {\n const randomIndex = Math.floor(Math.random() * allChars.length);\n password += allChars[randomIndex];\n }\n\n return password;\n }\n\n private async notifyUserOnForcePasswordChange(user: User, autoGeneratedPwd: string) {\n const companyLogo = await this.getCompanyLogo();\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'on-force-password-change',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n email: user.email,\n fullName: user.fullName,\n userName: user.username,\n password: autoGeneratedPwd,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n\n }\n\n private async isWelcomeEmailEnabled(): Promise<boolean> {\n const sendWelcomeEmailOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeEmailOnSignup');\n return sendWelcomeEmailOnSignup;\n }\n\n private async isWelcomeSmsEnabled(): Promise<boolean> {\n const sendWelcomeSmsOnSignup = this.settingService.getConfigValue<SolidCoreSetting>('sendWelcomeSmsOnSignup');\n return sendWelcomeSmsOnSignup;\n }\n\n private async notifyUserOnSignup(user: User) {\n const companyLogo = await this.getCompanyLogo();\n // Email welcome\n if (await this.isWelcomeEmailEnabled()) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'email-on-signup',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n email: user.email,\n fullName: user.fullName,\n userName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n\n // SMS welcome\n const isWelcomeSmsEnabled = await this.isWelcomeSmsEnabled()\n if (isWelcomeSmsEnabled && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'text-on-signup',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n frontendLoginPageUrl: this.settingService.getConfigValue<SolidCoreSetting>('frontendLoginPageUrl'),\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpInitiateRegistration(signUpDto: OTPSignUpDto) {\n try {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n // Validate if either mobile or email is present.\n if (isEmpty(signUpDto.mobile) && isEmpty(signUpDto.email)) {\n throw new BadRequestException(ERROR_MESSAGES.REGISTRATION_REQUIRES_CONTACT);\n }\n if (signUpDto.validationSources.includes(TransactionalRegistrationValidationSource.EMAIL) && isEmpty(signUpDto.email)) {\n throw new BadRequestException(ERROR_MESSAGES.EMAIL_REQUIRED_FOR_VALIDATION);\n }\n if (signUpDto.validationSources.includes(TransactionalRegistrationValidationSource.MOBILE) && isEmpty(signUpDto.mobile)) {\n throw new BadRequestException(ERROR_MESSAGES.MOBILE_REQUIRED_FOR_VALIDATION);\n }\n\n // Validate if user already exists.\n const existingUser = await this.userRepository.findOne({ //TODO Perhaps we should use the user service instead of the repository directly.\n where: [\n { email: signUpDto.email, },\n { mobile: signUpDto.mobile, },\n { username: signUpDto.username, }\n ]\n });\n if (isNotEmpty(existingUser) && existingUser.active) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');\n\n const finalRegistrationVerificationSources = this.calculateVerificationSources(passwordlessRegistrationValidateWhat, signUpDto);\n let user = existingUser\n if (isEmpty(user)) {\n user = this.createUser(signUpDto);\n await this.populateVerificationTokens(finalRegistrationVerificationSources, user);\n await this.userRepository.save(user);\n await this.userService.addRoleToUser(user.username, this.settingService.getConfigValue<SolidCoreSetting>('defaultRole'));\n }\n else {\n await this.populateVerificationTokens(finalRegistrationVerificationSources, user);\n await this.userRepository.save(user);\n }\n\n // Send OTP to the user through email or SMS, depending on the configuration.\n await this.notifyUserOnOtpInitiateRegistration(user, finalRegistrationVerificationSources);\n return { message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_REGISTRATION }\n } catch (err) {\n const pgUniqueViolationErrorCode = '23505';\n if (err.code === pgUniqueViolationErrorCode) {\n throw new ConflictException(ERROR_MESSAGES.USER_ALREADY_EXISTS);\n }\n throw err;\n }\n }\n\n // Create a new user entity.\n private createUser(signUpDto: OTPSignUpDto) {\n const user = new User();\n user.username = signUpDto.username;\n user.email = signUpDto.email;\n user.mobile = signUpDto.mobile;\n user.customPayload = signUpDto.customPayload;\n user.lastLoginProvider = LoginProvider.OTP;\n return user;\n }\n\n private calculateVerificationSources(configuredRegistrationValidationSources: string[], signUpDto: OTPSignUpDto): string[] {\n const finalRegistrationValidationSources = configuredRegistrationValidationSources.filter((source) => source !== RegistrationValidationSource.TRANSACTIONAL);\n if (configuredRegistrationValidationSources.includes(RegistrationValidationSource.TRANSACTIONAL)) {\n finalRegistrationValidationSources.push(...signUpDto.validationSources); // Add the validation sources provided by the user.\n }\n return finalRegistrationValidationSources;\n }\n\n // Generate the validation tokens for the user i.e (system configured + user provided)\n private async populateVerificationTokens(finalRegistrationValidationSources: string[], user: User) {\n if (finalRegistrationValidationSources.length === 0) {\n throw new BadRequestException(ERROR_MESSAGES.VALIDATION_SOURCE_REQUIRED);\n }\n if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.EMAIL)) {\n const { token, expiresAt } = await this.otp();\n user.emailVerificationTokenOnRegistration = token;\n user.emailVerificationTokenOnRegistrationExpiresAt = expiresAt;\n const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');\n\n if (autoLoginUserOnRegistration) {\n user.emailVerificationTokenOnLogin = token;\n user.emailVerificationTokenOnLoginExpiresAt = expiresAt;\n }\n }\n if (finalRegistrationValidationSources.includes(TransactionalRegistrationValidationSource.MOBILE)) {\n const { token, expiresAt } = await this.otp();\n user.mobileVerificationTokenOnRegistration = token;\n user.mobileVerificationTokenOnRegistrationExpiresAt = expiresAt;\n\n const autoLoginUserOnRegistration = this.settingService.getConfigValue<SolidCoreSetting>('autoLoginUserOnRegistration');\n if (autoLoginUserOnRegistration) {\n user.mobileVerificationTokenOnLogin = token;\n user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;\n }\n }\n }\n\n private async notifyUserOnOtpInitiateRegistration(user: User, registrationValidationSources: string[]) {\n const companyLogo = await this.getCompanyLogo();\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n\n if (dummyOtp)\n return; // Do nothing if dummy otp is configured.\n if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'otp-on-register',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n emailVerificationTokenOnRegistration: user.emailVerificationTokenOnRegistration,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n if (registrationValidationSources.includes(RegistrationValidationSource.MOBILE)) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'otp-on-register',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.mobileVerificationTokenOnRegistration,\n mobileVerificationTokenOnRegistration: user.mobileVerificationTokenOnRegistration,\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpConfirmRegistration(confirmSignUpDto: OTPConfirmOTPDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Based on the identifier, validate by query the user table.\n if (confirmSignUpDto.type === RegistrationValidationSource.EMAIL) {\n const user = await this.userRepository.findOne({\n where: {\n email: confirmSignUpDto.identifier,\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (user.emailVerificationTokenOnRegistration !== confirmSignUpDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.emailVerificationTokenOnRegistrationExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.OTP_EXPIRED);\n }\n user.emailVerifiedOnRegistrationAt = new Date();\n user.emailVerificationTokenOnRegistration = null;\n user.emailVerificationTokenOnRegistrationExpiresAt = null;\n user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);\n const savedUser: User = await this.userRepository.save(user);\n this.triggerRegistrationEvent(savedUser);\n return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }\n } else if (confirmSignUpDto.type === RegistrationValidationSource.MOBILE) {\n const user = await this.userRepository.findOne({\n where: {\n mobile: confirmSignUpDto.identifier,\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (user.mobileVerificationTokenOnRegistration !== confirmSignUpDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.mobileVerificationTokenOnRegistrationExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.mobileVerifiedOnRegistrationAt = new Date();\n user.mobileVerificationTokenOnRegistration = null;\n user.mobileVerificationTokenOnRegistrationExpiresAt = null;\n user.active = this.settingService.getConfigValue<SolidCoreSetting>('activateUserOnRegistration') && await this.areRegistrationValidationSourcesVerified(user);\n const savedUser: User = await this.userRepository.save(user);\n this.triggerRegistrationEvent(savedUser);\n return { active: savedUser.active, message: `User registration verified for ${confirmSignUpDto.type}` }\n }\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n\n private triggerRegistrationEvent(savedUser: User) {\n // Trigger events for user registration.\n const event = new EventDetails<User>(EventType.USER_REGISTERED, savedUser);\n this.eventEmitter.emit(EventType.USER_REGISTERED, event);\n }\n\n async areRegistrationValidationSourcesVerified(user: User): Promise<boolean> {\n const passwordlessRegistrationValidateWhat = this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistrationValidateWhat');\n\n const registrationValidationSources = passwordlessRegistrationValidateWhat;\n if (registrationValidationSources.includes(RegistrationValidationSource.EMAIL)) {\n if (!user.emailVerifiedOnRegistrationAt) {\n return false;\n }\n }\n if (registrationValidationSources.includes(RegistrationValidationSource.MOBILE)) {\n if (!user.mobileVerifiedOnRegistrationAt) {\n return false;\n }\n }\n return true;\n }\n\n private async otp(): Promise<otp> {\n const now = new Date();\n const otpExpiry = this.settingService.getConfigValue<SolidCoreSetting>('otpExpiry');\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n now.setMinutes(now.getMinutes() + otpExpiry);\n return {\n token: dummyOtp ? dummyOtp : randomInt(100000, 999999).toString(),\n expiresAt: now,\n };\n }\n\n async signIn(signInDto: SignInDto) {\n const user = await this.validateUserAndRehashPasswordIfRequired(signInDto);\n\n // TODO: Unset the password etc...\n const tokens = await this.generateTokens(user);\n\n await this.userActivityHistoryService.logEvent('login', user);\n\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private maskEmail(email: string): string {\n if (!email) return null;\n\n const [localPart, domain] = email.split('@');\n if (localPart.length <= 2) {\n return `${localPart[0]}***@${domain}`;\n }\n\n const visibleStart = localPart.slice(0, 2);\n const visibleEnd = localPart.slice(-1);\n return `${visibleStart}***${visibleEnd}@${domain}`;\n }\n\n private maskMobile(mobile: string): string {\n if (!mobile) return null;\n\n if (mobile.length <= 4) {\n return mobile;\n }\n\n const visibleEnd = mobile.slice(-4);\n return `***${visibleEnd}`;\n }\n\n async otpInitiateLogin(signInDto: OTPSignInDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n\n // Validate & generate otp token for the user based on the identifier type.\n if (signInDto.type === RegistrationValidationSource.EMAIL) {\n // const user = await this.userRepository.findOne({\n // where: {\n // email: signInDto.identifier,\n // }\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: signInDto.identifier },\n { email: signInDto.identifier },\n ]\n });\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n const { token, expiresAt } = await this.otp();\n user.emailVerificationTokenOnLogin = token;\n user.emailVerificationTokenOnLoginExpiresAt = expiresAt;\n await this.userRepository.save(user);\n this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.EMAIL);\n return {\n message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,\n user: {\n email: this.maskEmail(user.email)\n }\n };\n } else if (signInDto.type === RegistrationValidationSource.MOBILE) {\n // const user = await this.userRepository.findOne({\n // where: {\n // mobile: signInDto.identifier,\n // }\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: signInDto.identifier },\n { mobile: signInDto.identifier },\n ]\n });\n\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n\n const { token, expiresAt } = await this.otp();\n user.mobileVerificationTokenOnLogin = token;\n user.mobileVerificationTokenOnLoginExpiresAt = expiresAt;\n await this.userRepository.save(user);\n this.notifyUserOnOtpInititateLogin(user, RegistrationValidationSource.MOBILE);\n return {\n message: SUCCESS_MESSAGES.OTP_SENT_SUCCESS_LOGIN,\n user: {\n mobile: this.maskMobile(user.mobile)\n }\n };\n }\n else {\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n }\n\n private async notifyUserOnOtpInititateLogin(user: User, loginType: RegistrationValidationSource) {\n const companyLogo = await this.getCompanyLogo();\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n\n if (dummyOtp)\n return; // Do nothing if dummy otp is configured.\n if (loginType === RegistrationValidationSource.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'otp-on-login',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n emailVerificationTokenOnLogin: user.emailVerificationTokenOnLogin,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n if (loginType === RegistrationValidationSource.MOBILE) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'otp-on-login',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.mobileVerificationTokenOnLogin,\n mobileVerificationTokenOnLogin: user.mobileVerificationTokenOnLogin,\n firstName: user.username,\n fullName: user.fullName ? user.fullName : user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n\n );\n }\n }\n\n async otpConfirmLogin(confirmSignInDto: OTPConfirmOTPDto) {\n const isPasswordlessRegistrationEnabled = await this.isPasswordlessRegistrationEnabled();\n if (!isPasswordlessRegistrationEnabled) {\n throw new BadRequestException(ERROR_MESSAGES.PASSWORDLESS_REGISTRATION_DISABLED);\n }\n if (confirmSignInDto.type === RegistrationValidationSource.EMAIL) {\n // const user = await this.userRepository.findOne({\n // where: {\n // email: confirmSignInDto.identifier,\n // },\n // relations: ['roles']\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: confirmSignInDto.identifier },\n { email: confirmSignInDto.identifier },\n ],\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n if (user.emailVerificationTokenOnLogin !== confirmSignInDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.emailVerificationTokenOnLoginExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.emailVerifiedOnLoginAt = new Date();\n user.emailVerificationTokenOnLogin = null;\n user.emailVerificationTokenOnLoginExpiresAt = null;\n await this.userRepository.save(user);\n const { accessToken, refreshToken } = await this.generateTokens(user);\n const { id, username, email, mobile, lastLoginProvider } = user;\n const roles = user.roles.map((role) => role.name);\n return { accessToken, refreshToken, user: { id, username, email, mobile, lastLoginProvider, roles } };\n } else if (confirmSignInDto.type === RegistrationValidationSource.MOBILE) {\n // const user = await this.userRepository.findOne({\n // where: {\n // mobile: confirmSignInDto.identifier,\n // },\n // relations: ['roles']\n // });\n const user = await this.userRepository.findOne({\n where: [\n { username: confirmSignInDto.identifier },\n { mobile: confirmSignInDto.identifier },\n ],\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_NOT_ACTIVE);\n }\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n if (user.mobileVerificationTokenOnLogin !== confirmSignInDto.otp) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n if (user.mobileVerificationTokenOnLoginExpiresAt < new Date()) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_OTP);\n }\n user.mobileVerifiedOnLoginAt = new Date();\n user.mobileVerificationTokenOnLogin = null;\n user.mobileVerificationTokenOnLoginExpiresAt = null;\n await this.userRepository.save(user);\n const { accessToken, refreshToken } = await this.generateTokens(user);\n const { id, username, email, mobile, lastLoginProvider } = user;\n const roles = user.roles.map((role) => role.name);\n return { accessToken, refreshToken, user: { id, username, email, mobile, lastLoginProvider, roles } };\n\n }\n throw new BadRequestException(ERROR_MESSAGES.INVALID_VERIFICATION_TYPE);\n }\n\n async changePassword(changePasswordDto: ChangePasswordDto, activeUser: ActiveUserData) {\n const user = await this.userRepository.findOne({\n where: { id: changePasswordDto.id }\n });\n if (!user) {\n throw new NotFoundException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n\n if (!user.active) {\n throw new UnauthorizedException(ERROR_MESSAGES.USER_INACTIVE);\n }\n\n // 2. Validate if user has used a provider which is \"local\", only then it makes sense for us to initiate the forgot password routine.\n if (user.lastLoginProvider !== 'local') {\n throw new BadRequestException(ERROR_MESSAGES.NON_LOCAL_PROVIDER);\n }\n\n // Check if ID's match\n if (!(user.id === activeUser.sub)) {\n throw new BadRequestException(ERROR_MESSAGES.USER_ID_MISMATCH);\n }\n\n // Check if username's match\n if (!(user.username === activeUser.username)) {\n throw new BadRequestException(ERROR_MESSAGES.USERNAME_MISMATCH);\n }\n\n // Check if old password is matching.\n const isEqual = await this.hashingService.compare(\n changePasswordDto.currentPassword,\n user.password,\n user.passwordSchemeVersion\n );\n if (!isEqual) {\n throw new UnauthorizedException(ERROR_MESSAGES.INCORRECT_CURRENT_PASSWORD);\n }\n\n // Update Password\n const pwdData = await this.userService.hashPassword(\n changePasswordDto.newPassword,\n );\n user.password = changePasswordDto.newPassword;\n\n user.password = pwdData.password;\n user.passwordScheme = pwdData.passwordScheme;\n user.passwordSchemeVersion = pwdData.passwordSchemeVersion;\n // Everytime the user changes the password we reset the forcePasswordChange flag back to false. \n user.forcePasswordChange = false;\n\n await this.userRepository.save(user);\n\n return true;\n }\n\n // generate uuid token for forgot password\n private async generateForgotPasswordToken() {\n const expiryTime = new Date();\n const forgotPasswordVerificationTokenExpiry = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordVerificationTokenExpiry');\n const dummyOtp = this.settingService.getConfigValue<SolidCoreSetting>('dummyOtp');\n expiryTime.setMinutes(expiryTime.getMinutes() + forgotPasswordVerificationTokenExpiry);\n\n return {\n token: dummyOtp\n ? dummyOtp\n : uuidv4(), // UUID instead of numeric OTP\n expiresAt: expiryTime,\n };\n }\n\n async initiateForgotPassword(initiateForgotPasswordDto: InitiateForgotPasswordDto) {\n // Steps / Algorithm: \n // 1. Identify the user using the specified \"username\", if not found exit.\n // const user = await this.userRepository.findOne({\n // where: { username: initiateForgotPasswordDto.username, }\n // });\n const user = await this.resolveUser(initiateForgotPasswordDto.username, initiateForgotPasswordDto.email);\n\n let isValidUser = true // Instead of throwing exceptions we will simply return success message, this is to avoid user enumeration attacks.\n if (!user) {\n isValidUser = false\n // throw new NotFoundException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n if (isValidUser && !user?.active) {\n isValidUser = false\n // throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 2. Validate if user has used a provider which is \"local\", only then it makes sense for us to initiate the forgot password routine. \n if (isValidUser && user?.lastLoginProvider !== 'local') {\n isValidUser = false\n // throw new BadRequestException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 3. Generate a 6 digit validation token, we send this token to the user over their email & mobile number (controlled using configuration).\n // 4. Save this validation token in new fields on the user record. \n if (isValidUser) {\n const { token, expiresAt } = await this.generateForgotPasswordToken();\n user.verificationTokenOnForgotPassword = token;\n user.verificationTokenOnForgotPasswordExpiresAt = expiresAt;\n await this.userRepository.save(user);\n await this.notifyUserOnForgotPassword(user);\n }\n\n // 5. Return. \n return {\n status: 'success',\n message: SUCCESS_MESSAGES.FORGOT_PASSWORD_TOKEN_SENT,\n error: '',\n errorCode: '',\n data: {\n user: {\n email: user?.email,\n // mobile: user.mobile,\n // username: user.username,\n },\n }\n }\n }\n\n private async notifyUserOnForgotPassword(user: User) {\n const companyLogo = await this.getCompanyLogo();\n\n const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');\n\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n firstName: user.username,\n fullName: user.fullName,\n // TODO: Need to prefix this with the page url where the forgot password page will open up.\n passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n // Assuming all users do not have mobile as mandatory.\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.MOBILE && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.verificationTokenOnForgotPassword,\n verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,\n firstName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n );\n }\n }\n\n async confirmForgotPassword(confirmForgotPasswordDto: ConfirmForgotPasswordDto) {\n return this.dataSource.transaction(async (m) => {\n // Resolve the user id first (by username/email), but DON'T check the token in JS.\n const user = await this.resolveUserByVerificationToken(confirmForgotPasswordDto.verificationToken);\n if (!user) throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n if (user.lastLoginProvider !== 'local') throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n if (!user.active) throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n\n // 1) Atomically consume the token (only one request can succeed)\n const { affected } = await m\n .createQueryBuilder()\n .update(User)\n .set({\n forgotPasswordConfirmedAt: () => 'NOW()',\n verificationTokenOnForgotPassword: () => 'NULL',\n verificationTokenOnForgotPasswordExpiresAt: () => 'NULL',\n })\n .where('id = :id', { id: user.id })\n .andWhere('verificationTokenOnForgotPassword = :token', { token: confirmForgotPasswordDto.verificationToken })\n .andWhere('verificationTokenOnForgotPasswordExpiresAt > NOW()')\n .execute();\n\n if (affected !== 1) {\n // Token invalid/expired/already used (or a parallel call already consumed it)\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_CREDENTIALS);\n }\n\n // 2) Now update the password & history (still inside the same transaction)\n const pwdHash = await this.hashingService.hash(confirmForgotPasswordDto.password);\n const pwdScheme = this.hashingService.name(); // e.g. bcrypt\n const pwdSchemeVersion = this.hashingService.currentVersion(); // e.g. 1, 2, 3 ...\n\n // Check reuse with your existing method (ensure it looks at hashes).\n await m.getRepository(User).update({ id: user.id }, { password: pwdHash, passwordScheme: pwdScheme, passwordSchemeVersion: pwdSchemeVersion });\n await this.notifyUserOnPasswordChanged(user);\n\n return {\n status: 'success',\n message: SUCCESS_MESSAGES.FORGOT_PASSWORD_CONFIRMED,\n error: '',\n errorCode: '',\n data: {},\n };\n });\n }\n\n private async notifyUserOnPasswordChanged(user: User) {\n const companyLogo = await this.getCompanyLogo();\n const forgotPasswordSendVerificationTokenOn = this.settingService.getConfigValue<SolidCoreSetting>('forgotPasswordSendVerificationTokenOn');\n\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.EMAIL) {\n const mailService = this.mailServiceFactory.getMailService();\n mailService.sendEmailUsingTemplate(\n user.email,\n 'password-changed',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n solidAppWebsiteUrl: this.settingService.getConfigValue<SolidCoreSetting>('solidAppWebsiteUrl'),\n email: user.email,\n firstName: user.username,\n fullName: user.fullName,\n // TODO: Need to prefix this with the page url where the forgot password page will open up.\n passwordResetLink: `${this.settingService.getConfigValue<SolidCoreSetting>('frontendForgotPasswordPageUrl')}?token=${user.verificationTokenOnForgotPassword}`,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueEmails'),\n null,\n null,\n 'user',\n user.id\n );\n }\n // Assuming all users do not have mobile as mandatory.\n if (forgotPasswordSendVerificationTokenOn == ForgotPasswordSendVerificationTokenOn.MOBILE && user.mobile) {\n const smsService = this.smsFactory.getSmsService();\n smsService.sendSMSUsingTemplate(\n user.mobile,\n 'forgot-password',\n {\n solidAppName: this.settingService.getConfigValue<SolidCoreSetting>('appTitle'),\n otp: user.verificationTokenOnForgotPassword,\n verificationTokenOnForgotPassword: user.verificationTokenOnForgotPassword,\n firstName: user.username,\n companyLogoUrl: companyLogo\n },\n this.settingService.getConfigValue<SolidCoreSetting>('shouldQueueSms'),\n );\n }\n }\n\n async generateTokens(user: User) {\n\n const [accessToken, refreshToken] = await Promise.all([\n await this.generateAccessToken(user),\n await this.generateRefreshToken(user),\n ]);\n\n return {\n accessToken,\n refreshToken,\n };\n }\n\n async generateAccessToken(user: User) {\n\n // const userRoleNames = user.roles.map((role) => role.name).join(';')\n const userRoleNames = user.roles.map((role) => role.name);\n\n const accessTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>(\"accessTokenTtl\");\n const accessToken = await this.signToken<Partial<ActiveUserData>>(\n user.id,\n accessTokenTtl,\n { username: user.username, email: user.email, roles: userRoleNames },\n );\n\n return accessToken;\n }\n\n async generateRefreshToken(user: User, previousRefreshToken?: string) {\n const refreshTokenId = randomUUID();\n const refreshTokenTtl = this.settingService.getConfigValue<SolidCoreSetting>(\"refreshTokenTtl\");\n const refreshToken = await this.signToken(user.id, refreshTokenTtl, {\n refreshTokenId,\n })\n\n // store the refresh token id in the redis storage.\n await this.refreshTokenIdsStorage.insert(user.id, refreshToken, previousRefreshToken);\n\n return refreshToken;\n }\n\n async refreshTokens(refreshTokenDto: RefreshTokenDto) {\n try {\n const secret = this.settingService.getConfigValue<SolidCoreSetting>(\"secret\");\n const audience = this.settingService.getConfigValue<SolidCoreSetting>(\"audience\");\n const issuer = this.settingService.getConfigValue<SolidCoreSetting>(\"issuer\");\n\n const { sub } = await this.jwtService.verifyAsync<Pick<ActiveUserData, 'sub'> & { refreshTokenId: string }>(refreshTokenDto.refreshToken, {\n secret,\n audience,\n issuer,\n });\n // const user = await this.userRepository.findOneByOrFail({ id: sub });\n const user = await this.userRepository.findOne({\n where: {\n id: sub,\n },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new UnauthorizedException(ERROR_MESSAGES.SESSION_INVALID);\n }\n\n // TODO: Replace the if else condition below with a call to validateAndRotate - Done\n // const isValid = await this.refreshTokenIdsStorage.validate(user.id, refreshTokenId);\n // if (isValid) {\n // // Refresh token rotation.\n // await this.refreshTokenIdsStorage.invalidate(user.id);\n // } else {\n // throw new Error('Refresh token is invalid');\n // }\n\n const currentRefreshToken = await this.refreshTokenIdsStorage.validateAndRotate(user, refreshTokenDto.refreshToken);\n\n await this.userActivityHistoryService.logEvent('tokenRefreshed', user);\n\n return {\n accessToken: await this.generateAccessToken(user),\n refreshToken: currentRefreshToken,\n };\n } catch (err) {\n if (err instanceof InvalidatedRefreshTokenError) {\n // Take action: notify user that his refresh token might have been stolen?\n throw new UnauthorizedException(ERROR_MESSAGES.ACCESS_DENIED);\n }\n\n throw new UnauthorizedException(ERROR_MESSAGES.SESSION_EXPIRED);\n }\n }\n\n private async signToken<T>(userId: number, expiresIn: number, payload?: T) {\n const audience = this.settingService.getConfigValue<SolidCoreSetting>(\"audience\");\n const issuer = this.settingService.getConfigValue<SolidCoreSetting>(\"issuer\");\n const secret = this.settingService.getConfigValue<SolidCoreSetting>(\"secret\");\n\n\n return await this.jwtService.signAsync(\n {\n sub: userId,\n ...payload,\n },\n {\n audience,\n issuer,\n secret,\n expiresIn,\n },\n );\n }\n\n // PROVIDER SPECIFIC CODE\n async validateUserUsingGoogle(user: User) {\n try {\n // Make API call to Google OAuth service to fetch user profile\n const response = await this.httpService.axiosRef.get(`https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${user.googleAccessToken}`);\n const userProfile = response.data;\n\n // Ensure the fetched profile email & provider Id match the ones we have stored in the database earlier. \n if (userProfile.email === user.email && userProfile.id === user.googleId) {\n // TODO: remove the access code both from the database.\n return userProfile;\n } else {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_USER_PROFILE);\n }\n } catch (error) {\n throw new UnauthorizedException(ERROR_MESSAGES.GOOGLE_OAUTH_PROFILE_FETCH_FAILED);\n }\n }\n\n async signInUsingGoogle(accessCode: string) {\n const user = await this.userRepository.findOne({\n where: {\n accessCode: accessCode\n },\n relations: {\n roles: true\n }\n });\n\n // Validate the user against the Google oauth provider. \n // If the below call finishes without raising an exception then we have validated the user properly.\n await this.validateUserUsingGoogle(user);\n\n // finally we simply generate the tokens. \n const tokens = await this.generateTokens(user);\n return {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n // forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n ...tokens\n }\n }\n\n private async isPasswordlessRegistrationEnabled() {\n // return this.settingService.getConfigValue<SolidCoreSetting>('passwordlessRegistration');\n return this.settingService.getConfigValue<SolidCoreSetting>('passwordLessAuth');\n }\n\n //FIXME - Pending implementation\n // async logout() {\n // // const user = this.request.user; //TODO: // Access the user from the execution context\n\n // // Invalidate the refresh token\n // // await this.refreshTokenIdsStorage.invalidate(user.id);\n // }\n async logout(refreshToken: string) {\n try {\n // const activeUser = this.requestContextService.getActiveUser();\n // const userId = activeUser?.sub;\n // const user = await this.userRepository.findOne({\n // where: {\n // id: userId,\n // }\n // })\n // // Invalidate refresh token if you store them\n // await this.refreshTokenIdsStorage.invalidate(userId); // ← Your existing logic\n // if (!refreshToken) {\n // throw new UnauthorizedException('Refresh token is required');\n // }\n const payload = this.jwtService.decode(refreshToken) as any;\n\n if (!payload || !payload.sub) {\n throw new UnauthorizedException(ERROR_MESSAGES.INVALID_REFRESH_TOKEN);\n }\n\n const userId = payload.sub;\n await this.refreshTokenIdsStorage.invalidate(userId);\n const user = await this.userRepository.findOne({\n where: {\n id: userId,\n }\n })\n // Log logout event\n await this.userActivityHistoryService.logEvent('logout', user);\n\n return { message: SUCCESS_MESSAGES.LOGOUT_SUCCESS };\n } catch (err) {\n throw err instanceof UnauthorizedException || err instanceof InternalServerErrorException\n ? err\n : new InternalServerErrorException(ERROR_MESSAGES.LOGOUT_FAILED);\n }\n }\n\n\n async activateUser(userId: number) {\n const user = await this.userService.findOne(userId, {});\n if (!user) {\n throw new NotFoundException(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n user.active = true;\n await this.userRepository.save(user);\n }\n\n async me(activeUser: ActiveUserData) {\n const user = await this.userRepository.findOne({\n where: {\n id: activeUser.sub,\n },\n relations: {\n roles: true\n }\n });\n\n // const tokens = await this.generateTokens(user);\n\n // Get the refresh token for a user from refresh token storage.\n const refreshTokenState = await this.refreshTokenIdsStorage.getCurrentRefreshTokenState(user.id);\n\n const response = {\n user: {\n email: user.email,\n mobile: user.mobile,\n username: user.username,\n // forcePasswordChange: user.forcePasswordChange,\n id: user.id,\n roles: user.roles.map((role) => role.name)\n },\n refreshToken: refreshTokenState.currentRefreshToken,\n // ...tokens\n }\n return response;\n }\n\n}\n\nfunction parseUniqueConstraintError(detail: string): string {\n const match = detail.match(/Key \\(([^)]+)\\)=\\(([^)]+)\\) already exists\\./);\n if (match) {\n const field = match[1];\n const value = match[2];\n const fieldMap: Record<string, string> = {\n username: 'username',\n email: 'email address',\n full_name_user_key: 'full name',\n };\n const friendlyField = fieldMap[field] || field;\n return `A user with ${friendlyField} \"${value}\" already exists.`;\n }\n return detail;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAKlC,qBACa,WAAW;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;;IAoBvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAWpD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B5G,OAAO,CAAC,qBAAqB;IAIvB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzE,OAAO,CAAC,eAAe;IAUV,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAS/F"}
1
+ {"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,qBACa,WAAW;IAEtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;;IAoBvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAWpD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpE,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B5G,OAAO,CAAC,qBAAqB;IAIvB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYzE,OAAO,CAAC,eAAe;IAUV,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAShD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAS/F"}
@@ -50,8 +50,8 @@ exports.FileService = void 0;
50
50
  const common_1 = require("@nestjs/common");
51
51
  const fs = __importStar(require("fs"));
52
52
  const client_s3_1 = require("@aws-sdk/client-s3");
53
- const path_1 = __importDefault(require("path"));
54
53
  const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
54
+ const path_1 = __importDefault(require("path"));
55
55
  const error_messages_1 = require("../constants/error-messages");
56
56
  let FileService = FileService_1 = class FileService {
57
57
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"file.service.js","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\n// import * as AWS from 'aws-sdk';\nimport { S3Client, PutObjectCommand, DeleteObjectCommand, ObjectCannedACL, GetObjectCommand } from '@aws-sdk/client-s3';\nimport { ConfigType } from '@nestjs/config';\nimport path from 'path';\nimport { Readable } from 'stream';\nimport { getSignedUrl as awsGetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { AwsS3Config } from 'src/interfaces';\n\n@Injectable()\nexport class FileService {\n\n private readonly s3Client: S3Client;\n private readonly logger = new Logger(FileService.name);\n\n constructor(\n\n ) {\n const awsS3Credentials = {\n S3_AWS_ACCESS_KEY: process.env.S3_AWS_ACCESS_KEY,\n S3_AWS_SECRET_KEY: process.env.S3_AWS_SECRET_KEY,\n S3_AWS_REGION_NAME: process.env.S3_AWS_REGION_NAME\n }\n if (!this.isValidS3Config(awsS3Credentials)) { return }\n this.s3Client = new S3Client({\n region: process.env.S3_AWS_REGION_NAME,\n credentials: {\n accessKeyId: process.env.S3_AWS_ACCESS_KEY,\n secretAccessKey: process.env.S3_AWS_SECRET_KEY,\n },\n });\n }\n\n readFile(filePath: string): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(filePath, (err, data) => {\n if (err) {\n return reject(err);\n }\n resolve(data);\n });\n });\n }\n\n readImageFile(filePath: string): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(filePath, (err, data) => {\n if (err) {\n return reject(err);\n }\n resolve(data); // Resolve with Buffer instead of string\n });\n\n });\n }\n\n writeFile(filePath: string, data: string | Buffer): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(filePath, data, (err) => {\n if (err) {\n return reject(err);\n }\n resolve();\n });\n });\n }\n\n async copyFile(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n const data = await this.readFile(sourcePath);\n await this.createDirectoryIfNotExists(destinationPath);\n await this.writeFile(destinationPath, data);\n } catch (error) {\n throw new Error(`${ERROR_MESSAGES.FILE_COPY_ERROR}: ${error.message}`);\n }\n }\n\n async createDirectoryIfNotExists(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n deleteFile(filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(filePath, (err) => {\n if (err) {\n return reject(err);\n }\n resolve();\n });\n });\n }\n\n async copyToS3(filePath: string, ContentType: string, fileName: string, bucketName: string): Promise<string> {\n this.checkIfS3ClientExists();\n try {\n // Read Image File TO Fetch Buffer \n const data = await this.readImageFile(filePath);\n\n const params = {\n Bucket: bucketName,\n Key: fileName,\n Body: data,\n ContentType: ContentType, // Set the correct MIME type\n\n };\n // Upload it to S3\n // const response = await this.s3.upload(params).promise();\n const command = new PutObjectCommand(params);\n const response = await this.s3Client.send(command);\n\n // Return the URL file Name\n // To access the file - https://rep-public-files.s3.amazonaws.com/${fileName}\n return fileName\n\n } catch (error) {\n throw new Error(`${ERROR_MESSAGES.FILE_COPY_ERROR}: ${error.message}`);\n }\n }\n\n private checkIfS3ClientExists() {\n if (!this.s3Client) { throw new Error(ERROR_MESSAGES.S3_CLIENT_NOT_INITIALIZED); }\n }\n\n async copyToS3WithPublic(filePath: string, ContentType: string, fileName: string, bucketName: string): Promise<string> {\n return this.copyToS3(filePath, ContentType, fileName, bucketName);\n }\n\n async deleteFromS3(fileName: string, bucketName: string): Promise<string> {\n this.checkIfS3ClientExists();\n const params = {\n Bucket: bucketName, // your S3 bucket name\n Key: fileName // the name of the file you want to delete \n };\n\n const command = new DeleteObjectCommand(params)\n const response = await this.s3Client.send(command);\n return fileName\n }\n\n private isValidS3Config(config: AwsS3Config): boolean {\n return !!config.S3_AWS_ACCESS_KEY && !!config.S3_AWS_SECRET_KEY && !!config.S3_AWS_REGION_NAME;\n }\n\n /**\n * Save a stream to a file\n * @param stream - Readable stream\n * @param filePath - Destination file path\n * @returns Promise<void>\n */\n public async writeStreamToFile(stream: Readable, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const writeStream = fs.createWriteStream(filePath);\n stream.pipe(writeStream);\n\n writeStream.on('finish', () => {\n this.logger.debug(`✅ File saved: ${filePath}`);\n resolve();\n });\n\n writeStream.on('error', (err) => {\n this.logger.debug(`❌ Error saving file: ${filePath}`, err);\n reject(err);\n });\n });\n }\n\n public async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.promises.access(filePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n public async pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.promises.access(targetPath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n public async getSignedUrl(key: string, expiresIn: number, bucketName: string): Promise<string> {\n const command = new GetObjectCommand({\n Bucket: bucketName,\n Key: key,\n });\n\n return awsGetSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n}\n"]}
1
+ {"version":3,"file":"file.service.js","sourceRoot":"","sources":["../../src/services/file.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\n// import * as AWS from 'aws-sdk';\nimport { DeleteObjectCommand, GetObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3';\nimport { getSignedUrl as awsGetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport path from 'path';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { AwsS3Config } from 'src/interfaces';\nimport { Readable } from 'stream';\n\n@Injectable()\nexport class FileService {\n\n private readonly s3Client: S3Client;\n private readonly logger = new Logger(FileService.name);\n\n constructor(\n\n ) {\n const awsS3Credentials = {\n S3_AWS_ACCESS_KEY: process.env.S3_AWS_ACCESS_KEY,\n S3_AWS_SECRET_KEY: process.env.S3_AWS_SECRET_KEY,\n S3_AWS_REGION_NAME: process.env.S3_AWS_REGION_NAME\n }\n if (!this.isValidS3Config(awsS3Credentials)) { return }\n this.s3Client = new S3Client({\n region: process.env.S3_AWS_REGION_NAME,\n credentials: {\n accessKeyId: process.env.S3_AWS_ACCESS_KEY,\n secretAccessKey: process.env.S3_AWS_SECRET_KEY,\n },\n });\n }\n\n readFile(filePath: string): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(filePath, (err, data) => {\n if (err) {\n return reject(err);\n }\n resolve(data);\n });\n });\n }\n\n readImageFile(filePath: string): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(filePath, (err, data) => {\n if (err) {\n return reject(err);\n }\n resolve(data); // Resolve with Buffer instead of string\n });\n\n });\n }\n\n writeFile(filePath: string, data: string | Buffer): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(filePath, data, (err) => {\n if (err) {\n return reject(err);\n }\n resolve();\n });\n });\n }\n\n async copyFile(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n const data = await this.readFile(sourcePath);\n await this.createDirectoryIfNotExists(destinationPath);\n await this.writeFile(destinationPath, data);\n } catch (error) {\n throw new Error(`${ERROR_MESSAGES.FILE_COPY_ERROR}: ${error.message}`);\n }\n }\n\n async createDirectoryIfNotExists(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n\n deleteFile(filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(filePath, (err) => {\n if (err) {\n return reject(err);\n }\n resolve();\n });\n });\n }\n\n async copyToS3(filePath: string, ContentType: string, fileName: string, bucketName: string): Promise<string> {\n this.checkIfS3ClientExists();\n try {\n // Read Image File TO Fetch Buffer \n const data = await this.readImageFile(filePath);\n\n const params = {\n Bucket: bucketName,\n Key: fileName,\n Body: data,\n ContentType: ContentType, // Set the correct MIME type\n\n };\n // Upload it to S3\n // const response = await this.s3.upload(params).promise();\n const command = new PutObjectCommand(params);\n const response = await this.s3Client.send(command);\n\n // Return the URL file Name\n // To access the file - https://rep-public-files.s3.amazonaws.com/${fileName}\n return fileName\n\n } catch (error) {\n throw new Error(`${ERROR_MESSAGES.FILE_COPY_ERROR}: ${error.message}`);\n }\n }\n\n private checkIfS3ClientExists() {\n if (!this.s3Client) { throw new Error(ERROR_MESSAGES.S3_CLIENT_NOT_INITIALIZED); }\n }\n\n async copyToS3WithPublic(filePath: string, ContentType: string, fileName: string, bucketName: string): Promise<string> {\n return this.copyToS3(filePath, ContentType, fileName, bucketName);\n }\n\n async deleteFromS3(fileName: string, bucketName: string): Promise<string> {\n this.checkIfS3ClientExists();\n const params = {\n Bucket: bucketName, // your S3 bucket name\n Key: fileName // the name of the file you want to delete \n };\n\n const command = new DeleteObjectCommand(params)\n const response = await this.s3Client.send(command);\n return fileName\n }\n\n private isValidS3Config(config: AwsS3Config): boolean {\n return !!config.S3_AWS_ACCESS_KEY && !!config.S3_AWS_SECRET_KEY && !!config.S3_AWS_REGION_NAME;\n }\n\n /**\n * Save a stream to a file\n * @param stream - Readable stream\n * @param filePath - Destination file path\n * @returns Promise<void>\n */\n public async writeStreamToFile(stream: Readable, filePath: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const writeStream = fs.createWriteStream(filePath);\n stream.pipe(writeStream);\n\n writeStream.on('finish', () => {\n this.logger.debug(`✅ File saved: ${filePath}`);\n resolve();\n });\n\n writeStream.on('error', (err) => {\n this.logger.debug(`❌ Error saving file: ${filePath}`, err);\n reject(err);\n });\n });\n }\n\n public async fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.promises.access(filePath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n public async pathExists(targetPath: string): Promise<boolean> {\n try {\n await fs.promises.access(targetPath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n public async getSignedUrl(key: string, expiresIn: number, bucketName: string): Promise<string> {\n const command = new GetObjectCommand({\n Bucket: bucketName,\n Key: key,\n });\n\n return awsGetSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n}\n"]}
@@ -8,6 +8,7 @@ export declare class SchedulerServiceImpl implements ISchedulerService {
8
8
  constructor(scheduledJobRepo: ScheduledJobRepository, solidRegistry: SolidRegistry);
9
9
  runScheduledJobs(): Promise<void>;
10
10
  private shouldRunNow;
11
+ private computeNextRunForCustomCron;
11
12
  private computeNextRunAt;
12
13
  }
13
14
  //# sourceMappingURL=scheduler.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.service.d.ts","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,oBAAqB,YAAW,iBAAiB;IAMtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IANlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAK3C,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,aAAa;IAI3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDvC,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,gBAAgB;CAyB3B"}
1
+ {"version":3,"file":"scheduler.service.d.ts","sourceRoot":"","sources":["../../../src/services/scheduled-jobs/scheduler.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,qBACa,oBAAqB,YAAW,iBAAiB;IAMtD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IANlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;gBAK3C,gBAAgB,EAAE,sBAAsB,EACxC,aAAa,EAAE,aAAa;IAI3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDvC,OAAO,CAAC,YAAY;IA0CpB,OAAO,CAAC,2BAA2B;IA8BnC,OAAO,CAAC,gBAAgB;CAwB3B"}