@webiny/api-mailer 5.33.5 → 5.34.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/context.d.ts +2 -2
  2. package/context.js +9 -3
  3. package/context.js.map +1 -1
  4. package/crud/group.d.ts +2 -0
  5. package/crud/group.js +21 -0
  6. package/crud/group.js.map +1 -0
  7. package/crud/settings/hooks.d.ts +5 -0
  8. package/crud/settings/hooks.js +55 -0
  9. package/crud/settings/hooks.js.map +1 -0
  10. package/crud/settings/model.d.ts +3 -0
  11. package/crud/settings/model.js +90 -0
  12. package/crud/settings/model.js.map +1 -0
  13. package/crud/settings/password.d.ts +7 -0
  14. package/crud/settings/password.js +71 -0
  15. package/crud/settings/password.js.map +1 -0
  16. package/crud/settings/secret.d.ts +1 -0
  17. package/crud/settings/secret.js +23 -0
  18. package/crud/settings/secret.js.map +1 -0
  19. package/crud/settings/transform.d.ts +13 -0
  20. package/crud/settings/transform.js +56 -0
  21. package/crud/settings/transform.js.map +1 -0
  22. package/crud/settings/validation.d.ts +4 -0
  23. package/crud/settings/validation.js +38 -0
  24. package/crud/settings/validation.js.map +1 -0
  25. package/crud/settings.crud.d.ts +5 -0
  26. package/crud/settings.crud.js +331 -0
  27. package/crud/settings.crud.js.map +1 -0
  28. package/crud/transport/onTransportBeforeSend.d.ts +7 -0
  29. package/crud/transport/onTransportBeforeSend.js +69 -0
  30. package/crud/transport/onTransportBeforeSend.js.map +1 -0
  31. package/crud/transporter.crud.d.ts +2 -0
  32. package/crud/transporter.crud.js +193 -0
  33. package/crud/transporter.crud.js.map +1 -0
  34. package/graphql/index.d.ts +1 -0
  35. package/graphql/index.js +14 -0
  36. package/graphql/index.js.map +1 -0
  37. package/graphql/settings.d.ts +3 -0
  38. package/graphql/settings.js +109 -0
  39. package/graphql/settings.js.map +1 -0
  40. package/index.d.ts +7 -6
  41. package/index.js +69 -10
  42. package/index.js.map +1 -1
  43. package/package.json +33 -15
  44. package/plugins/CreateTransportPlugin.d.ts +17 -0
  45. package/plugins/CreateTransportPlugin.js +34 -0
  46. package/plugins/CreateTransportPlugin.js.map +1 -0
  47. package/plugins/index.d.ts +1 -0
  48. package/plugins/index.js +18 -0
  49. package/plugins/index.js.map +1 -0
  50. package/transports/createDummyTransport.d.ts +5 -0
  51. package/{mailers/createDummyMailer.js → transports/createDummyTransport.js} +4 -3
  52. package/transports/createDummyTransport.js.map +1 -0
  53. package/transports/createSmtpTransport.d.ts +12 -0
  54. package/transports/createSmtpTransport.js +101 -0
  55. package/transports/createSmtpTransport.js.map +1 -0
  56. package/types.d.ts +124 -34
  57. package/types.js.map +1 -1
  58. package/crud/mailer/onBeforeSend.d.ts +0 -7
  59. package/crud/mailer/onBeforeSend.js +0 -69
  60. package/crud/mailer/onBeforeSend.js.map +0 -1
  61. package/crud/mailer.crud.d.ts +0 -2
  62. package/crud/mailer.crud.js +0 -123
  63. package/crud/mailer.crud.js.map +0 -1
  64. package/mailers/createDummyMailer.d.ts +0 -5
  65. package/mailers/createDummyMailer.js.map +0 -1
  66. package/mailers/createSmtpMailer.d.ts +0 -13
  67. package/mailers/createSmtpMailer.js +0 -106
  68. package/mailers/createSmtpMailer.js.map +0 -1
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createSettingsCrud = void 0;
9
+
10
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
+
12
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
13
+
14
+ var _error = _interopRequireDefault(require("@webiny/error"));
15
+
16
+ var _pubsub = require("@webiny/pubsub");
17
+
18
+ var _model = require("./settings/model");
19
+
20
+ var _transform = require("./settings/transform");
21
+
22
+ var _secret = require("./settings/secret");
23
+
24
+ var _validation = require("./settings/validation");
25
+
26
+ var _hooks = require("./settings/hooks");
27
+
28
+ var _apiSecurity = require("@webiny/api-security");
29
+
30
+ const _excluded = ["password"],
31
+ _excluded2 = ["password"];
32
+
33
+ /**
34
+ * Note that settings cannot be used if there is no secret defined.
35
+ */
36
+ const createSettingsCrud = async context => {
37
+ /**
38
+ * We need to remove password from all references on create and update in the CMS.
39
+ */
40
+ (0, _hooks.attachPasswordObfuscatingHooks)(context);
41
+
42
+ const getTenant = () => {
43
+ return context.tenancy.getCurrentTenant().id;
44
+ };
45
+
46
+ const validateAccess = async () => {
47
+ const permission = await context.security.getPermission("mailer.settings");
48
+
49
+ if (permission) {
50
+ return;
51
+ }
52
+
53
+ throw new _apiSecurity.NotAuthorizedError({
54
+ data: {
55
+ reason: `Not allowed to update the mailer settings.`
56
+ }
57
+ });
58
+ };
59
+
60
+ let secret = null;
61
+
62
+ try {
63
+ secret = (0, _secret.getSecret)();
64
+ } catch (ex) {}
65
+
66
+ const getModel = async () => {
67
+ try {
68
+ context.security.disableAuthorization();
69
+ const model = await context.cms.getModel(_model.SETTINGS_MODEL_ID);
70
+
71
+ if (model) {
72
+ return model;
73
+ }
74
+ } catch (ex) {
75
+ throw new _error.default(ex.message, ex.code, ex.data);
76
+ } finally {
77
+ context.security.enableAuthorization();
78
+ }
79
+
80
+ throw new _error.default(`Missing CMS Model "${_model.SETTINGS_MODEL_ID}".`, "CMS_MODEL_MISSING", {
81
+ modelId: _model.SETTINGS_MODEL_ID
82
+ });
83
+ }; // get
84
+
85
+
86
+ const onSettingsBeforeGet = (0, _pubsub.createTopic)("mailer.onSettingsBeforeGet");
87
+ const onSettingsAfterGet = (0, _pubsub.createTopic)("mailer.onSettingsAfterGet");
88
+ const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError"); // create
89
+
90
+ const onSettingsBeforeCreate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeCreate");
91
+ const onSettingsAfterCreate = (0, _pubsub.createTopic)("mailer.onSettingsAfterCreate");
92
+ const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError"); // update
93
+
94
+ const onSettingsBeforeUpdate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeUpdate");
95
+ const onSettingsAfterUpdate = (0, _pubsub.createTopic)("mailer.onSettingsAfterUpdate");
96
+ const onSettingsUpdateError = (0, _pubsub.createTopic)("mailer.onSettingsUpdateError");
97
+
98
+ const checkSecret = () => {
99
+ if (secret) {
100
+ return;
101
+ }
102
+
103
+ throw new _error.default("There must be a password secret defined!", "PASSWORD_SECRET_ERROR", {
104
+ description: "To store the Mailer settings, you must have a password secret environment variable defined."
105
+ });
106
+ };
107
+
108
+ return {
109
+ onSettingsAfterGet,
110
+ onSettingsBeforeGet,
111
+ onSettingsGetError,
112
+ onSettingsBeforeCreate,
113
+ onSettingsAfterCreate,
114
+ onSettingsCreateError,
115
+ onSettingsBeforeUpdate,
116
+ onSettingsAfterUpdate,
117
+ onSettingsUpdateError,
118
+ getSettings: async () => {
119
+ checkSecret();
120
+ const model = await getModel();
121
+ const tenant = getTenant();
122
+
123
+ try {
124
+ context.security.disableAuthorization();
125
+ await onSettingsBeforeGet.publish({
126
+ tenant
127
+ });
128
+ /**
129
+ * We always list because we have no id or something like that to query by.
130
+ * This should return one setting anyway.
131
+ */
132
+
133
+ const [entries] = await context.cms.listLatestEntries(model, {
134
+ limit: 1,
135
+ sort: ["createdOn_DESC"]
136
+ });
137
+ const [entry] = entries;
138
+
139
+ if (!entry) {
140
+ return null;
141
+ }
142
+
143
+ const settings = (0, _transform.transformValuesFromEntry)({
144
+ entry: entry,
145
+ secret
146
+ });
147
+ const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
148
+ password: ""
149
+ });
150
+ await onSettingsAfterGet.publish({
151
+ tenant,
152
+ settings: passwordlessSettings
153
+ });
154
+ return settings;
155
+ } catch (ex) {
156
+ await onSettingsGetError.publish({
157
+ tenant,
158
+ error: ex
159
+ });
160
+ } finally {
161
+ context.security.enableAuthorization();
162
+ }
163
+
164
+ return null;
165
+ },
166
+
167
+ /**
168
+ * Method should not be used outside of mailer
169
+ * @internal
170
+ */
171
+ async createSettings(params) {
172
+ checkSecret();
173
+ await validateAccess();
174
+ const {
175
+ input
176
+ } = params;
177
+ const model = await getModel();
178
+
179
+ const result = _validation.createValidation.validate(input);
180
+
181
+ const error = result.error;
182
+
183
+ if (error) {
184
+ throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
185
+ errors: error.details
186
+ });
187
+ }
188
+
189
+ const _result$value = result.value,
190
+ {
191
+ password
192
+ } = _result$value,
193
+ settings = (0, _objectWithoutProperties2.default)(_result$value, _excluded);
194
+
195
+ if (!settings.port) {
196
+ settings.port = 25;
197
+ }
198
+
199
+ const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
200
+ password: ""
201
+ });
202
+
203
+ try {
204
+ context.security.disableAuthorization();
205
+ await onSettingsBeforeCreate.publish({
206
+ settings: passwordlessSettings
207
+ });
208
+ await context.cms.createEntry(model, (0, _transform.transformInputToEntryValues)({
209
+ values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
210
+ password
211
+ }),
212
+ secret
213
+ }));
214
+ await onSettingsAfterCreate.publish({
215
+ settings: passwordlessSettings
216
+ });
217
+ return passwordlessSettings;
218
+ } catch (ex) {
219
+ await onSettingsCreateError.publish({
220
+ settings: passwordlessSettings,
221
+ error: ex
222
+ });
223
+ throw new _error.default(ex.message, ex.code, ex.data);
224
+ } finally {
225
+ context.security.enableAuthorization();
226
+ }
227
+ },
228
+
229
+ /**
230
+ * Method should not be used outside of mailer
231
+ * @internal
232
+ */
233
+ async updateSettings(params) {
234
+ checkSecret();
235
+ await validateAccess();
236
+ const {
237
+ input,
238
+ original: initialOriginal
239
+ } = params;
240
+ const model = await getModel();
241
+
242
+ const result = _validation.updateValidation.validate(input);
243
+
244
+ const error = result.error;
245
+
246
+ if (error) {
247
+ throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
248
+ errors: error.details
249
+ });
250
+ }
251
+
252
+ let original = initialOriginal;
253
+
254
+ if (!original) {
255
+ original = await this.getSettings();
256
+
257
+ if (!original) {
258
+ throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
259
+ }
260
+ }
261
+
262
+ const _result$value2 = result.value,
263
+ {
264
+ password
265
+ } = _result$value2,
266
+ settings = (0, _objectWithoutProperties2.default)(_result$value2, _excluded2);
267
+
268
+ if (!settings.port) {
269
+ settings.port = original.port || 25;
270
+ }
271
+
272
+ const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
273
+ password: ""
274
+ });
275
+
276
+ try {
277
+ context.security.disableAuthorization();
278
+ await onSettingsBeforeUpdate.publish({
279
+ settings: passwordlessSettings,
280
+ original
281
+ });
282
+ const transformedInput = (0, _transform.transformInputToEntryValues)({
283
+ values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
284
+ password: password || original.password
285
+ }),
286
+ secret
287
+ });
288
+ /**
289
+ * We want to make sure that old password gets stored again in case no password was sent in update input.
290
+ */
291
+
292
+ await context.cms.updateEntry(model, original.id, transformedInput);
293
+ await onSettingsAfterUpdate.publish({
294
+ settings: passwordlessSettings,
295
+ original
296
+ });
297
+ return passwordlessSettings;
298
+ } catch (ex) {
299
+ await onSettingsUpdateError.publish({
300
+ original,
301
+ settings: passwordlessSettings,
302
+ error: ex
303
+ });
304
+ throw new _error.default(ex.message, ex.code, ex.data);
305
+ } finally {
306
+ context.security.enableAuthorization();
307
+ }
308
+ },
309
+
310
+ async saveSettings(params) {
311
+ const {
312
+ input
313
+ } = params;
314
+ const original = await this.getSettings();
315
+
316
+ if (!original) {
317
+ return this.createSettings({
318
+ input
319
+ });
320
+ }
321
+
322
+ return this.updateSettings({
323
+ input,
324
+ original
325
+ });
326
+ }
327
+
328
+ };
329
+ };
330
+
331
+ exports.createSettingsCrud = createSettingsCrud;
@@ -0,0 +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","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.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 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.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 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":";;;;;;;;;;;;;AAAA;;AAgBA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;AAEA;AACA;AACA;AACO,MAAMA,kBAAkB,GAAG,MAC9BC,OAD8B,IAEG;EACjC;AACJ;AACA;EACI,IAAAC,qCAAA,EAA+BD,OAA/B;;EAEA,MAAME,SAAS,GAAG,MAAM;IACpB,OAAOF,OAAO,CAACG,OAAR,CAAgBC,gBAAhB,GAAmCC,EAA1C;EACH,CAFD;;EAIA,MAAMC,cAAc,GAAG,YAAY;IAC/B,MAAMC,UAAU,GAAG,MAAMP,OAAO,CAACQ,QAAR,CAAiBC,aAAjB,CAA+B,iBAA/B,CAAzB;;IAEA,IAAIF,UAAJ,EAAgB;MACZ;IACH;;IACD,MAAM,IAAIG,+BAAJ,CAAuB;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG;MADP;IADmB,CAAvB,CAAN;EAKH,CAXD;;EAaA,IAAIC,MAAqB,GAAG,IAA5B;;EACA,IAAI;IACAA,MAAM,GAAG,IAAAC,iBAAA,GAAT;EACH,CAFD,CAEE,OAAOC,EAAP,EAAW,CAAE;;EAEf,MAAMC,QAAQ,GAAG,YAA+B;IAC5C,IAAI;MACAhB,OAAO,CAACQ,QAAR,CAAiBS,oBAAjB;MACA,MAAMC,KAAK,GAAG,MAAMlB,OAAO,CAACmB,GAAR,CAAYH,QAAZ,CAAqBI,wBAArB,CAApB;;MACA,IAAIF,KAAJ,EAAW;QACP,OAAOA,KAAP;MACH;IACJ,CAND,CAME,OAAOH,EAAP,EAAW;MACT,MAAM,IAAIM,cAAJ,CAAgBN,EAAE,CAACO,OAAnB,EAA4BP,EAAE,CAACQ,IAA/B,EAAqCR,EAAE,CAACJ,IAAxC,CAAN;IACH,CARD,SAQU;MACNX,OAAO,CAACQ,QAAR,CAAiBgB,mBAAjB;IACH;;IACD,MAAM,IAAIH,cAAJ,CAAiB,sBAAqBD,wBAAkB,IAAxD,EAA6D,mBAA7D,EAAkF;MACpFK,OAAO,EAAEL;IAD2E,CAAlF,CAAN;EAGH,CAfD,CA5BiC,CA6CjC;;;EACA,MAAMM,mBAAmB,GAAG,IAAAC,mBAAA,EACxB,4BADwB,CAA5B;EAGA,MAAMC,kBAAkB,GAAG,IAAAD,mBAAA,EACvB,2BADuB,CAA3B;EAGA,MAAME,kBAAkB,GAAG,IAAAF,mBAAA,EACvB,8BADuB,CAA3B,CApDiC,CAuDjC;;EACA,MAAMG,sBAAsB,GAAG,IAAAH,mBAAA,EAC3B,+BAD2B,CAA/B;EAGA,MAAMI,qBAAqB,GAAG,IAAAJ,mBAAA,EAC1B,8BAD0B,CAA9B;EAGA,MAAMK,qBAAqB,GAAG,IAAAL,mBAAA,EAC1B,8BAD0B,CAA9B,CA9DiC,CAiEjC;;EACA,MAAMM,sBAAsB,GAAG,IAAAN,mBAAA,EAC3B,+BAD2B,CAA/B;EAGA,MAAMO,qBAAqB,GAAG,IAAAP,mBAAA,EAC1B,8BAD0B,CAA9B;EAGA,MAAMQ,qBAAqB,GAAG,IAAAR,mBAAA,EAC1B,8BAD0B,CAA9B;;EAIA,MAAMS,WAAW,GAAG,MAAY;IAC5B,IAAIvB,MAAJ,EAAY;MACR;IACH;;IACD,MAAM,IAAIQ,cAAJ,CAAgB,0CAAhB,EAA4D,uBAA5D,EAAqF;MACvFgB,WAAW,EACP;IAFmF,CAArF,CAAN;EAIH,CARD;;EAUA,OAAO;IACHT,kBADG;IAEHF,mBAFG;IAGHG,kBAHG;IAIHC,sBAJG;IAKHC,qBALG;IAMHC,qBANG;IAOHC,sBAPG;IAQHC,qBARG;IASHC,qBATG;IAUHG,WAAW,EAAE,YAAY;MACrBF,WAAW;MAEX,MAAMlB,KAAK,GAAG,MAAMF,QAAQ,EAA5B;MAEA,MAAMuB,MAAM,GAAGrC,SAAS,EAAxB;;MACA,IAAI;QACAF,OAAO,CAACQ,QAAR,CAAiBS,oBAAjB;QACA,MAAMS,mBAAmB,CAACc,OAApB,CAA4B;UAC9BD;QAD8B,CAA5B,CAAN;QAGA;AAChB;AACA;AACA;;QACgB,MAAM,CAACE,OAAD,IAAY,MAAMzC,OAAO,CAACmB,GAAR,CAAYuB,iBAAZ,CAA8BxB,KAA9B,EAAqC;UACzDyB,KAAK,EAAE,CADkD;UAEzDC,IAAI,EAAE,CAAC,gBAAD;QAFmD,CAArC,CAAxB;QAIA,MAAM,CAACC,KAAD,IAAUJ,OAAhB;;QACA,IAAI,CAACI,KAAL,EAAY;UACR,OAAO,IAAP;QACH;;QACD,MAAMC,QAAQ,GAAG,IAAAC,mCAAA,EAAyB;UACtCF,KAAK,EAAEA,KAD+B;UAEtChC;QAFsC,CAAzB,CAAjB;QAKA,MAAMmC,oBAAuC,+DACtCF,QADsC;UAEzCG,QAAQ,EAAE;QAF+B,EAA7C;QAKA,MAAMrB,kBAAkB,CAACY,OAAnB,CAA2B;UAC7BD,MAD6B;UAE7BO,QAAQ,EAAEE;QAFmB,CAA3B,CAAN;QAKA,OAAOF,QAAP;MACH,CAjCD,CAiCE,OAAO/B,EAAP,EAAW;QACT,MAAMc,kBAAkB,CAACW,OAAnB,CAA2B;UAC7BD,MAD6B;UAE7BW,KAAK,EAAEnC;QAFsB,CAA3B,CAAN;MAIH,CAtCD,SAsCU;QACNf,OAAO,CAACQ,QAAR,CAAiBgB,mBAAjB;MACH;;MACD,OAAO,IAAP;IACH,CA1DE;;IA2DH;AACR;AACA;AACA;IACQ,MAAM2B,cAAN,CAAgDC,MAAhD,EAAwD;MACpDhB,WAAW;MACX,MAAM9B,cAAc,EAApB;MAEA,MAAM;QAAE+C;MAAF,IAAYD,MAAlB;MAEA,MAAMlC,KAAK,GAAG,MAAMF,QAAQ,EAA5B;;MAEA,MAAMsC,MAAM,GAAGC,4BAAA,CAAiBC,QAAjB,CAA0BH,KAA1B,CAAf;;MAEA,MAAMH,KAAK,GAAGI,MAAM,CAACJ,KAArB;;MACA,IAAIA,KAAJ,EAAW;QACP,MAAM,IAAI7B,cAAJ,CAAgB,oBAAhB,EAAsC,kBAAtC,EAA0D;UAC5DoC,MAAM,EAAEP,KAAK,CAACQ;QAD8C,CAA1D,CAAN;MAGH;;MAED,sBAAkCJ,MAAM,CAACK,KAAzC;MAAA,MAAM;QAAEV;MAAF,CAAN;MAAA,MAAqBH,QAArB;;MAEA,IAAI,CAACA,QAAQ,CAACc,IAAd,EAAoB;QAChBd,QAAQ,CAACc,IAAT,GAAgB,EAAhB;MACH;;MAED,MAAMZ,oBAAuC,+DACtCF,QADsC;QAEzCG,QAAQ,EAAE;MAF+B,EAA7C;;MAKA,IAAI;QACAjD,OAAO,CAACQ,QAAR,CAAiBS,oBAAjB;QAEA,MAAMa,sBAAsB,CAACU,OAAvB,CAA+B;UACjCM,QAAQ,EAAEE;QADuB,CAA/B,CAAN;QAIA,MAAMhD,OAAO,CAACmB,GAAR,CAAY0C,WAAZ,CACF3C,KADE,EAEF,IAAA4C,sCAAA,EAA4B;UACxBC,MAAM,8DACCjB,QADD;YAEFG;UAFE,EADkB;UAKxBpC;QALwB,CAA5B,CAFE,CAAN;QAWA,MAAMkB,qBAAqB,CAACS,OAAtB,CAA8B;UAChCM,QAAQ,EAAEE;QADsB,CAA9B,CAAN;QAGA,OAAOA,oBAAP;MACH,CAtBD,CAsBE,OAAOjC,EAAP,EAAW;QACT,MAAMiB,qBAAqB,CAACQ,OAAtB,CAA8B;UAChCM,QAAQ,EAAEE,oBADsB;UAEhCE,KAAK,EAAEnC;QAFyB,CAA9B,CAAN;QAIA,MAAM,IAAIM,cAAJ,CAAgBN,EAAE,CAACO,OAAnB,EAA4BP,EAAE,CAACQ,IAA/B,EAAqCR,EAAE,CAACJ,IAAxC,CAAN;MACH,CA5BD,SA4BU;QACNX,OAAO,CAACQ,QAAR,CAAiBgB,mBAAjB;MACH;IACJ,CA1HE;;IA2HH;AACR;AACA;AACA;IACQ,MAAMwC,cAAN,CAAgDZ,MAAhD,EAAwD;MACpDhB,WAAW;MACX,MAAM9B,cAAc,EAApB;MAEA,MAAM;QAAE+C,KAAF;QAASY,QAAQ,EAAEC;MAAnB,IAAuCd,MAA7C;MAEA,MAAMlC,KAAK,GAAG,MAAMF,QAAQ,EAA5B;;MAEA,MAAMsC,MAAM,GAAGa,4BAAA,CAAiBX,QAAjB,CAA0BH,KAA1B,CAAf;;MAEA,MAAMH,KAAK,GAAGI,MAAM,CAACJ,KAArB;;MACA,IAAIA,KAAJ,EAAW;QACP,MAAM,IAAI7B,cAAJ,CAAgB,oBAAhB,EAAsC,kBAAtC,EAA0D;UAC5DoC,MAAM,EAAEP,KAAK,CAACQ;QAD8C,CAA1D,CAAN;MAGH;;MACD,IAAIO,QAAQ,GAAGC,eAAf;;MACA,IAAI,CAACD,QAAL,EAAe;QACXA,QAAQ,GAAG,MAAM,KAAK3B,WAAL,EAAjB;;QACA,IAAI,CAAC2B,QAAL,EAAe;UACX,MAAM,IAAI5C,cAAJ,CACD,sFADC,EAEF,WAFE,CAAN;QAIH;MACJ;;MAED,uBAAkCiC,MAAM,CAACK,KAAzC;MAAA,MAAM;QAAEV;MAAF,CAAN;MAAA,MAAqBH,QAArB;;MAEA,IAAI,CAACA,QAAQ,CAACc,IAAd,EAAoB;QAChBd,QAAQ,CAACc,IAAT,GAAgBK,QAAQ,CAACL,IAAT,IAAiB,EAAjC;MACH;;MAED,MAAMZ,oBAAuC,+DACtCF,QADsC;QAEzCG,QAAQ,EAAE;MAF+B,EAA7C;;MAIA,IAAI;QACAjD,OAAO,CAACQ,QAAR,CAAiBS,oBAAjB;QAEA,MAAMgB,sBAAsB,CAACO,OAAvB,CAA+B;UACjCM,QAAQ,EAAEE,oBADuB;UAEjCiB;QAFiC,CAA/B,CAAN;QAKA,MAAMG,gBAAgB,GAAG,IAAAN,sCAAA,EAA4B;UACjDC,MAAM,8DACCjB,QADD;YAEFG,QAAQ,EAAEA,QAAQ,IAAIgB,QAAQ,CAAChB;UAF7B,EAD2C;UAKjDpC;QALiD,CAA5B,CAAzB;QAOA;AAChB;AACA;;QACgB,MAAMb,OAAO,CAACmB,GAAR,CAAYkD,WAAZ,CAAwBnD,KAAxB,EAA+B+C,QAAQ,CAAC5D,EAAxC,EAA4C+D,gBAA5C,CAAN;QAEA,MAAMlC,qBAAqB,CAACM,OAAtB,CAA8B;UAChCM,QAAQ,EAAEE,oBADsB;UAEhCiB;QAFgC,CAA9B,CAAN;QAIA,OAAOjB,oBAAP;MACH,CAzBD,CAyBE,OAAOjC,EAAP,EAAW;QACT,MAAMoB,qBAAqB,CAACK,OAAtB,CAA8B;UAChCyB,QADgC;UAEhCnB,QAAQ,EAAEE,oBAFsB;UAGhCE,KAAK,EAAEnC;QAHyB,CAA9B,CAAN;QAKA,MAAM,IAAIM,cAAJ,CAAgBN,EAAE,CAACO,OAAnB,EAA4BP,EAAE,CAACQ,IAA/B,EAAqCR,EAAE,CAACJ,IAAxC,CAAN;MACH,CAhCD,SAgCU;QACNX,OAAO,CAACQ,QAAR,CAAiBgB,mBAAjB;MACH;IACJ,CAvME;;IAwMH,MAAM8C,YAAN,CAA8ClB,MAA9C,EAAsD;MAClD,MAAM;QAAEC;MAAF,IAAYD,MAAlB;MAEA,MAAMa,QAAQ,GAAG,MAAM,KAAK3B,WAAL,EAAvB;;MACA,IAAI,CAAC2B,QAAL,EAAe;QACX,OAAO,KAAKd,cAAL,CAAoB;UACvBE;QADuB,CAApB,CAAP;MAGH;;MACD,OAAO,KAAKW,cAAL,CAAoB;QACvBX,KADuB;QAEvBY;MAFuB,CAApB,CAAP;IAIH;;EArNE,CAAP;AAuNH,CA/SM"}
@@ -0,0 +1,7 @@
1
+ import { Topic } from "@webiny/pubsub/types";
2
+ import { OnTransportBeforeSendParams } from "../../types";
3
+ interface Params {
4
+ onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;
5
+ }
6
+ export declare const attachOnTransportBeforeSend: (params: Params) => void;
7
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.attachOnTransportBeforeSend = void 0;
9
+
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
+
12
+ var _joi = _interopRequireDefault(require("joi"));
13
+
14
+ var _error = _interopRequireDefault(require("@webiny/error"));
15
+
16
+ const options = {
17
+ tlds: false
18
+ };
19
+
20
+ const requiredString = _joi.default.string().required();
21
+
22
+ const requiredEmail = requiredString.email(options);
23
+
24
+ const schema = _joi.default.object({
25
+ to: _joi.default.array().items(requiredEmail),
26
+ from: _joi.default.string().email(options),
27
+ subject: requiredString.max(1024),
28
+ cc: _joi.default.array().items(requiredEmail),
29
+ bcc: _joi.default.array().items(requiredEmail),
30
+ replyTo: _joi.default.string().email(options),
31
+ text: requiredString.min(10),
32
+ html: _joi.default.string()
33
+ });
34
+
35
+ const attachOnTransportBeforeSend = params => {
36
+ const {
37
+ onTransportBeforeSend
38
+ } = params;
39
+ onTransportBeforeSend.subscribe(async ({
40
+ data: input
41
+ }) => {
42
+ let result;
43
+
44
+ try {
45
+ result = await schema.validate(input);
46
+
47
+ if (!result.error) {
48
+ return;
49
+ }
50
+ } catch (ex) {
51
+ throw new _error.default({
52
+ message: "Error while validating e-mail params.",
53
+ code: "VALIDATION_ERROR",
54
+ data: {
55
+ input,
56
+ error: ex
57
+ }
58
+ });
59
+ }
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
+ });
67
+ };
68
+
69
+ exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["options","tlds","requiredString","joi","string","required","requiredEmail","email","schema","object","to","array","items","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","data","input","result","validate","error","ex","WebinyError","message","code"],"sources":["onTransportBeforeSend.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { TransportSendData, OnTransportBeforeSendParams } from \"~/types\";\nimport joi, { EmailOptions } from \"joi\";\nimport WebinyError from \"@webiny/error\";\n\nconst options: EmailOptions = {\n tlds: false\n};\n\nconst requiredString = joi.string().required();\nconst requiredEmail = requiredString.email(options);\n\nconst schema = joi.object<TransportSendData>({\n to: joi.array().items(requiredEmail),\n from: joi.string().email(options),\n subject: requiredString.max(1024),\n cc: joi.array().items(requiredEmail),\n bcc: joi.array().items(requiredEmail),\n replyTo: joi.string().email(options),\n text: requiredString.min(10),\n html: joi.string()\n});\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: joi.ValidationResult<TransportSendData>;\n try {\n result = await schema.validate(input);\n\n if (!result.error) {\n return;\n }\n } catch (ex) {\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 throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n ...result.error\n }\n });\n });\n};\n"],"mappings":";;;;;;;;;;;AAEA;;AACA;;AAEA,MAAMA,OAAqB,GAAG;EAC1BC,IAAI,EAAE;AADoB,CAA9B;;AAIA,MAAMC,cAAc,GAAGC,YAAA,CAAIC,MAAJ,GAAaC,QAAb,EAAvB;;AACA,MAAMC,aAAa,GAAGJ,cAAc,CAACK,KAAf,CAAqBP,OAArB,CAAtB;;AAEA,MAAMQ,MAAM,GAAGL,YAAA,CAAIM,MAAJ,CAA8B;EACzCC,EAAE,EAAEP,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CADqC;EAEzCO,IAAI,EAAEV,YAAA,CAAIC,MAAJ,GAAaG,KAAb,CAAmBP,OAAnB,CAFmC;EAGzCc,OAAO,EAAEZ,cAAc,CAACa,GAAf,CAAmB,IAAnB,CAHgC;EAIzCC,EAAE,EAAEb,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CAJqC;EAKzCW,GAAG,EAAEd,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CALoC;EAMzCY,OAAO,EAAEf,YAAA,CAAIC,MAAJ,GAAaG,KAAb,CAAmBP,OAAnB,CANgC;EAOzCmB,IAAI,EAAEjB,cAAc,CAACkB,GAAf,CAAmB,EAAnB,CAPmC;EAQzCC,IAAI,EAAElB,YAAA,CAAIC,MAAJ;AARmC,CAA9B,CAAf;;AAcO,MAAMkB,2BAA2B,GAAIC,MAAD,IAAoB;EAC3D,MAAM;IAAEC;EAAF,IAA4BD,MAAlC;EAEAC,qBAAqB,CAACC,SAAtB,CAAgC,OAAO;IAAEC,IAAI,EAAEC;EAAR,CAAP,KAA2B;IACvD,IAAIC,MAAJ;;IACA,IAAI;MACAA,MAAM,GAAG,MAAMpB,MAAM,CAACqB,QAAP,CAAgBF,KAAhB,CAAf;;MAEA,IAAI,CAACC,MAAM,CAACE,KAAZ,EAAmB;QACf;MACH;IACJ,CAND,CAME,OAAOC,EAAP,EAAW;MACT,MAAM,IAAIC,cAAJ,CAAgB;QAClBC,OAAO,EAAE,uCADS;QAElBC,IAAI,EAAE,kBAFY;QAGlBR,IAAI,EAAE;UACFC,KADE;UAEFG,KAAK,EAAEC;QAFL;MAHY,CAAhB,CAAN;IAQH;;IACD,MAAM,IAAIC,cAAJ,CAAgB;MAClBC,OAAO,EAAE,uCADS;MAElBC,IAAI,EAAE,kBAFY;MAGlBR,IAAI,kCACGE,MAAM,CAACE,KADV;IAHc,CAAhB,CAAN;EAOH,CAzBD;AA0BH,CA7BM"}
@@ -0,0 +1,2 @@
1
+ import { MailerContext, MailerTransporterContext } from "../types";
2
+ export declare const createTransporterCrud: (context: MailerContext) => Promise<MailerTransporterContext>;
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createTransporterCrud = void 0;
9
+
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
+
12
+ var _pubsub = require("@webiny/pubsub");
13
+
14
+ var _onTransportBeforeSend = require("./transport/onTransportBeforeSend");
15
+
16
+ var _plugins = require("../plugins");
17
+
18
+ var _error = _interopRequireDefault(require("@webiny/error"));
19
+
20
+ var _validation = require("./settings/validation");
21
+
22
+ const buildTransporter = async params => {
23
+ const {
24
+ settings,
25
+ context,
26
+ plugins
27
+ } = params;
28
+
29
+ for (const plugin of plugins) {
30
+ try {
31
+ return await plugin.buildMailerTransport({
32
+ settings,
33
+ context
34
+ });
35
+ } catch (ex) {
36
+ console.log(`Could not build mailer with plugin "${plugin.name}".`);
37
+ console.log(ex.message);
38
+ }
39
+ }
40
+
41
+ throw new _error.default("Could not build mailer via any of the available plugins.", "MAILER_PLUGINS_ERROR");
42
+ };
43
+
44
+ const getPort = value => {
45
+ const port = Number(value);
46
+
47
+ if (!!value && isNaN(port) === false) {
48
+ return port;
49
+ }
50
+
51
+ return 25;
52
+ };
53
+
54
+ const getDefaultSettings = () => {
55
+ const input = {
56
+ host: process.env.WEBINY_MAILER_HOST,
57
+ port: getPort(process.env.WEBINY_MAILER_PORT),
58
+ user: process.env.WEBINY_MAILER_USER,
59
+ password: process.env.WEBINY_MAILER_PASSWORD,
60
+ replyTo: process.env.WEBINY_MAILER_REPLY_TO,
61
+ from: process.env.WEBINY_MAILER_FROM
62
+ };
63
+ /**
64
+ * No need to do the validation if there is not at least one variable defined.
65
+ */
66
+
67
+ const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());
68
+
69
+ if (!hasAtLeastOneValue) {
70
+ return null;
71
+ }
72
+
73
+ try {
74
+ const result = _validation.createValidation.validate(input);
75
+
76
+ if (!result.error) {
77
+ return result.value;
78
+ }
79
+ } catch (ex) {}
80
+
81
+ return null;
82
+ };
83
+
84
+ const createTransporterCrud = async context => {
85
+ const transporters = {};
86
+ const defaultSettings = getDefaultSettings();
87
+ /**
88
+ * We need the last possible plugin which is defined.
89
+ * The last plugins are our default ones with the default configurations.
90
+ * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.
91
+ */
92
+
93
+ const plugins = context.plugins.byType(_plugins.CreateTransportPlugin.type).reverse();
94
+ /**
95
+ * We define possible events to be hooked into.
96
+ */
97
+
98
+ const onTransportBeforeSend = (0, _pubsub.createTopic)("mailer.onTransportBeforeSend");
99
+ const onTransportAfterSend = (0, _pubsub.createTopic)("mailer.onTransportAfterSend");
100
+ const onTransportError = (0, _pubsub.createTopic)("mailer.onTransportError");
101
+ /**
102
+ * We attach our default ones.
103
+ */
104
+
105
+ (0, _onTransportBeforeSend.attachOnTransportBeforeSend)({
106
+ onTransportBeforeSend
107
+ });
108
+
109
+ const getTransport = async () => {
110
+ const tenant = context.tenancy.getCurrentTenant().id;
111
+
112
+ if (transporters[tenant]) {
113
+ return transporters[tenant];
114
+ }
115
+
116
+ let settings = null;
117
+
118
+ try {
119
+ settings = await context.mailer.getSettings();
120
+ } catch (ex) {
121
+ if (ex.code !== "PASSWORD_SECRET_ERROR") {
122
+ console.log(ex.message);
123
+ console.log(ex.code);
124
+ }
125
+ }
126
+
127
+ if (!settings && !defaultSettings) {
128
+ console.log(`There are no Mailer transport settings for tenant "${tenant}".`);
129
+ }
130
+
131
+ const transporter = await buildTransporter({
132
+ settings: settings || defaultSettings,
133
+ plugins,
134
+ context
135
+ });
136
+ transporters[tenant] = transporter;
137
+ return transporter;
138
+ };
139
+
140
+ return {
141
+ onTransportBeforeSend,
142
+ onTransportAfterSend,
143
+ onTransportError,
144
+ getTransport,
145
+ sendMail: async data => {
146
+ const transport = await getTransport();
147
+
148
+ if (!transport) {
149
+ return {
150
+ result: null,
151
+ error: {
152
+ message: "There is no transport available.",
153
+ code: "NO_TRANSPORT_DEFINED"
154
+ }
155
+ };
156
+ }
157
+
158
+ try {
159
+ await onTransportBeforeSend.publish({
160
+ data,
161
+ transport
162
+ });
163
+ const response = await transport.send(data);
164
+ await onTransportAfterSend.publish({
165
+ data,
166
+ transport
167
+ });
168
+ return {
169
+ result: response.result,
170
+ error: response.error
171
+ };
172
+ } catch (ex) {
173
+ await onTransportError.publish({
174
+ error: ex,
175
+ data,
176
+ transport
177
+ });
178
+ return {
179
+ result: null,
180
+ error: {
181
+ message: ex.message,
182
+ code: ex.code,
183
+ data: (0, _objectSpread2.default)({
184
+ data
185
+ }, ex.data)
186
+ }
187
+ };
188
+ }
189
+ }
190
+ };
191
+ };
192
+
193
+ exports.createTransporterCrud = createTransporterCrud;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["buildTransporter","params","settings","context","plugins","plugin","buildMailerTransport","ex","console","log","name","message","WebinyError","getPort","value","port","Number","isNaN","getDefaultSettings","input","host","process","env","WEBINY_MAILER_HOST","WEBINY_MAILER_PORT","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","replyTo","WEBINY_MAILER_REPLY_TO","from","WEBINY_MAILER_FROM","hasAtLeastOneValue","Object","values","some","String","trim","result","createValidation","validate","error","createTransporterCrud","transporters","defaultSettings","byType","CreateTransportPlugin","type","reverse","onTransportBeforeSend","createTopic","onTransportAfterSend","onTransportError","attachOnTransportBeforeSend","getTransport","tenant","tenancy","getCurrentTenant","id","mailer","getSettings","code","transporter","sendMail","data","transport","publish","response","send"],"sources":["transporter.crud.ts"],"sourcesContent":["import {\n MailerContext,\n Transport,\n OnTransportAfterSendParams,\n OnTransportBeforeSendParams,\n OnTransportErrorParams,\n TransportSettings,\n MailerTransporterContext\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { attachOnTransportBeforeSend } from \"~/crud/transport/onTransportBeforeSend\";\nimport { CreateTransportPlugin } from \"~/plugins\";\nimport WebinyError from \"@webiny/error\";\n\nimport { createValidation } from \"./settings/validation\";\n\ninterface BuildMailerParams {\n plugins: CreateTransportPlugin[];\n settings: TransportSettings | null;\n context: MailerContext;\n}\n\nconst buildTransporter = async (params: BuildMailerParams): Promise<Transport> => {\n const { settings, context, plugins } = params;\n\n for (const plugin of plugins) {\n try {\n return await plugin.buildMailerTransport({\n settings,\n context\n });\n } catch (ex) {\n console.log(`Could not build mailer with plugin \"${plugin.name}\".`);\n console.log(ex.message);\n }\n }\n throw new WebinyError(\n \"Could not build mailer via any of the available plugins.\",\n \"MAILER_PLUGINS_ERROR\"\n );\n};\n\nconst getPort = (value: any) => {\n const port = Number(value);\n if (!!value && isNaN(port) === false) {\n return port;\n }\n return 25;\n};\n\nconst getDefaultSettings = (): TransportSettings | null => {\n const input: Partial<TransportSettings> = {\n host: process.env.WEBINY_MAILER_HOST,\n port: getPort(process.env.WEBINY_MAILER_PORT),\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD,\n replyTo: process.env.WEBINY_MAILER_REPLY_TO,\n from: process.env.WEBINY_MAILER_FROM\n };\n /**\n * No need to do the validation if there is not at least one variable defined.\n */\n const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());\n if (!hasAtLeastOneValue) {\n return null;\n }\n\n try {\n const result = createValidation.validate(input);\n\n if (!result.error) {\n return result.value;\n }\n } catch (ex) {}\n\n return null;\n};\n\nexport const createTransporterCrud = async (\n context: MailerContext\n): Promise<MailerTransporterContext> => {\n const transporters: Record<string, Transport> = {};\n\n const defaultSettings: TransportSettings | null = getDefaultSettings();\n /**\n * We need the last possible plugin which is defined.\n * The last plugins are our default ones with the default configurations.\n * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.\n */\n const plugins = context.plugins\n .byType<CreateTransportPlugin>(CreateTransportPlugin.type)\n .reverse();\n\n /**\n * We define possible events to be hooked into.\n */\n const onTransportBeforeSend = createTopic<OnTransportBeforeSendParams>(\n \"mailer.onTransportBeforeSend\"\n );\n const onTransportAfterSend = createTopic<OnTransportAfterSendParams>(\n \"mailer.onTransportAfterSend\"\n );\n const onTransportError = createTopic<OnTransportErrorParams>(\"mailer.onTransportError\");\n /**\n * We attach our default ones.\n */\n attachOnTransportBeforeSend({\n onTransportBeforeSend\n });\n\n const getTransport = async (): Promise<Transport | null> => {\n const tenant = context.tenancy.getCurrentTenant().id;\n\n if (transporters[tenant]) {\n return transporters[tenant];\n }\n\n let settings: TransportSettings | null = null;\n try {\n settings = await context.mailer.getSettings();\n } catch (ex) {\n if (ex.code !== \"PASSWORD_SECRET_ERROR\") {\n console.log(ex.message);\n console.log(ex.code);\n }\n }\n if (!settings && !defaultSettings) {\n console.log(`There are no Mailer transport settings for tenant \"${tenant}\".`);\n }\n const transporter = await buildTransporter({\n settings: settings || defaultSettings,\n plugins,\n context\n });\n\n transporters[tenant] = transporter;\n\n return transporter;\n };\n\n return {\n onTransportBeforeSend,\n onTransportAfterSend,\n onTransportError,\n getTransport,\n sendMail: async data => {\n const transport = await getTransport();\n if (!transport) {\n return {\n result: null,\n error: {\n message: \"There is no transport available.\",\n code: \"NO_TRANSPORT_DEFINED\"\n }\n };\n }\n try {\n await onTransportBeforeSend.publish({\n data,\n transport\n });\n const response = await transport.send(data);\n await onTransportAfterSend.publish({\n data,\n transport\n });\n\n return {\n result: response.result,\n error: response.error\n };\n } catch (ex) {\n await onTransportError.publish({\n error: ex,\n data,\n transport\n });\n return {\n result: null,\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n data,\n ...ex.data\n }\n }\n };\n }\n }\n };\n};\n"],"mappings":"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"}