@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.
- package/README.md +604 -0
- package/cjs/config/email.constants.js +0 -18
- package/cjs/config/index.js +0 -1
- package/cjs/controllers/email-config.controller.js +46 -4
- package/cjs/controllers/email-send.controller.js +13 -26
- package/cjs/controllers/email-template.controller.js +60 -11
- package/cjs/docs/email-swagger.config.js +18 -80
- package/cjs/dtos/email-config.dto.js +6 -106
- package/cjs/dtos/email-send.dto.js +101 -123
- package/cjs/dtos/email-template.dto.js +41 -103
- package/cjs/entities/email-config-with-company.entity.js +2 -2
- package/cjs/entities/email-config.entity.js +91 -3
- package/cjs/entities/email-template-with-company.entity.js +5 -3
- package/cjs/entities/email-template.entity.js +119 -3
- package/cjs/entities/index.js +34 -19
- package/cjs/index.js +1 -0
- package/cjs/interfaces/email-provider.interface.js +1 -3
- package/cjs/modules/email.module.js +50 -104
- package/cjs/providers/email-factory.service.js +37 -109
- package/cjs/providers/email-provider.registry.js +5 -15
- package/cjs/providers/mailgun-provider.js +54 -58
- package/cjs/providers/sendgrid-provider.js +68 -92
- package/cjs/providers/smtp-provider.js +58 -69
- package/cjs/{config → services}/email-config.service.js +9 -32
- package/cjs/services/email-datasource.provider.js +17 -104
- package/cjs/services/email-provider-config.service.js +28 -58
- package/cjs/services/email-send.service.js +120 -125
- package/cjs/services/email-template.service.js +62 -85
- package/cjs/services/index.js +2 -1
- package/cjs/utils/email-templates.util.js +64 -0
- package/cjs/utils/index.js +18 -0
- package/config/email.constants.d.ts +0 -9
- package/config/index.d.ts +0 -1
- package/controllers/email-send.controller.d.ts +5 -12
- package/controllers/email-template.controller.d.ts +5 -7
- package/dtos/email-config.dto.d.ts +5 -13
- package/dtos/email-send.dto.d.ts +17 -21
- package/dtos/email-template.dto.d.ts +5 -16
- package/entities/email-config-with-company.entity.d.ts +2 -2
- package/entities/email-config.entity.d.ts +9 -2
- package/entities/email-template-with-company.entity.d.ts +2 -2
- package/entities/email-template.entity.d.ts +13 -2
- package/entities/index.d.ts +9 -3
- package/fesm/config/email.constants.js +0 -9
- package/fesm/config/index.js +0 -1
- package/fesm/controllers/email-config.controller.js +49 -7
- package/fesm/controllers/email-send.controller.js +13 -26
- package/fesm/controllers/email-template.controller.js +61 -12
- package/fesm/docs/email-swagger.config.js +21 -86
- package/fesm/dtos/email-config.dto.js +9 -115
- package/fesm/dtos/email-send.dto.js +103 -139
- package/fesm/dtos/email-template.dto.js +43 -111
- package/fesm/entities/email-config-with-company.entity.js +2 -2
- package/fesm/entities/email-config.entity.js +92 -4
- package/fesm/entities/email-template-with-company.entity.js +5 -3
- package/fesm/entities/email-template.entity.js +120 -4
- package/fesm/entities/index.js +22 -16
- package/fesm/index.js +1 -0
- package/fesm/interfaces/email-config.interface.js +1 -3
- package/fesm/interfaces/email-module-options.interface.js +1 -3
- package/fesm/interfaces/email-provider.interface.js +1 -5
- package/fesm/interfaces/email-template.interface.js +1 -3
- package/fesm/modules/email.module.js +52 -106
- package/fesm/providers/email-factory.service.js +38 -69
- package/fesm/providers/email-provider.registry.js +6 -19
- package/fesm/providers/mailgun-provider.js +55 -63
- package/fesm/providers/sendgrid-provider.js +69 -97
- package/fesm/providers/smtp-provider.js +59 -73
- package/fesm/{config → services}/email-config.service.js +9 -32
- package/fesm/services/email-datasource.provider.js +18 -64
- package/fesm/services/email-provider-config.service.js +26 -56
- package/fesm/services/email-send.service.js +118 -123
- package/fesm/services/email-template.service.js +60 -83
- package/fesm/services/index.js +2 -1
- package/fesm/utils/email-templates.util.js +47 -0
- package/fesm/utils/index.js +1 -0
- package/index.d.ts +1 -0
- package/interfaces/email-config.interface.d.ts +6 -0
- package/interfaces/email-module-options.interface.d.ts +0 -5
- package/modules/email.module.d.ts +1 -2
- package/package.json +9 -4
- package/providers/email-factory.service.d.ts +4 -7
- package/providers/mailgun-provider.d.ts +6 -2
- package/providers/sendgrid-provider.d.ts +6 -2
- package/providers/smtp-provider.d.ts +7 -2
- package/services/email-config.service.d.ts +12 -0
- package/services/email-datasource.provider.d.ts +3 -6
- package/services/email-provider-config.service.d.ts +3 -3
- package/services/email-send.service.d.ts +11 -3
- package/services/email-template.service.d.ts +5 -4
- package/services/index.d.ts +2 -1
- package/utils/email-templates.util.d.ts +2 -0
- package/utils/index.d.ts +1 -0
- package/cjs/entities/email-config-base.entity.js +0 -111
- package/cjs/entities/email-template-base.entity.js +0 -134
- package/config/email-config.service.d.ts +0 -13
- package/entities/email-config-base.entity.d.ts +0 -11
- package/entities/email-template-base.entity.d.ts +0 -14
- package/fesm/entities/email-config-base.entity.js +0 -101
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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);
|
package/cjs/entities/index.js
CHANGED
|
@@ -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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
12
|
-
_export_star(require("./email-
|
|
13
|
-
_export_star(require("./email-config-with-company.entity"), exports);
|
|
14
|
-
_export_star(require("./email-template-
|
|
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
|
-
|
|
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)) {
|
|
@@ -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
|
-
|
|
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
|
|
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 ?
|
|
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 ?
|
|
65
|
+
controllers: options.includeController !== false ? CONTROLLERS : [],
|
|
73
66
|
providers: [
|
|
74
|
-
...
|
|
75
|
-
...this.
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
_services.EmailDataSourceProvider,
|
|
103
|
-
_services.EmailProviderConfigService,
|
|
104
|
-
_services.EmailTemplateService,
|
|
105
|
-
_services.EmailSendService,
|
|
106
|
-
_providers.EmailFactoryService
|
|
75
|
+
...EXPORTED_SERVICES
|
|
107
76
|
];
|
|
108
|
-
if (
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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 =
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
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.
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
51
|
+
throw new _common.InternalServerErrorException(`Failed to initialize email provider '${config.provider}': ${this.extractErrorMessage(error)}`);
|
|
118
52
|
}
|
|
119
53
|
}
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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);
|