@flusys/nestjs-email 3.0.0 → 4.0.0-rc

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 (44) hide show
  1. package/README.md +1 -1
  2. package/cjs/config/index.js +1 -0
  3. package/cjs/config/message-keys.js +70 -0
  4. package/cjs/controllers/email-config.controller.js +1 -0
  5. package/cjs/controllers/email-send.controller.js +2 -0
  6. package/cjs/controllers/email-template.controller.js +3 -0
  7. package/cjs/modules/email.module.js +0 -2
  8. package/cjs/providers/email-factory.service.js +37 -12
  9. package/cjs/providers/mailgun-provider.js +10 -15
  10. package/cjs/providers/sendgrid-provider.js +10 -16
  11. package/cjs/providers/smtp-provider.js +7 -21
  12. package/cjs/services/email-datasource.provider.js +6 -2
  13. package/cjs/services/email-provider-config.service.js +1 -1
  14. package/cjs/services/email-send.service.js +77 -21
  15. package/cjs/services/email-template.service.js +1 -2
  16. package/config/index.d.ts +1 -0
  17. package/config/message-keys.d.ts +82 -0
  18. package/controllers/email-config.controller.d.ts +7 -7
  19. package/dtos/email-config.dto.d.ts +2 -2
  20. package/dtos/email-send.dto.d.ts +1 -1
  21. package/fesm/config/index.js +1 -0
  22. package/fesm/config/message-keys.js +47 -0
  23. package/fesm/controllers/email-config.controller.js +1 -0
  24. package/fesm/controllers/email-send.controller.js +2 -0
  25. package/fesm/controllers/email-template.controller.js +3 -0
  26. package/fesm/modules/email.module.js +1 -3
  27. package/fesm/providers/email-factory.service.js +38 -13
  28. package/fesm/providers/mailgun-provider.js +11 -16
  29. package/fesm/providers/sendgrid-provider.js +11 -17
  30. package/fesm/providers/smtp-provider.js +7 -21
  31. package/fesm/services/email-datasource.provider.js +7 -3
  32. package/fesm/services/email-provider-config.service.js +1 -1
  33. package/fesm/services/email-send.service.js +78 -22
  34. package/fesm/services/email-template.service.js +1 -2
  35. package/interfaces/email-config.interface.d.ts +1 -1
  36. package/interfaces/email-provider.interface.d.ts +2 -2
  37. package/interfaces/email-template.interface.d.ts +1 -1
  38. package/package.json +3 -3
  39. package/providers/email-factory.service.d.ts +0 -1
  40. package/providers/mailgun-provider.d.ts +0 -2
  41. package/providers/sendgrid-provider.d.ts +0 -2
  42. package/providers/smtp-provider.d.ts +0 -2
  43. package/services/email-datasource.provider.d.ts +0 -2
  44. package/services/email-send.service.d.ts +0 -2
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Email Package Guide
2
2
 
3
3
  > **Package:** `@flusys/nestjs-email`
4
- > **Version:** 3.0.0
4
+ > **Version:** 3.0.1
5
5
  > **Type:** Email sending with templates, multiple providers, and multi-tenant support
6
6
 
