@solidstarters/solid-core 1.2.146 → 1.2.148

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 (122) hide show
  1. package/dist/config/common.config.d.ts +10 -0
  2. package/dist/config/common.config.d.ts.map +1 -1
  3. package/dist/config/common.config.js +5 -0
  4. package/dist/config/common.config.js.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/interfaces.d.ts +5 -5
  10. package/dist/interfaces.d.ts.map +1 -1
  11. package/dist/interfaces.js.map +1 -1
  12. package/dist/jobs/database/api-email-subscriber-database.service.d.ts +3 -1
  13. package/dist/jobs/database/api-email-subscriber-database.service.d.ts.map +1 -1
  14. package/dist/jobs/database/api-email-subscriber-database.service.js +6 -3
  15. package/dist/jobs/database/api-email-subscriber-database.service.js.map +1 -1
  16. package/dist/jobs/database/computed-field-evaluation-subscriber.service.d.ts +3 -1
  17. package/dist/jobs/database/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
  18. package/dist/jobs/database/computed-field-evaluation-subscriber.service.js +6 -3
  19. package/dist/jobs/database/computed-field-evaluation-subscriber.service.js.map +1 -1
  20. package/dist/jobs/database/generate-code-subscriber-database.service.d.ts +3 -1
  21. package/dist/jobs/database/generate-code-subscriber-database.service.d.ts.map +1 -1
  22. package/dist/jobs/database/generate-code-subscriber-database.service.js +6 -3
  23. package/dist/jobs/database/generate-code-subscriber-database.service.js.map +1 -1
  24. package/dist/jobs/database/otp-subscriber-database.service.d.ts +3 -1
  25. package/dist/jobs/database/otp-subscriber-database.service.d.ts.map +1 -1
  26. package/dist/jobs/database/otp-subscriber-database.service.js +5 -2
  27. package/dist/jobs/database/otp-subscriber-database.service.js.map +1 -1
  28. package/dist/jobs/database/sms-subscriber-database.service.d.ts +4 -2
  29. package/dist/jobs/database/sms-subscriber-database.service.d.ts.map +1 -1
  30. package/dist/jobs/database/sms-subscriber-database.service.js +7 -4
  31. package/dist/jobs/database/sms-subscriber-database.service.js.map +1 -1
  32. package/dist/jobs/database/smtp-email-subscriber-database.service.d.ts +4 -2
  33. package/dist/jobs/database/smtp-email-subscriber-database.service.d.ts.map +1 -1
  34. package/dist/jobs/database/smtp-email-subscriber-database.service.js +6 -3
  35. package/dist/jobs/database/smtp-email-subscriber-database.service.js.map +1 -1
  36. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts +3 -1
  37. package/dist/jobs/database/test-queue-subscriber-database.service.d.ts.map +1 -1
  38. package/dist/jobs/database/test-queue-subscriber-database.service.js +6 -3
  39. package/dist/jobs/database/test-queue-subscriber-database.service.js.map +1 -1
  40. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts +3 -1
  41. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  42. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +5 -2
  43. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  44. package/dist/jobs/database/twilio-sms-publisher-database.service.d.ts +11 -0
  45. package/dist/jobs/database/twilio-sms-publisher-database.service.d.ts.map +1 -0
  46. package/dist/jobs/database/twilio-sms-publisher-database.service.js +39 -0
  47. package/dist/jobs/database/twilio-sms-publisher-database.service.js.map +1 -0
  48. package/dist/jobs/database/twilio-sms-queue-database-options.d.ts +8 -0
  49. package/dist/jobs/database/twilio-sms-queue-database-options.d.ts.map +1 -0
  50. package/dist/jobs/database/twilio-sms-queue-database-options.js +10 -0
  51. package/dist/jobs/database/twilio-sms-queue-database-options.js.map +1 -0
  52. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +17 -0
  53. package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts.map +1 -0
  54. package/dist/jobs/database/twilio-sms-subscriber-database.service.js +48 -0
  55. package/dist/jobs/database/twilio-sms-subscriber-database.service.js.map +1 -0
  56. package/dist/jobs/database/whatsapp-subscriber-database.service.d.ts +3 -1
  57. package/dist/jobs/database/whatsapp-subscriber-database.service.d.ts.map +1 -1
  58. package/dist/jobs/database/whatsapp-subscriber-database.service.js +6 -3
  59. package/dist/jobs/database/whatsapp-subscriber-database.service.js.map +1 -1
  60. package/dist/jobs/sms-subscriber.service.d.ts +1 -1
  61. package/dist/jobs/sms-subscriber.service.js +1 -1
  62. package/dist/jobs/sms-subscriber.service.js.map +1 -1
  63. package/dist/jobs/smtp-email-subscriber.service.d.ts +1 -1
  64. package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
  65. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  66. package/dist/seeders/module-metadata-seeder.service.js +15 -4
  67. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  68. package/dist/services/mail/smtp-email.service.d.ts +4 -4
  69. package/dist/services/mail/smtp-email.service.d.ts.map +1 -1
  70. package/dist/services/mail/smtp-email.service.js +12 -8
  71. package/dist/services/mail/smtp-email.service.js.map +1 -1
  72. package/dist/services/poller.service.d.ts +24 -0
  73. package/dist/services/poller.service.d.ts.map +1 -0
  74. package/dist/services/poller.service.js +131 -0
  75. package/dist/services/poller.service.js.map +1 -0
  76. package/dist/services/queues/database-subscriber.service.d.ts +4 -1
  77. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  78. package/dist/services/queues/database-subscriber.service.js +13 -13
  79. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  80. package/dist/services/sms/Msg91BaseSMSService.d.ts +2 -2
  81. package/dist/services/sms/Msg91BaseSMSService.d.ts.map +1 -1
  82. package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
  83. package/dist/services/sms/Msg91OTPService.d.ts +1 -1
  84. package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
  85. package/dist/services/sms/Msg91OTPService.js.map +1 -1
  86. package/dist/services/sms/Msg91SMSService.d.ts +1 -1
  87. package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
  88. package/dist/services/sms/Msg91SMSService.js.map +1 -1
  89. package/dist/services/sms/TwilioSMSService.d.ts +18 -0
  90. package/dist/services/sms/TwilioSMSService.d.ts.map +1 -0
  91. package/dist/services/sms/TwilioSMSService.js +115 -0
  92. package/dist/services/sms/TwilioSMSService.js.map +1 -0
  93. package/dist/solid-core.module.d.ts.map +1 -1
  94. package/dist/solid-core.module.js +10 -0
  95. package/dist/solid-core.module.js.map +1 -1
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +4 -3
  98. package/src/config/common.config.ts +5 -0
  99. package/src/index.ts +2 -0
  100. package/src/interfaces.ts +5 -5
  101. package/src/jobs/database/api-email-subscriber-database.service.ts +3 -1
  102. package/src/jobs/database/computed-field-evaluation-subscriber.service.ts +4 -2
  103. package/src/jobs/database/generate-code-subscriber-database.service.ts +3 -1
  104. package/src/jobs/database/otp-subscriber-database.service.ts +3 -1
  105. package/src/jobs/database/sms-subscriber-database.service.ts +4 -2
  106. package/src/jobs/database/smtp-email-subscriber-database.service.ts +3 -1
  107. package/src/jobs/database/test-queue-subscriber-database.service.ts +3 -1
  108. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +3 -1
  109. package/src/jobs/database/twilio-sms-publisher-database.service.ts +23 -0
  110. package/src/jobs/database/twilio-sms-queue-database-options.ts +9 -0
  111. package/src/jobs/database/twilio-sms-subscriber-database.service.ts +32 -0
  112. package/src/jobs/database/whatsapp-subscriber-database.service.ts +3 -1
  113. package/src/jobs/sms-subscriber.service.ts +1 -1
  114. package/src/seeders/module-metadata-seeder.service.ts +18 -15
  115. package/src/services/mail/smtp-email.service.ts +18 -17
  116. package/src/services/poller.service.ts +163 -0
  117. package/src/services/queues/database-subscriber.service.ts +39 -12
  118. package/src/services/sms/Msg91BaseSMSService.ts +2 -2
  119. package/src/services/sms/Msg91OTPService.ts +1 -1
  120. package/src/services/sms/Msg91SMSService.ts +1 -1
  121. package/src/services/sms/TwilioSMSService.ts +118 -0
  122. package/src/solid-core.module.ts +13 -0
@@ -62,7 +62,7 @@ export declare class ModuleMetadataSeederService {
62
62
  seedPermissions(): Promise<void>;
63
63
  seedMediaStorageProviders(mediaStorageProviders: any): Promise<void>;
64
64
  seedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleMetadata: CreateModuleMetadataDto): Promise<void>;
65
- seedSmsTemplates(smsTemplates: CreateSmsTemplateDto[]): Promise<void>;
65
+ seedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleMetadata: CreateModuleMetadataDto): Promise<void>;
66
66
  seedMenus(menus: any): Promise<void>;
67
67
  seedActions(actions: any): Promise<void>;
68
68
  seedViews(views: any): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata-seeder.service.d.ts","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-metadata-seeder.service.d.ts","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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"}
@@ -178,7 +178,7 @@ let ModuleMetadataSeederService = ModuleMetadataSeederService_1 = class ModuleMe
178
178
  this.logger.log(`[End] Processing email templates for ${moduleMetadata.name}`);
179
179
  this.logger.log(`[Start] Processing sms templates for ${moduleMetadata.name}`);
180
180
  const smsTemplates = overallMetadata.smsTemplates;
181
- await this.seedSmsTemplates(smsTemplates);
181
+ await this.seedSmsTemplates(smsTemplates, moduleMetadata);
182
182
  this.logger.log(`[End] Processing sms templates for ${moduleMetadata.name}`);
183
183
  this.logger.log(`[Start] Processing settings for ${moduleMetadata.name}`);
184
184
  await this.seetingService.seedDefaultSettings();
@@ -296,18 +296,29 @@ let ModuleMetadataSeederService = ModuleMetadataSeederService_1 = class ModuleMe
296
296
  await this.emailTemplateService.create(emailTemplate);
297
297
  }
298
298
  }
