@flusys/nestjs-email 1.1.0-beta → 1.1.0

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 (100) hide show
  1. package/README.md +604 -0
  2. package/cjs/config/email.constants.js +0 -18
  3. package/cjs/config/index.js +0 -1
  4. package/cjs/controllers/email-config.controller.js +46 -4
  5. package/cjs/controllers/email-send.controller.js +13 -26
  6. package/cjs/controllers/email-template.controller.js +60 -11
  7. package/cjs/docs/email-swagger.config.js +18 -80
  8. package/cjs/dtos/email-config.dto.js +6 -106
  9. package/cjs/dtos/email-send.dto.js +101 -123
  10. package/cjs/dtos/email-template.dto.js +41 -103
  11. package/cjs/entities/email-config-with-company.entity.js +2 -2
  12. package/cjs/entities/email-config.entity.js +91 -3
  13. package/cjs/entities/email-template-with-company.entity.js +5 -3
  14. package/cjs/entities/email-template.entity.js +119 -3
  15. package/cjs/entities/index.js +34 -19
  16. package/cjs/index.js +1 -0
  17. package/cjs/interfaces/email-provider.interface.js +1 -3
  18. package/cjs/modules/email.module.js +50 -104
  19. package/cjs/providers/email-factory.service.js +37 -109
  20. package/cjs/providers/email-provider.registry.js +5 -15
  21. package/cjs/providers/mailgun-provider.js +54 -58
  22. package/cjs/providers/sendgrid-provider.js +68 -92
  23. package/cjs/providers/smtp-provider.js +58 -69
  24. package/cjs/{config → services}/email-config.service.js +9 -32
  25. package/cjs/services/email-datasource.provider.js +17 -104
  26. package/cjs/services/email-provider-config.service.js +28 -58
  27. package/cjs/services/email-send.service.js +120 -125
  28. package/cjs/services/email-template.service.js +62 -85
  29. package/cjs/services/index.js +2 -1
  30. package/cjs/utils/email-templates.util.js +64 -0
  31. package/cjs/utils/index.js +18 -0
  32. package/config/email.constants.d.ts +0 -9
  33. package/config/index.d.ts +0 -1
  34. package/controllers/email-send.controller.d.ts +5 -12
  35. package/controllers/email-template.controller.d.ts +5 -7
  36. package/dtos/email-config.dto.d.ts +5 -13
  37. package/dtos/email-send.dto.d.ts +17 -21
  38. package/dtos/email-template.dto.d.ts +5 -16
  39. package/entities/email-config-with-company.entity.d.ts +2 -2
  40. package/entities/email-config.entity.d.ts +9 -2
  41. package/entities/email-template-with-company.entity.d.ts +2 -2
  42. package/entities/email-template.entity.d.ts +13 -2
  43. package/entities/index.d.ts +9 -3
  44. package/fesm/config/email.constants.js +0 -9
  45. package/fesm/config/index.js +0 -1
  46. package/fesm/controllers/email-config.controller.js +49 -7
  47. package/fesm/controllers/email-send.controller.js +13 -26
  48. package/fesm/controllers/email-template.controller.js +61 -12
  49. package/fesm/docs/email-swagger.config.js +21 -86
  50. package/fesm/dtos/email-config.dto.js +9 -115
  51. package/fesm/dtos/email-send.dto.js +103 -139
  52. package/fesm/dtos/email-template.dto.js +43 -111
  53. package/fesm/entities/email-config-with-company.entity.js +2 -2
  54. package/fesm/entities/email-config.entity.js +92 -4
  55. package/fesm/entities/email-template-with-company.entity.js +5 -3
  56. package/fesm/entities/email-template.entity.js +120 -4
  57. package/fesm/entities/index.js +22 -16
  58. package/fesm/index.js +1 -0
  59. package/fesm/interfaces/email-config.interface.js +1 -3
  60. package/fesm/interfaces/email-module-options.interface.js +1 -3
  61. package/fesm/interfaces/email-provider.interface.js +1 -5
  62. package/fesm/interfaces/email-template.interface.js +1 -3
  63. package/fesm/modules/email.module.js +52 -106
  64. package/fesm/providers/email-factory.service.js +38 -69
  65. package/fesm/providers/email-provider.registry.js +6 -19
  66. package/fesm/providers/mailgun-provider.js +55 -63
  67. package/fesm/providers/sendgrid-provider.js +69 -97
  68. package/fesm/providers/smtp-provider.js +59 -73
  69. package/fesm/{config → services}/email-config.service.js +9 -32
  70. package/fesm/services/email-datasource.provider.js +18 -64
  71. package/fesm/services/email-provider-config.service.js +26 -56
  72. package/fesm/services/email-send.service.js +118 -123
  73. package/fesm/services/email-template.service.js +60 -83
  74. package/fesm/services/index.js +2 -1
  75. package/fesm/utils/email-templates.util.js +47 -0
  76. package/fesm/utils/index.js +1 -0
  77. package/index.d.ts +1 -0
  78. package/interfaces/email-config.interface.d.ts +6 -0
  79. package/interfaces/email-module-options.interface.d.ts +0 -5
  80. package/modules/email.module.d.ts +1 -2
  81. package/package.json +9 -4
  82. package/providers/email-factory.service.d.ts +4 -7
  83. package/providers/mailgun-provider.d.ts +6 -2
  84. package/providers/sendgrid-provider.d.ts +6 -2
  85. package/providers/smtp-provider.d.ts +7 -2
  86. package/services/email-config.service.d.ts +12 -0
  87. package/services/email-datasource.provider.d.ts +3 -6
  88. package/services/email-provider-config.service.d.ts +3 -3
  89. package/services/email-send.service.d.ts +11 -3
  90. package/services/email-template.service.d.ts +5 -4
  91. package/services/index.d.ts +2 -1
  92. package/utils/email-templates.util.d.ts +2 -0
  93. package/utils/index.d.ts +1 -0
  94. package/cjs/entities/email-config-base.entity.js +0 -111
  95. package/cjs/entities/email-template-base.entity.js +0 -134
  96. package/config/email-config.service.d.ts +0 -13
  97. package/entities/email-config-base.entity.d.ts +0 -11
  98. package/entities/email-template-base.entity.d.ts +0 -14
  99. package/fesm/entities/email-config-base.entity.js +0 -101
  100. package/fesm/entities/email-template-base.entity.js +0 -124
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "EmailTemplateWithCompany", {
9
9
  }