7
7
  ## Table of Contents
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  _export_star(require("./email.constants"), exports);
6
+ _export_star(require("./message-keys"), exports);
6
7
  function _export_star(from, to) {
7
8
  Object.keys(from).forEach(function(k) {
8
9
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -0,0 +1,70 @@
1
+ // ==================== EMAIL MODULE MESSAGE KEYS ====================
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
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 EMAIL_CONFIG_MESSAGES () {
14
+ return EMAIL_CONFIG_MESSAGES;
15
+ },
16
+ get EMAIL_MODULE_MESSAGES () {
17
+ return EMAIL_MODULE_MESSAGES;
18
+ },
19
+ get EMAIL_SEND_MESSAGES () {
20
+ return EMAIL_SEND_MESSAGES;
21
+ },
22
+ get EMAIL_TEMPLATE_MESSAGES () {
23
+ return EMAIL_TEMPLATE_MESSAGES;
24
+ }
25
+ });
26
+ const EMAIL_CONFIG_MESSAGES = {
27
+ CREATE_SUCCESS: 'email.config.create.success',
28
+ CREATE_MANY_SUCCESS: 'email.config.create.many.success',
29
+ GET_SUCCESS: 'email.config.get.success',
30
+ GET_ALL_SUCCESS: 'email.config.get.all.success',
31
+ UPDATE_SUCCESS: 'email.config.update.success',
32
+ UPDATE_MANY_SUCCESS: 'email.config.update.many.success',
33
+ DELETE_SUCCESS: 'email.config.delete.success',
34
+ RESTORE_SUCCESS: 'email.config.restore.success',
35
+ NOT_FOUND: 'email.config.not.found',
36
+ ACTIVE_SUCCESS: 'email.config.active.success',
37
+ TEST_SUCCESS: 'email.config.test.success',
38
+ TEST_FAILED: 'email.config.test.failed'
39
+ };
40
+ const EMAIL_TEMPLATE_MESSAGES = {
41
+ CREATE_SUCCESS: 'email.template.create.success',
42
+ CREATE_MANY_SUCCESS: 'email.template.create.many.success',
43
+ GET_SUCCESS: 'email.template.get.success',
44
+ GET_ALL_SUCCESS: 'email.template.get.all.success',
45
+ UPDATE_SUCCESS: 'email.template.update.success',
46
+ UPDATE_MANY_SUCCESS: 'email.template.update.many.success',
47
+ DELETE_SUCCESS: 'email.template.delete.success',
48
+ RESTORE_SUCCESS: 'email.template.restore.success',
49
+ NOT_FOUND: 'email.template.not.found',
50
+ PREVIEW_SUCCESS: 'email.template.preview.success'
51
+ };
52
+ const EMAIL_SEND_MESSAGES = {
53
+ SUCCESS: 'email.send.success',
54
+ FAILED: 'email.send.failed',
55
+ QUEUED: 'email.send.queued',
56
+ TEMPLATE_SUCCESS: 'email.send.template.success',
57
+ BULK_SUCCESS: 'email.send.bulk.success',
58
+ TEST_SUCCESS: 'email.send.test.success',
59
+ CONFIG_NOT_FOUND: 'email.send.config.not.found',
60
+ CONFIG_INACTIVE: 'email.send.config.inactive',
61
+ CONFIG_DEFAULT_NOT_FOUND: 'email.send.config.default.not.found',
62
+ TEMPLATE_NOT_FOUND: 'email.send.template.not.found',
63
+ TEMPLATE_INACTIVE: 'email.send.template.inactive',
64
+ TEMPLATE_ID_OR_SLUG_REQUIRED: 'email.send.template.id.or.slug.required'
65
+ };
66
+ const EMAIL_MODULE_MESSAGES = {
67
+ EMAIL_CONFIG: EMAIL_CONFIG_MESSAGES,
68
+ EMAIL_TEMPLATE: EMAIL_TEMPLATE_MESSAGES,
69
+ EMAIL_SEND: EMAIL_SEND_MESSAGES
70
+ };
@@ -41,6 +41,7 @@ function _ts_param(paramIndex, decorator) {
41
41
  };
42
42
  }