299
- async seedSmsTemplates(smsTemplates) {
299
+ async seedSmsTemplates(smsTemplates, moduleMetadata) {
300
300
  if (!smsTemplates) {
301
301
  return;
302
302
  }
303
303
  for (let i = 0; i < smsTemplates.length; i++) {
304
304
  const smsTemplate = smsTemplates[i];
305
305
  this.logger.log(`Found ${smsTemplate.name} sms template`);
306
- if (smsTemplate.body) {
306
+ if (moduleMetadata.name === 'solid-core') {
307
307
  const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));
308
308
  const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/sms-templates');
309
309
  const filePath = path.join(seedDataPath, smsTemplate.body);
310
- smsTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();
310
+ this.logger.log(`Seeding sms template from solid-core at path: ${filePath}`);
311
+ if (fs.existsSync(filePath)) {
312
+ smsTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();
313
+ }
314
+ }
315
+ else {
316
+ const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/sms-templates/${smsTemplate.body}`;
317
+ const fullPath = path.join(process.cwd(), emailTemplateHandlebar);
318
+ this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);
319
+ if (fs.existsSync(fullPath)) {
320
+ smsTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();
321
+ }
311
322
  }
312
323
  await this.smsTemplateService.removeByName(smsTemplate.name);
313
324
  await this.smsTemplateService.create(smsTemplate);
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata-seeder.service.js","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport appBuilderConfig from '../config/app-builder.config';\nimport { ConfigType } from '@nestjs/config';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadataService } from '../services/model-metadata.service';\nimport { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';\nimport { FieldMetadataService } from '../services/field-metadata.service';\nimport { UserService } from 'src/services/user.service';\nimport { AuthenticationService } from 'src/services/authentication.service';\nimport { MediaStorageProviderMetadataSeederService } from '../services/media-storage-provider-metadata-seeder.service';\nimport { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';\nimport { EmailTemplateService } from 'src/services/email-template.service';\nimport { SmsTemplateService } from 'src/services/sms-template.service';\nimport { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';\nimport { ViewMetadataService } from '../services/view-metadata.service';\nimport { ActionMetadataService } from '../services/action-metadata.service';\nimport { MenuItemMetadataService } from '../services/menu-item-metadata.service';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { Repository } from 'typeorm';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { RoleMetadataService } from '../services/role-metadata.service';\nimport { getCoreModuleNames, getDynamicModuleNames } from '../helpers/module.helper';\nimport solidCoreMetadata from './seed-data/solid-core-metadata.json';\nimport { iamConfig } from 'src/config/iam.config';\nimport commonConfig from 'src/config/common.config';\nimport { CreateSettingDto } from 'src/dtos/create-setting.dto';\nimport { SettingService } from 'src/services/setting.service';\nimport { Setting } from 'src/entities/setting.entity';\nimport { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';\nimport { SecurityRuleRepository } from 'src/repository/security-rule.repository';\nimport { ListOfValuesService } from 'src/services/list-of-values.service';\nimport { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';\nimport { SystemFieldsSeederService } from './system-fields-seeder.service';\nimport { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';\nimport { DashboardRepository } from 'src/repository/dashboard.repository';\n\n@Injectable()\nexport class ModuleMetadataSeederService {\n private readonly logger = new Logger(ModuleMetadataSeederService.name);\n\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n private readonly modelMetadataService: ModelMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly userService: UserService,\n private readonly authenticationService: AuthenticationService,\n private readonly solidActionService: ActionMetadataService,\n private readonly solidMenuItemService: MenuItemMetadataService,\n private readonly solidViewService: ViewMetadataService,\n private readonly mediaStorageProviderSeederService: MediaStorageProviderMetadataSeederService,\n private readonly emailTemplateService: EmailTemplateService,\n private readonly smsTemplateService: SmsTemplateService,\n private readonly listOfValuesService: ListOfValuesService,\n @InjectRepository(PermissionMetadata)\n private readonly permissionRepo: Repository<PermissionMetadata>,\n private readonly solidRegistry: SolidRegistry,\n @Inject(appBuilderConfig.KEY)\n private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,\n @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n private readonly seetingService: SettingService,\n @InjectRepository(Setting, 'default')\n readonly settingsRepo: Repository<Setting>,\n readonly securityRuleRepo: SecurityRuleRepository,\n readonly systemFieldsSeederService: SystemFieldsSeederService,\n readonly dashboardRepo: DashboardRepository,\n ) { }\n\n async seed() {\n\n const typedSolidCoreMetadata: any = structuredClone(solidCoreMetadata);\n\n // Run the permissions seeder. \n // await this.permissionsSeederService.seed();\n this.logger.log(`Seeding permissions`);\n await this.seedPermissions();\n\n // TODO: move this also the main loop processing. Generate the media storage providers required by default\n this.logger.log(`Seeding media storage providers`);\n await this.mediaStorageProviderSeederService.seed();\n\n // Seed any missing system fields metadata for all models.\n this.logger.log(`Seeding system fields metadata`);\n await this.systemFieldsSeederService.seed();\n\n // Read the module metadata from a file specified in the .env \n // Add the core json file as the first entry in the above array.\n // Please note the sequence of core files is important below...\n const coreModules = getCoreModuleNames();\n const seedDataFiles = [\n // 'src/common/seeders/seed-data/common-metadata.json',\n // 'src/iam/seeders/seed-data/iam-metadata.json',\n // 'src/app-builder/seeders/seed-data/app-builder-metadata.json',\n // 'src/queues/seeders/seed-data/queues-metadata.json',\n // ...coreModules.map(module => `src/${module}/seeders/seed-data/${module}-metadata.json`),\n typedSolidCoreMetadata\n ];\n this.logger.debug(`getting dynamics modules`);\n const enabledModules = getDynamicModuleNames();\n this.logger.log(`Seeding metadata`);\n\n for (let i = 0; i < enabledModules.length; i++) {\n const enabledModule = enabledModules[i];\n const enabledModuleSeedFile = `module-metadata/${enabledModule}/${enabledModule}-metadata.json`\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n if (fs.existsSync(fullPath)) {\n const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n seedDataFiles.push(overallMetadata)\n }\n }\n\n this.logger.debug(`Seed data files are: ${seedDataFiles}`);\n let usersDetail;\n for (let i = 0; i < seedDataFiles.length; i++) {\n\n // Module, model & field handling.\n const overallMetadata = seedDataFiles[i];\n // const fullPath = path.join(process.cwd(), seedDataFile);\n\n // For each module metadata seed file provided, read contents, parse & convert to a variable. \n // this.logger.log(`[Start] module seed data: ${fullPath}`);\n\n // const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n // Process module metadata first. \n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)\n await this.seedModuleModelFields(moduleMetadata);\n this.logger.log(`[End] Processing module metadata for ${moduleMetadata.name}`)\n\n // Media Storage provider templates\n this.logger.log(`[Start] Processing Media Storage Provider for ${moduleMetadata.name}`);\n const mediaStorageProviders = overallMetadata.mediaStorageProviders;\n await this.seedMediaStorageProviders(mediaStorageProviders);\n this.logger.log(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);\n\n // Custom role handling\n this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)\n const roles = overallMetadata.roles;\n\n // Every role configuration in the seeder json can optionally have a permissions attribute. \n // While creating roles we are only passing the role name to be used. \n await this.roleService.createRolesIfNotExists(roles.map(role => { return { name: role.name } }));\n\n // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.\n for (let roleI = 0; roleI < roles.length; roleI++) {\n const role = roles[roleI];\n if (role.permissions) {\n await this.roleService.addPermissionsToRole(role.name, role.permissions)\n }\n }\n this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)\n\n // Custom user handling\n this.logger.log(`[Start] Processing users for ${moduleMetadata.name}`);\n const users = overallMetadata.users;\n usersDetail = users;\n await this.seedUsers(users);\n this.logger.log(`[End] Processing users for ${moduleMetadata.name}`)\n\n // Application Module View handling \n this.logger.log(`[Start] Processing views for ${moduleMetadata.name}`);\n const views = overallMetadata.views;\n await this.seedViews(views);\n this.logger.log(`[End] Processing views for ${moduleMetadata.name}`)\n\n // Application Module Action handling\n this.logger.log(`[Start] Processing actions for ${moduleMetadata.name}`);\n const actions = overallMetadata.actions;\n await this.seedActions(actions);\n this.logger.log(`[End] Processing actions for ${moduleMetadata.name}`)\n\n // Application Module Menu handling \n this.logger.log(`[Start] Processing menus for ${moduleMetadata.name}`);\n const menus = overallMetadata.menus;\n await this.seedMenus(menus);\n this.logger.log(`[End] Processing menus for ${moduleMetadata.name}`)\n\n // Email templates \n this.logger.log(`[Start] Processing email templates for ${moduleMetadata.name}`);\n const emailTemplates: CreateEmailTemplateDto[] = overallMetadata.emailTemplates;\n await this.seedEmailTemplates(emailTemplates, moduleMetadata);\n this.logger.log(`[End] Processing email templates for ${moduleMetadata.name}`);\n\n // Sms templates\n this.logger.log(`[Start] Processing sms templates for ${moduleMetadata.name}`);\n const smsTemplates: CreateSmsTemplateDto[] = overallMetadata.smsTemplates;\n await this.seedSmsTemplates(smsTemplates);\n this.logger.log(`[End] Processing sms templates for ${moduleMetadata.name}`);\n\n // Settings\n this.logger.log(`[Start] Processing settings for ${moduleMetadata.name}`);\n await this.seetingService.seedDefaultSettings();\n this.logger.log(`[End] Processing settings for ${moduleMetadata.name}`);\n\n // Security rules\n this.logger.log(`[Start] Processing security rules for ${moduleMetadata.name}`);\n const securityRules: CreateSecurityRuleDto[] = overallMetadata.securityRules;\n await this.seedSecurityRules(securityRules);\n this.logger.log(`[End] Processing security rules for ${moduleMetadata.name}`);\n\n // List Of Values\n this.logger.log(`[Start] Processing List Of Values for ${moduleMetadata.name}`);\n const listOfValues: CreateListOfValuesDto[] = overallMetadata.listOfValues;\n await this.seedListOfValues(listOfValues);\n this.logger.log(`[End] Processing List Of Values for ${moduleMetadata.name}`);\n\n // Dashboards\n this.logger.log(`[Start] Processing dashboards for ${moduleMetadata.name}`);\n const dashboards: CreateDashboardDto[] = overallMetadata.dashboards;\n await this.seedDashboards(dashboards);\n this.logger.log(`[End] Processing dashboards for ${moduleMetadata.name}`);\n\n\n this.logger.debug(`[End] module seed data: ${overallMetadata}`);\n\n }\n\n // Post seed data file processing. \n\n // 1. Give all permissions to the Admin role.\n this.logger.log(`About to add all permissions to the Admin role`);\n await this.roleService.addAllPermissionsToRole(\"Admin\");\n // 2. Give wrapSettings permissions to the Public role.\n const internalRolePermission = [\n 'UserController.findMany',\n 'UserController.checkIfPermissionExists',\n 'UserController.findOne',\n 'MenuItemMetadataController.findMany',\n 'MenuItemMetadataController.findUserMenus',\n 'MenuItemMetadataController.findOne',\n 'ViewMetadataController.getLayout',\n 'ViewMetadataController.findMany',\n 'ViewMetadataController.findOne',\n 'AuthenticationController.changePassword',\n 'FieldMetadataController.getSelectionDynamicValues',\n 'FieldMetadataController.getSelectionDynamicValue',\n 'FieldMetadataController.findFieldDefaultMetaData',\n 'SavedFiltersController.delete',\n 'SavedFiltersController.deleteMany',\n 'SavedFiltersController.findOne',\n 'SavedFiltersController.findMany',\n 'SavedFiltersController.recover',\n 'SavedFiltersController.recoverMany',\n 'SavedFiltersController.partialUpdate',\n 'SavedFiltersController.update',\n 'SavedFiltersController.insertMany',\n 'SavedFiltersController.create',\n 'AuthenticationController.logout'\n ]\n await this.roleService.addPermissionToRole('Internal User', internalRolePermission);\n await this.roleService.addPermissionToRole('Public', ['SettingController.wrapSettings','AuthenticationController.logout']);\n this.logger.log(`All Seeders finished`);\n this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);\n }\n\n\n async seedPermissions() {\n\n const controllers = this.solidRegistry.getControllers();\n\n // Loop over the countries and create them.\n for (let id = 0; id < controllers.length; id++) {\n try {\n const controller = controllers[id];\n this.logger.log(`Resolving controller: ${controller.name}`);\n\n const methods = controller.methods;\n for (let mId = 0; mId < methods.length; mId++) {\n\n const methodName = methods[mId];\n const permissionName = `${controller.name}.${methodName}`;\n\n const existingPermission = await this.permissionRepo.findOne({\n where: {\n name: permissionName\n }\n });\n\n if (existingPermission) {\n this.logger.log(`Permission ${permissionName} already exists.`);\n }\n else {\n this.logger.log(`Permission ${permissionName} does not exist, creating new.`);\n\n const newPermission = this.permissionRepo.create({\n name: permissionName\n });\n await this.permissionRepo.save(newPermission);\n\n }\n }\n\n } catch (error) {\n this.logger.error(error);\n }\n }\n }\n\n async seedMediaStorageProviders(mediaStorageProviders: any) {\n for (let i = 0; i < mediaStorageProviders.length; i++) {\n const mediaStorageProivder = mediaStorageProviders[i];\n await this.mediaStorageProviderMetadataService.upsert(mediaStorageProivder);\n }\n }\n\n async seedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleMetadata: CreateModuleMetadataDto) {\n if (!emailTemplates) {\n return;\n }\n\n for (let i = 0; i < emailTemplates.length; i++) {\n const emailTemplate = emailTemplates[i];\n this.logger.log(`Found ${emailTemplate.name} email template`);\n\n // We need to load the actual template contents. \n if (moduleMetadata.name === 'solid-core') {\n const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));\n const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/email-templates');\n const filePath = path.join(seedDataPath, emailTemplate.body);\n this.logger.log(`Seeding email template from solid-core at path: ${filePath}`);\n if (fs.existsSync(filePath)) {\n emailTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/email-templates/${emailTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n emailTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n // Save to DB.\n await this.emailTemplateService.removeByName(emailTemplate.name);\n await this.emailTemplateService.create(emailTemplate);\n }\n\n }\n\n async seedSmsTemplates(smsTemplates: CreateSmsTemplateDto[]) {\n if (!smsTemplates) {\n return;\n }\n\n for (let i = 0; i < smsTemplates.length; i++) {\n const smsTemplate = smsTemplates[i];\n this.logger.log(`Found ${smsTemplate.name} sms template`);\n\n // We need to load the actual template contents. \n if (smsTemplate.body) {\n // const smsTemplateFilePath = path.join(process.cwd(), smsTemplate.body);\n // smsTemplate.body = fs.readFileSync(smsTemplateFilePath, 'utf-8').toString()\n\n const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));\n\n // Resolve the `src` folder\n const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/sms-templates');\n\n // Example usage\n const filePath = path.join(seedDataPath, smsTemplate.body);\n\n\n smsTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();\n\n }\n\n // Save to DB.\n await this.smsTemplateService.removeByName(smsTemplate.name);\n await this.smsTemplateService.create(smsTemplate);\n }\n }\n\n async seedMenus(menus: any) {\n if (!menus) {\n return;\n }\n\n for (let j = 0; j < menus.length; j++) {\n const menuData = menus[j];\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const specifiedRoles = menuData['roles'];\n\n // If the developer has specified roles, then resolve them, making sure that admin role is also given.\n const specifiedRoleObjects = [adminRole];\n if (specifiedRoles) {\n for (let i = 0; i < specifiedRoles.length; i++) {\n const specifiedRole = specifiedRoles[i];\n const specifiedRoleObject = await this.roleService.findRoleByName(specifiedRole);\n if (!specifiedRoleObject) {\n throw new Error(`Invalid role: (${specifiedRole}) specified against menu with display name ${menuData.displayName}.`);\n }\n specifiedRoleObjects.push(specifiedRoleObject);\n }\n }\n\n menuData['roles'] = specifiedRoleObjects;\n menuData['action'] = await this.solidActionService.findOneByUserKey(menuData.actionUserKey);\n menuData['module'] = await this.moduleMetadataService.findOneByUserKey(menuData.moduleUserKey);\n\n if (menuData.parentMenuItemUserKey) {\n menuData['parentMenuItem'] = await this.solidMenuItemService.findOneByUserKey(menuData.parentMenuItemUserKey);\n } else {\n menuData['parentMenuItem'] = null\n }\n await this.solidMenuItemService.upsert(menuData);\n }\n }\n\n async seedActions(actions: any) {\n if (!actions) {\n return;\n }\n\n for (let j = 0; j < actions.length; j++) {\n const actionData = actions[j];\n actionData['module'] = await this.moduleMetadataService.findOneByUserKey(actionData.moduleUserKey);\n if (actionData.type === 'solid') {\n actionData['model'] = await this.modelMetadataService.findOneByUserKey(actionData.modelUserKey);\n actionData['view'] = await this.solidViewService.findOneByUserKey(actionData.viewUserKey);\n }\n else {\n if (actionData.modelUserKey) {\n actionData['model'] = await this.modelMetadataService.findOneByUserKey(actionData.modelUserKey);\n }\n }\n await this.solidActionService.upsert(actionData);\n }\n }\n\n async seedViews(views: any) {\n if (!views) {\n return;\n }\n\n for (let j = 0; j < views.length; j++) {\n const viewData = views[j];\n\n // preety format the layout & context. \n viewData['layout'] = JSON.stringify(viewData['layout'], null, 2);\n // viewData['context'] = JSON.stringify(viewData['context'], null, 2);\n\n viewData['module'] = await this.moduleMetadataService.findOneByUserKey(viewData.moduleUserKey);\n viewData['model'] = await this.modelMetadataService.findOneByUserKey(viewData.modelUserKey);\n // await this.solidViewService.upsert(viewData);\n // First check if module already exists using name\n\n // Changed the below to upsert as now we are saving modifications to the view json to file system also.\n // await this.solidViewService.createIfNotPresent(viewData);\n await this.solidViewService.upsert(viewData);\n }\n }\n\n async seedUsers(users) {\n if (!users) {\n return;\n }\n\n for (let l = 0; l < users.length; l++) {\n const user = users[l];\n let exisitingUser = await this.userService.findOneByUsername(user.username);\n if (!exisitingUser) {\n exisitingUser = await this.authenticationService.signUp(user);\n\n this.logger.log(`Newly created user is ${user}`);\n }\n // now add Roles to user.\n // for (let m = 0; m < roles.length; m++) {\n // const role = roles[m];\n // await this.userService.addRoleToUser(user.email, role.name);\n // }\n }\n }\n\n async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto) {\n\n // First we create the module. \n // await this.moduleMetadataService.removeByName(moduleMetadata.name);\n // const module = await this.moduleMetadataService.create(moduleMetadata);\n const module = await this.moduleMetadataService.upsert(moduleMetadata);\n\n // Next create all the models. \n const modelsMetadata: CreateModelMetadataDto[] = moduleMetadata.models;\n for (let j = 0; j < modelsMetadata.length; j++) {\n const modelMetadata = modelsMetadata[j];\n\n // Before creating the model, we need to make sure we are linking it to the newly created module.\n // modelMetdata['moduleId'] = module.id;\n modelMetadata['module'] = module;\n\n // Please note that all the fields will also get created as we have setup the relation in model.entity.ts as cascade=true\n // await this.modelMetadataService.removeBySingularName(modelMetdata.singularName);\n // await this.modelMetadataService.modelSeeder(modelMetdata);\n\n // upsert the model information.\n // const fieldsMetadata = modelMetdata.fields;\n // delete modelMetdata['fields'];\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = modelMetadata;\n\n // Load and set the parent model if it exists.\n if (modelMetadata.isChild && modelMetadata.parentModelUserKey) {\n const parentModel = await this.modelMetadataService.findOneByUserKey(modelMetadata.parentModelUserKey);\n modelMetaDataWithoutFields['parentModel'] = parentModel;\n }\n\n await this.modelMetadataService.upsert(modelMetaDataWithoutFields);\n const model = await this.modelMetadataService.findOneBySingularName(modelMetadata.singularName)\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const userKeyFieldName = modelMetadata.userKeyFieldUserKey;\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderUserKey) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOneByUserKey(fieldMetadata.mediaStorageProviderUserKey);\n }\n // console.log(fieldMetadata.displayName);\n\n const affectedField = await this.fieldMetadataService.upsert(fieldMetadata);\n if (fieldMetadata.name === userKeyFieldName) {\n const { model, ...fieldData } = affectedField;\n userKeyField = fieldData;\n }\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n await this.modelMetadataService.upsert(modelMetaDataWithoutFields);\n }\n }\n }\n\n async seedSettings(createDto: CreateSettingDto) {\n const settingsArray: any[] = await this.settingsRepo.find();\n if (!settingsArray || settingsArray.length === 0) {\n this.seetingService.create(createDto);\n }\n }\n\n async seedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {\n if (!rulesDto || rulesDto.length === 0) {\n this.logger.debug(`No security rules found to seed`);\n return;\n }\n for (const dto of rulesDto) {\n await this.securityRuleRepo.upsertWithDto({ ...dto, securityRuleConfig: JSON.stringify(dto.securityRuleConfig) });\n }\n }\n\n async seedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {\n if (!listOfValuesDto || listOfValuesDto.length === 0) {\n this.logger.debug(`No List Of Values found to seed`);\n return;\n }\n for (let j = 0; j < listOfValuesDto.length; j++) {\n await this.listOfValuesService.upsert(listOfValuesDto);\n }\n }\n\n async seedDashboards(dashboardDtos: CreateDashboardDto[]) {\n if (!dashboardDtos || dashboardDtos.length === 0) {\n this.logger.debug(`No dashboards found to seed`);\n return;\n }\n for (const dto of dashboardDtos) {\n await this.dashboardRepo.upsertWithDto(dto);\n }\n }\n\n}"]}
1
+ {"version":3,"file":"module-metadata-seeder.service.js","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport appBuilderConfig from '../config/app-builder.config';\nimport { ConfigType } from '@nestjs/config';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadataService } from '../services/model-metadata.service';\nimport { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';\nimport { FieldMetadataService } from '../services/field-metadata.service';\nimport { UserService } from 'src/services/user.service';\nimport { AuthenticationService } from 'src/services/authentication.service';\nimport { MediaStorageProviderMetadataSeederService } from '../services/media-storage-provider-metadata-seeder.service';\nimport { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';\nimport { EmailTemplateService } from 'src/services/email-template.service';\nimport { SmsTemplateService } from 'src/services/sms-template.service';\nimport { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';\nimport { ViewMetadataService } from '../services/view-metadata.service';\nimport { ActionMetadataService } from '../services/action-metadata.service';\nimport { MenuItemMetadataService } from '../services/menu-item-metadata.service';\nimport { InjectRepository } from '@nestjs/typeorm';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { Repository } from 'typeorm';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { RoleMetadataService } from '../services/role-metadata.service';\nimport { getCoreModuleNames, getDynamicModuleNames } from '../helpers/module.helper';\nimport solidCoreMetadata from './seed-data/solid-core-metadata.json';\nimport { iamConfig } from 'src/config/iam.config';\nimport commonConfig from 'src/config/common.config';\nimport { CreateSettingDto } from 'src/dtos/create-setting.dto';\nimport { SettingService } from 'src/services/setting.service';\nimport { Setting } from 'src/entities/setting.entity';\nimport { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';\nimport { SecurityRuleRepository } from 'src/repository/security-rule.repository';\nimport { ListOfValuesService } from 'src/services/list-of-values.service';\nimport { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';\nimport { SystemFieldsSeederService } from './system-fields-seeder.service';\nimport { CreateDashboardDto } from 'src/dtos/create-dashboard.dto';\nimport { DashboardRepository } from 'src/repository/dashboard.repository';\n\n@Injectable()\nexport class ModuleMetadataSeederService {\n private readonly logger = new Logger(ModuleMetadataSeederService.name);\n\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n private readonly modelMetadataService: ModelMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly userService: UserService,\n private readonly authenticationService: AuthenticationService,\n private readonly solidActionService: ActionMetadataService,\n private readonly solidMenuItemService: MenuItemMetadataService,\n private readonly solidViewService: ViewMetadataService,\n private readonly mediaStorageProviderSeederService: MediaStorageProviderMetadataSeederService,\n private readonly emailTemplateService: EmailTemplateService,\n private readonly smsTemplateService: SmsTemplateService,\n private readonly listOfValuesService: ListOfValuesService,\n @InjectRepository(PermissionMetadata)\n private readonly permissionRepo: Repository<PermissionMetadata>,\n private readonly solidRegistry: SolidRegistry,\n @Inject(appBuilderConfig.KEY)\n private readonly appBuilderConfiguration: ConfigType<typeof appBuilderConfig>,\n @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n private readonly seetingService: SettingService,\n @InjectRepository(Setting, 'default')\n readonly settingsRepo: Repository<Setting>,\n readonly securityRuleRepo: SecurityRuleRepository,\n readonly systemFieldsSeederService: SystemFieldsSeederService,\n readonly dashboardRepo: DashboardRepository,\n ) { }\n\n async seed() {\n\n const typedSolidCoreMetadata: any = structuredClone(solidCoreMetadata);\n\n // Run the permissions seeder. \n // await this.permissionsSeederService.seed();\n this.logger.log(`Seeding permissions`);\n await this.seedPermissions();\n\n // TODO: move this also the main loop processing. Generate the media storage providers required by default\n this.logger.log(`Seeding media storage providers`);\n await this.mediaStorageProviderSeederService.seed();\n\n // Seed any missing system fields metadata for all models.\n this.logger.log(`Seeding system fields metadata`);\n await this.systemFieldsSeederService.seed();\n\n // Read the module metadata from a file specified in the .env \n // Add the core json file as the first entry in the above array.\n // Please note the sequence of core files is important below...\n const coreModules = getCoreModuleNames();\n const seedDataFiles = [\n // 'src/common/seeders/seed-data/common-metadata.json',\n // 'src/iam/seeders/seed-data/iam-metadata.json',\n // 'src/app-builder/seeders/seed-data/app-builder-metadata.json',\n // 'src/queues/seeders/seed-data/queues-metadata.json',\n // ...coreModules.map(module => `src/${module}/seeders/seed-data/${module}-metadata.json`),\n typedSolidCoreMetadata\n ];\n this.logger.debug(`getting dynamics modules`);\n const enabledModules = getDynamicModuleNames();\n this.logger.log(`Seeding metadata`);\n\n for (let i = 0; i < enabledModules.length; i++) {\n const enabledModule = enabledModules[i];\n const enabledModuleSeedFile = `module-metadata/${enabledModule}/${enabledModule}-metadata.json`\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n if (fs.existsSync(fullPath)) {\n const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n seedDataFiles.push(overallMetadata)\n }\n }\n\n this.logger.debug(`Seed data files are: ${seedDataFiles}`);\n let usersDetail;\n for (let i = 0; i < seedDataFiles.length; i++) {\n\n // Module, model & field handling.\n const overallMetadata = seedDataFiles[i];\n // const fullPath = path.join(process.cwd(), seedDataFile);\n\n // For each module metadata seed file provided, read contents, parse & convert to a variable. \n // this.logger.log(`[Start] module seed data: ${fullPath}`);\n\n // const overallMetadata: any = JSON.parse(fs.readFileSync(fullPath, 'utf-8').toString());\n\n // Process module metadata first. \n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n this.logger.log(`[Start] Processing module metadata for ${moduleMetadata.name}`)\n await this.seedModuleModelFields(moduleMetadata);\n this.logger.log(`[End] Processing module metadata for ${moduleMetadata.name}`)\n\n // Media Storage provider templates\n this.logger.log(`[Start] Processing Media Storage Provider for ${moduleMetadata.name}`);\n const mediaStorageProviders = overallMetadata.mediaStorageProviders;\n await this.seedMediaStorageProviders(mediaStorageProviders);\n this.logger.log(`[End] Processing Media Storage Provider for ${moduleMetadata.name}`);\n\n // Custom role handling\n this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)\n const roles = overallMetadata.roles;\n\n // Every role configuration in the seeder json can optionally have a permissions attribute. \n // While creating roles we are only passing the role name to be used. \n await this.roleService.createRolesIfNotExists(roles.map(role => { return { name: role.name } }));\n\n // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.\n for (let roleI = 0; roleI < roles.length; roleI++) {\n const role = roles[roleI];\n if (role.permissions) {\n await this.roleService.addPermissionsToRole(role.name, role.permissions)\n }\n }\n this.logger.log(`[End] Processing roles for ${moduleMetadata.name}`)\n\n // Custom user handling\n this.logger.log(`[Start] Processing users for ${moduleMetadata.name}`);\n const users = overallMetadata.users;\n usersDetail = users;\n await this.seedUsers(users);\n this.logger.log(`[End] Processing users for ${moduleMetadata.name}`)\n\n // Application Module View handling \n this.logger.log(`[Start] Processing views for ${moduleMetadata.name}`);\n const views = overallMetadata.views;\n await this.seedViews(views);\n this.logger.log(`[End] Processing views for ${moduleMetadata.name}`)\n\n // Application Module Action handling\n this.logger.log(`[Start] Processing actions for ${moduleMetadata.name}`);\n const actions = overallMetadata.actions;\n await this.seedActions(actions);\n this.logger.log(`[End] Processing actions for ${moduleMetadata.name}`)\n\n // Application Module Menu handling \n this.logger.log(`[Start] Processing menus for ${moduleMetadata.name}`);\n const menus = overallMetadata.menus;\n await this.seedMenus(menus);\n this.logger.log(`[End] Processing menus for ${moduleMetadata.name}`)\n\n // Email templates \n this.logger.log(`[Start] Processing email templates for ${moduleMetadata.name}`);\n const emailTemplates: CreateEmailTemplateDto[] = overallMetadata.emailTemplates;\n await this.seedEmailTemplates(emailTemplates, moduleMetadata);\n this.logger.log(`[End] Processing email templates for ${moduleMetadata.name}`);\n\n // Sms templates\n this.logger.log(`[Start] Processing sms templates for ${moduleMetadata.name}`);\n const smsTemplates: CreateSmsTemplateDto[] = overallMetadata.smsTemplates;\n await this.seedSmsTemplates(smsTemplates, moduleMetadata);\n this.logger.log(`[End] Processing sms templates for ${moduleMetadata.name}`);\n\n // Settings\n this.logger.log(`[Start] Processing settings for ${moduleMetadata.name}`);\n await this.seetingService.seedDefaultSettings();\n this.logger.log(`[End] Processing settings for ${moduleMetadata.name}`);\n\n // Security rules\n this.logger.log(`[Start] Processing security rules for ${moduleMetadata.name}`);\n const securityRules: CreateSecurityRuleDto[] = overallMetadata.securityRules;\n await this.seedSecurityRules(securityRules);\n this.logger.log(`[End] Processing security rules for ${moduleMetadata.name}`);\n\n // List Of Values\n this.logger.log(`[Start] Processing List Of Values for ${moduleMetadata.name}`);\n const listOfValues: CreateListOfValuesDto[] = overallMetadata.listOfValues;\n await this.seedListOfValues(listOfValues);\n this.logger.log(`[End] Processing List Of Values for ${moduleMetadata.name}`);\n\n // Dashboards\n this.logger.log(`[Start] Processing dashboards for ${moduleMetadata.name}`);\n const dashboards: CreateDashboardDto[] = overallMetadata.dashboards;\n await this.seedDashboards(dashboards);\n this.logger.log(`[End] Processing dashboards for ${moduleMetadata.name}`);\n\n\n this.logger.debug(`[End] module seed data: ${overallMetadata}`);\n\n }\n\n // Post seed data file processing. \n\n // 1. Give all permissions to the Admin role.\n this.logger.log(`About to add all permissions to the Admin role`);\n await this.roleService.addAllPermissionsToRole(\"Admin\");\n // 2. Give wrapSettings permissions to the Public role.\n const internalRolePermission = [\n 'UserController.findMany',\n 'UserController.checkIfPermissionExists',\n 'UserController.findOne',\n 'MenuItemMetadataController.findMany',\n 'MenuItemMetadataController.findUserMenus',\n 'MenuItemMetadataController.findOne',\n 'ViewMetadataController.getLayout',\n 'ViewMetadataController.findMany',\n 'ViewMetadataController.findOne',\n 'AuthenticationController.changePassword',\n 'FieldMetadataController.getSelectionDynamicValues',\n 'FieldMetadataController.getSelectionDynamicValue',\n 'FieldMetadataController.findFieldDefaultMetaData',\n 'SavedFiltersController.delete',\n 'SavedFiltersController.deleteMany',\n 'SavedFiltersController.findOne',\n 'SavedFiltersController.findMany',\n 'SavedFiltersController.recover',\n 'SavedFiltersController.recoverMany',\n 'SavedFiltersController.partialUpdate',\n 'SavedFiltersController.update',\n 'SavedFiltersController.insertMany',\n 'SavedFiltersController.create',\n 'AuthenticationController.logout'\n ]\n await this.roleService.addPermissionToRole('Internal User', internalRolePermission);\n await this.roleService.addPermissionToRole('Public', ['SettingController.wrapSettings', 'AuthenticationController.logout']);\n this.logger.log(`All Seeders finished`);\n this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);\n }\n\n\n async seedPermissions() {\n\n const controllers = this.solidRegistry.getControllers();\n\n // Loop over the countries and create them.\n for (let id = 0; id < controllers.length; id++) {\n try {\n const controller = controllers[id];\n this.logger.log(`Resolving controller: ${controller.name}`);\n\n const methods = controller.methods;\n for (let mId = 0; mId < methods.length; mId++) {\n\n const methodName = methods[mId];\n const permissionName = `${controller.name}.${methodName}`;\n\n const existingPermission = await this.permissionRepo.findOne({\n where: {\n name: permissionName\n }\n });\n\n if (existingPermission) {\n this.logger.log(`Permission ${permissionName} already exists.`);\n }\n else {\n this.logger.log(`Permission ${permissionName} does not exist, creating new.`);\n\n const newPermission = this.permissionRepo.create({\n name: permissionName\n });\n await this.permissionRepo.save(newPermission);\n\n }\n }\n\n } catch (error) {\n this.logger.error(error);\n }\n }\n }\n\n async seedMediaStorageProviders(mediaStorageProviders: any) {\n for (let i = 0; i < mediaStorageProviders.length; i++) {\n const mediaStorageProivder = mediaStorageProviders[i];\n await this.mediaStorageProviderMetadataService.upsert(mediaStorageProivder);\n }\n }\n\n async seedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleMetadata: CreateModuleMetadataDto) {\n if (!emailTemplates) {\n return;\n }\n\n for (let i = 0; i < emailTemplates.length; i++) {\n const emailTemplate = emailTemplates[i];\n this.logger.log(`Found ${emailTemplate.name} email template`);\n\n // We need to load the actual template contents. \n if (moduleMetadata.name === 'solid-core') {\n const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));\n const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/email-templates');\n const filePath = path.join(seedDataPath, emailTemplate.body);\n this.logger.log(`Seeding email template from solid-core at path: ${filePath}`);\n if (fs.existsSync(filePath)) {\n emailTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/email-templates/${emailTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n emailTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n // Save to DB.\n await this.emailTemplateService.removeByName(emailTemplate.name);\n await this.emailTemplateService.create(emailTemplate);\n }\n\n }\n\n async seedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleMetadata: CreateModuleMetadataDto) {\n if (!smsTemplates) {\n return;\n }\n\n for (let i = 0; i < smsTemplates.length; i++) {\n const smsTemplate = smsTemplates[i];\n this.logger.log(`Found ${smsTemplate.name} sms template`);\n\n // We need to load the actual template contents. \n if (moduleMetadata.name === 'solid-core') {\n const modulePath = path.dirname(require.resolve('@solidstarters/solid-core'));\n const seedDataPath = path.join(modulePath, '../src/seeders/seed-data/sms-templates');\n const filePath = path.join(seedDataPath, smsTemplate.body);\n this.logger.log(`Seeding sms template from solid-core at path: ${filePath}`);\n if (fs.existsSync(filePath)) {\n smsTemplate.body = fs.readFileSync(filePath, 'utf-8').toString();\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `module-metadata/${moduleMetadata.name}/sms-templates/${smsTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n smsTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n\n // Save to DB.\n await this.smsTemplateService.removeByName(smsTemplate.name);\n await this.smsTemplateService.create(smsTemplate);\n }\n }\n\n async seedMenus(menus: any) {\n if (!menus) {\n return;\n }\n\n for (let j = 0; j < menus.length; j++) {\n const menuData = menus[j];\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const specifiedRoles = menuData['roles'];\n\n // If the developer has specified roles, then resolve them, making sure that admin role is also given.\n const specifiedRoleObjects = [adminRole];\n if (specifiedRoles) {\n for (let i = 0; i < specifiedRoles.length; i++) {\n const specifiedRole = specifiedRoles[i];\n const specifiedRoleObject = await this.roleService.findRoleByName(specifiedRole);\n if (!specifiedRoleObject) {\n throw new Error(`Invalid role: (${specifiedRole}) specified against menu with display name ${menuData.displayName}.`);\n }\n specifiedRoleObjects.push(specifiedRoleObject);\n }\n }\n\n menuData['roles'] = specifiedRoleObjects;\n menuData['action'] = await this.solidActionService.findOneByUserKey(menuData.actionUserKey);\n menuData['module'] = await this.moduleMetadataService.findOneByUserKey(menuData.moduleUserKey);\n\n if (menuData.parentMenuItemUserKey) {\n menuData['parentMenuItem'] = await this.solidMenuItemService.findOneByUserKey(menuData.parentMenuItemUserKey);\n } else {\n menuData['parentMenuItem'] = null\n }\n await this.solidMenuItemService.upsert(menuData);\n }\n }\n\n async seedActions(actions: any) {\n if (!actions) {\n return;\n }\n\n for (let j = 0; j < actions.length; j++) {\n const actionData = actions[j];\n actionData['module'] = await this.moduleMetadataService.findOneByUserKey(actionData.moduleUserKey);\n if (actionData.type === 'solid') {\n actionData['model'] = await this.modelMetadataService.findOneByUserKey(actionData.modelUserKey);\n actionData['view'] = await this.solidViewService.findOneByUserKey(actionData.viewUserKey);\n }\n else {\n if (actionData.modelUserKey) {\n actionData['model'] = await this.modelMetadataService.findOneByUserKey(actionData.modelUserKey);\n }\n }\n await this.solidActionService.upsert(actionData);\n }\n }\n\n async seedViews(views: any) {\n if (!views) {\n return;\n }\n\n for (let j = 0; j < views.length; j++) {\n const viewData = views[j];\n\n // preety format the layout & context. \n viewData['layout'] = JSON.stringify(viewData['layout'], null, 2);\n // viewData['context'] = JSON.stringify(viewData['context'], null, 2);\n\n viewData['module'] = await this.moduleMetadataService.findOneByUserKey(viewData.moduleUserKey);\n viewData['model'] = await this.modelMetadataService.findOneByUserKey(viewData.modelUserKey);\n // await this.solidViewService.upsert(viewData);\n // First check if module already exists using name\n\n // Changed the below to upsert as now we are saving modifications to the view json to file system also.\n // await this.solidViewService.createIfNotPresent(viewData);\n await this.solidViewService.upsert(viewData);\n }\n }\n\n async seedUsers(users) {\n if (!users) {\n return;\n }\n\n for (let l = 0; l < users.length; l++) {\n const user = users[l];\n let exisitingUser = await this.userService.findOneByUsername(user.username);\n if (!exisitingUser) {\n exisitingUser = await this.authenticationService.signUp(user);\n\n this.logger.log(`Newly created user is ${user}`);\n }\n // now add Roles to user.\n // for (let m = 0; m < roles.length; m++) {\n // const role = roles[m];\n // await this.userService.addRoleToUser(user.email, role.name);\n // }\n }\n }\n\n async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto) {\n\n // First we create the module. \n // await this.moduleMetadataService.removeByName(moduleMetadata.name);\n // const module = await this.moduleMetadataService.create(moduleMetadata);\n const module = await this.moduleMetadataService.upsert(moduleMetadata);\n\n // Next create all the models. \n const modelsMetadata: CreateModelMetadataDto[] = moduleMetadata.models;\n for (let j = 0; j < modelsMetadata.length; j++) {\n const modelMetadata = modelsMetadata[j];\n\n // Before creating the model, we need to make sure we are linking it to the newly created module.\n // modelMetdata['moduleId'] = module.id;\n modelMetadata['module'] = module;\n\n // Please note that all the fields will also get created as we have setup the relation in model.entity.ts as cascade=true\n // await this.modelMetadataService.removeBySingularName(modelMetdata.singularName);\n // await this.modelMetadataService.modelSeeder(modelMetdata);\n\n // upsert the model information.\n // const fieldsMetadata = modelMetdata.fields;\n // delete modelMetdata['fields'];\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = modelMetadata;\n\n // Load and set the parent model if it exists.\n if (modelMetadata.isChild && modelMetadata.parentModelUserKey) {\n const parentModel = await this.modelMetadataService.findOneByUserKey(modelMetadata.parentModelUserKey);\n modelMetaDataWithoutFields['parentModel'] = parentModel;\n }\n\n await this.modelMetadataService.upsert(modelMetaDataWithoutFields);\n const model = await this.modelMetadataService.findOneBySingularName(modelMetadata.singularName)\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const userKeyFieldName = modelMetadata.userKeyFieldUserKey;\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderUserKey) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOneByUserKey(fieldMetadata.mediaStorageProviderUserKey);\n }\n // console.log(fieldMetadata.displayName);\n\n const affectedField = await this.fieldMetadataService.upsert(fieldMetadata);\n if (fieldMetadata.name === userKeyFieldName) {\n const { model, ...fieldData } = affectedField;\n userKeyField = fieldData;\n }\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n await this.modelMetadataService.upsert(modelMetaDataWithoutFields);\n }\n }\n }\n\n async seedSettings(createDto: CreateSettingDto) {\n const settingsArray: any[] = await this.settingsRepo.find();\n if (!settingsArray || settingsArray.length === 0) {\n this.seetingService.create(createDto);\n }\n }\n\n async seedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {\n if (!rulesDto || rulesDto.length === 0) {\n this.logger.debug(`No security rules found to seed`);\n return;\n }\n for (const dto of rulesDto) {\n await this.securityRuleRepo.upsertWithDto({ ...dto, securityRuleConfig: JSON.stringify(dto.securityRuleConfig) });\n }\n }\n\n async seedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {\n if (!listOfValuesDto || listOfValuesDto.length === 0) {\n this.logger.debug(`No List Of Values found to seed`);\n return;\n }\n for (let j = 0; j < listOfValuesDto.length; j++) {\n await this.listOfValuesService.upsert(listOfValuesDto);\n }\n }\n\n async seedDashboards(dashboardDtos: CreateDashboardDto[]) {\n if (!dashboardDtos || dashboardDtos.length === 0) {\n this.logger.debug(`No dashboards found to seed`);\n return;\n }\n for (const dto of dashboardDtos) {\n await this.dashboardRepo.upsertWithDto(dto);\n }\n }\n\n}"]}
@@ -11,9 +11,9 @@ export declare class SMTPEMailService implements IMail {
11
11
  private readonly logger;
12
12
  private readonly transporter;
13
13
  constructor(commonConfiguration: ConfigType<typeof commonConfig>, publisherFactory: PublisherFactory<any>, emailTemplateService: EmailTemplateService);
14
- sendEmailUsingTemplate(to: string, templateName: string, templateParams: any, shouldQueueEmails?: boolean, wrapperAttachments?: MailAttachmentWrapper[], attachments?: MailAttachment[], parentEntity?: any, parentEntityId?: any, cc?: string[], bcc?: string[], from?: string): Promise<void>;
15
- sendEmail(to: string, subject: string, body: string, shouldQueueEmails?: boolean, wrapperAttachments?: MailAttachmentWrapper[], attachments?: MailAttachment[], parentEntity?: any, parentEntityId?: any, cc?: string[], bcc?: string[], from?: string): Promise<void>;
16
- sendEmailAsynchronously(message: any): Promise<void>;
17
- sendEmailSynchronously(message: QueueMessage<any>): Promise<void>;
14
+ sendEmailUsingTemplate(to: string, templateName: string, templateParams: any, shouldQueueEmails?: boolean, wrapperAttachments?: MailAttachmentWrapper[], attachments?: MailAttachment[], parentEntity?: any, parentEntityId?: any, cc?: string[], bcc?: string[], from?: string): Promise<any>;
15
+ sendEmail(to: string, subject: string, body: string, shouldQueueEmails?: boolean, wrapperAttachments?: MailAttachmentWrapper[], attachments?: MailAttachment[], parentEntity?: any, parentEntityId?: any, cc?: string[], bcc?: string[], from?: string): Promise<any>;
16
+ sendEmailAsynchronously(message: any): Promise<string>;
17
+ sendEmailSynchronously(message: QueueMessage<any>): Promise<any>;
18
18
  }
19
19
  //# sourceMappingURL=smtp-email.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"smtp-email.service.d.ts","sourceRoot":"","sources":["../../../src/services/mail/smtp-email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAIvE,qBAEa,gBAAiB,YAAW,KAAK;IAMtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAGpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IATzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;gBAIb,mBAAmB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAGpD,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACvC,oBAAoB,EAAE,oBAAoB;IAazD,sBAAsB,CACxB,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,GAAG,EACnB,iBAAiB,UAAQ,EACzB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,EAC5C,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,GAAG,EAClB,cAAc,CAAC,EAAE,GAAG,EACpB,EAAE,CAAC,EAAE,MAAM,EAAE,EACb,GAAG,CAAC,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IAmBV,SAAS,CACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,iBAAiB,UAAQ,EACzB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,EAC5C,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,GAAG,EAClB,cAAc,CAAC,EAAE,GAAG,EACpB,EAAE,CAAC,EAAE,MAAM,EAAE,EACb,GAAG,CAAC,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC;IA6BV,uBAAuB,CAAC,OAAO,KAAA;IAW/B,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAgC1E"}
1
+ {"version":3,"file":"smtp-email.service.d.ts","sourceRoot":"","sources":["../../../src/services/mail/smtp-email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAIvE,qBAEa,gBAAiB,YAAW,KAAK;IAMtC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAGpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IATzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;gBAIb,mBAAmB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAGpD,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACvC,oBAAoB,EAAE,oBAAoB;IAazD,sBAAsB,CACxB,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,GAAG,EACnB,iBAAiB,UAAQ,EACzB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,EAC5C,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,GAAG,EAClB,cAAc,CAAC,EAAE,GAAG,EACpB,EAAE,CAAC,EAAE,MAAM,EAAE,EACb,GAAG,CAAC,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,MAAM;IAoBX,SAAS,CACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,iBAAiB,UAAQ,EACzB,kBAAkB,CAAC,EAAE,qBAAqB,EAAE,EAC5C,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,GAAG,EAClB,cAAc,CAAC,EAAE,GAAG,EACpB,EAAE,CAAC,EAAE,MAAM,EAAE,EACb,GAAG,CAAC,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE,MAAM;IA8BX,uBAAuB,CAAC,OAAO,KAAA;IAM/B,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;CAsC1D"}
@@ -49,7 +49,7 @@ let SMTPEMailService = SMTPEMailService_1 = class SMTPEMailService {
49
49
  const body = bodyTemplate(templateParams);
50
50
  const subjectTemplate = handlebars_1.default.compile(emailTemplate.subject);
51
51
  const subject = subjectTemplate(templateParams);
52
- await this.sendEmail(to, subject, body, shouldQueueEmails, wrapperAttachments, attachments, parentEntity, parentEntityId, cc, bcc, from);
52
+ return await this.sendEmail(to, subject, body, shouldQueueEmails, wrapperAttachments, attachments, parentEntity, parentEntityId, cc, bcc, from);
53
53
  }
54
54
  async sendEmail(to, subject, body, shouldQueueEmails = false, wrapperAttachments, attachments, parentEntity, parentEntityId, cc, bcc, from) {
55
55
  const message = {
@@ -66,23 +66,27 @@ let SMTPEMailService = SMTPEMailService_1 = class SMTPEMailService {
66
66
  parentEntityId: parentEntityId,
67
67
  };
68
68
  if (shouldQueueEmails === true) {
69
- this.sendEmailAsynchronously(message);
69
+ return this.sendEmailAsynchronously(message);
70
70
  }
71
71
  else if (shouldQueueEmails == false && this.commonConfiguration.shouldQueueEmails === true) {
72
- this.sendEmailAsynchronously(message);
72
+ return this.sendEmailAsynchronously(message);
73
73
  }
74
74
  else {
75
- await this.sendEmailSynchronously(message);
75
+ return await this.sendEmailSynchronously(message);
76
76
  }
77
77
  }
78
78
  async sendEmailAsynchronously(message) {
79
79
  const { to, subject, body } = message.payload;
80
- this.publisherFactory.publish(message, 'SmtpEmailQueuePublisher');
81
80
  this.logger.debug(`Queueing email to ${to} with subject ${subject} and body ${body}`);
81
+ return this.publisherFactory.publish(message, 'SmtpEmailQueuePublisher');
82
82
  }
83
83
  async sendEmailSynchronously(message) {
84
- const { from, to, subject, body, attachments, cc, bcc } = message.payload;
85
- const attachmentsList = attachments.map((attachment) => {
84
+ const { from, to, subject, body, attachments = [], cc, bcc } = message.payload;
85
+ if (!from || !to || !subject || !body) {
86
+ this.logger.error(`Required fields are missing in the email message: ${JSON.stringify(message.payload)}`);
87
+ return;
88
+ }
89
+ const attachmentsList = attachments?.map((attachment) => {
86
90
  const attachmentEntry = {
87
91
  filename: attachment.filename,
88
92
  contentType: attachment.contentType,
@@ -94,7 +98,7 @@ let SMTPEMailService = SMTPEMailService_1 = class SMTPEMailService {
94
98
  attachmentEntry['content'] = attachment.content;
95
99
  }
96
100
  return attachmentEntry;
97
- });
101
+ }) || [];
98
102
  const r = await this.transporter.sendMail({
99
103
  from: from,
100
104
  to: to,
@@ -1 +1 @@
1
- {"version":3,"file":"smtp-email.service.js","sourceRoot":"","sources":["../../../src/services/mail/smtp-email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { ConfigType } from '@nestjs/config';\nimport Handlebars from \"handlebars\";\nimport commonConfig from 'src/config/common.config';\nimport { MailProvider } from 'src/decorators/mail-provider.decorator';\nimport { QueueMessage } from 'src/interfaces/mq';\nimport { IMail, MailAttachment, MailAttachmentWrapper } from \"../../interfaces\";\nimport { EmailTemplateService } from '../email-template.service';\nimport { PublisherFactory } from '../queues/publisher-factory.service';\n\nconst nodemailer = require(\"nodemailer\");\n\n@Injectable()\n@MailProvider()\nexport class SMTPEMailService implements IMail {\n private readonly logger = new Logger(SMTPEMailService.name);\n private readonly transporter: any;\n\n constructor(\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n // private readonly emailPublisher: EmailQueuePublisher,\n // private readonly emailDbPublisher: EmailQueueDbPublisher,\n private readonly publisherFactory: PublisherFactory<any>,\n private readonly emailTemplateService: EmailTemplateService,\n ) {\n this.transporter = nodemailer.createTransport({\n host: this.commonConfiguration.smtpMail.host,\n port: this.commonConfiguration.smtpMail.port,\n secure: this.commonConfiguration.smtpMail.port === 465,\n auth: {\n user: this.commonConfiguration.smtpMail.username,\n pass: this.commonConfiguration.smtpMail.password\n }\n });\n }\n\n async sendEmailUsingTemplate(\n to: string,\n templateName: string,\n templateParams: any,\n shouldQueueEmails = false,\n wrapperAttachments?: MailAttachmentWrapper[],\n attachments?: MailAttachment[],\n parentEntity?: any,\n parentEntityId?: any,\n cc?: string[],\n bcc?: string[],\n from?: string\n ): Promise<void> {\n // Load template and evaluate it.\n const emailTemplate = await this.emailTemplateService.findOneByName(templateName);\n if (!emailTemplate) {\n throw new Error(`Invalid template name ${templateName}`);\n }\n\n // Evaluate the body template.\n const bodyTemplate = Handlebars.compile(emailTemplate.body);\n const body = bodyTemplate(templateParams);\n\n // Evaluate the subject template \n const subjectTemplate = Handlebars.compile(emailTemplate.subject);\n const subject = subjectTemplate(templateParams);\n\n // Finally send the email.\n await this.sendEmail(to, subject, body, shouldQueueEmails, wrapperAttachments, attachments, parentEntity, parentEntityId, cc, bcc, from);\n }\n\n async sendEmail(\n to: string,\n subject: string,\n body: string,\n shouldQueueEmails = false,\n wrapperAttachments?: MailAttachmentWrapper[],\n attachments?: MailAttachment[],\n parentEntity?: any,\n parentEntityId?: any,\n cc?: string[],\n bcc?: string[],\n from?: string\n ): Promise<void> {\n const message = {\n payload: {\n from: from || this.commonConfiguration.smtpMail.from,\n to: to,\n subject: subject,\n body: body,\n attachments: attachments,\n cc: cc,\n bcc: bcc,\n },\n parentEntity: parentEntity,\n parentEntityId: parentEntityId,\n };\n\n // Send using queue if the developer has explicitly invoked with true.\n if (shouldQueueEmails === true) {\n this.sendEmailAsynchronously(message);\n }\n // If developer has not, however system config mandates that we send using queue, still we send.\n else if (shouldQueueEmails == false && this.commonConfiguration.shouldQueueEmails === true) {\n this.sendEmailAsynchronously(message);\n }\n // Else we send synch\n else {\n await this.sendEmailSynchronously(message);\n }\n }\n\n async sendEmailAsynchronously(message) {\n const { to, subject, body } = message.payload;\n // this.notificationPublisherService.publish(message);\n // this.emailPublisher.publish(message);\n // this.emailDbPublisher.publish(message);\n\n this.publisherFactory.publish(message, 'SmtpEmailQueuePublisher');\n\n this.logger.debug(`Queueing email to ${to} with subject ${subject} and body ${body}`);\n }\n\n async sendEmailSynchronously(message: QueueMessage<any>): Promise<void> {\n const { from, to, subject, body, attachments, cc, bcc } = message.payload;\n\n const attachmentsList = attachments.map((attachment: MailAttachment) => {\n const attachmentEntry = {\n filename: attachment.filename,\n contentType: attachment.contentType,\n }\n if (attachment.path) {\n attachmentEntry['path'] = attachment.path;\n }\n if (attachment.content) {\n attachmentEntry['content'] = attachment.content;\n }\n return attachmentEntry;\n });\n\n // throw new Error('Random error....');\n const r = await this.transporter.sendMail({\n from: from,\n to: to,\n cc: cc,\n bcc: bcc,\n subject: subject,\n html: body,\n attachments: attachmentsList,\n });\n // this.logger.debug(`Sending email to ${to} with subject ${subject} and body ${body}`);\n this.logger.debug(`Sending email to ${to} with subject ${subject}`);\n\n return r;\n }\n}"]}
1
+ {"version":3,"file":"smtp-email.service.js","sourceRoot":"","sources":["../../../src/services/mail/smtp-email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { ConfigType } from '@nestjs/config';\nimport Handlebars from \"handlebars\";\nimport commonConfig from 'src/config/common.config';\nimport { MailProvider } from 'src/decorators/mail-provider.decorator';\nimport { QueueMessage } from 'src/interfaces/mq';\nimport { IMail, MailAttachment, MailAttachmentWrapper } from \"../../interfaces\";\nimport { EmailTemplateService } from '../email-template.service';\nimport { PublisherFactory } from '../queues/publisher-factory.service';\n\nconst nodemailer = require(\"nodemailer\");\n\n@Injectable()\n@MailProvider()\nexport class SMTPEMailService implements IMail {\n private readonly logger = new Logger(SMTPEMailService.name);\n private readonly transporter: any;\n\n constructor(\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n // private readonly emailPublisher: EmailQueuePublisher,\n // private readonly emailDbPublisher: EmailQueueDbPublisher,\n private readonly publisherFactory: PublisherFactory<any>,\n private readonly emailTemplateService: EmailTemplateService,\n ) {\n this.transporter = nodemailer.createTransport({\n host: this.commonConfiguration.smtpMail.host,\n port: this.commonConfiguration.smtpMail.port,\n secure: this.commonConfiguration.smtpMail.port === 465,\n auth: {\n user: this.commonConfiguration.smtpMail.username,\n pass: this.commonConfiguration.smtpMail.password\n }\n });\n }\n\n async sendEmailUsingTemplate(\n to: string,\n templateName: string,\n templateParams: any,\n shouldQueueEmails = false,\n wrapperAttachments?: MailAttachmentWrapper[],\n attachments?: MailAttachment[],\n parentEntity?: any,\n parentEntityId?: any,\n cc?: string[],\n bcc?: string[],\n from?: string\n ) {\n // Load template and evaluate it.\n const emailTemplate = await this.emailTemplateService.findOneByName(templateName);\n if (!emailTemplate) {\n throw new Error(`Invalid template name ${templateName}`);\n }\n\n // Evaluate the body template.\n const bodyTemplate = Handlebars.compile(emailTemplate.body);\n const body = bodyTemplate(templateParams);\n\n // Evaluate the subject template \n const subjectTemplate = Handlebars.compile(emailTemplate.subject);\n const subject = subjectTemplate(templateParams);\n\n // Finally send the email.\n return await this.sendEmail(to, subject, body, shouldQueueEmails, wrapperAttachments, attachments, parentEntity, parentEntityId, cc, bcc, from);\n }\n\n async sendEmail(\n to: string,\n subject: string,\n body: string,\n shouldQueueEmails = false,\n wrapperAttachments?: MailAttachmentWrapper[],\n attachments?: MailAttachment[],\n parentEntity?: any,\n parentEntityId?: any,\n cc?: string[],\n bcc?: string[],\n from?: string\n ) {\n const message = {\n payload: {\n from: from || this.commonConfiguration.smtpMail.from,\n to: to,\n subject: subject,\n body: body,\n attachments: attachments,\n cc: cc,\n bcc: bcc,\n },\n parentEntity: parentEntity,\n parentEntityId: parentEntityId,\n };\n\n // Send using queue if the developer has explicitly invoked with true.\n if (shouldQueueEmails === true) {\n return this.sendEmailAsynchronously(message);\n }\n // If developer has not, however system config mandates that we send using queue, still we send.\n else if (shouldQueueEmails == false && this.commonConfiguration.shouldQueueEmails === true) {\n return this.sendEmailAsynchronously(message);\n }\n // Else we send synchronously\n else {\n return await this.sendEmailSynchronously(message);\n }\n }\n\n async sendEmailAsynchronously(message) {\n const { to, subject, body } = message.payload;\n this.logger.debug(`Queueing email to ${to} with subject ${subject} and body ${body}`);\n return this.publisherFactory.publish(message, 'SmtpEmailQueuePublisher');\n }\n\n async sendEmailSynchronously(message: QueueMessage<any>) {\n const { from, to, subject, body, attachments = [], cc, bcc } = message.payload;\n\n // if any of the required fields are missing, throw an error.\n if (!from || !to || !subject || !body) {\n this.logger.error(`Required fields are missing in the email message: ${JSON.stringify(message.payload)}`);\n return;\n }\n\n const attachmentsList = attachments?.map((attachment: MailAttachment) => {\n const attachmentEntry = {\n filename: attachment.filename,\n contentType: attachment.contentType,\n }\n if (attachment.path) {\n attachmentEntry['path'] = attachment.path;\n }\n if (attachment.content) {\n attachmentEntry['content'] = attachment.content;\n }\n return attachmentEntry;\n }) || [];\n\n // throw new Error('Random error....');\n const r = await this.transporter.sendMail({\n from: from,\n to: to,\n cc: cc,\n bcc: bcc,\n subject: subject,\n html: body,\n attachments: attachmentsList,\n });\n // this.logger.debug(`Sending email to ${to} with subject ${subject} and body ${body}`);\n this.logger.debug(`Sending email to ${to} with subject ${subject}`);\n\n return r;\n }\n}"]}
@@ -0,0 +1,24 @@
1
+ import { OnModuleDestroy, BeforeApplicationShutdown } from '@nestjs/common';
2
+ export interface PollOptions {
3
+ baseDelayMs?: number;
4
+ maxDelayMs?: number;
5
+ timeoutPerIterationMs?: number;
6
+ jitter?: boolean;
7
+ }
8
+ type ProcessNextFn = (queueName: string) => Promise<unknown>;
9
+ export declare class PollerService implements OnModuleDestroy, BeforeApplicationShutdown {
10
+ private readonly logger;
11
+ private readonly pollers;
12
+ start(queueName: string, processNext: ProcessNextFn, options?: PollOptions): void;
13
+ stop(queueName: string): void;
14
+ stopAll(): void;
15
+ onModuleDestroy(): Promise<void>;
16
+ beforeApplicationShutdown(): Promise<void>;
17
+ private poll;
18
+ private schedule;
19
+ private computeWait;
20
+ private withTimeout;
21
+ private errorToString;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=poller.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.service.d.ts","sourceRoot":"","sources":["../../src/services/poller.service.ts"],"names":[],"mappings":"AACA,OAAO,EAGH,eAAe,EACf,yBAAyB,EAC5B,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,WAAW;IAExB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,KAAK,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAY7D,qBACa,aAAc,YAAW,eAAe,EAAE,yBAAyB;IAC5E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,GAAE,WAAgB,GAAG,IAAI;IA6BrF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAa7B,OAAO,IAAI,IAAI;IAMT,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;YAMlC,IAAI;IA2BlB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,WAAW;YAQL,WAAW;IAczB,OAAO,CAAC,aAAa;CAQxB"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var PollerService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PollerService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ let PollerService = PollerService_1 = class PollerService {
13
+ constructor() {
14
+ this.logger = new common_1.Logger(PollerService_1.name);
15
+ this.pollers = new Map();
16
+ }
17
+ start(queueName, processNext, options = {}) {
18
+ if (this.pollers.has(queueName)) {
19
+ this.logger.warn(`Poller "${queueName}" already started; ignoring.`);
20
+ return;
21
+ }
22
+ const opts = {
23
+ baseDelayMs: options.baseDelayMs ?? 1000,
24
+ maxDelayMs: options.maxDelayMs ?? 30_000,
25
+ timeoutPerIterationMs: options.timeoutPerIterationMs ?? 60_000,
26
+ jitter: options.jitter ?? true,
27
+ };
28
+ const state = {
29
+ queueName,
30
+ processNext,
31
+ opts,
32
+ inFlight: false,
33
+ stopped: false,
34
+ backoff: opts.baseDelayMs,
35
+ nextTimer: undefined,
36
+ };
37
+ this.pollers.set(queueName, state);
38
+ setImmediate(() => this.poll(state).catch(() => { }));
39
+ this.logger.log(`Started poller "${queueName}"`);
40
+ }
41
+ stop(queueName) {
42
+ const state = this.pollers.get(queueName);
43
+ if (!state)
44
+ return;
45
+ state.stopped = true;
46
+ if (state.nextTimer) {
47
+ clearTimeout(state.nextTimer);
48
+ state.nextTimer = undefined;
49
+ }
50
+ this.pollers.delete(queueName);
51
+ this.logger.log(`Stopped poller "${queueName}"`);
52
+ }
53
+ stopAll() {
54
+ for (const name of Array.from(this.pollers.keys())) {
55
+ this.stop(name);
56
+ }
57
+ }
58
+ async onModuleDestroy() {
59
+ this.stopAll();
60
+ }
61
+ async beforeApplicationShutdown() {
62
+ this.stopAll();
63
+ }
64
+ async poll(state) {
65
+ if (state.stopped || state.inFlight)
66
+ return;
67
+ state.inFlight = true;
68
+ try {
69
+ await this.withTimeout(state.processNext(state.queueName), state.opts.timeoutPerIterationMs);
70
+ state.backoff = state.opts.baseDelayMs;
71
+ this.schedule(state, state.opts.baseDelayMs);
72
+ }
73
+ catch (err) {
74
+ const msg = this.errorToString(err);
75
+ this.logger.error(`[${state.queueName}] iteration failed: ${msg}`);
76
+ const wait = this.computeWait(state.backoff, state.opts);
77
+ state.backoff = Math.min(state.backoff * 2, state.opts.maxDelayMs);
78
+ this.schedule(state, wait);
79
+ }
80
+ finally {
81
+ state.inFlight = false;
82
+ }
83
+ }
84
+ schedule(state, delayMs) {
85
+ if (state.stopped)
86
+ return;
87
+ if (state.nextTimer)
88
+ clearTimeout(state.nextTimer);
89
+ state.nextTimer = setTimeout(() => {
90
+ state.nextTimer = undefined;
91
+ this.poll(state).catch(() => { });
92
+ }, delayMs);
93
+ }
94
+ computeWait(currentBackoff, opts) {
95
+ if (!opts.jitter)
96
+ return currentBackoff;
97
+ const doubled = Math.min(currentBackoff * 2, opts.maxDelayMs);
98
+ const jittered = Math.floor(Math.random() * doubled);
99
+ return Math.max(250, jittered);
100
+ }
101
+ async withTimeout(p, ms) {
102
+ let timer;
103
+ try {
104
+ return await Promise.race([
105
+ p,
106
+ new Promise((_, rej) => {
107
+ timer = setTimeout(() => rej(new Error(`Iteration timed out after ${ms} ms`)), ms);
108
+ }),
109
+ ]);
110
+ }
111
+ finally {
112
+ if (timer)
113
+ clearTimeout(timer);
114
+ }
115
+ }
116
+ errorToString(err) {
117
+ if (err instanceof Error)
118
+ return err.stack ?? err.message;
119
+ try {
120
+ return JSON.stringify(err);
121
+ }
122
+ catch {
123
+ return String(err);
124
+ }
125
+ }
126
+ };
127
+ exports.PollerService = PollerService;
128
+ exports.PollerService = PollerService = PollerService_1 = __decorate([
129
+ (0, common_1.Injectable)()
130
+ ], PollerService);
131
+ //# sourceMappingURL=poller.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.service.js","sourceRoot":"","sources":["../../src/services/poller.service.ts"],"names":[],"mappings":"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","sourcesContent":["// src/common/poller/poller.service.ts\nimport {\n Injectable,\n Logger,\n OnModuleDestroy,\n BeforeApplicationShutdown,\n} from '@nestjs/common';\n\nexport interface PollOptions {\n /** Wait after a successful iteration */\n baseDelayMs?: number; // default 1000\n /** Maximum delay after repeated failures */\n maxDelayMs?: number; // default 30000\n /** Per-iteration timeout guard */\n timeoutPerIterationMs?: number; // default 60000\n /** Add jitter to spread load */\n jitter?: boolean; // default true\n}\n\ntype ProcessNextFn = (queueName: string) => Promise<unknown>;\n\ninterface PollerState {\n queueName: string;\n processNext: ProcessNextFn;\n opts: Required<PollOptions>;\n inFlight: boolean;\n stopped: boolean;\n backoff: number;\n nextTimer?: NodeJS.Timeout;\n}\n\n@Injectable()\nexport class PollerService implements OnModuleDestroy, BeforeApplicationShutdown {\n private readonly logger = new Logger(PollerService.name);\n private readonly pollers = new Map<string, PollerState>();\n\n start(queueName: string, processNext: ProcessNextFn, options: PollOptions = {}): void {\n if (this.pollers.has(queueName)) {\n this.logger.warn(`Poller \"${queueName}\" already started; ignoring.`);\n return;\n }\n\n const opts: Required<PollOptions> = {\n baseDelayMs: options.baseDelayMs ?? 1000,\n maxDelayMs: options.maxDelayMs ?? 30_000,\n timeoutPerIterationMs: options.timeoutPerIterationMs ?? 60_000,\n jitter: options.jitter ?? true,\n };\n\n const state: PollerState = {\n queueName,\n processNext,\n opts,\n inFlight: false,\n stopped: false,\n backoff: opts.baseDelayMs,\n nextTimer: undefined,\n };\n\n this.pollers.set(queueName, state);\n // kick off on next tick\n setImmediate(() => this.poll(state).catch(() => { }));\n this.logger.log(`Started poller \"${queueName}\"`);\n }\n\n stop(queueName: string): void {\n const state = this.pollers.get(queueName);\n if (!state) return;\n\n state.stopped = true;\n if (state.nextTimer) {\n clearTimeout(state.nextTimer);\n state.nextTimer = undefined;\n }\n this.pollers.delete(queueName);\n this.logger.log(`Stopped poller \"${queueName}\"`);\n }\n\n stopAll(): void {\n for (const name of Array.from(this.pollers.keys())) {\n this.stop(name);\n }\n }\n\n async onModuleDestroy(): Promise<void> {\n this.stopAll();\n }\n\n async beforeApplicationShutdown(): Promise<void> {\n this.stopAll();\n }\n\n // ---- internals ----\n\n private async poll(state: PollerState): Promise<void> {\n if (state.stopped || state.inFlight) return;\n state.inFlight = true;\n\n try {\n await this.withTimeout(\n state.processNext(state.queueName),\n state.opts.timeoutPerIterationMs,\n );\n\n // success: reset backoff and schedule next run after base delay\n state.backoff = state.opts.baseDelayMs;\n // this.logger.debug(`[${state.queueName}] iteration completed`);\n this.schedule(state, state.opts.baseDelayMs);\n } catch (err: unknown) {\n const msg = this.errorToString(err);\n this.logger.error(`[${state.queueName}] iteration failed: ${msg}`);\n\n // failure: schedule with backoff + optional jitter, then increase backoff\n const wait = this.computeWait(state.backoff, state.opts);\n state.backoff = Math.min(state.backoff * 2, state.opts.maxDelayMs);\n this.schedule(state, wait);\n } finally {\n state.inFlight = false;\n }\n }\n\n private schedule(state: PollerState, delayMs: number) {\n if (state.stopped) return;\n if (state.nextTimer) clearTimeout(state.nextTimer);\n\n state.nextTimer = setTimeout(() => {\n // clear reference before calling poll to avoid re-entrancy confusion\n state.nextTimer = undefined;\n this.poll(state).catch(() => { });\n }, delayMs);\n }\n\n private computeWait(currentBackoff: number, opts: Required<PollOptions>): number {\n if (!opts.jitter) return currentBackoff;\n // Full jitter: random in [250ms, currentBackoff * 2], clamped to maxDelayMs\n const doubled = Math.min(currentBackoff * 2, opts.maxDelayMs);\n const jittered = Math.floor(Math.random() * doubled);\n return Math.max(250, jittered);\n }\n\n private async withTimeout<T>(p: Promise<T>, ms: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n try {\n return await Promise.race<T>([\n p,\n new Promise<never>((_, rej) => {\n timer = setTimeout(() => rej(new Error(`Iteration timed out after ${ms} ms`)), ms);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n\n private errorToString(err: unknown): string {\n if (err instanceof Error) return err.stack ?? err.message;\n try {\n return JSON.stringify(err);\n } catch {\n return String(err);\n }\n }\n}"]}