@flusys/nestjs-email 7.1.0 → 8.0.0-beta.1

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 (159) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/email-config.controller.d.ts +2 -2
  3. package/controllers/email-send.controller.d.ts +3 -3
  4. package/controllers/email-template.controller.d.ts +4 -4
  5. package/controllers/index.d.ts +3 -3
  6. package/docs/email-swagger.config.d.ts +2 -2
  7. package/docs/index.d.ts +1 -1
  8. package/dtos/email-config.dto.d.ts +1 -1
  9. package/dtos/email-send.dto.d.ts +1 -1
  10. package/dtos/index.d.ts +3 -3
  11. package/entities/email-config-with-company.entity.d.ts +1 -1
  12. package/entities/email-template-with-company.entity.d.ts +1 -1
  13. package/entities/index.d.ts +10 -10
  14. package/enums/index.d.ts +1 -1
  15. package/fesm/261.js +799 -0
  16. package/fesm/493.js +1723 -0
  17. package/fesm/chunks/99.js +12 -0
  18. package/fesm/config/index.js +104 -3
  19. package/fesm/controllers/index.js +396 -3
  20. package/fesm/docs/index.js +134 -1
  21. package/fesm/dtos/index.js +22 -3
  22. package/fesm/entities/index.js +409 -13
  23. package/fesm/enums/index.js +37 -1
  24. package/fesm/index.js +762 -10
  25. package/fesm/interfaces/index.js +18 -4
  26. package/fesm/modules/index.js +541 -1
  27. package/fesm/providers/index.js +523 -5
  28. package/fesm/runtime.js +134 -0
  29. package/fesm/services/index.js +17 -5
  30. package/index.d.ts +10 -10
  31. package/interfaces/email-config.interface.d.ts +2 -2
  32. package/interfaces/email-module-options.interface.d.ts +3 -3
  33. package/interfaces/email-template.interface.d.ts +1 -1
  34. package/interfaces/index.d.ts +4 -4
  35. package/modules/email.module.d.ts +2 -2
  36. package/modules/index.d.ts +1 -1
  37. package/package.json +27 -38
  38. package/providers/email-factory.service.d.ts +2 -2
  39. package/providers/email-provider.registry.d.ts +2 -2
  40. package/providers/index.d.ts +5 -5
  41. package/providers/mailgun-provider.d.ts +1 -1
  42. package/providers/sendgrid-provider.d.ts +1 -1
  43. package/providers/smtp-provider.d.ts +1 -1
  44. package/services/email-config.service.d.ts +3 -3
  45. package/services/email-datasource.provider.d.ts +3 -3
  46. package/services/email-provider-config.service.d.ts +7 -7
  47. package/services/email-send.service.d.ts +7 -7
  48. package/services/email-template.service.d.ts +6 -6
  49. package/services/index.d.ts +5 -5
  50. package/utils/index.d.ts +1 -1
  51. package/cjs/config/email.constants.js +0 -22
  52. package/cjs/config/event-actions.js +0 -34
  53. package/cjs/config/index.js +0 -20
  54. package/cjs/config/message-keys.js +0 -39
  55. package/cjs/controllers/email-config.controller.js +0 -111
  56. package/cjs/controllers/email-config.controller.spec.js +0 -85
  57. package/cjs/controllers/email-send.controller.js +0 -128
  58. package/cjs/controllers/email-send.controller.spec.js +0 -139
  59. package/cjs/controllers/email-template.controller.js +0 -142
  60. package/cjs/controllers/email-template.controller.spec.js +0 -89
  61. package/cjs/controllers/index.js +0 -20
  62. package/cjs/docs/email-swagger.config.js +0 -116
  63. package/cjs/docs/email-swagger.config.spec.js +0 -62
  64. package/cjs/docs/index.js +0 -11
  65. package/cjs/dtos/email-config.dto.js +0 -212
  66. package/cjs/dtos/email-send.dto.js +0 -354
  67. package/cjs/dtos/email-template.dto.js +0 -252
  68. package/cjs/dtos/index.js +0 -20
  69. package/cjs/entities/email-config-with-company.entity.js +0 -63
  70. package/cjs/entities/email-config.entity.js +0 -114
  71. package/cjs/entities/email-template-with-company.entity.js +0 -65
  72. package/cjs/entities/email-template.entity.js +0 -136
  73. package/cjs/entities/index.js +0 -56
  74. package/cjs/entities/index.spec.js +0 -18
  75. package/cjs/enums/email-provider-type.enum.js +0 -18
  76. package/cjs/enums/index.js +0 -18
  77. package/cjs/index.js +0 -28
  78. package/cjs/interfaces/email-config.interface.js +0 -4
  79. package/cjs/interfaces/email-module-options.interface.js +0 -4
  80. package/cjs/interfaces/email-provider.interface.js +0 -4
  81. package/cjs/interfaces/email-template.interface.js +0 -4
  82. package/cjs/interfaces/index.js +0 -21
  83. package/cjs/modules/email.module.js +0 -122
  84. package/cjs/modules/email.module.spec.js +0 -142
  85. package/cjs/modules/index.js +0 -18
  86. package/cjs/providers/email-factory.service.js +0 -113
  87. package/cjs/providers/email-factory.service.spec.js +0 -242
  88. package/cjs/providers/email-provider.registry.js +0 -41
  89. package/cjs/providers/email-provider.registry.spec.js +0 -58
  90. package/cjs/providers/index.js +0 -22
  91. package/cjs/providers/mailgun-provider.js +0 -119
  92. package/cjs/providers/mailgun-provider.spec.js +0 -244
  93. package/cjs/providers/sendgrid-provider.js +0 -129
  94. package/cjs/providers/sendgrid-provider.spec.js +0 -346
  95. package/cjs/providers/smtp-provider.js +0 -164
  96. package/cjs/providers/smtp-provider.spec.js +0 -327
  97. package/cjs/services/email-config.service.js +0 -71
  98. package/cjs/services/email-config.service.spec.js +0 -69
  99. package/cjs/services/email-datasource.provider.js +0 -84
  100. package/cjs/services/email-datasource.provider.spec.js +0 -135
  101. package/cjs/services/email-provider-config.service.js +0 -159
  102. package/cjs/services/email-provider-config.service.spec.js +0 -269
  103. package/cjs/services/email-send.service.js +0 -315
  104. package/cjs/services/email-send.service.spec.js +0 -614
  105. package/cjs/services/email-template.service.js +0 -144
  106. package/cjs/services/email-template.service.spec.js +0 -261
  107. package/cjs/services/index.js +0 -22
  108. package/cjs/utils/email-templates.util.js +0 -64
  109. package/cjs/utils/email-templates.util.spec.js +0 -61
  110. package/cjs/utils/index.js +0 -18
  111. package/fesm/config/email.constants.js +0 -4
  112. package/fesm/config/event-actions.js +0 -13
  113. package/fesm/config/message-keys.js +0 -18
  114. package/fesm/controllers/email-config.controller.js +0 -101
  115. package/fesm/controllers/email-config.controller.spec.js +0 -81
  116. package/fesm/controllers/email-send.controller.js +0 -118
  117. package/fesm/controllers/email-send.controller.spec.js +0 -135
  118. package/fesm/controllers/email-template.controller.js +0 -132
  119. package/fesm/controllers/email-template.controller.spec.js +0 -85
  120. package/fesm/docs/email-swagger.config.js +0 -109
  121. package/fesm/docs/email-swagger.config.spec.js +0 -58
  122. package/fesm/dtos/email-config.dto.js +0 -191
  123. package/fesm/dtos/email-send.dto.js +0 -324
  124. package/fesm/dtos/email-template.dto.js +0 -231
  125. package/fesm/entities/email-config-with-company.entity.js +0 -53
  126. package/fesm/entities/email-config.entity.js +0 -104
  127. package/fesm/entities/email-template-with-company.entity.js +0 -55
  128. package/fesm/entities/email-template.entity.js +0 -126
  129. package/fesm/entities/index.spec.js +0 -14
  130. package/fesm/enums/email-provider-type.enum.js +0 -8
  131. package/fesm/interfaces/email-config.interface.js +0 -1
  132. package/fesm/interfaces/email-module-options.interface.js +0 -1
  133. package/fesm/interfaces/email-provider.interface.js +0 -1
  134. package/fesm/interfaces/email-template.interface.js +0 -1
  135. package/fesm/modules/email.module.js +0 -112
  136. package/fesm/modules/email.module.spec.js +0 -138
  137. package/fesm/providers/email-factory.service.js +0 -103
  138. package/fesm/providers/email-factory.service.spec.js +0 -238
  139. package/fesm/providers/email-provider.registry.js +0 -31
  140. package/fesm/providers/email-provider.registry.spec.js +0 -54
  141. package/fesm/providers/mailgun-provider.js +0 -109
  142. package/fesm/providers/mailgun-provider.spec.js +0 -240
  143. package/fesm/providers/sendgrid-provider.js +0 -119
  144. package/fesm/providers/sendgrid-provider.spec.js +0 -342
  145. package/fesm/providers/smtp-provider.js +0 -113
  146. package/fesm/providers/smtp-provider.spec.js +0 -282
  147. package/fesm/services/email-config.service.js +0 -61
  148. package/fesm/services/email-config.service.spec.js +0 -65
  149. package/fesm/services/email-datasource.provider.js +0 -74
  150. package/fesm/services/email-datasource.provider.spec.js +0 -131
  151. package/fesm/services/email-provider-config.service.js +0 -149
  152. package/fesm/services/email-provider-config.service.spec.js +0 -265
  153. package/fesm/services/email-send.service.js +0 -305
  154. package/fesm/services/email-send.service.spec.js +0 -610
  155. package/fesm/services/email-template.service.js +0 -134
  156. package/fesm/services/email-template.service.spec.js +0 -257
  157. package/fesm/utils/email-templates.util.js +0 -47
  158. package/fesm/utils/email-templates.util.spec.js +0 -57
  159. package/fesm/utils/index.js +0 -1
