@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.
- package/README.md +1 -1
- package/cjs/config/index.js +1 -0
- package/cjs/config/message-keys.js +70 -0
- package/cjs/controllers/email-config.controller.js +1 -0
- package/cjs/controllers/email-send.controller.js +2 -0
- package/cjs/controllers/email-template.controller.js +3 -0
- package/cjs/modules/email.module.js +0 -2
- package/cjs/providers/email-factory.service.js +37 -12
- package/cjs/providers/mailgun-provider.js +10 -15
- package/cjs/providers/sendgrid-provider.js +10 -16
- package/cjs/providers/smtp-provider.js +7 -21
- package/cjs/services/email-datasource.provider.js +6 -2
- package/cjs/services/email-provider-config.service.js +1 -1
- package/cjs/services/email-send.service.js +77 -21
- package/cjs/services/email-template.service.js +1 -2
- package/config/index.d.ts +1 -0
- package/config/message-keys.d.ts +82 -0
- package/controllers/email-config.controller.d.ts +7 -7
- package/dtos/email-config.dto.d.ts +2 -2
- package/dtos/email-send.dto.d.ts +1 -1
- package/fesm/config/index.js +1 -0
- package/fesm/config/message-keys.js +47 -0
- package/fesm/controllers/email-config.controller.js +1 -0
- package/fesm/controllers/email-send.controller.js +2 -0
- package/fesm/controllers/email-template.controller.js +3 -0
- package/fesm/modules/email.module.js +1 -3
- package/fesm/providers/email-factory.service.js +38 -13
- package/fesm/providers/mailgun-provider.js +11 -16
- package/fesm/providers/sendgrid-provider.js +11 -17
- package/fesm/providers/smtp-provider.js +7 -21
- package/fesm/services/email-datasource.provider.js +7 -3
- package/fesm/services/email-provider-config.service.js +1 -1
- package/fesm/services/email-send.service.js +78 -22
- package/fesm/services/email-template.service.js +1 -2
- package/interfaces/email-config.interface.d.ts +1 -1
- package/interfaces/email-provider.interface.d.ts +2 -2
- package/interfaces/email-template.interface.d.ts +1 -1
- package/package.json +3 -3
- package/providers/email-factory.service.d.ts +0 -1
- package/providers/mailgun-provider.d.ts +0 -2
- package/providers/sendgrid-provider.d.ts +0 -2
- package/providers/smtp-provider.d.ts +0 -2
- package/services/email-datasource.provider.d.ts +0 -2
- package/services/email-send.service.d.ts +0 -2
package/README.md
CHANGED
package/cjs/config/index.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
51
|
-
|
|
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.
|
|
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(
|
|
85
|
+
async closeProvider(provider) {
|
|
70
86
|
if (!provider.close) return;
|
|
71
87
|
try {
|
|
72
88
|
await provider.close();
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
139
|
-
|
|
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(
|
|
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),
|
|
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([
|