43
43
  let EmailConfigController = class EmailConfigController extends (0, _classes.createApiController)(_dtos.CreateEmailConfigDto, _dtos.UpdateEmailConfigDto, _dtos.EmailConfigResponseDto, {
44
+ entityName: 'emailConfig',
44
45
  security: {
45
46
  insert: {
46
47
  level: 'permission',
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "EmailSendController", {
8
8
  return EmailSendController;
9
9
  }
10
10
  });
11
+ const _config = require("../config");
11
12
  const _decorators = require("@flusys/nestjs-shared/decorators");
12
13
  const _guards = require("@flusys/nestjs-shared/guards");
13
14
  const _interfaces = require("@flusys/nestjs-shared/interfaces");
@@ -59,6 +60,7 @@ let EmailSendController = class EmailSendController {
59
60
  return {
60
61
  success: result.success,
61
62
  message: result.success ? `${label} sent successfully` : `Failed to send ${label.toLowerCase()}`,
63
+ messageKey: result.success ? _config.EMAIL_SEND_MESSAGES.SUCCESS : _config.EMAIL_SEND_MESSAGES.FAILED,
62
64
  data: {
63
65
  success: result.success,
64
66
  messageId: result.messageId,
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "EmailTemplateController", {
9
9
  }
10
10
  });
11
11
  const _classes = require("@flusys/nestjs-shared/classes");
12
+ const _config = require("../config");
12
13
  const _decorators = require("@flusys/nestjs-shared/decorators");
13
14
  const _guards = require("@flusys/nestjs-shared/guards");
14
15
  const _interfaces = require("@flusys/nestjs-shared/interfaces");
@@ -44,6 +45,7 @@ function _ts_param(paramIndex, decorator) {
44
45
  };
45
46
  }
46
47
  let EmailTemplateController = class EmailTemplateController extends (0, _classes.createApiController)(_dtos.CreateEmailTemplateDto, _dtos.UpdateEmailTemplateDto, _dtos.EmailTemplateResponseDto, {
48
+ entityName: 'emailTemplate',
47
49
  security: {
48
50
  insert: {
49
51
  level: 'permission',
@@ -94,6 +96,7 @@ let EmailTemplateController = class EmailTemplateController extends (0, _classes
94
96
  return {
95
97
  success: true,
96
98
  message: 'Template retrieved',
99
+ messageKey: _config.EMAIL_TEMPLATE_MESSAGES.GET_SUCCESS,
97
100
  data: data ?? undefined
98
101
  };
99
102
  }
@@ -21,7 +21,6 @@ function _ts_decorate(decorators, target, key, desc) {
21
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;
22
22
  return c > 3 && r && Object.defineProperty(target, key, r), r;
23
23
  }
24
- const logger = new _common.Logger('EmailModule');
25
24
  const CONTROLLERS = [
26
25
  _controllers.EmailConfigController,
27
26
  _controllers.EmailTemplateController,
@@ -38,7 +37,6 @@ const EXPORTED_SERVICES = [
38
37
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SMTP, _providers.SmtpProvider);
39
38
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SENDGRID, _providers.SendGridProvider);
40
39
  _providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.MAILGUN, _providers.MailgunProvider);
41
- logger.log('Registered built-in email providers: SMTP, SendGrid, Mailgun');
42
40
  let EmailModule = class EmailModule {
43
41
  static forRoot(options) {
44
42
  return {
@@ -8,8 +8,11 @@ Object.defineProperty(exports, "EmailFactoryService", {
8
8
  return EmailFactoryService;
9
9
  }
10
10
  });
11
+ const _nestjsshared = require("@flusys/nestjs-shared");
12
+ const _config = require("../config");
11
13
  const _common = require("@nestjs/common");
12
14
  const _crypto = require("crypto");
15
+ const _interfaces = require("../interfaces");
13
16
  const _emailproviderregistry = require("./email-provider.registry");
14
17
  function _define_property(obj, key, value) {
15
18
  if (key in obj) {
@@ -30,6 +33,9 @@ function _ts_decorate(decorators, target, key, desc) {
30
33
  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;
31
34
  return c > 3 && r && Object.defineProperty(target, key, r), r;
32
35
  }
36
+ function _ts_metadata(k, v) {
37
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
38
+ }
33
39
  let EmailFactoryService = class EmailFactoryService {
34
40
  // ─── Public API ─────────────────────────────────────────────────────────────
35
41
  async createProvider(config) {
@@ -38,26 +44,36 @@ let EmailFactoryService = class EmailFactoryService {
38
44
  if (cached) return cached;
39
45
  const ProviderClass = _emailproviderregistry.EmailProviderRegistry.get(config.provider);
40
46
  if (!ProviderClass) {
41
- throw new _common.NotFoundException(`Email provider '${config.provider}' is not registered. Available: ${_emailproviderregistry.EmailProviderRegistry.getAll().join(', ')}`);
47
+ throw new _common.NotFoundException({
48
+ message: `Email provider '${config.provider}' is not registered`,
49
+ messageKey: _config.EMAIL_SEND_MESSAGES.CONFIG_NOT_FOUND,
50
+ messageParams: {
51
+ provider: config.provider,
52
+ available: _emailproviderregistry.EmailProviderRegistry.getAll().join(', ')
53
+ }
54
+ });
42
55
  }
43
56
  try {
44
57
  const instance = new ProviderClass();
45
58
  await instance.initialize?.(config.config);
46
59
  this.providerCache.set(cacheKey, instance);
47
- this.logger.log(`Created email provider: ${config.provider} (key: ${cacheKey})`);
48
60
  return instance;
49
61
  } catch (error) {
50
- this.logger.error(`Failed to create provider ${config.provider}:`, error);
51
- throw new _common.InternalServerErrorException(`Failed to initialize email provider '${config.provider}': ${this.extractErrorMessage(error)}`);
62
+ throw new _common.InternalServerErrorException({
63
+ message: `Failed to initialize email provider '${config.provider}'`,
64
+ messageKey: _nestjsshared.SYSTEM_MESSAGES.SERVICE_NOT_AVAILABLE,
65
+ messageParams: {
66
+ provider: config.provider,
67
+ error: this.extractErrorMessage(error)
68
+ }
69
+ });
52
70
  }
53
71
  }
54
72
  // ─── Lifecycle ──────────────────────────────────────────────────────────────
55
73
  async onModuleDestroy() {
56
- this.logger.log('Cleaning up email provider connections...');
57
- const closePromises = Array.from(this.providerCache.entries()).map(([key, provider])=>this.closeProvider(key, provider));
74
+ const closePromises = Array.from(this.providerCache.entries()).map(([, provider])=>this.closeProvider(provider));
58
75
  await Promise.allSettled(closePromises);
59
76
  this.providerCache.clear();
60
- this.logger.log('Email provider cleanup complete');
61
77
  }
62
78
  // ─── Private Helpers ────────────────────────────────────────────────────────
63
79
  generateCacheKey(config) {
@@ -66,23 +82,32 @@ let EmailFactoryService = class EmailFactoryService {
66
82
  const hash = (0, _crypto.createHash)('sha256').update(configString).digest('hex').substring(0, 16);
67
83
  return `${config.provider}-${hash}`;
68
84
  }
69
- async closeProvider(key, provider) {
85
+ async closeProvider(provider) {
70
86
  if (!provider.close) return;
71
87
  try {
72
88
  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)}`);
89
+ } catch {
90
+ // Silent failure
76
91
  }
77
92
  }
78
93
  extractErrorMessage(error) {
79
94
  return error instanceof Error ? error.message : 'Unknown error';
80
95
  }
81
96
  constructor(){
82
- _define_property(this, "logger", new _common.Logger(EmailFactoryService.name));
83
97
  _define_property(this, "providerCache", new Map());
84
98
  }
85
99
  };
100
+ _ts_decorate([
101
+ (0, _nestjsshared.LogAction)({
102
+ action: 'email.createProvider',
103
+ module: 'email'
104
+ }),
105
+ _ts_metadata("design:type", Function),
106
+ _ts_metadata("design:paramtypes", [
107
+ typeof _interfaces.IEmailProviderConfig === "undefined" ? Object : _interfaces.IEmailProviderConfig
108
+ ]),
109
+ _ts_metadata("design:returntype", Promise)
110
+ ], EmailFactoryService.prototype, "createProvider", null);
86
111
  EmailFactoryService = _ts_decorate([
87
112
  (0, _common.Injectable)()
88
113
  ], EmailFactoryService);
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "MailgunProvider", {
9
9
  }
10
10
  });
11
11
  const _common = require("@nestjs/common");
12
+ const _constants = require("@flusys/nestjs-shared/constants");
12
13
  function _define_property(obj, key, value) {
13
14
  if (key in obj) {
14
15
  Object.defineProperty(obj, key, {
@@ -38,10 +39,11 @@ let MailgunProvider = class MailgunProvider {
38
39
  key: config.apiKey,
39
40
  url
40
41
  });
41
- this.logger.log(`Mailgun Provider initialized for domain: ${config.domain}`);
42
- } catch (error) {
43
- this.logger.error('Failed to initialize Mailgun:', this.extractError(error));
44
- throw new Error('Mailgun initialization failed. Install: npm install mailgun.js form-data');
42
+ } catch {
43
+ throw new _common.InternalServerErrorException({
44
+ message: 'Mailgun initialization failed. Install: npm install mailgun.js form-data',
45
+ messageKey: _constants.SYSTEM_MESSAGES.SDK_NOT_INSTALLED
46
+ });
45
47
  }
46
48
  }
47
49
  async sendEmail(options) {
@@ -54,13 +56,15 @@ let MailgunProvider = class MailgunProvider {
54
56
  try {
55
57
  const messageData = this.buildMessageData(options);
56
58
  const result = await this.client.messages.create(this.domain, messageData);
57
- this.logger.log(`Email sent via Mailgun: ${result.id}`);
58
59
  return {
59
60
  success: true,
60
61
  messageId: result.id
61
62
  };
62
63
  } catch (error) {
63
- return this.handleError('Mailgun send failed', error);
64
+ return {
65
+ success: false,
66
+ error: this.extractError(error)
67
+ };
64
68
  }
65
69
  }
66
70
  async sendBulkEmails(options) {
@@ -105,16 +109,7 @@ let MailgunProvider = class MailgunProvider {
105
109
  extractError(error) {
106
110
  return error instanceof Error ? error.message : 'Unknown error';
107
111
  }
108
- handleError(context, error) {
109
- const message = this.extractError(error);
110
- this.logger.error(`${context}: ${message}`, error);
111
- return {
112
- success: false,
113
- error: message
114
- };
115
- }
116
112
  constructor(){
117
- _define_property(this, "logger", new _common.Logger(MailgunProvider.name));
118
113
  _define_property(this, "client", null);
119
114
  _define_property(this, "domain", null);
120
115
  }
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "SendGridProvider", {
9
9
  }
10
10
  });
11
11
  const _common = require("@nestjs/common");
12
+ const _constants = require("@flusys/nestjs-shared/constants");
12
13
  function _define_property(obj, key, value) {
13
14
  if (key in obj) {
14
15
  Object.defineProperty(obj, key, {
@@ -30,10 +31,11 @@ let SendGridProvider = class SendGridProvider {
30
31
  const sgMailModule = await new Function('return import("@sendgrid/mail")')();
31
32
  this.sgMail = sgMailModule.default || sgMailModule;
32
33
  this.sgMail.setApiKey(config.apiKey);
33
- this.logger.log('SendGrid Provider initialized');
34
- } catch (error) {
35
- this.logger.error('Failed to initialize SendGrid:', this.extractError(error));
36
- throw new Error('SendGrid initialization failed. Install: npm install @sendgrid/mail');
34
+ } catch {
35
+ throw new _common.InternalServerErrorException({
36
+ message: 'SendGrid initialization failed. Install: npm install @sendgrid/mail',
37
+ messageKey: _constants.SYSTEM_MESSAGES.SDK_NOT_INSTALLED
38
+ });
37
39
  }
38
40
  }
39
41
  async sendEmail(options) {
@@ -45,13 +47,15 @@ let SendGridProvider = class SendGridProvider {
45
47
  const msg = this.buildMessage(options, true);
46
48
  const [response] = await this.sgMail.send(msg);
47
49
  const messageId = response.headers['x-message-id'] || response.headers['X-Message-Id'];
48
- this.logger.log(`Email sent via SendGrid: ${messageId}`);
49
50
  return {
50
51
  success: true,
51
52
  messageId
52
53
  };
53
54
  } catch (error) {
54
- return this.handleError('SendGrid send failed', error);
55
+ return {
56
+ success: false,
57
+ error: this.extractError(error)
58
+ };
55
59
  }
56
60
  }
57
61
  async sendBulkEmails(options) {
@@ -66,7 +70,6 @@ let SendGridProvider = class SendGridProvider {
66
70
  success: true
67
71
  }));
68
72
  } catch (error) {
69
- this.logger.error('SendGrid bulk send failed:', error);
70
73
  const errorMessage = this.extractError(error);
71
74
  return options.map(()=>({
72
75
  success: false,
@@ -116,16 +119,7 @@ let SendGridProvider = class SendGridProvider {
116
119
  const sgError = error;
117
120
  return sgError.response?.body?.errors?.[0]?.message || sgError.message || 'Unknown error';
118
121
  }
119
- handleError(context, error) {
120
- const message = this.extractError(error);
121
- this.logger.error(`${context}: ${message}`, error);
122
- return {
123
- success: false,
124
- error: message
125
- };
126
- }
127
122
  constructor(){
128
- _define_property(this, "logger", new _common.Logger(SendGridProvider.name));
129
123
  _define_property(this, "sgMail", null);
130
124
  _define_property(this, "apiKey", null);
131
125
  }
@@ -8,7 +8,6 @@ Object.defineProperty(exports, "SmtpProvider", {
8
8
  return SmtpProvider;
9
9
  }
10
10
  });
11
- const _common = require("@nestjs/common");
12
11
  function _define_property(obj, key, value) {
13
12
  if (key in obj) {
14
13
  Object.defineProperty(obj, key, {
@@ -67,7 +66,6 @@ const VERIFY_TIMEOUT_MS = 10_000;
67
66
  const SEND_TIMEOUT_MS = 30_000;
68
67
  let SmtpProvider = class SmtpProvider {
69
68
  async initialize(config) {
70
- this.logger.log(`Initializing SMTP: host=${config.host}, port=${config.port}`);
71
69
  const nodemailer = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("nodemailer")));
72
70
  this.transporter = nodemailer.createTransport({
73
71
  host: config.host,
@@ -82,7 +80,7 @@ let SmtpProvider = class SmtpProvider {
82
80
  minVersion: config.tls?.minVersion ?? 'TLSv1.2'
83
81
  }
84
82
  });
85
- await this.verifyConnection(config);
83
+ await this.verifyConnection();
86
84
  }
87
85
  async sendEmail(options) {
88
86
  if (!this.transporter) return {
@@ -107,13 +105,15 @@ let SmtpProvider = class SmtpProvider {
107
105
  }))
108
106
  };
109
107
  const info = await this.withTimeout(this.transporter.sendMail(mailOptions), SEND_TIMEOUT_MS, 'SMTP send timeout');
110
- this.logger.log(`Email sent via SMTP: ${info.messageId}`);
111
108
  return {
112
109
  success: true,
113
110
  messageId: info.messageId
114
111
  };
115
112
  } catch (error) {
116
- return this.handleError('SMTP send failed', error);
113
+ return {
114
+ success: false,
115
+ error: this.extractError(error)
116
+ };
117
117
  }
118
118
  }
119
119
  async sendBulkEmails(options) {
@@ -135,13 +135,8 @@ let SmtpProvider = class SmtpProvider {
135
135
  }
136
136
  }
137
137
  // ─── Private Helpers ────────────────────────────────────────────────────────
138
- async verifyConnection(config) {
139
- try {
140
- await this.withTimeout(this.transporter.verify(), VERIFY_TIMEOUT_MS, 'SMTP verification timeout');
141
- this.logger.log(`SMTP Provider verified: ${config.host}:${config.port}`);
142
- } catch (error) {
143
- this.logger.warn(`SMTP verification failed: ${this.extractError(error)}`);
144
- }
138
+ async verifyConnection() {
139
+ await this.withTimeout(this.transporter.verify(), VERIFY_TIMEOUT_MS, 'SMTP verification timeout');
145
140
  }
146
141
  formatFrom(from, fromName) {
147
142
  return fromName ? `"${fromName}" <${from}>` : from;
@@ -159,16 +154,7 @@ let SmtpProvider = class SmtpProvider {
159
154
  extractError(error) {
160
155
  return error instanceof Error ? error.message : 'Unknown error';
161
156
  }
162
- handleError(context, error) {
163
- const message = this.extractError(error);
164
- this.logger.error(`${context}: ${message}`, error instanceof Error ? error.stack : undefined);
165
- return {
166
- success: false,
167
- error: message
168
- };
169
- }
170
157
  constructor(){
171
- _define_property(this, "logger", new _common.Logger(SmtpProvider.name));
172
158
  _define_property(this, "transporter", null);
173
159
  }
174
160
  };
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "EmailDataSourceProvider", {
9
9
  }
10
10
  });
11
11
  const _modules = require("@flusys/nestjs-shared/modules");
12
+ const _constants = require("@flusys/nestjs-shared/constants");
12
13
  const _common = require("@nestjs/common");
13
14
  const _core = require("@nestjs/core");
14
15
  const _express = require("express");
@@ -71,7 +72,10 @@ let EmailDataSourceProvider = class EmailDataSourceProvider extends _modules.Mul
71
72
  }
72
73
  const config = this.getDefaultDatabaseConfig();
73
74
  if (!config) {
74
- throw new _common.InternalServerErrorException('No database config available. Provide defaultDatabaseConfig or tenantDefaultDatabaseConfig.');
75
+ throw new _common.InternalServerErrorException({
76
+ message: 'No database config available. Provide defaultDatabaseConfig or tenantDefaultDatabaseConfig.',
77
+ messageKey: _constants.SYSTEM_MESSAGES.DATABASE_CONFIG_NOT_AVAILABLE
78
+ });
75
79
  }
76
80
  const connectionPromise = this.createDataSourceFromConfig(config);
77
81
  EmailDataSourceProvider.singleConnectionLock = connectionPromise;
@@ -104,7 +108,7 @@ let EmailDataSourceProvider = class EmailDataSourceProvider extends _modules.Mul
104
108
  }
105
109
  }
106
110
  constructor(configService, request){
107
- super(EmailDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), _define_property(this, "logger", void 0), this.configService = configService, this.logger = new _common.Logger(EmailDataSourceProvider.name);
111
+ super(EmailDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
108
112
  }
109
113
  };
110
114
  _define_property(EmailDataSourceProvider, "tenantConnections", new Map());
@@ -129,7 +129,7 @@ let EmailProviderConfigService = class EmailProviderConfigService extends _class
129
129
  });
130
130
  }
131
131
  constructor(cacheManager, utilsService, emailConfig, dataSourceProvider){
132
- super('emailConfig', null, cacheManager, utilsService, EmailProviderConfigService.name, true), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "emailConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.emailConfig = emailConfig, this.dataSourceProvider = dataSourceProvider;
132
+ super('emailConfig', null, cacheManager, utilsService, EmailProviderConfigService.name, true, 'email'), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "emailConfig", void 0), _define_property(this, "dataSourceProvider", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.emailConfig = emailConfig, this.dataSourceProvider = dataSourceProvider;
133
133
  }
134
134
  };
135
135
  EmailProviderConfigService = _ts_decorate([