@webiny/api-mailer 0.0.0-unstable.d4f203fa97 → 0.0.0-unstable.d65ec29d44

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 (52) hide show
  1. package/context.js +0 -7
  2. package/context.js.map +1 -1
  3. package/crud/group.js +0 -3
  4. package/crud/group.js.map +1 -1
  5. package/crud/settings/hooks.js +3 -15
  6. package/crud/settings/hooks.js.map +1 -1
  7. package/crud/settings/model.js +0 -12
  8. package/crud/settings/model.js.map +1 -1
  9. package/crud/settings/password.js +0 -18
  10. package/crud/settings/password.js.map +1 -1
  11. package/crud/settings/secret.js +0 -6
  12. package/crud/settings/secret.js.map +1 -1
  13. package/crud/settings/transform.js +0 -12
  14. package/crud/settings/transform.js.map +1 -1
  15. package/crud/settings/validation.d.ts +45 -4
  16. package/crud/settings/validation.js +11 -24
  17. package/crud/settings/validation.js.map +1 -1
  18. package/crud/settings.crud.js +23 -80
  19. package/crud/settings.crud.js.map +1 -1
  20. package/crud/transport/onTransportBeforeSend.js +25 -36
  21. package/crud/transport/onTransportBeforeSend.js.map +1 -1
  22. package/crud/transporter.crud.js +3 -40
  23. package/crud/transporter.crud.js.map +1 -1
  24. package/graphql/index.js +0 -3
  25. package/graphql/index.js.map +1 -1
  26. package/graphql/settings.js +8 -16
  27. package/graphql/settings.js.map +1 -1
  28. package/index.js +0 -15
  29. package/index.js.map +1 -1
  30. package/package.json +24 -24
  31. package/plugins/CreateTransportPlugin.js +0 -9
  32. package/plugins/CreateTransportPlugin.js.map +1 -1
  33. package/plugins/index.js +0 -2
  34. package/plugins/index.js.map +1 -1
  35. package/transports/createDummyTransport.js +0 -2
  36. package/transports/createDummyTransport.js.map +1 -1
  37. package/transports/createSmtpTransport.js +1 -16
  38. package/transports/createSmtpTransport.js.map +1 -1
  39. package/types.d.ts +1 -1
  40. package/types.js.map +1 -1
  41. package/crud/mailer/onBeforeSend.d.ts +0 -7
  42. package/crud/mailer/onBeforeSend.js +0 -69
  43. package/crud/mailer/onBeforeSend.js.map +0 -1
  44. package/crud/mailer.crud.d.ts +0 -2
  45. package/crud/mailer.crud.js +0 -123
  46. package/crud/mailer.crud.js.map +0 -1
  47. package/mailers/createDummyMailer.d.ts +0 -5
  48. package/mailers/createDummyMailer.js +0 -24
  49. package/mailers/createDummyMailer.js.map +0 -1
  50. package/mailers/createSmtpMailer.d.ts +0 -13
  51. package/mailers/createSmtpMailer.js +0 -106
  52. package/mailers/createSmtpMailer.js.map +0 -1
@@ -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
- _excluded2 = ["password"];
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
- }; // get
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"); // create
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"); // update
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,31 +144,23 @@ const createSettingsCrud = async context => {
175
144
  input
176
145
  } = params;
177
146
  const model = await getModel();
178
-
179
- const result = _validation.createValidation.validate(input);
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.details
150
+ errors: result.error.errors
186
151
  });
187
152
  }
188
-
189
- const _result$value = result.value,
190
- {
191
- password
192
- } = _result$value,
193
- settings = (0, _objectWithoutProperties2.default)(_result$value, _excluded);
194
-
153
+ const _result$data = result.data,
154
+ {
155
+ password
156
+ } = _result$data,
157
+ settings = (0, _objectWithoutProperties2.default)(_result$data, _excluded);
195
158
  if (!settings.port) {
196
159
  settings.port = 25;
197
160
  }
198
-
199
161
  const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
200
162
  password: ""
201
163
  });
