@webiny/api-mailer 0.0.0-unstable.3386f66516 → 0.0.0-unstable.496cf268ac
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/context.js +0 -7
- package/context.js.map +1 -1
- package/crud/group.js +0 -3
- package/crud/group.js.map +1 -1
- package/crud/settings/hooks.js +3 -15
- package/crud/settings/hooks.js.map +1 -1
- package/crud/settings/model.js +0 -12
- package/crud/settings/model.js.map +1 -1
- package/crud/settings/password.js +0 -18
- package/crud/settings/password.js.map +1 -1
- package/crud/settings/secret.js +0 -6
- package/crud/settings/secret.js.map +1 -1
- package/crud/settings/transform.js +0 -12
- package/crud/settings/transform.js.map +1 -1
- package/crud/settings/validation.d.ts +9 -9
- package/crud/settings/validation.js +2 -11
- package/crud/settings/validation.js.map +1 -1
- package/crud/settings.crud.js +20 -76
- package/crud/settings.crud.js.map +1 -1
- package/crud/transport/onTransportBeforeSend.js +5 -15
- package/crud/transport/onTransportBeforeSend.js.map +1 -1
- package/crud/transporter.crud.js +1 -32
- package/crud/transporter.crud.js.map +1 -1
- package/graphql/index.js +0 -3
- package/graphql/index.js.map +1 -1
- package/graphql/settings.js +0 -8
- package/graphql/settings.js.map +1 -1
- package/index.d.ts +2 -5
- package/index.js +29 -35
- package/index.js.map +1 -1
- package/package.json +23 -23
- package/plugins/CreateTransportPlugin.js +0 -9
- package/plugins/CreateTransportPlugin.js.map +1 -1
- package/plugins/index.js +0 -2
- package/plugins/index.js.map +1 -1
- package/transports/createDummyTransport.js +1 -3
- package/transports/createDummyTransport.js.map +1 -1
- package/transports/createSmtpTransport.js +1 -16
- package/transports/createSmtpTransport.js.map +1 -1
- package/transports/index.d.ts +2 -0
- package/transports/index.js +27 -0
- package/transports/index.js.map +1 -0
- package/types.d.ts +1 -1
- package/types.js.map +1 -1
package/crud/settings.crud.js
CHANGED
|
@@ -1,35 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.createSettingsCrud = void 0;
|
|
9
|
-
|
|
10
8
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
|
|
12
9
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
13
|
-
|
|
14
10
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
15
|
-
|
|
16
11
|
var _pubsub = require("@webiny/pubsub");
|
|
17
|
-
|
|
18
12
|
var _model = require("./settings/model");
|
|
19
|
-
|
|
20
13
|
var _transform = require("./settings/transform");
|
|
21
|
-
|
|
22
14
|
var _secret = require("./settings/secret");
|
|
23
|
-
|
|
24
15
|
var _validation = require("./settings/validation");
|
|
25
|
-
|
|
26
16
|
var _hooks = require("./settings/hooks");
|
|
27
|
-
|
|
28
17
|
var _apiSecurity = require("@webiny/api-security");
|
|
29
|
-
|
|
30
18
|
const _excluded = ["password"],
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
_excluded2 = ["password"];
|
|
20
|
+
const defaultPort = 25;
|
|
33
21
|
/**
|
|
34
22
|
* Note that settings cannot be used if there is no secret defined.
|
|
35
23
|
*/
|
|
@@ -38,36 +26,28 @@ const createSettingsCrud = async context => {
|
|
|
38
26
|
* We need to remove password from all references on create and update in the CMS.
|
|
39
27
|
*/
|
|
40
28
|
(0, _hooks.attachPasswordObfuscatingHooks)(context);
|
|
41
|
-
|
|
42
29
|
const getTenant = () => {
|
|
43
30
|
return context.tenancy.getCurrentTenant().id;
|
|
44
31
|
};
|
|
45
|
-
|
|
46
32
|
const validateAccess = async () => {
|
|
47
33
|
const permission = await context.security.getPermission("mailer.settings");
|
|
48
|
-
|
|
49
34
|
if (permission) {
|
|
50
35
|
return;
|
|
51
36
|
}
|
|
52
|
-
|
|
53
37
|
throw new _apiSecurity.NotAuthorizedError({
|
|
54
38
|
data: {
|
|
55
39
|
reason: `Not allowed to update the mailer settings.`
|
|
56
40
|
}
|
|
57
41
|
});
|
|
58
42
|
};
|
|
59
|
-
|
|
60
43
|
let secret = null;
|
|
61
|
-
|
|
62
44
|
try {
|
|
63
45
|
secret = (0, _secret.getSecret)();
|
|
64
46
|
} catch (ex) {}
|
|
65
|
-
|
|
66
47
|
const getModel = async () => {
|
|
67
48
|
try {
|
|
68
49
|
context.security.disableAuthorization();
|
|
69
50
|
const model = await context.cms.getModel(_model.SETTINGS_MODEL_ID);
|
|
70
|
-
|
|
71
51
|
if (model) {
|
|
72
52
|
return model;
|
|
73
53
|
}
|
|
@@ -76,35 +56,31 @@ const createSettingsCrud = async context => {
|
|
|
76
56
|
} finally {
|
|
77
57
|
context.security.enableAuthorization();
|
|
78
58
|
}
|
|
79
|
-
|
|
80
59
|
throw new _error.default(`Missing CMS Model "${_model.SETTINGS_MODEL_ID}".`, "CMS_MODEL_MISSING", {
|
|
81
60
|
modelId: _model.SETTINGS_MODEL_ID
|
|
82
61
|
});
|
|
83
|
-
};
|
|
84
|
-
|
|
62
|
+
};
|
|
85
63
|
|
|
64
|
+
// get
|
|
86
65
|
const onSettingsBeforeGet = (0, _pubsub.createTopic)("mailer.onSettingsBeforeGet");
|
|
87
66
|
const onSettingsAfterGet = (0, _pubsub.createTopic)("mailer.onSettingsAfterGet");
|
|
88
|
-
const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
89
|
-
|
|
67
|
+
const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
68
|
+
// create
|
|
90
69
|
const onSettingsBeforeCreate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeCreate");
|
|
91
70
|
const onSettingsAfterCreate = (0, _pubsub.createTopic)("mailer.onSettingsAfterCreate");
|
|
92
|
-
const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
93
|
-
|
|
71
|
+
const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
72
|
+
// update
|
|
94
73
|
const onSettingsBeforeUpdate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeUpdate");
|
|
95
74
|
const onSettingsAfterUpdate = (0, _pubsub.createTopic)("mailer.onSettingsAfterUpdate");
|
|
96
75
|
const onSettingsUpdateError = (0, _pubsub.createTopic)("mailer.onSettingsUpdateError");
|
|
97
|
-
|
|
98
76
|
const checkSecret = () => {
|
|
99
77
|
if (secret) {
|
|
100
78
|
return;
|
|
101
79
|
}
|
|
102
|
-
|
|
103
80
|
throw new _error.default("There must be a password secret defined!", "PASSWORD_SECRET_ERROR", {
|
|
104
81
|
description: "To store the Mailer settings, you must have a password secret environment variable defined."
|
|
105
82
|
});
|
|
106
83
|
};
|
|
107
|
-
|
|
108
84
|
return {
|
|
109
85
|
onSettingsAfterGet,
|
|
110
86
|
onSettingsBeforeGet,
|
|
@@ -119,7 +95,6 @@ const createSettingsCrud = async context => {
|
|
|
119
95
|
checkSecret();
|
|
120
96
|
const model = await getModel();
|
|
121
97
|
const tenant = getTenant();
|
|
122
|
-
|
|
123
98
|
try {
|
|
124
99
|
context.security.disableAuthorization();
|
|
125
100
|
await onSettingsBeforeGet.publish({
|
|
@@ -129,17 +104,14 @@ const createSettingsCrud = async context => {
|
|
|
129
104
|
* We always list because we have no id or something like that to query by.
|
|
130
105
|
* This should return one setting anyway.
|
|
131
106
|
*/
|
|
132
|
-
|
|
133
107
|
const [entries] = await context.cms.listLatestEntries(model, {
|
|
134
108
|
limit: 1,
|
|
135
109
|
sort: ["createdOn_DESC"]
|
|
136
110
|
});
|
|
137
111
|
const [entry] = entries;
|
|
138
|
-
|
|
139
112
|
if (!entry) {
|
|
140
113
|
return null;
|
|
141
114
|
}
|
|
142
|
-
|
|
143
115
|
const settings = (0, _transform.transformValuesFromEntry)({
|
|
144
116
|
entry: entry,
|
|
145
117
|
secret
|
|
@@ -160,10 +132,8 @@ const createSettingsCrud = async context => {
|
|
|
160
132
|
} finally {
|
|
161
133
|
context.security.enableAuthorization();
|
|
162
134
|
}
|
|
163
|
-
|
|
164
135
|
return null;
|
|
165
136
|
},
|
|
166
|
-
|
|
167
137
|
/**
|
|
168
138
|
* Method should not be used outside of mailer
|
|
169
139
|
* @internal
|
|
@@ -175,36 +145,28 @@ const createSettingsCrud = async context => {
|
|
|
175
145
|
input
|
|
176
146
|
} = params;
|
|
177
147
|
const model = await getModel();
|
|
178
|
-
|
|
179
148
|
const result = _validation.createValidation.safeParse(input);
|
|
180
|
-
|
|
181
149
|
if (!result.success) {
|
|
182
150
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
183
151
|
errors: result.error.errors
|
|
184
152
|
});
|
|
185
153
|
}
|
|
186
|
-
|
|
187
154
|
const _result$data = result.data,
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (!settings.port) {
|
|
194
|
-
settings.port = 25;
|
|
195
|
-
}
|
|
196
|
-
|
|
155
|
+
{
|
|
156
|
+
password
|
|
157
|
+
} = _result$data,
|
|
158
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data, _excluded);
|
|
197
159
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
160
|
+
port: settings.port || defaultPort,
|
|
198
161
|
password: ""
|
|
199
162
|
});
|
|
200
|
-
|
|
201
163
|
try {
|
|
202
164
|
context.security.disableAuthorization();
|
|
203
165
|
await onSettingsBeforeCreate.publish({
|
|
204
166
|
settings: passwordlessSettings
|
|
205
167
|
});
|
|
206
168
|
await context.cms.createEntry(model, (0, _transform.transformInputToEntryValues)({
|
|
207
|
-
values: (0, _objectSpread2.default)((0, _objectSpread2.default)({},
|
|
169
|
+
values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, passwordlessSettings), {}, {
|
|
208
170
|
password
|
|
209
171
|
}),
|
|
210
172
|
secret
|
|
@@ -223,7 +185,6 @@ const createSettingsCrud = async context => {
|
|
|
223
185
|
context.security.enableAuthorization();
|
|
224
186
|
}
|
|
225
187
|
},
|
|
226
|
-
|
|
227
188
|
/**
|
|
228
189
|
* Method should not be used outside of mailer
|
|
229
190
|
* @internal
|
|
@@ -236,39 +197,28 @@ const createSettingsCrud = async context => {
|
|
|
236
197
|
original: initialOriginal
|
|
237
198
|
} = params;
|
|
238
199
|
const model = await getModel();
|
|
239
|
-
|
|
240
200
|
const result = _validation.updateValidation.safeParse(input);
|
|
241
|
-
|
|
242
201
|
if (!result.success) {
|
|
243
202
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
244
203
|
errors: result.error.errors
|
|
245
204
|
});
|
|
246
205
|
}
|
|
247
|
-
|
|
248
206
|
let original = initialOriginal;
|
|
249
|
-
|
|
250
207
|
if (!original) {
|
|
251
208
|
original = await this.getSettings();
|
|
252
|
-
|
|
253
209
|
if (!original) {
|
|
254
210
|
throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
|
|
255
211
|
}
|
|
256
212
|
}
|
|
257
|
-
|
|
258
213
|
const _result$data2 = result.data,
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
if (!settings.port) {
|
|
265
|
-
settings.port = original.port || 25;
|
|
266
|
-
}
|
|
267
|
-
|
|
214
|
+
{
|
|
215
|
+
password
|
|
216
|
+
} = _result$data2,
|
|
217
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data2, _excluded2);
|
|
268
218
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
219
|
+
port: settings.port || original.port || defaultPort,
|
|
269
220
|
password: ""
|
|
270
221
|
});
|
|
271
|
-
|
|
272
222
|
try {
|
|
273
223
|
context.security.disableAuthorization();
|
|
274
224
|
await onSettingsBeforeUpdate.publish({
|
|
@@ -276,7 +226,7 @@ const createSettingsCrud = async context => {
|
|
|
276
226
|
original
|
|
277
227
|
});
|
|
278
228
|
const transformedInput = (0, _transform.transformInputToEntryValues)({
|
|
279
|
-
values: (0, _objectSpread2.default)((0, _objectSpread2.default)({},
|
|
229
|
+
values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, passwordlessSettings), {}, {
|
|
280
230
|
password: password || original.password
|
|
281
231
|
}),
|
|
282
232
|
secret
|
|
@@ -284,7 +234,6 @@ const createSettingsCrud = async context => {
|
|
|
284
234
|
/**
|
|
285
235
|
* We want to make sure that old password gets stored again in case no password was sent in update input.
|
|
286
236
|
*/
|
|
287
|
-
|
|
288
237
|
await context.cms.updateEntry(model, original.id, transformedInput);
|
|
289
238
|
await onSettingsAfterUpdate.publish({
|
|
290
239
|
settings: passwordlessSettings,
|
|
@@ -302,26 +251,21 @@ const createSettingsCrud = async context => {
|
|
|
302
251
|
context.security.enableAuthorization();
|
|
303
252
|
}
|
|
304
253
|
},
|
|
305
|
-
|
|
306
254
|
async saveSettings(params) {
|
|
307
255
|
const {
|
|
308
256
|
input
|
|
309
257
|
} = params;
|
|
310
258
|
const original = await this.getSettings();
|
|
311
|
-
|
|
312
259
|
if (!original) {
|
|
313
260
|
return this.createSettings({
|
|
314
261
|
input
|
|
315
262
|
});
|
|
316
263
|
}
|
|
317
|
-
|
|
318
264
|
return this.updateSettings({
|
|
319
265
|
input,
|
|
320
266
|
original
|
|
321
267
|
});
|
|
322
268
|
}
|
|
323
|
-
|
|
324
269
|
};
|
|
325
270
|
};
|
|
326
|
-
|
|
327
271
|
exports.createSettingsCrud = createSettingsCrud;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createSettingsCrud","context","attachPasswordObfuscatingHooks","getTenant","tenancy","getCurrentTenant","id","validateAccess","permission","security","getPermission","NotAuthorizedError","data","reason","secret","getSecret","ex","getModel","disableAuthorization","model","cms","SETTINGS_MODEL_ID","WebinyError","message","code","enableAuthorization","modelId","onSettingsBeforeGet","createTopic","onSettingsAfterGet","onSettingsGetError","onSettingsBeforeCreate","onSettingsAfterCreate","onSettingsCreateError","onSettingsBeforeUpdate","onSettingsAfterUpdate","onSettingsUpdateError","checkSecret","description","getSettings","tenant","publish","entries","listLatestEntries","limit","sort","entry","settings","transformValuesFromEntry","passwordlessSettings","password","error","createSettings","params","input","result","createValidation","safeParse","success","errors","port","createEntry","transformInputToEntryValues","values","updateSettings","original","initialOriginal","updateValidation","transformedInput","updateEntry","saveSettings"],"sources":["settings.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n MailerContext,\n MailerContextObject,\n MailerSettingsContext,\n OnSettingsAfterCreateTopicParams,\n OnSettingsAfterGetTopicParams,\n OnSettingsAfterUpdateTopicParams,\n OnSettingsBeforeCreateTopicParams,\n OnSettingsBeforeGetTopicParams,\n OnSettingsBeforeUpdateTopicParams,\n OnSettingsCreateErrorTopicParams,\n OnSettingsGetErrorTopicParams,\n OnSettingsUpdateErrorTopicParams,\n TransportSettings\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { SETTINGS_MODEL_ID } from \"./settings/model\";\nimport { transformValuesFromEntry, transformInputToEntryValues } from \"~/crud/settings/transform\";\nimport { getSecret } from \"~/crud/settings/secret\";\nimport { createValidation, updateValidation } from \"~/crud/settings/validation\";\nimport { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { attachPasswordObfuscatingHooks } from \"~/crud/settings/hooks\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\n/**\n * Note that settings cannot be used if there is no secret defined.\n */\nexport const createSettingsCrud = async (\n context: MailerContext\n): Promise<MailerSettingsContext> => {\n /**\n * We need to remove password from all references on create and update in the CMS.\n */\n attachPasswordObfuscatingHooks(context);\n\n const getTenant = () => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const validateAccess = async () => {\n const permission = await context.security.getPermission(\"mailer.settings\");\n\n if (permission) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to update the mailer settings.`\n }\n });\n };\n\n let secret: string | null = null;\n try {\n secret = getSecret();\n } catch (ex) {}\n\n const getModel = async (): Promise<CmsModel> => {\n try {\n context.security.disableAuthorization();\n const model = await context.cms.getModel(SETTINGS_MODEL_ID);\n if (model) {\n return model;\n }\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n throw new WebinyError(`Missing CMS Model \"${SETTINGS_MODEL_ID}\".`, \"CMS_MODEL_MISSING\", {\n modelId: SETTINGS_MODEL_ID\n });\n };\n\n // get\n const onSettingsBeforeGet = createTopic<OnSettingsBeforeGetTopicParams>(\n \"mailer.onSettingsBeforeGet\"\n );\n const onSettingsAfterGet = createTopic<OnSettingsAfterGetTopicParams>(\n \"mailer.onSettingsAfterGet\"\n );\n const onSettingsGetError = createTopic<OnSettingsGetErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // create\n const onSettingsBeforeCreate = createTopic<OnSettingsBeforeCreateTopicParams>(\n \"mailer.onSettingsBeforeCreate\"\n );\n const onSettingsAfterCreate = createTopic<OnSettingsAfterCreateTopicParams>(\n \"mailer.onSettingsAfterCreate\"\n );\n const onSettingsCreateError = createTopic<OnSettingsCreateErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // update\n const onSettingsBeforeUpdate = createTopic<OnSettingsBeforeUpdateTopicParams>(\n \"mailer.onSettingsBeforeUpdate\"\n );\n const onSettingsAfterUpdate = createTopic<OnSettingsAfterUpdateTopicParams>(\n \"mailer.onSettingsAfterUpdate\"\n );\n const onSettingsUpdateError = createTopic<OnSettingsUpdateErrorTopicParams>(\n \"mailer.onSettingsUpdateError\"\n );\n\n const checkSecret = (): void => {\n if (secret) {\n return;\n }\n throw new WebinyError(\"There must be a password secret defined!\", \"PASSWORD_SECRET_ERROR\", {\n description:\n \"To store the Mailer settings, you must have a password secret environment variable defined.\"\n });\n };\n\n return {\n onSettingsAfterGet,\n onSettingsBeforeGet,\n onSettingsGetError,\n onSettingsBeforeCreate,\n onSettingsAfterCreate,\n onSettingsCreateError,\n onSettingsBeforeUpdate,\n onSettingsAfterUpdate,\n onSettingsUpdateError,\n getSettings: async () => {\n checkSecret();\n\n const model = await getModel();\n\n const tenant = getTenant();\n try {\n context.security.disableAuthorization();\n await onSettingsBeforeGet.publish({\n tenant\n });\n /**\n * We always list because we have no id or something like that to query by.\n * This should return one setting anyway.\n */\n const [entries] = await context.cms.listLatestEntries(model, {\n limit: 1,\n sort: [\"createdOn_DESC\"]\n });\n const [entry] = entries;\n if (!entry) {\n return null;\n }\n const settings = transformValuesFromEntry({\n entry: entry as CmsEntry<TransportSettings>,\n secret\n });\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n await onSettingsAfterGet.publish({\n tenant,\n settings: passwordlessSettings\n });\n\n return settings;\n } catch (ex) {\n await onSettingsGetError.publish({\n tenant,\n error: ex\n });\n } finally {\n context.security.enableAuthorization();\n }\n return null;\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async createSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input } = params;\n\n const model = await getModel();\n\n const result = createValidation.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n\n const { password, ...settings } = result.data;\n\n if (!settings.port) {\n settings.port = 25;\n }\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeCreate.publish({\n settings: passwordlessSettings\n });\n\n await context.cms.createEntry(\n model,\n transformInputToEntryValues({\n values: {\n ...settings,\n password\n },\n secret\n })\n );\n\n await onSettingsAfterCreate.publish({\n settings: passwordlessSettings\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsCreateError.publish({\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async updateSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input, original: initialOriginal } = params;\n\n const model = await getModel();\n\n const result = updateValidation.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n let original = initialOriginal;\n if (!original) {\n original = await this.getSettings();\n if (!original) {\n throw new WebinyError(\n `You are trying to update settings, but there is no existing record. Create it first!`,\n \"NOT_FOUND\"\n );\n }\n }\n\n const { password, ...settings } = result.data;\n\n if (!settings.port) {\n settings.port = original.port || 25;\n }\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n\n const transformedInput = transformInputToEntryValues({\n values: {\n ...settings,\n password: password || original.password\n },\n secret\n });\n /**\n * We want to make sure that old password gets stored again in case no password was sent in update input.\n */\n await context.cms.updateEntry(model, original.id, transformedInput);\n\n await onSettingsAfterUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsUpdateError.publish({\n original,\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n async saveSettings(this: MailerContextObject, params) {\n const { input } = params;\n\n const original = await this.getSettings();\n if (!original) {\n return this.createSettings({\n input\n });\n }\n return this.updateSettings({\n input,\n original\n });\n }\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["defaultPort","createSettingsCrud","context","attachPasswordObfuscatingHooks","getTenant","tenancy","getCurrentTenant","id","validateAccess","permission","security","getPermission","NotAuthorizedError","data","reason","secret","getSecret","ex","getModel","disableAuthorization","model","cms","SETTINGS_MODEL_ID","WebinyError","message","code","enableAuthorization","modelId","onSettingsBeforeGet","createTopic","onSettingsAfterGet","onSettingsGetError","onSettingsBeforeCreate","onSettingsAfterCreate","onSettingsCreateError","onSettingsBeforeUpdate","onSettingsAfterUpdate","onSettingsUpdateError","checkSecret","description","getSettings","tenant","publish","entries","listLatestEntries","limit","sort","entry","settings","transformValuesFromEntry","passwordlessSettings","password","error","createSettings","params","input","result","createValidation","safeParse","success","errors","port","createEntry","transformInputToEntryValues","values","updateSettings","original","initialOriginal","updateValidation","transformedInput","updateEntry","saveSettings"],"sources":["settings.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n MailerContext,\n MailerContextObject,\n MailerSettingsContext,\n OnSettingsAfterCreateTopicParams,\n OnSettingsAfterGetTopicParams,\n OnSettingsAfterUpdateTopicParams,\n OnSettingsBeforeCreateTopicParams,\n OnSettingsBeforeGetTopicParams,\n OnSettingsBeforeUpdateTopicParams,\n OnSettingsCreateErrorTopicParams,\n OnSettingsGetErrorTopicParams,\n OnSettingsUpdateErrorTopicParams,\n TransportSettings\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { SETTINGS_MODEL_ID } from \"./settings/model\";\nimport { transformValuesFromEntry, transformInputToEntryValues } from \"~/crud/settings/transform\";\nimport { getSecret } from \"~/crud/settings/secret\";\nimport { createValidation, updateValidation } from \"~/crud/settings/validation\";\nimport { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { attachPasswordObfuscatingHooks } from \"~/crud/settings/hooks\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nconst defaultPort = 25;\n/**\n * Note that settings cannot be used if there is no secret defined.\n */\nexport const createSettingsCrud = async (\n context: MailerContext\n): Promise<MailerSettingsContext> => {\n /**\n * We need to remove password from all references on create and update in the CMS.\n */\n attachPasswordObfuscatingHooks(context);\n\n const getTenant = () => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const validateAccess = async () => {\n const permission = await context.security.getPermission(\"mailer.settings\");\n\n if (permission) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to update the mailer settings.`\n }\n });\n };\n\n let secret: string | null = null;\n try {\n secret = getSecret();\n } catch (ex) {}\n\n const getModel = async (): Promise<CmsModel> => {\n try {\n context.security.disableAuthorization();\n const model = await context.cms.getModel(SETTINGS_MODEL_ID);\n if (model) {\n return model;\n }\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n throw new WebinyError(`Missing CMS Model \"${SETTINGS_MODEL_ID}\".`, \"CMS_MODEL_MISSING\", {\n modelId: SETTINGS_MODEL_ID\n });\n };\n\n // get\n const onSettingsBeforeGet = createTopic<OnSettingsBeforeGetTopicParams>(\n \"mailer.onSettingsBeforeGet\"\n );\n const onSettingsAfterGet = createTopic<OnSettingsAfterGetTopicParams>(\n \"mailer.onSettingsAfterGet\"\n );\n const onSettingsGetError = createTopic<OnSettingsGetErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // create\n const onSettingsBeforeCreate = createTopic<OnSettingsBeforeCreateTopicParams>(\n \"mailer.onSettingsBeforeCreate\"\n );\n const onSettingsAfterCreate = createTopic<OnSettingsAfterCreateTopicParams>(\n \"mailer.onSettingsAfterCreate\"\n );\n const onSettingsCreateError = createTopic<OnSettingsCreateErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // update\n const onSettingsBeforeUpdate = createTopic<OnSettingsBeforeUpdateTopicParams>(\n \"mailer.onSettingsBeforeUpdate\"\n );\n const onSettingsAfterUpdate = createTopic<OnSettingsAfterUpdateTopicParams>(\n \"mailer.onSettingsAfterUpdate\"\n );\n const onSettingsUpdateError = createTopic<OnSettingsUpdateErrorTopicParams>(\n \"mailer.onSettingsUpdateError\"\n );\n\n const checkSecret = (): void => {\n if (secret) {\n return;\n }\n throw new WebinyError(\"There must be a password secret defined!\", \"PASSWORD_SECRET_ERROR\", {\n description:\n \"To store the Mailer settings, you must have a password secret environment variable defined.\"\n });\n };\n\n return {\n onSettingsAfterGet,\n onSettingsBeforeGet,\n onSettingsGetError,\n onSettingsBeforeCreate,\n onSettingsAfterCreate,\n onSettingsCreateError,\n onSettingsBeforeUpdate,\n onSettingsAfterUpdate,\n onSettingsUpdateError,\n getSettings: async () => {\n checkSecret();\n\n const model = await getModel();\n\n const tenant = getTenant();\n try {\n context.security.disableAuthorization();\n await onSettingsBeforeGet.publish({\n tenant\n });\n /**\n * We always list because we have no id or something like that to query by.\n * This should return one setting anyway.\n */\n const [entries] = await context.cms.listLatestEntries(model, {\n limit: 1,\n sort: [\"createdOn_DESC\"]\n });\n const [entry] = entries;\n if (!entry) {\n return null;\n }\n const settings = transformValuesFromEntry({\n entry: entry as CmsEntry<TransportSettings>,\n secret\n });\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n await onSettingsAfterGet.publish({\n tenant,\n settings: passwordlessSettings\n });\n\n return settings;\n } catch (ex) {\n await onSettingsGetError.publish({\n tenant,\n error: ex\n });\n } finally {\n context.security.enableAuthorization();\n }\n return null;\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async createSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input } = params;\n\n const model = await getModel();\n\n const result = createValidation.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n\n const { password, ...settings } = result.data;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || defaultPort,\n password: \"\"\n };\n\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeCreate.publish({\n settings: passwordlessSettings\n });\n\n await context.cms.createEntry(\n model,\n transformInputToEntryValues({\n values: {\n ...passwordlessSettings,\n password\n },\n secret\n })\n );\n\n await onSettingsAfterCreate.publish({\n settings: passwordlessSettings\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsCreateError.publish({\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async updateSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input, original: initialOriginal } = params;\n\n const model = await getModel();\n\n const result = updateValidation.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n let original = initialOriginal;\n if (!original) {\n original = await this.getSettings();\n if (!original) {\n throw new WebinyError(\n `You are trying to update settings, but there is no existing record. Create it first!`,\n \"NOT_FOUND\"\n );\n }\n }\n\n const { password, ...settings } = result.data;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || original.port || defaultPort,\n password: \"\"\n };\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n\n const transformedInput = transformInputToEntryValues({\n values: {\n ...passwordlessSettings,\n password: password || original.password\n },\n secret\n });\n /**\n * We want to make sure that old password gets stored again in case no password was sent in update input.\n */\n await context.cms.updateEntry(model, original.id, transformedInput);\n\n await onSettingsAfterUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsUpdateError.publish({\n original,\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n async saveSettings(this: MailerContextObject, params) {\n const { input } = params;\n\n const original = await this.getSettings();\n if (!original) {\n return this.createSettings({\n input\n });\n }\n return this.updateSettings({\n input,\n original\n });\n }\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.attachOnTransportBeforeSend = void 0;
|
|
9
|
-
|
|
10
8
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
11
|
-
|
|
12
9
|
var _zod = _interopRequireDefault(require("zod"));
|
|
13
|
-
|
|
14
10
|
const requiredString = _zod.default.string();
|
|
15
|
-
|
|
16
11
|
const requiredEmail = requiredString.email();
|
|
17
|
-
|
|
18
12
|
const schema = _zod.default.object({
|
|
19
13
|
to: _zod.default.array(requiredEmail).optional(),
|
|
20
14
|
from: _zod.default.string().email().optional(),
|
|
21
|
-
subject: requiredString.max(1024),
|
|
15
|
+
subject: requiredString.max(1024).min(2),
|
|
22
16
|
cc: _zod.default.array(requiredEmail).optional(),
|
|
23
17
|
bcc: _zod.default.array(requiredEmail).optional(),
|
|
24
18
|
replyTo: _zod.default.string().email().optional(),
|
|
25
|
-
text:
|
|
19
|
+
text: _zod.default.string().optional(),
|
|
26
20
|
html: _zod.default.string().optional()
|
|
27
|
-
})
|
|
28
|
-
|
|
21
|
+
}).refine(data => {
|
|
22
|
+
return !!data.text || !!data.html;
|
|
23
|
+
}, "Either text or html is required.");
|
|
29
24
|
const attachOnTransportBeforeSend = params => {
|
|
30
25
|
const {
|
|
31
26
|
onTransportBeforeSend
|
|
@@ -34,14 +29,11 @@ const attachOnTransportBeforeSend = params => {
|
|
|
34
29
|
data: input
|
|
35
30
|
}) => {
|
|
36
31
|
let result;
|
|
37
|
-
|
|
38
32
|
try {
|
|
39
33
|
result = schema.safeParse(input);
|
|
40
|
-
|
|
41
34
|
if (result.success) {
|
|
42
35
|
return;
|
|
43
36
|
}
|
|
44
|
-
|
|
45
37
|
throw new _error.default({
|
|
46
38
|
message: "Error while validating e-mail params.",
|
|
47
39
|
code: "VALIDATION_ERROR",
|
|
@@ -54,7 +46,6 @@ const attachOnTransportBeforeSend = params => {
|
|
|
54
46
|
if (ex instanceof _error.default) {
|
|
55
47
|
throw ex;
|
|
56
48
|
}
|
|
57
|
-
|
|
58
49
|
throw new _error.default({
|
|
59
50
|
message: "Error while validating e-mail params.",
|
|
60
51
|
code: "VALIDATION_ERROR",
|
|
@@ -66,5 +57,4 @@ const attachOnTransportBeforeSend = params => {
|
|
|
66
57
|
}
|
|
67
58
|
});
|
|
68
59
|
};
|
|
69
|
-
|
|
70
60
|
exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","cc","bcc","replyTo","text","
|
|
1
|
+
{"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","min","cc","bcc","replyTo","text","html","refine","data","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","input","result","safeParse","success","WebinyError","message","code","error","ex"],"sources":["onTransportBeforeSend.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport zod from \"zod\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { OnTransportBeforeSendParams } from \"~/types\";\nimport { SafeParseReturnType } from \"zod/lib/types\";\n\nconst requiredString = zod.string();\nconst requiredEmail = requiredString.email();\n\nconst schema = zod\n .object({\n to: zod.array(requiredEmail).optional(),\n from: zod.string().email().optional(),\n subject: requiredString.max(1024).min(2),\n cc: zod.array(requiredEmail).optional(),\n bcc: zod.array(requiredEmail).optional(),\n replyTo: zod.string().email().optional(),\n text: zod.string().optional(),\n html: zod.string().optional()\n })\n .refine(data => {\n return !!data.text || !!data.html;\n }, \"Either text or html is required.\");\n\ntype SchemaType = zod.infer<typeof schema>;\n\ninterface Params {\n onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;\n}\nexport const attachOnTransportBeforeSend = (params: Params) => {\n const { onTransportBeforeSend } = params;\n\n onTransportBeforeSend.subscribe(async ({ data: input }) => {\n let result: SafeParseReturnType<SchemaType, SchemaType>;\n try {\n result = schema.safeParse(input);\n\n if (result.success) {\n return;\n }\n throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n error: result.error,\n input\n }\n });\n } catch (ex) {\n if (ex instanceof WebinyError) {\n throw ex;\n }\n throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n input,\n error: ex\n }\n });\n }\n });\n};\n"],"mappings":";;;;;;;AAAA;AACA;AAKA,MAAMA,cAAc,GAAGC,YAAG,CAACC,MAAM,EAAE;AACnC,MAAMC,aAAa,GAAGH,cAAc,CAACI,KAAK,EAAE;AAE5C,MAAMC,MAAM,GAAGJ,YAAG,CACbK,MAAM,CAAC;EACJC,EAAE,EAAEN,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCC,IAAI,EAAET,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACrCE,OAAO,EAAEX,cAAc,CAACY,GAAG,CAAC,IAAI,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC;EACxCC,EAAE,EAAEb,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCM,GAAG,EAAEd,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACxCO,OAAO,EAAEf,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACxCQ,IAAI,EAAEhB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ,EAAE;EAC7BS,IAAI,EAAEjB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ;AAC/B,CAAC,CAAC,CACDU,MAAM,CAACC,IAAI,IAAI;EACZ,OAAO,CAAC,CAACA,IAAI,CAACH,IAAI,IAAI,CAAC,CAACG,IAAI,CAACF,IAAI;AACrC,CAAC,EAAE,kCAAkC,CAAC;AAOnC,MAAMG,2BAA2B,GAAIC,MAAc,IAAK;EAC3D,MAAM;IAAEC;EAAsB,CAAC,GAAGD,MAAM;EAExCC,qBAAqB,CAACC,SAAS,CAAC,OAAO;IAAEJ,IAAI,EAAEK;EAAM,CAAC,KAAK;IACvD,IAAIC,MAAmD;IACvD,IAAI;MACAA,MAAM,GAAGrB,MAAM,CAACsB,SAAS,CAACF,KAAK,CAAC;MAEhC,IAAIC,MAAM,CAACE,OAAO,EAAE;QAChB;MACJ;MACA,MAAM,IAAIC,cAAW,CAAC;QAClBC,OAAO,EAAE,uCAAuC;QAChDC,IAAI,EAAE,kBAAkB;QACxBX,IAAI,EAAE;UACFY,KAAK,EAAEN,MAAM,CAACM,KAAK;UACnBP;QACJ;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOQ,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYJ,cAAW,EAAE;QAC3B,MAAMI,EAAE;MACZ;MACA,MAAM,IAAIJ,cAAW,CAAC;QAClBC,OAAO,EAAE,uCAAuC;QAChDC,IAAI,EAAE,kBAAkB;QACxBX,IAAI,EAAE;UACFK,KAAK;UACLO,KAAK,EAAEC;QACX;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
|
package/crud/transporter.crud.js
CHANGED
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.createTransporterCrud = void 0;
|
|
9
|
-
|
|
10
8
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
|
-
|
|
12
9
|
var _pubsub = require("@webiny/pubsub");
|
|
13
|
-
|
|
14
10
|
var _onTransportBeforeSend = require("./transport/onTransportBeforeSend");
|
|
15
|
-
|
|
16
11
|
var _plugins = require("../plugins");
|
|
17
|
-
|
|
18
12
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
19
|
-
|
|
20
13
|
var _validation = require("./settings/validation");
|
|
21
|
-
|
|
22
14
|
const buildTransporter = async params => {
|
|
23
15
|
const {
|
|
24
16
|
settings,
|
|
25
17
|
context,
|
|
26
18
|
plugins
|
|
27
19
|
} = params;
|
|
28
|
-
|
|
29
20
|
for (const plugin of plugins) {
|
|
30
21
|
try {
|
|
31
22
|
return await plugin.buildMailerTransport({
|
|
@@ -37,20 +28,15 @@ const buildTransporter = async params => {
|
|
|
37
28
|
console.log(ex.message);
|
|
38
29
|
}
|
|
39
30
|
}
|
|
40
|
-
|
|
41
31
|
throw new _error.default("Could not build mailer via any of the available plugins.", "MAILER_PLUGINS_ERROR");
|
|
42
32
|
};
|
|
43
|
-
|
|
44
33
|
const getPort = value => {
|
|
45
34
|
const port = Number(value);
|
|
46
|
-
|
|
47
35
|
if (!!value && isNaN(port) === false) {
|
|
48
36
|
return port;
|
|
49
37
|
}
|
|
50
|
-
|
|
51
38
|
return 25;
|
|
52
39
|
};
|
|
53
|
-
|
|
54
40
|
const getDefaultSettings = () => {
|
|
55
41
|
const input = {
|
|
56
42
|
host: process.env.WEBINY_MAILER_HOST,
|
|
@@ -63,18 +49,13 @@ const getDefaultSettings = () => {
|
|
|
63
49
|
/**
|
|
64
50
|
* No need to do the validation if there is not at least one variable defined.
|
|
65
51
|
*/
|
|
66
|
-
|
|
67
52
|
const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());
|
|
68
|
-
|
|
69
53
|
if (!hasAtLeastOneValue) {
|
|
70
54
|
return null;
|
|
71
55
|
}
|
|
72
|
-
|
|
73
56
|
const result = _validation.createValidation.safeParse(input);
|
|
74
|
-
|
|
75
57
|
return result.success ? result.data : null;
|
|
76
58
|
};
|
|
77
|
-
|
|
78
59
|
const createTransporterCrud = async context => {
|
|
79
60
|
const transporters = {};
|
|
80
61
|
const defaultSettings = getDefaultSettings();
|
|
@@ -83,32 +64,26 @@ const createTransporterCrud = async context => {
|
|
|
83
64
|
* The last plugins are our default ones with the default configurations.
|
|
84
65
|
* If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.
|
|
85
66
|
*/
|
|
86
|
-
|
|
87
67
|
const plugins = context.plugins.byType(_plugins.CreateTransportPlugin.type).reverse();
|
|
68
|
+
|
|
88
69
|
/**
|
|
89
70
|
* We define possible events to be hooked into.
|
|
90
71
|
*/
|
|
91
|
-
|
|
92
72
|
const onTransportBeforeSend = (0, _pubsub.createTopic)("mailer.onTransportBeforeSend");
|
|
93
73
|
const onTransportAfterSend = (0, _pubsub.createTopic)("mailer.onTransportAfterSend");
|
|
94
74
|
const onTransportError = (0, _pubsub.createTopic)("mailer.onTransportError");
|
|
95
75
|
/**
|
|
96
76
|
* We attach our default ones.
|
|
97
77
|
*/
|
|
98
|
-
|
|
99
78
|
(0, _onTransportBeforeSend.attachOnTransportBeforeSend)({
|
|
100
79
|
onTransportBeforeSend
|
|
101
80
|
});
|
|
102
|
-
|
|
103
81
|
const getTransport = async () => {
|
|
104
82
|
const tenant = context.tenancy.getCurrentTenant().id;
|
|
105
|
-
|
|
106
83
|
if (transporters[tenant]) {
|
|
107
84
|
return transporters[tenant];
|
|
108
85
|
}
|
|
109
|
-
|
|
110
86
|
let settings = null;
|
|
111
|
-
|
|
112
87
|
try {
|
|
113
88
|
settings = await context.mailer.getSettings();
|
|
114
89
|
} catch (ex) {
|
|
@@ -117,11 +92,9 @@ const createTransporterCrud = async context => {
|
|
|
117
92
|
console.log(ex.code);
|
|
118
93
|
}
|
|
119
94
|
}
|
|
120
|
-
|
|
121
95
|
if (!settings && !defaultSettings) {
|
|
122
96
|
console.log(`There are no Mailer transport settings for tenant "${tenant}".`);
|
|
123
97
|
}
|
|
124
|
-
|
|
125
98
|
const transporter = await buildTransporter({
|
|
126
99
|
settings: settings || defaultSettings,
|
|
127
100
|
plugins,
|
|
@@ -130,7 +103,6 @@ const createTransporterCrud = async context => {
|
|
|
130
103
|
transporters[tenant] = transporter;
|
|
131
104
|
return transporter;
|
|
132
105
|
};
|
|
133
|
-
|
|
134
106
|
return {
|
|
135
107
|
onTransportBeforeSend,
|
|
136
108
|
onTransportAfterSend,
|
|
@@ -138,7 +110,6 @@ const createTransporterCrud = async context => {
|
|
|
138
110
|
getTransport,
|
|
139
111
|
sendMail: async data => {
|
|
140
112
|
const transport = await getTransport();
|
|
141
|
-
|
|
142
113
|
if (!transport) {
|
|
143
114
|
return {
|
|
144
115
|
result: null,
|
|
@@ -148,7 +119,6 @@ const createTransporterCrud = async context => {
|
|
|
148
119
|
}
|
|
149
120
|
};
|
|
150
121
|
}
|
|
151
|
-
|
|
152
122
|
try {
|
|
153
123
|
await onTransportBeforeSend.publish({
|
|
154
124
|
data,
|
|
@@ -183,5 +153,4 @@ const createTransporterCrud = async context => {
|
|
|
183
153
|
}
|
|
184
154
|
};
|
|
185
155
|
};
|
|
186
|
-
|
|
187
156
|
exports.createTransporterCrud = createTransporterCrud;
|