10
10
  });
11
11
  const _typeorm = require("typeorm");
12
- const _emailtemplatebaseentity = require("./email-template-base.entity");
12
+ const _emailtemplateentity = require("./email-template.entity");
13
13
  function _define_property(obj, key, value) {
14
14
  if (key in obj) {
15
15
  Object.defineProperty(obj, key, {
@@ -32,7 +32,7 @@ function _ts_decorate(decorators, target, key, desc) {
32
32
  function _ts_metadata(k, v) {
33
33
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
34
34
  }
35
- let EmailTemplateWithCompany = class EmailTemplateWithCompany extends _emailtemplatebaseentity.EmailTemplateBase {
35
+ let EmailTemplateWithCompany = class EmailTemplateWithCompany extends _emailtemplateentity.EmailTemplate {
36
36
  constructor(...args){
37
37
  super(...args), _define_property(this, "companyId", void 0);
38
38
  }
@@ -55,7 +55,9 @@ EmailTemplateWithCompany = _ts_decorate([
55
55
  (0, _typeorm.Index)([
56
56
  'companyId',
57
57
  'slug'
58
- ]),
58
+ ], {
59
+ unique: true
60
+ }),
59
61
  (0, _typeorm.Index)([
60
62
  'companyId',
61
63
  'isActive'
@@ -8,18 +8,134 @@ Object.defineProperty(exports, "EmailTemplate", {
8
8
  return EmailTemplate;
9
9
  }
10
10
  });
11
+ const _entities = require("@flusys/nestjs-shared/entities");
11
12
  const _typeorm = require("typeorm");
12
- const _emailtemplatebaseentity = require("./email-template-base.entity");
13
+ function _define_property(obj, key, value) {
14
+ if (key in obj) {
15
+ Object.defineProperty(obj, key, {
16
+ value: value,
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true
20
+ });
21
+ } else {
22
+ obj[key] = value;
23
+ }
24
+ return obj;
25
+ }
13
26
  function _ts_decorate(decorators, target, key, desc) {
14
27
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
15
28
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
16
29
  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;
17
30
  return c > 3 && r && Object.defineProperty(target, key, r), r;
18
31
  }
19
- let EmailTemplate = class EmailTemplate extends _emailtemplatebaseentity.EmailTemplateBase {
32
+ function _ts_metadata(k, v) {
33
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
34
+ }
35
+ let EmailTemplate = class EmailTemplate extends _entities.Identity {
36
+ constructor(...args){
37
+ super(...args), _define_property(this, "name", void 0), _define_property(this, "slug", void 0), _define_property(this, "description", void 0), _define_property(this, "subject", void 0), _define_property(this, "schema", void 0), _define_property(this, "htmlContent", void 0), _define_property(this, "textContent", void 0), _define_property(this, "schemaVersion", void 0), _define_property(this, "isActive", void 0), _define_property(this, "isHtml", void 0), _define_property(this, "metadata", void 0);
38
+ }
20
39
  };
40
+ _ts_decorate([
41
+ (0, _typeorm.Column)({
42
+ type: 'varchar',
43
+ length: 255,
44
+ nullable: false
45
+ }),
46
+ _ts_metadata("design:type", String)
47
+ ], EmailTemplate.prototype, "name", void 0);
48
+ _ts_decorate([
49
+ (0, _typeorm.Column)({
50
+ type: 'varchar',
51
+ length: 255,
52
+ nullable: false
53
+ }),
54
+ _ts_metadata("design:type", String)
55
+ ], EmailTemplate.prototype, "slug", void 0);
56
+ _ts_decorate([
57
+ (0, _typeorm.Column)({
58
+ type: 'varchar',
59
+ length: 500,
60
+ nullable: true
61
+ }),
62
+ _ts_metadata("design:type", Object)
63
+ ], EmailTemplate.prototype, "description", void 0);
64
+ _ts_decorate([
65
+ (0, _typeorm.Column)({
66
+ type: 'varchar',
67
+ length: 500,
68
+ nullable: false
69
+ }),
70
+ _ts_metadata("design:type", String)
71
+ ], EmailTemplate.prototype, "subject", void 0);
72
+ _ts_decorate([
73
+ (0, _typeorm.Column)({
74
+ type: 'json',
75
+ nullable: false
76
+ }),
77
+ _ts_metadata("design:type", typeof Record === "undefined" ? Object : Record)
78
+ ], EmailTemplate.prototype, "schema", void 0);
79
+ _ts_decorate([
80
+ (0, _typeorm.Column)({
81
+ type: 'text',
82
+ nullable: false,
83
+ name: 'html_content'
84
+ }),
85
+ _ts_metadata("design:type", String)
86
+ ], EmailTemplate.prototype, "htmlContent", void 0);
87
+ _ts_decorate([
88
+ (0, _typeorm.Column)({
89
+ type: 'text',
90
+ nullable: true,
91
+ name: 'text_content'
92
+ }),
93
+ _ts_metadata("design:type", Object)
94
+ ], EmailTemplate.prototype, "textContent", void 0);
95
+ _ts_decorate([
96
+ (0, _typeorm.Column)({
97
+ type: 'int',
98
+ nullable: false,
99
+ default: 1,
100
+ name: 'schema_version'
101
+ }),
102
+ _ts_metadata("design:type", Number)
103
+ ], EmailTemplate.prototype, "schemaVersion", void 0);
104
+ _ts_decorate([
105
+ (0, _typeorm.Column)({
106
+ type: 'boolean',
107
+ default: true,
108
+ name: 'is_active'
109
+ }),
110
+ _ts_metadata("design:type", Boolean)
111
+ ], EmailTemplate.prototype, "isActive", void 0);
112
+ _ts_decorate([
113
+ (0, _typeorm.Column)({
114
+ type: 'boolean',
115
+ default: true,
116
+ name: 'is_html'
117
+ }),
118
+ _ts_metadata("design:type", Boolean)
119
+ ], EmailTemplate.prototype, "isHtml", void 0);
120
+ _ts_decorate([
121
+ (0, _typeorm.Column)('simple-json', {
122
+ nullable: true
123
+ }),
124
+ _ts_metadata("design:type", Object)
125
+ ], EmailTemplate.prototype, "metadata", void 0);
21
126
  EmailTemplate = _ts_decorate([
22
127
  (0, _typeorm.Entity)({
23
128
  name: 'email_template'
24
- })
129
+ }),
130
+ (0, _typeorm.Index)([
131
+ 'name'
132
+ ]),
133
+ (0, _typeorm.Index)([
134
+ 'slug'
135
+ ], {
136
+ unique: true
137
+ }),
138
+ (0, _typeorm.Index)([
139
+ 'isActive'
140
+ ])
25
141
  ], EmailTemplate);
@@ -1,19 +1,35 @@
1
+ // Entities without company feature
1
2
  "use strict";
2
3
  Object.defineProperty(exports, "__esModule", {
3
4
  value: true
4
5
  });
5
- Object.defineProperty(exports, "getEmailEntitiesByConfig", {
6
- enumerable: true,
7
- get: function() {
6
+ function _export(target, all) {
7
+ for(var name in all)Object.defineProperty(target, name, {
8
+ enumerable: true,
9
+ get: Object.getOwnPropertyDescriptor(all, name).get
10
+ });
11
+ }
12
+ _export(exports, {
13
+ get EmailCompanyEntities () {
14
+ return EmailCompanyEntities;
15
+ },
16
+ get EmailConfigBase () {
17
+ return _emailconfigentity.EmailConfig;
18
+ },
19
+ get EmailCoreEntities () {
20
+ return EmailCoreEntities;
21
+ },
22
+ get EmailTemplateBase () {
23
+ return _emailtemplateentity.EmailTemplate;
24
+ },
25
+ get getEmailEntitiesByConfig () {
8
26
  return getEmailEntitiesByConfig;
9
27
  }
10
28
  });
11
- _export_star(require("./email-config-base.entity"), exports);
12
- _export_star(require("./email-config.entity"), exports);
13
- _export_star(require("./email-config-with-company.entity"), exports);
14
- _export_star(require("./email-template-base.entity"), exports);
15
- _export_star(require("./email-template.entity"), exports);
16
- _export_star(require("./email-template-with-company.entity"), exports);
29
+ const _emailconfigentity = _export_star(require("./email-config.entity"), exports);
30
+ const _emailtemplateentity = _export_star(require("./email-template.entity"), exports);
31
+ const _emailconfigwithcompanyentity = _export_star(require("./email-config-with-company.entity"), exports);
32
+ const _emailtemplatewithcompanyentity = _export_star(require("./email-template-with-company.entity"), exports);
17
33
  function _export_star(from, to) {
18
34
  Object.keys(from).forEach(function(k) {
19
35
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -27,15 +43,14 @@ function _export_star(from, to) {
27
43
  });
28
44
  return from;
29
45
  }
46
+ const EmailCoreEntities = [
47
+ _emailconfigentity.EmailConfig,
48
+ _emailtemplateentity.EmailTemplate
49
+ ];
50
+ const EmailCompanyEntities = [
51
+ _emailconfigwithcompanyentity.EmailConfigWithCompany,
52
+ _emailtemplatewithcompanyentity.EmailTemplateWithCompany
53
+ ];
30
54
  function getEmailEntitiesByConfig(enableCompanyFeature) {
31
- if (enableCompanyFeature) {
32
- return [
33
- require('./email-config-with-company.entity').EmailConfigWithCompany,
34
- require('./email-template-with-company.entity').EmailTemplateWithCompany
35
- ];
36
- }
37
- return [
38
- require('./email-config.entity').EmailConfig,
39
- require('./email-template.entity').EmailTemplate
40
- ];
55
+ return enableCompanyFeature ? EmailCompanyEntities : EmailCoreEntities;
41
56
  }
package/cjs/index.js CHANGED
@@ -12,6 +12,7 @@ _export_star(require("./dtos"), exports);
12
12
  _export_star(require("./enums"), exports);
13
13
  _export_star(require("./interfaces"), exports);
14
14
  _export_star(require("./providers"), exports);
15
+ _export_star(require("./utils"), exports);
15
16
  function _export_star(from, to) {
16
17
  Object.keys(from).forEach(function(k) {
17
18
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -1,6 +1,4 @@
1
- /**
2
- * Email provider configuration
3
- */ "use strict";
1
+ "use strict";
4
2
  Object.defineProperty(exports, "__esModule", {
5
3
  value: true
6
4
  });
@@ -10,33 +10,37 @@ Object.defineProperty(exports, "EmailModule", {
10
10
  });
11
11
  const _modules = require("@flusys/nestjs-shared/modules");
12
12
  const _common = require("@nestjs/common");
13
- const _config = require("../config");
14
13
  const _emailconstants = require("../config/email.constants");
14
+ const _controllers = require("../controllers");
15
15
  const _enums = require("../enums");
16
16
  const _providers = require("../providers");
17
17
  const _services = require("../services");
18
- const _controllers = require("../controllers");
19
18
  function _ts_decorate(decorators, target, key, desc) {
20
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
21
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
22
21
  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;
23
22
  return c > 3 && r && Object.defineProperty(target, key, r), r;
24
23
  }
25
- // Auto-register built-in email providers
26
24
  const logger = new _common.Logger('EmailModule');
27
- // Register all providers (they use dynamic imports internally)
25
+ const CONTROLLERS = [
26
+ _controllers.EmailConfigController,
27
+ _controllers.EmailTemplateController,
28
+ _controllers.EmailSendController
29
+ ];
30
+ const EXPORTED_SERVICES = [
31
+ _services.EmailConfigService,
32
+ _services.EmailDataSourceProvider,
33
+ _services.EmailProviderConfigService,
34
+ _services.EmailTemplateService,
35
+ _services.EmailSendService,
36
+ _providers.EmailFactoryService
37
+ ];
28
38
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SMTP, _providers.SmtpProvider);
29
- logger.log('Registered SmtpProvider');
30
39
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SENDGRID, _providers.SendGridProvider);
31
- logger.log('Registered SendGridProvider');
32
40
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.MAILGUN, _providers.MailgunProvider);
33
- logger.log('Registered MailgunProvider');
41
+ logger.log('Registered built-in email providers: SMTP, SendGrid, Mailgun');
34
42
  let EmailModule = class EmailModule {
35
- /**
36
- * Register EmailModule synchronously
37
- */ static forRoot(options) {
38
- const controllers = this.getControllers(options);
39
- const providers = this.getProviders(options);
43
+ static forRoot(options) {
40
44
  return {
41
45
  module: EmailModule,
42
46
  global: options.global ?? false,
@@ -44,23 +48,12 @@ let EmailModule = class EmailModule {
44
48
  _modules.CacheModule,
45
49
  _modules.UtilsModule
46
50
  ],
47
- controllers: options.includeController !== false ? controllers : [],
48
- providers,
49
- exports: [
50
- _config.EmailConfigService,
51
- _services.EmailDataSourceProvider,
52
- _services.EmailProviderConfigService,
53
- _services.EmailTemplateService,
54
- _services.EmailSendService,
55
- _providers.EmailFactoryService
56
- ]
51
+ controllers: options.includeController !== false ? CONTROLLERS : [],
52
+ providers: this.buildProviders(options),
53
+ exports: EXPORTED_SERVICES
57
54
  };
58
55
  }
59
- /**
60
- * Register EmailModule asynchronously
61
- */ static forRootAsync(options) {
62
- const controllers = this.getControllers(options);
63
- const asyncProviders = this.createAsyncProviders(options);
56
+ static forRootAsync(options) {
64
57
  return {
65
58
  module: EmailModule,
66
59
  global: options.global ?? false,
@@ -69,43 +62,19 @@ let EmailModule = class EmailModule {
69
62
  _modules.CacheModule,
70
63
  _modules.UtilsModule
71
64
  ],
72
- controllers: options.includeController !== false ? controllers : [],
65
+ controllers: options.includeController !== false ? CONTROLLERS : [],
73
66
  providers: [
74
- ...asyncProviders,
75
- ...this.getProviders(options, false)
67
+ ...this.createAsyncProviders(options),
68
+ ...this.buildProviders()
76
69
  ],
77
- exports: [
78
- _config.EmailConfigService,
79
- _services.EmailDataSourceProvider,
80
- _services.EmailProviderConfigService,
81
- _services.EmailTemplateService,
82
- _services.EmailSendService,
83
- _providers.EmailFactoryService
84
- ]
70
+ exports: EXPORTED_SERVICES
85
71
  };
86
72
  }
87
- // ==================== Private Helper Methods ====================
88
- /**
89
- * Get controllers
90
- */ static getControllers(_options) {
91
- return [
92
- _controllers.EmailConfigController,
93
- _controllers.EmailTemplateController,
94
- _controllers.EmailSendController
95
- ];
96
- }
97
- /**
98
- * Get providers
99
- */ static getProviders(options, includeOptionsProvider = true) {
73
+ static buildProviders(options) {
100
74
  const providers = [
101
- _config.EmailConfigService,
102
- _services.EmailDataSourceProvider,
103
- _services.EmailProviderConfigService,
104
- _services.EmailTemplateService,
105
- _services.EmailSendService,
106
- _providers.EmailFactoryService
75
+ ...EXPORTED_SERVICES
107
76
  ];
108
- if (includeOptionsProvider) {
77
+ if (options) {
109
78
  providers.unshift({
110
79
  provide: _emailconstants.EMAIL_MODULE_OPTIONS,
111
80
  useValue: options
@@ -113,63 +82,40 @@ let EmailModule = class EmailModule {
113
82
  }
114
83
  return providers;
115
84
  }
116
- /**
117
- * Create async providers for forRootAsync
118
- */ static createAsyncProviders(options) {
85
+ static createAsyncProviders(options) {
119
86
  if (options.useFactory) {
120
87
  return [
121
88
  {
122
89
  provide: _emailconstants.EMAIL_MODULE_OPTIONS,
123
- useFactory: async (...args)=>{
124
- const config = await options.useFactory(...args);
125
- return {
90
+ useFactory: async (...args)=>({
126
91
  ...options,
127
- config
128
- };
129
- },
92
+ config: await options.useFactory(...args)
93
+ }),
130
94
  inject: options.inject || []
131
95
  }
132
96
  ];
133
97
  }
98
+ const factoryClass = options.useClass || options.useExisting;
99
+ if (!factoryClass) return [];
100
+ const providers = [
101
+ {
102
+ provide: _emailconstants.EMAIL_MODULE_OPTIONS,
103
+ useFactory: async (factory)=>({
104
+ ...options,
105
+ config: await factory.createEmailOptions()
106
+ }),
107
+ inject: [
108
+ factoryClass
109
+ ]
110
+ }
111
+ ];
134
112
  if (options.useClass) {
135
- return [
136
- {
137
- provide: _emailconstants.EMAIL_MODULE_OPTIONS,
138
- useFactory: async (optionsFactory)=>{
139
- const config = await optionsFactory.createEmailOptions();
140
- return {
141
- ...options,
142
- config
143
- };
144
- },
145
- inject: [
146
- options.useClass
147
- ]
148
- },
149
- {
150
- provide: options.useClass,
151
- useClass: options.useClass
152
- }
153
- ];
154
- }
155
- if (options.useExisting) {
156
- return [
157
- {
158
- provide: _emailconstants.EMAIL_MODULE_OPTIONS,
159
- useFactory: async (optionsFactory)=>{
160
- const config = await optionsFactory.createEmailOptions();
161
- return {
162
- ...options,
163
- config
164
- };
165
- },
166
- inject: [
167
- options.useExisting
168
- ]
169
- }
170
- ];
113
+ providers.push({
114
+ provide: options.useClass,
115
+ useClass: options.useClass
116
+ });
171
117
  }
172
- return [];
118
+ return providers;
173
119
  }
174
120
  };
175
121
  EmailModule = _ts_decorate([
@@ -9,8 +9,7 @@ Object.defineProperty(exports, "EmailFactoryService", {
9
9
  }
10
10
  });
11
11
  const _common = require("@nestjs/common");
12
- const _crypto = /*#__PURE__*/ _interop_require_wildcard(require("crypto"));
13
- const _emailconfigservice = require("../config/email-config.service");
12
+ const _crypto = require("crypto");
14
13
  const _emailproviderregistry = require("./email-provider.registry");
15
14
  function _define_property(obj, key, value) {
16
15
  if (key in obj) {
@@ -25,136 +24,65 @@ function _define_property(obj, key, value) {
25
24
  }
26
25
  return obj;
27
26
  }
28
- function _getRequireWildcardCache(nodeInterop) {
29
- if (typeof WeakMap !== "function") return null;
30
- var cacheBabelInterop = new WeakMap();
31
- var cacheNodeInterop = new WeakMap();
32
- return (_getRequireWildcardCache = function(nodeInterop) {
33
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
34
- })(nodeInterop);
35
- }
36
- function _interop_require_wildcard(obj, nodeInterop) {
37
- if (!nodeInterop && obj && obj.__esModule) {
38
- return obj;
39
- }
40
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
41
- return {
42
- default: obj
43
- };
44
- }
45
- var cache = _getRequireWildcardCache(nodeInterop);
46
- if (cache && cache.has(obj)) {
47
- return cache.get(obj);
48
- }
49
- var newObj = {
50
- __proto__: null
51
- };
52
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
53
- for(var key in obj){
54
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
55
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
56
- if (desc && (desc.get || desc.set)) {
57
- Object.defineProperty(newObj, key, desc);
58
- } else {
59
- newObj[key] = obj[key];
60
- }
61
- }
62
- }
63
- newObj.default = obj;
64
- if (cache) {
65
- cache.set(obj, newObj);
66
- }
67
- return newObj;
68
- }
69
27
  function _ts_decorate(decorators, target, key, desc) {
70
28
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
71
29
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
72
30
  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;
73
31
  return c > 3 && r && Object.defineProperty(target, key, r), r;
74
32
  }
75
- function _ts_metadata(k, v) {
76
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
77
- }
78
- function _ts_param(paramIndex, decorator) {
79
- return function(target, key) {
80
- decorator(target, key, paramIndex);
81
- };
82
- }
83
33
  let EmailFactoryService = class EmailFactoryService {
84
- /**
85
- * Generate a unique cache key for a provider configuration
86
- */ generateCacheKey(config) {
87
- const configString = JSON.stringify(config.config, Object.keys(config.config || {}).sort());
88
- const configHash = _crypto.createHash('sha256').update(configString).digest('hex').substring(0, 16);
89
- return `${config.provider}-${configHash}`;
90
- }
91
- /**
92
- * Create or retrieve a cached email provider instance
93
- */ async createProvider(config) {
94
- const providerKey = this.generateCacheKey(config);
95
- // Return cached provider if exists
96
- if (this.providerCache.has(providerKey)) {
97
- return this.providerCache.get(providerKey);
98
- }
99
- // Get provider class from registry
34
+ // ─── Public API ─────────────────────────────────────────────────────────────
35
+ async createProvider(config) {
36
+ const cacheKey = this.generateCacheKey(config);
37
+ const cached = this.providerCache.get(cacheKey);
38
+ if (cached) return cached;
100
39
  const ProviderClass = _emailproviderregistry.EmailProviderRegistry.get(config.provider);
101
40
  if (!ProviderClass) {
102
- throw new _common.NotFoundException(`Email provider '${config.provider}' is not registered. ` + `Available providers: ${_emailproviderregistry.EmailProviderRegistry.getAll().join(', ')}`);
41
+ throw new _common.NotFoundException(`Email provider '${config.provider}' is not registered. Available: ${_emailproviderregistry.EmailProviderRegistry.getAll().join(', ')}`);
103
42
  }
104
43
  try {
105
- // Create new instance
106
44
  const instance = new ProviderClass();
107
- // Initialize if provider has initialize method
108
- if ('initialize' in instance && typeof instance.initialize === 'function') {
109
- await instance.initialize(config.config);
110
- }
111
- // Cache the instance
112
- this.providerCache.set(providerKey, instance);
113
- this.logger.log(`Created email provider: ${config.provider} (key: ${providerKey})`);
45
+ await instance.initialize?.(config.config);
46
+ this.providerCache.set(cacheKey, instance);
47
+ this.logger.log(`Created email provider: ${config.provider} (key: ${cacheKey})`);
114
48
  return instance;
115
49
  } catch (error) {
116
50
  this.logger.error(`Failed to create provider ${config.provider}:`, error);
117
- throw new Error(`Failed to initialize email provider '${config.provider}': ${error?.message || 'Unknown error'}`);
51
+ throw new _common.InternalServerErrorException(`Failed to initialize email provider '${config.provider}': ${this.extractErrorMessage(error)}`);
118
52
  }
119
53
  }
120
- /**
121
- * Check if a provider is available (registered)
122
- */ isProviderAvailable(providerName) {
123
- return _emailproviderregistry.EmailProviderRegistry.has(providerName);
124
- }
125
- /**
126
- * Get list of available providers
127
- */ getAvailableProviders() {
128
- return _emailproviderregistry.EmailProviderRegistry.getAll();
129
- }
130
- /**
131
- * Cleanup on module destroy
132
- */ async onModuleDestroy() {
54
+ // ─── Lifecycle ──────────────────────────────────────────────────────────────
55
+ async onModuleDestroy() {
133
56
  this.logger.log('Cleaning up email provider connections...');
134
- const closePromises = [];
135
- for (const [key, provider] of this.providerCache.entries()){
136
- if ('close' in provider && typeof provider.close === 'function') {
137
- closePromises.push(provider.close().then(()=>this.logger.debug(`Closed provider: ${key}`)).catch((err)=>this.logger.warn(`Failed to close provider ${key}: ${err.message}`)));
138
- }
139
- }
57
+ const closePromises = Array.from(this.providerCache.entries()).map(([key, provider])=>this.closeProvider(key, provider));
140
58
  await Promise.allSettled(closePromises);
141
59
  this.providerCache.clear();
142
60
  this.logger.log('Email provider cleanup complete');
143
61
  }
144
- constructor(emailConfigService){
145
- _define_property(this, "emailConfigService", void 0);
146
- _define_property(this, "logger", void 0);
147
- _define_property(this, "providerCache", void 0);
148
- this.emailConfigService = emailConfigService;
149
- this.logger = new _common.Logger(EmailFactoryService.name);
150
- this.providerCache = new Map();
62
+ // ─── Private Helpers ────────────────────────────────────────────────────────
63
+ generateCacheKey(config) {
64
+ const sortedKeys = Object.keys(config.config || {}).sort();
65
+ const configString = JSON.stringify(config.config, sortedKeys);
66
+ const hash = (0, _crypto.createHash)('sha256').update(configString).digest('hex').substring(0, 16);
67
+ return `${config.provider}-${hash}`;
68
+ }
69
+ async closeProvider(key, provider) {
70
+ if (!provider.close) return;
71
+ try {
72
+ await provider.close();
73
+ this.logger.debug(`Closed provider: ${key}`);
74
+ } catch (err) {
75
+ this.logger.warn(`Failed to close provider ${key}: ${this.extractErrorMessage(err)}`);
76
+ }
77
+ }
78
+ extractErrorMessage(error) {
79
+ return error instanceof Error ? error.message : 'Unknown error';
80
+ }
81
+ constructor(){
82
+ _define_property(this, "logger", new _common.Logger(EmailFactoryService.name));
83
+ _define_property(this, "providerCache", new Map());
151
84
  }
152
85
  };
153
86
  EmailFactoryService = _ts_decorate([
154
- (0, _common.Injectable)(),
155
- _ts_param(0, (0, _common.Inject)(_emailconfigservice.EmailConfigService)),
156
- _ts_metadata("design:type", Function),
157
- _ts_metadata("design:paramtypes", [
158
- typeof _emailconfigservice.EmailConfigService === "undefined" ? Object : _emailconfigservice.EmailConfigService
159
- ])
87
+ (0, _common.Injectable)()
160
88
  ], EmailFactoryService);