202
-
203
164
  try {
204
165
  context.security.disableAuthorization();
205
166
  await onSettingsBeforeCreate.publish({
@@ -225,7 +186,6 @@ const createSettingsCrud = async context => {
225
186
  context.security.enableAuthorization();
226
187
  }
227
188
  },
228
-
229
189
  /**
230
190
  * Method should not be used outside of mailer
231
191
  * @internal
@@ -238,41 +198,30 @@ const createSettingsCrud = async context => {
238
198
  original: initialOriginal
239
199
  } = params;
240
200
  const model = await getModel();
241
-
242
- const result = _validation.updateValidation.validate(input);
243
-
244
- const error = result.error;
245
-
246
- if (error) {
201
+ const result = _validation.updateValidation.safeParse(input);
202
+ if (!result.success) {
247
203
  throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
248
- errors: error.details
204
+ errors: result.error.errors
249
205
  });
250
206
  }
251
-
252
207
  let original = initialOriginal;
253
-
254
208
  if (!original) {
255
209
  original = await this.getSettings();
256
-
257
210
  if (!original) {
258
211
  throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
259
212
  }
260
213
  }
261
-
262
- const _result$value2 = result.value,
263
- {
264
- password
265
- } = _result$value2,
266
- settings = (0, _objectWithoutProperties2.default)(_result$value2, _excluded2);
267
-
214
+ const _result$data2 = result.data,
215
+ {
216
+ password
217
+ } = _result$data2,
218
+ settings = (0, _objectWithoutProperties2.default)(_result$data2, _excluded2);
268
219
  if (!settings.port) {
269
220
  settings.port = original.port || 25;
270
221
  }
271
-
272
222
  const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
273
223
  password: ""
274
224
  });
275
-
276
225
  try {
277
226
  context.security.disableAuthorization();
278
227
  await onSettingsBeforeUpdate.publish({
@@ -288,7 +237,6 @@ const createSettingsCrud = async context => {
288
237
  /**
289
238
  * We want to make sure that old password gets stored again in case no password was sent in update input.
290
239
  */
291
-
292
240
  await context.cms.updateEntry(model, original.id, transformedInput);
293
241
  await onSettingsAfterUpdate.publish({
294
242
  settings: passwordlessSettings,
@@ -306,26 +254,21 @@ const createSettingsCrud = async context => {
306
254
  context.security.enableAuthorization();
307
255
  }
308
256
  },
309
-
310
257
  async saveSettings(params) {
311
258
  const {
312
259
  input
313
260
  } = params;
314
261
  const original = await this.getSettings();
315
-
316
262
  if (!original) {
317
263
  return this.createSettings({
318
264
  input
319
265
  });
320
266
  }
321
-
322
267
  return this.updateSettings({
323
268
  input,
324
269
  original
325
270
  });
326
271
  }
327
-
328
272
  };
329
273
  };
330
-
331
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","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":"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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 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),
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: _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
-
16
+ cc: _zod.default.array(requiredEmail).optional(),
17
+ bcc: _zod.default.array(requiredEmail).optional(),
18
+ replyTo: _zod.default.string().email().optional(),
19
+ text: _zod.default.string().optional(),
20
+ html: _zod.default.string().optional()
21
+ }).refine(data => data.text || data.html, "Either text or html is required.");
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 = await schema.validate(input);
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":["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"}
1
+ {"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","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),\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 => data.text || data.html, \"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;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,EAAEf,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ,EAAE;EAC7BQ,IAAI,EAAEhB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ;AAC/B,CAAC,CAAC,CACDS,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACH,IAAI,IAAIG,IAAI,CAACF,IAAI,EAAE,kCAAkC,CAAC;AAOxE,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,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;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"}
@@ -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,24 +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
- 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;
56
+ const result = _validation.createValidation.safeParse(input);
57
+ return result.success ? result.data : null;
82
58
  };
83
-
84
59
  const createTransporterCrud = async context => {
85
60
  const transporters = {};
86
61
  const defaultSettings = getDefaultSettings();
@@ -89,32 +64,26 @@ const createTransporterCrud = async context => {
89
64
  * The last plugins are our default ones with the default configurations.
90
65
  * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.
91
66
  */
92
-
93
67
  const plugins = context.plugins.byType(_plugins.CreateTransportPlugin.type).reverse();
68
+
94
69
  /**
95
70
  * We define possible events to be hooked into.
96
71
  */
97
-
98
72
  const onTransportBeforeSend = (0, _pubsub.createTopic)("mailer.onTransportBeforeSend");
99
73
  const onTransportAfterSend = (0, _pubsub.createTopic)("mailer.onTransportAfterSend");
100
74
  const onTransportError = (0, _pubsub.createTopic)("mailer.onTransportError");
101
75
  /**
102
76
  * We attach our default ones.
103
77
  */
104
-
105
78
  (0, _onTransportBeforeSend.attachOnTransportBeforeSend)({
106
79
  onTransportBeforeSend
107
80
  });
108
-
109
81
  const getTransport = async () => {
110
82
  const tenant = context.tenancy.getCurrentTenant().id;
111
-
112
83
  if (transporters[tenant]) {
113
84
  return transporters[tenant];
114
85
  }
115
-
116
86
  let settings = null;
117
-
118
87
  try {
119
88
  settings = await context.mailer.getSettings();
120
89
  } catch (ex) {
@@ -123,11 +92,9 @@ const createTransporterCrud = async context => {
123
92
  console.log(ex.code);
124
93
  }
125
94
  }
126
-
127
95
  if (!settings && !defaultSettings) {
128
96
  console.log(`There are no Mailer transport settings for tenant "${tenant}".`);
129
97
  }
130
-
131
98
  const transporter = await buildTransporter({
132
99
  settings: settings || defaultSettings,
133
100
  plugins,
@@ -136,7 +103,6 @@ const createTransporterCrud = async context => {
136
103
  transporters[tenant] = transporter;
137
104
  return transporter;
138
105
  };
139
-
140
106
  return {
141
107
  onTransportBeforeSend,
142
108
  onTransportAfterSend,
@@ -144,7 +110,6 @@ const createTransporterCrud = async context => {
144
110
  getTransport,
145
111
  sendMail: async data => {
146
112
  const transport = await getTransport();
147
-
148
113
  if (!transport) {
149
114
  return {
150
115
  result: null,
@@ -154,7 +119,6 @@ const createTransporterCrud = async context => {
154
119
  }
155
120
  };
156
121
  }
157
-
158
122
  try {
159
123
  await onTransportBeforeSend.publish({
160
124
  data,
@@ -189,5 +153,4 @@ const createTransporterCrud = async context => {
189
153
  }
190
154
  };
191
155
  };
192
-
193
156
  exports.createTransporterCrud = createTransporterCrud;