@webiny/api-mailer 0.0.0-unstable.1e66d121db → 0.0.0-unstable.2af142b57e
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 +2 -4
- 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 +24 -18
- 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 +45 -4
- package/crud/settings/validation.js +11 -23
- package/crud/settings/validation.js.map +1 -1
- package/crud/settings.crud.js +29 -76
- package/crud/settings.crud.js.map +1 -1
- package/crud/transport/onTransportBeforeSend.js +23 -34
- package/crud/transport/onTransportBeforeSend.js.map +1 -1
- package/crud/transporter.crud.js +11 -37
- 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 +10 -16
- package/graphql/settings.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.js +24 -15
- package/index.js.map +1 -1
- package/package.json +24 -24
- 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 +0 -2
- package/transports/createDummyTransport.js.map +1 -1
- package/transports/createSmtpTransport.d.ts +1 -1
- package/transports/createSmtpTransport.js +20 -14
- package/transports/createSmtpTransport.js.map +1 -1
- package/types.d.ts +1 -0
- package/types.js.map +1 -1
- package/crud/mailer/onBeforeSend.d.ts +0 -7
- package/crud/mailer/onBeforeSend.js +0 -69
- package/crud/mailer/onBeforeSend.js.map +0 -1
- package/crud/mailer.crud.d.ts +0 -2
- package/crud/mailer.crud.js +0 -123
- package/crud/mailer.crud.js.map +0 -1
- package/mailers/createDummyMailer.d.ts +0 -5
- package/mailers/createDummyMailer.js +0 -24
- package/mailers/createDummyMailer.js.map +0 -1
- package/mailers/createSmtpMailer.d.ts +0 -13
- package/mailers/createSmtpMailer.js +0 -106
- package/mailers/createSmtpMailer.js.map +0 -1
package/crud/settings.crud.js
CHANGED
|
@@ -1,35 +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.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"];
|
|
33
20
|
/**
|
|
34
21
|
* Note that settings cannot be used if there is no secret defined.
|
|
35
22
|
*/
|
|
@@ -38,36 +25,28 @@ const createSettingsCrud = async context => {
|
|
|
38
25
|
* We need to remove password from all references on create and update in the CMS.
|
|
39
26
|
*/
|
|
40
27
|
(0, _hooks.attachPasswordObfuscatingHooks)(context);
|
|
41
|
-
|
|
42
28
|
const getTenant = () => {
|
|
43
29
|
return context.tenancy.getCurrentTenant().id;
|
|
44
30
|
};
|
|
45
|
-
|
|
46
31
|
const validateAccess = async () => {
|
|
47
32
|
const permission = await context.security.getPermission("mailer.settings");
|
|
48
|
-
|
|
49
33
|
if (permission) {
|
|
50
34
|
return;
|
|
51
35
|
}
|
|
52
|
-
|
|
53
36
|
throw new _apiSecurity.NotAuthorizedError({
|
|
54
37
|
data: {
|
|
55
38
|
reason: `Not allowed to update the mailer settings.`
|
|
56
39
|
}
|
|
57
40
|
});
|
|
58
41
|
};
|
|
59
|
-
|
|
60
42
|
let secret = null;
|
|
61
|
-
|
|
62
43
|
try {
|
|
63
44
|
secret = (0, _secret.getSecret)();
|
|
64
45
|
} catch (ex) {}
|
|
65
|
-
|
|
66
46
|
const getModel = async () => {
|
|
67
47
|
try {
|
|
68
48
|
context.security.disableAuthorization();
|
|
69
49
|
const model = await context.cms.getModel(_model.SETTINGS_MODEL_ID);
|
|
70
|
-
|
|
71
50
|
if (model) {
|
|
72
51
|
return model;
|
|
73
52
|
}
|
|
@@ -76,35 +55,31 @@ const createSettingsCrud = async context => {
|
|
|
76
55
|
} finally {
|
|
77
56
|
context.security.enableAuthorization();
|
|
78
57
|
}
|
|
79
|
-
|
|
80
58
|
throw new _error.default(`Missing CMS Model "${_model.SETTINGS_MODEL_ID}".`, "CMS_MODEL_MISSING", {
|
|
81
59
|
modelId: _model.SETTINGS_MODEL_ID
|
|
82
60
|
});
|
|
83
|
-
};
|
|
84
|
-
|
|
61
|
+
};
|
|
85
62
|
|
|
63
|
+
// get
|
|
86
64
|
const onSettingsBeforeGet = (0, _pubsub.createTopic)("mailer.onSettingsBeforeGet");
|
|
87
65
|
const onSettingsAfterGet = (0, _pubsub.createTopic)("mailer.onSettingsAfterGet");
|
|
88
|
-
const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
89
|
-
|
|
66
|
+
const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
67
|
+
// create
|
|
90
68
|
const onSettingsBeforeCreate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeCreate");
|
|
91
69
|
const onSettingsAfterCreate = (0, _pubsub.createTopic)("mailer.onSettingsAfterCreate");
|
|
92
|
-
const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
93
|
-
|
|
70
|
+
const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
|
|
71
|
+
// update
|
|
94
72
|
const onSettingsBeforeUpdate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeUpdate");
|
|
95
73
|
const onSettingsAfterUpdate = (0, _pubsub.createTopic)("mailer.onSettingsAfterUpdate");
|
|
96
74
|
const onSettingsUpdateError = (0, _pubsub.createTopic)("mailer.onSettingsUpdateError");
|
|
97
|
-
|
|
98
75
|
const checkSecret = () => {
|
|
99
76
|
if (secret) {
|
|
100
77
|
return;
|
|
101
78
|
}
|
|
102
|
-
|
|
103
79
|
throw new _error.default("There must be a password secret defined!", "PASSWORD_SECRET_ERROR", {
|
|
104
80
|
description: "To store the Mailer settings, you must have a password secret environment variable defined."
|
|
105
81
|
});
|
|
106
82
|
};
|
|
107
|
-
|
|
108
83
|
return {
|
|
109
84
|
onSettingsAfterGet,
|
|
110
85
|
onSettingsBeforeGet,
|
|
@@ -119,7 +94,6 @@ const createSettingsCrud = async context => {
|
|
|
119
94
|
checkSecret();
|
|
120
95
|
const model = await getModel();
|
|
121
96
|
const tenant = getTenant();
|
|
122
|
-
|
|
123
97
|
try {
|
|
124
98
|
context.security.disableAuthorization();
|
|
125
99
|
await onSettingsBeforeGet.publish({
|
|
@@ -129,17 +103,14 @@ const createSettingsCrud = async context => {
|
|
|
129
103
|
* We always list because we have no id or something like that to query by.
|
|
130
104
|
* This should return one setting anyway.
|
|
131
105
|
*/
|
|
132
|
-
|
|
133
106
|
const [entries] = await context.cms.listLatestEntries(model, {
|
|
134
107
|
limit: 1,
|
|
135
108
|
sort: ["createdOn_DESC"]
|
|
136
109
|
});
|
|
137
110
|
const [entry] = entries;
|
|
138
|
-
|
|
139
111
|
if (!entry) {
|
|
140
112
|
return null;
|
|
141
113
|
}
|
|
142
|
-
|
|
143
114
|
const settings = (0, _transform.transformValuesFromEntry)({
|
|
144
115
|
entry: entry,
|
|
145
116
|
secret
|
|
@@ -160,10 +131,8 @@ const createSettingsCrud = async context => {
|
|
|
160
131
|
} finally {
|
|
161
132
|
context.security.enableAuthorization();
|
|
162
133
|
}
|
|
163
|
-
|
|
164
134
|
return null;
|
|
165
135
|
},
|
|
166
|
-
|
|
167
136
|
/**
|
|
168
137
|
* Method should not be used outside of mailer
|
|
169
138
|
* @internal
|
|
@@ -175,26 +144,23 @@ const createSettingsCrud = async context => {
|
|
|
175
144
|
input
|
|
176
145
|
} = params;
|
|
177
146
|
const model = await getModel();
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const error = result.error;
|
|
182
|
-
|
|
183
|
-
if (error) {
|
|
147
|
+
const result = _validation.createValidation.safeParse(input);
|
|
148
|
+
if (!result.success) {
|
|
184
149
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
185
|
-
errors: error.
|
|
150
|
+
errors: result.error.errors
|
|
186
151
|
});
|
|
187
152
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
153
|
+
const _result$data = result.data,
|
|
154
|
+
{
|
|
155
|
+
password
|
|
156
|
+
} = _result$data,
|
|
157
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data, _excluded);
|
|
158
|
+
if (!settings.port) {
|
|
159
|
+
settings.port = 25;
|
|
160
|
+
}
|
|
194
161
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
195
162
|
password: ""
|
|
196
163
|
});
|
|
197
|
-
|
|
198
164
|
try {
|
|
199
165
|
context.security.disableAuthorization();
|
|
200
166
|
await onSettingsBeforeCreate.publish({
|
|
@@ -220,7 +186,6 @@ const createSettingsCrud = async context => {
|
|
|
220
186
|
context.security.enableAuthorization();
|
|
221
187
|
}
|
|
222
188
|
},
|
|
223
|
-
|
|
224
189
|
/**
|
|
225
190
|
* Method should not be used outside of mailer
|
|
226
191
|
* @internal
|
|
@@ -233,36 +198,30 @@ const createSettingsCrud = async context => {
|
|
|
233
198
|
original: initialOriginal
|
|
234
199
|
} = params;
|
|
235
200
|
const model = await getModel();
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const error = result.error;
|
|
240
|
-
|
|
241
|
-
if (error) {
|
|
201
|
+
const result = _validation.updateValidation.safeParse(input);
|
|
202
|
+
if (!result.success) {
|
|
242
203
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
243
|
-
errors: error.
|
|
204
|
+
errors: result.error.errors
|
|
244
205
|
});
|
|
245
206
|
}
|
|
246
|
-
|
|
247
207
|
let original = initialOriginal;
|
|
248
|
-
|
|
249
208
|
if (!original) {
|
|
250
209
|
original = await this.getSettings();
|
|
251
|
-
|
|
252
210
|
if (!original) {
|
|
253
211
|
throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
|
|
254
212
|
}
|
|
255
213
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
214
|
+
const _result$data2 = result.data,
|
|
215
|
+
{
|
|
216
|
+
password
|
|
217
|
+
} = _result$data2,
|
|
218
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data2, _excluded2);
|
|
219
|
+
if (!settings.port) {
|
|
220
|
+
settings.port = original.port || 25;
|
|
221
|
+
}
|
|
262
222
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
263
223
|
password: ""
|
|
264
224
|
});
|
|
265
|
-
|
|
266
225
|
try {
|
|
267
226
|
context.security.disableAuthorization();
|
|
268
227
|
await onSettingsBeforeUpdate.publish({
|
|
@@ -278,7 +237,6 @@ const createSettingsCrud = async context => {
|
|
|
278
237
|
/**
|
|
279
238
|
* We want to make sure that old password gets stored again in case no password was sent in update input.
|
|
280
239
|
*/
|
|
281
|
-
|
|
282
240
|
await context.cms.updateEntry(model, original.id, transformedInput);
|
|
283
241
|
await onSettingsAfterUpdate.publish({
|
|
284
242
|
settings: passwordlessSettings,
|
|
@@ -296,26 +254,21 @@ const createSettingsCrud = async context => {
|
|
|
296
254
|
context.security.enableAuthorization();
|
|
297
255
|
}
|
|
298
256
|
},
|
|
299
|
-
|
|
300
257
|
async saveSettings(params) {
|
|
301
258
|
const {
|
|
302
259
|
input
|
|
303
260
|
} = params;
|
|
304
261
|
const original = await this.getSettings();
|
|
305
|
-
|
|
306
262
|
if (!original) {
|
|
307
263
|
return this.createSettings({
|
|
308
264
|
input
|
|
309
265
|
});
|
|
310
266
|
}
|
|
311
|
-
|
|
312
267
|
return this.updateSettings({
|
|
313
268
|
input,
|
|
314
269
|
original
|
|
315
270
|
});
|
|
316
271
|
}
|
|
317
|
-
|
|
318
272
|
};
|
|
319
273
|
};
|
|
320
|
-
|
|
321
274
|
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","validate","errors","details","value","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.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\n });\n }\n\n const { password, ...settings } = result.value;\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.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\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.value;\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":["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,37 +1,24 @@
|
|
|
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
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
|
-
|
|
12
|
-
var _joi = _interopRequireDefault(require("joi"));
|
|
13
|
-
|
|
14
8
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const requiredEmail = requiredString.email(options);
|
|
23
|
-
|
|
24
|
-
const schema = _joi.default.object({
|
|
25
|
-
to: _joi.default.array().items(requiredEmail),
|
|
26
|
-
from: requiredEmail,
|
|
9
|
+
var _zod = _interopRequireDefault(require("zod"));
|
|
10
|
+
const requiredString = _zod.default.string();
|
|
11
|
+
const requiredEmail = requiredString.email();
|
|
12
|
+
const schema = _zod.default.object({
|
|
13
|
+
to: _zod.default.array(requiredEmail).optional(),
|
|
14
|
+
from: _zod.default.string().email().optional(),
|
|
27
15
|
subject: requiredString.max(1024),
|
|
28
|
-
cc:
|
|
29
|
-
bcc:
|
|
30
|
-
replyTo:
|
|
16
|
+
cc: _zod.default.array(requiredEmail).optional(),
|
|
17
|
+
bcc: _zod.default.array(requiredEmail).optional(),
|
|
18
|
+
replyTo: _zod.default.string().email().optional(),
|
|
31
19
|
text: requiredString.min(10),
|
|
32
|
-
html:
|
|
20
|
+
html: _zod.default.string().optional()
|
|
33
21
|
});
|
|
34
|
-
|
|
35
22
|
const attachOnTransportBeforeSend = params => {
|
|
36
23
|
const {
|
|
37
24
|
onTransportBeforeSend
|
|
@@ -40,14 +27,23 @@ const attachOnTransportBeforeSend = params => {
|
|
|
40
27
|
data: input
|
|
41
28
|
}) => {
|
|
42
29
|
let result;
|
|
43
|
-
|
|
44
30
|
try {
|
|
45
|
-
result =
|
|
46
|
-
|
|
47
|
-
if (!result.error) {
|
|
31
|
+
result = schema.safeParse(input);
|
|
32
|
+
if (result.success) {
|
|
48
33
|
return;
|
|
49
34
|
}
|
|
35
|
+
throw new _error.default({
|
|
36
|
+
message: "Error while validating e-mail params.",
|
|
37
|
+
code: "VALIDATION_ERROR",
|
|
38
|
+
data: {
|
|
39
|
+
error: result.error,
|
|
40
|
+
input
|
|
41
|
+
}
|
|
42
|
+
});
|
|
50
43
|
} catch (ex) {
|
|
44
|
+
if (ex instanceof _error.default) {
|
|
45
|
+
throw ex;
|
|
46
|
+
}
|
|
51
47
|
throw new _error.default({
|
|
52
48
|
message: "Error while validating e-mail params.",
|
|
53
49
|
code: "VALIDATION_ERROR",
|
|
@@ -57,13 +53,6 @@ const attachOnTransportBeforeSend = params => {
|
|
|
57
53
|
}
|
|
58
54
|
});
|
|
59
55
|
}
|
|
60
|
-
|
|
61
|
-
throw new _error.default({
|
|
62
|
-
message: "Error while validating e-mail params.",
|
|
63
|
-
code: "VALIDATION_ERROR",
|
|
64
|
-
data: (0, _objectSpread2.default)({}, result.error)
|
|
65
|
-
});
|
|
66
56
|
});
|
|
67
57
|
};
|
|
68
|
-
|
|
69
58
|
exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","data","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.object({\n to: zod.array(requiredEmail).optional(),\n from: zod.string().email().optional(),\n subject: requiredString.max(1024),\n cc: zod.array(requiredEmail).optional(),\n bcc: zod.array(requiredEmail).optional(),\n replyTo: zod.string().email().optional(),\n text: requiredString.min(10),\n html: zod.string().optional()\n});\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,CAACK,MAAM,CAAC;EACtBC,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;EACjCC,EAAE,EAAEZ,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCK,GAAG,EAAEb,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACxCM,OAAO,EAAEd,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACxCO,IAAI,EAAEhB,cAAc,CAACiB,GAAG,CAAC,EAAE,CAAC;EAC5BC,IAAI,EAAEjB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ;AAC/B,CAAC,CAAC;AAOK,MAAMU,2BAA2B,GAAIC,MAAc,IAAK;EAC3D,MAAM;IAAEC;EAAsB,CAAC,GAAGD,MAAM;EAExCC,qBAAqB,CAACC,SAAS,CAAC,OAAO;IAAEC,IAAI,EAAEC;EAAM,CAAC,KAAK;IACvD,IAAIC,MAAmD;IACvD,IAAI;MACAA,MAAM,GAAGpB,MAAM,CAACqB,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;QACxBP,IAAI,EAAE;UACFQ,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;QACxBP,IAAI,EAAE;UACFC,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,13 +28,19 @@ 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
|
-
|
|
33
|
+
const getPort = value => {
|
|
34
|
+
const port = Number(value);
|
|
35
|
+
if (!!value && isNaN(port) === false) {
|
|
36
|
+
return port;
|
|
37
|
+
}
|
|
38
|
+
return 25;
|
|
39
|
+
};
|
|
44
40
|
const getDefaultSettings = () => {
|
|
45
41
|
const input = {
|
|
46
42
|
host: process.env.WEBINY_MAILER_HOST,
|
|
43
|
+
port: getPort(process.env.WEBINY_MAILER_PORT),
|
|
47
44
|
user: process.env.WEBINY_MAILER_USER,
|
|
48
45
|
password: process.env.WEBINY_MAILER_PASSWORD,
|
|
49
46
|
replyTo: process.env.WEBINY_MAILER_REPLY_TO,
|
|
@@ -52,24 +49,13 @@ const getDefaultSettings = () => {
|
|
|
52
49
|
/**
|
|
53
50
|
* No need to do the validation if there is not at least one variable defined.
|
|
54
51
|
*/
|
|
55
|
-
|
|
56
52
|
const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());
|
|
57
|
-
|
|
58
53
|
if (!hasAtLeastOneValue) {
|
|
59
54
|
return null;
|
|
60
55
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const result = _validation.createValidation.validate(input);
|
|
64
|
-
|
|
65
|
-
if (!result.error) {
|
|
66
|
-
return result.value;
|
|
67
|
-
}
|
|
68
|
-
} catch (ex) {}
|
|
69
|
-
|
|
70
|
-
return null;
|
|
56
|
+
const result = _validation.createValidation.safeParse(input);
|
|
57
|
+
return result.success ? result.data : null;
|
|
71
58
|
};
|
|
72
|
-
|
|
73
59
|
const createTransporterCrud = async context => {
|
|
74
60
|
const transporters = {};
|
|
75
61
|
const defaultSettings = getDefaultSettings();
|
|
@@ -78,32 +64,26 @@ const createTransporterCrud = async context => {
|
|
|
78
64
|
* The last plugins are our default ones with the default configurations.
|
|
79
65
|
* If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.
|
|
80
66
|
*/
|
|
81
|
-
|
|
82
67
|
const plugins = context.plugins.byType(_plugins.CreateTransportPlugin.type).reverse();
|
|
68
|
+
|
|
83
69
|
/**
|
|
84
70
|
* We define possible events to be hooked into.
|
|
85
71
|
*/
|
|
86
|
-
|
|
87
72
|
const onTransportBeforeSend = (0, _pubsub.createTopic)("mailer.onTransportBeforeSend");
|
|
88
73
|
const onTransportAfterSend = (0, _pubsub.createTopic)("mailer.onTransportAfterSend");
|
|
89
74
|
const onTransportError = (0, _pubsub.createTopic)("mailer.onTransportError");
|
|
90
75
|
/**
|
|
91
76
|
* We attach our default ones.
|
|
92
77
|
*/
|
|
93
|
-
|
|
94
78
|
(0, _onTransportBeforeSend.attachOnTransportBeforeSend)({
|
|
95
79
|
onTransportBeforeSend
|
|
96
80
|
});
|
|
97
|
-
|
|
98
81
|
const getTransport = async () => {
|
|
99
82
|
const tenant = context.tenancy.getCurrentTenant().id;
|
|
100
|
-
|
|
101
83
|
if (transporters[tenant]) {
|
|
102
84
|
return transporters[tenant];
|
|
103
85
|
}
|
|
104
|
-
|
|
105
86
|
let settings = null;
|
|
106
|
-
|
|
107
87
|
try {
|
|
108
88
|
settings = await context.mailer.getSettings();
|
|
109
89
|
} catch (ex) {
|
|
@@ -112,11 +92,9 @@ const createTransporterCrud = async context => {
|
|
|
112
92
|
console.log(ex.code);
|
|
113
93
|
}
|
|
114
94
|
}
|
|
115
|
-
|
|
116
95
|
if (!settings && !defaultSettings) {
|
|
117
96
|
console.log(`There are no Mailer transport settings for tenant "${tenant}".`);
|
|
118
97
|
}
|
|
119
|
-
|
|
120
98
|
const transporter = await buildTransporter({
|
|
121
99
|
settings: settings || defaultSettings,
|
|
122
100
|
plugins,
|
|
@@ -125,7 +103,6 @@ const createTransporterCrud = async context => {
|
|
|
125
103
|
transporters[tenant] = transporter;
|
|
126
104
|
return transporter;
|
|
127
105
|
};
|
|
128
|
-
|
|
129
106
|
return {
|
|
130
107
|
onTransportBeforeSend,
|
|
131
108
|
onTransportAfterSend,
|
|
@@ -133,7 +110,6 @@ const createTransporterCrud = async context => {
|
|
|
133
110
|
getTransport,
|
|
134
111
|
sendMail: async data => {
|
|
135
112
|
const transport = await getTransport();
|
|
136
|
-
|
|
137
113
|
if (!transport) {
|
|
138
114
|
return {
|
|
139
115
|
result: null,
|
|
@@ -143,7 +119,6 @@ const createTransporterCrud = async context => {
|
|
|
143
119
|
}
|
|
144
120
|
};
|
|
145
121
|
}
|
|
146
|
-
|
|
147
122
|
try {
|
|
148
123
|
await onTransportBeforeSend.publish({
|
|
149
124
|
data,
|
|
@@ -178,5 +153,4 @@ const createTransporterCrud = async context => {
|
|
|
178
153
|
}
|
|
179
154
|
};
|
|
180
155
|
};
|
|
181
|
-
|
|
182
156
|
exports.createTransporterCrud = createTransporterCrud;
|