@@ -1,315 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "EmailSendService", {
6
- enumerable: true,
7
- get: function() {
8
- return EmailSendService;
9
- }
10
- });
11
- const _nestjsshared = require("@flusys/nestjs-shared");
12
- const _classes = require("@flusys/nestjs-shared/classes");
13
- const _interfaces = require("@flusys/nestjs-shared/interfaces");
14
- const _utils = require("@flusys/nestjs-shared/utils");
15
- const _common = require("@nestjs/common");
16
- const _config = require("../config");
17
- const _emailconfigservice = require("./email-config.service");
18
- const _dtos = require("../dtos");
19
- const _providers = require("../providers");
20
- const _emailproviderconfigservice = require("./email-provider-config.service");
21
- const _emailtemplateservice = require("./email-template.service");
22
- function _define_property(obj, key, value) {
23
- if (key in obj) {
24
- Object.defineProperty(obj, key, {
25
- value: value,
26
- enumerable: true,
27
- configurable: true,
28
- writable: true
29
- });
30
- } else {
31
- obj[key] = value;
32
- }
33
- return obj;
34
- }
35
- function _ts_decorate(decorators, target, key, desc) {
36
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
37
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
38
- 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;
39
- return c > 3 && r && Object.defineProperty(target, key, r), r;
40
- }
41
- function _ts_metadata(k, v) {
42
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
- }
44
- function _ts_param(paramIndex, decorator) {
45
- return function(target, key) {
46
- decorator(target, key, paramIndex);
47
- };
48
- }
49
- /** Valid identifier pattern for template variables: {{varName}} */ const VARIABLE_PATTERN = /\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g;
50
- let EmailSendService = class EmailSendService {
51
- // ─── Public API ─────────────────────────────────────────────────────────────
52
- async sendEmail(dto, user) {
53
- const { provider, config } = await this.getEmailProviderWithConfig(dto.emailConfigId, user);
54
- const sender = this.resolveSender(dto, config);
55
- const result = await provider.sendEmail({
56
- to: dto.to,
57
- cc: dto.cc,
58
- bcc: dto.bcc,
59
- subject: dto.subject,
60
- html: dto.html,
61
- text: dto.text,
62
- ...sender,
63
- replyTo: dto.replyTo,
64
- attachments: this.buildAttachments(dto.attachments)
65
- });
66
- await this.publishSendEvent(result, dto.to, user, {
67
- emailConfigId: config.id
68
- });
69
- return result;
70
- }
71
- async sendTemplateEmail(dto, user) {
72
- const template = await this.resolveTemplate(dto, user);
73
- const { subject, html, text } = this.buildTemplateContent(template, dto.variables);
74
- const { provider, config } = await this.getEmailProviderWithConfig(dto.emailConfigId, user);
75
- const sender = this.resolveSender(dto, config);
76
- const result = await provider.sendEmail({
77
- to: dto.to,
78
- cc: dto.cc,
79
- bcc: dto.bcc,
80
- subject,
81
- html,
82
- text,
83
- ...sender,
84
- replyTo: dto.replyTo,
85
- attachments: this.buildAttachments(dto.attachments)
86
- });
87
- await this.publishSendEvent(result, dto.to, user, {
88
- emailConfigId: config.id,
89
- templateId: template.id,
90
- templateSlug: template.slug
91
- });
92
- return result;
93
- }
94
- async sendTestEmail(emailConfigId, recipient, user) {
95
- const { provider, config } = await this.getEmailProviderWithConfig(emailConfigId, user);
96
- const safeConfig = (0, _utils.escapeHtmlVariables)({
97
- name: config.name,
98
- provider: config.provider.toUpperCase()
99
- });
100
- const result = await provider.sendEmail({
101
- to: recipient,
102
- subject: 'Test Email from FLUSYS',
103
- html: this.buildTestEmailHtml(safeConfig),
104
- text: `Test Email from FLUSYS\n\nThis is a test email.\nConfiguration: ${config.name}\nProvider: ${config.provider.toUpperCase()}`,
105
- from: config.fromEmail || undefined,
106
- fromName: config.fromName || this.emailConfigService.getDefaultFromName()
107
- });
108
- await this.publishSendEvent(result, recipient, user, {
109
- emailConfigId: config.id,
110
- isTest: true
111
- });
112
- return result;
113
- }
114
- // ─── Private: Provider & Config Resolution ──────────────────────────────────
115
- async getEmailProviderWithConfig(emailConfigId, user) {
116
- const emailConfig = emailConfigId ? await this.resolveConfigById(emailConfigId, user) : await this.resolveDefaultConfig(user);
117
- const providerConfig = {
118
- provider: emailConfig.provider,
119
- config: emailConfig.config
120
- };
121
- return {
122
- provider: await this.emailFactory.createProvider(providerConfig),
123
- config: emailConfig
124
- };
125
- }
126
- async resolveConfigById(id, user) {
127
- const config = await this.emailProviderConfigService.findByIdDirect(id);
128
- if (!config) {
129
- throw new _common.NotFoundException({
130
- message: 'Email configuration not found',
131
- messageKey: _config.EMAIL_SEND_MESSAGES.CONFIG_NOT_FOUND
132
- });
133
- }
134
- (0, _utils.validateCompanyOwnership)(config, user, this.emailConfigService.isCompanyFeatureEnabled(), 'Email configuration');
135
- if (!config.isActive) {
136
- throw new _common.BadRequestException({
137
- message: 'Email configuration is inactive',
138
- messageKey: _config.EMAIL_SEND_MESSAGES.CONFIG_INACTIVE
139
- });
140
- }
141
- return config;
142
- }
143
- async resolveDefaultConfig(user) {
144
- const config = await this.emailProviderConfigService.getDefaultConfig(user);
145
- if (!config) {
146
- throw new _common.NotFoundException({
147
- message: 'No default email configuration found',
148
- messageKey: _config.EMAIL_SEND_MESSAGES.CONFIG_DEFAULT_NOT_FOUND
149
- });
150
- }
151
- return config;
152
- }
153
- // ─── Private: Template Resolution ───────────────────────────────────────────
154
- async resolveTemplate(dto, user) {
155
- let template;
156
- if (dto.templateId) {
157
- template = await this.emailTemplateService.findByIdDirect(dto.templateId);
158
- } else if (dto.templateSlug) {
159
- template = await this.emailTemplateService.findBySlug(dto.templateSlug, user);
160
- } else {
161
- throw new _common.BadRequestException({
162
- message: 'templateId or templateSlug is required',
163
- messageKey: _config.EMAIL_SEND_MESSAGES.TEMPLATE_ID_OR_SLUG_REQUIRED
164
- });
165
- }
166
- if (!template) {
167
- throw new _common.NotFoundException({
168
- message: 'Email template not found',
169
- messageKey: _config.EMAIL_SEND_MESSAGES.TEMPLATE_NOT_FOUND
170
- });
171
- }
172
- if (!template.isActive) {
173
- throw new _common.BadRequestException({
174
- message: 'Email template is inactive',
175
- messageKey: _config.EMAIL_SEND_MESSAGES.TEMPLATE_INACTIVE
176
- });
177
- }
178
- (0, _utils.validateCompanyOwnership)(template, user, this.emailConfigService.isCompanyFeatureEnabled(), 'Email template');
179
- return template;
180
- }
181
- buildTemplateContent(template, variables) {
182
- const vars = variables || {};
183
- const subject = this.interpolateVariables(template.subject, vars, false);
184
- if (template.isHtml) {
185
- return {
186
- subject,
187
- html: this.interpolateVariables(template.htmlContent, vars, true),
188
- text: template.textContent ? this.interpolateVariables(template.textContent, vars, false) : undefined
189
- };
190
- }
191
- return {
192
- subject,
193
- html: undefined,
194
- text: template.textContent ? this.interpolateVariables(template.textContent, vars, false) : this.interpolateVariables(template.htmlContent, vars, false)
195
- };
196
- }
197
- // ─── Private: Helpers ───────────────────────────────────────────────────────
198
- resolveSender(dto, config) {
199
- return {
200
- from: dto.from || config.fromEmail || undefined,
201
- fromName: dto.fromName || config.fromName || this.emailConfigService.getDefaultFromName()
202
- };
203
- }
204
- buildAttachments(attachments) {
205
- return attachments?.map((a)=>({
206
- filename: a.filename,
207
- content: Buffer.from(a.content, 'base64'),
208
- contentType: a.contentType
209
- }));
210
- }
211
- interpolateVariables(content, variables, escapeHtml) {
212
- if (!variables || Object.keys(variables).length === 0) return content;
213
- const safeVars = escapeHtml ? (0, _utils.escapeHtmlVariables)(variables) : variables;
214
- return content.replace(VARIABLE_PATTERN, (match, varName)=>{
215
- return varName in safeVars && safeVars[varName] !== undefined ? String(safeVars[varName]) : match;
216
- });
217
- }
218
- buildTestEmailHtml(safeConfig) {
219
- return `
220
- <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
221
- <h1 style="color: #333;">Test Email</h1>
222
- <p>This is a test email from FLUSYS Email Service.</p>
223
- <p><strong>Configuration:</strong> ${safeConfig.name}</p>
224
- <p><strong>Provider:</strong> ${safeConfig.provider}</p>
225
- <p style="color: #666; font-size: 12px;">
226
- If you received this email, your email configuration is working correctly.
227
- </p>
228
- </div>
229
- `;
230
- }
231
- async publishSendEvent(result, to, user, metadata) {
232
- const recipients = Array.isArray(to) ? to : [
233
- to
234
- ];
235
- await (0, _classes.publishDomainEvent)({
236
- module: _config.EMAIL_EVENT_MODULE,
237
- entity: _config.EMAIL_EVENT_ENTITIES.MESSAGE,
238
- action: result.success ? _config.EMAIL_EVENT_ACTIONS.SENT : _config.EMAIL_EVENT_ACTIONS.FAILED,
239
- ids: result.messageId ? [
240
- result.messageId
241
- ] : [],
242
- metadata: {
243
- ...metadata,
244
- recipientCount: recipients.length,
245
- ...result.error ? {
246
- error: result.error
247
- } : {}
248
- },
249
- user: user ?? null
250
- });
251
- }
252
- constructor(emailFactory, emailConfigService, emailProviderConfigService, emailTemplateService){
253
- _define_property(this, "emailFactory", void 0);
254
- _define_property(this, "emailConfigService", void 0);
255
- _define_property(this, "emailProviderConfigService", void 0);
256
- _define_property(this, "emailTemplateService", void 0);
257
- this.emailFactory = emailFactory;
258
- this.emailConfigService = emailConfigService;
259
- this.emailProviderConfigService = emailProviderConfigService;
260
- this.emailTemplateService = emailTemplateService;
261
- }
262
- };
263
- _ts_decorate([
264
- (0, _nestjsshared.LogAction)({
265
- action: 'email.send',
266
- module: 'email'
267
- }),
268
- _ts_metadata("design:type", Function),
269
- _ts_metadata("design:paramtypes", [
270
- typeof _dtos.SendEmailDto === "undefined" ? Object : _dtos.SendEmailDto,
271
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
272
- ]),
273
- _ts_metadata("design:returntype", Promise)
274
- ], EmailSendService.prototype, "sendEmail", null);
275
- _ts_decorate([
276
- (0, _nestjsshared.LogAction)({
277
- action: 'email.sendTemplate',
278
- module: 'email'
279
- }),
280
- _ts_metadata("design:type", Function),
281
- _ts_metadata("design:paramtypes", [
282
- typeof _dtos.SendTemplateEmailDto === "undefined" ? Object : _dtos.SendTemplateEmailDto,
283
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
284
- ]),
285
- _ts_metadata("design:returntype", Promise)
286
- ], EmailSendService.prototype, "sendTemplateEmail", null);
287
- _ts_decorate([
288
- (0, _nestjsshared.LogAction)({
289
- action: 'email.sendTest',
290
- module: 'email'
291
- }),
292
- _ts_metadata("design:type", Function),
293
- _ts_metadata("design:paramtypes", [
294
- String,
295
- String,
296
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
297
- ]),
298
- _ts_metadata("design:returntype", Promise)
299
- ], EmailSendService.prototype, "sendTestEmail", null);
300
- EmailSendService = _ts_decorate([
301
- (0, _common.Injectable)({
302
- scope: _common.Scope.REQUEST
303
- }),
304
- _ts_param(0, (0, _common.Inject)(_providers.EmailFactoryService)),
305
- _ts_param(1, (0, _common.Inject)(_emailconfigservice.EmailConfigService)),
306
- _ts_param(2, (0, _common.Inject)(_emailproviderconfigservice.EmailProviderConfigService)),
307
- _ts_param(3, (0, _common.Inject)(_emailtemplateservice.EmailTemplateService)),
308
- _ts_metadata("design:type", Function),
309
- _ts_metadata("design:paramtypes", [
310
- typeof _providers.EmailFactoryService === "undefined" ? Object : _providers.EmailFactoryService,
311
- typeof _emailconfigservice.EmailConfigService === "undefined" ? Object : _emailconfigservice.EmailConfigService,
312
- typeof _emailproviderconfigservice.EmailProviderConfigService === "undefined" ? Object : _emailproviderconfigservice.EmailProviderConfigService,
313
- typeof _emailtemplateservice.EmailTemplateService === "undefined" ? Object : _emailtemplateservice.EmailTemplateService
314
- ])
315
- ], EmailSendService);