@webiny/api-mailer 0.0.0-unstable.fcdad0bc61 → 0.0.0-unstable.fdd9228b5d

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 (69) hide show
  1. package/context.d.ts +1 -1
  2. package/context.js +6 -10
  3. package/context.js.map +1 -1
  4. package/crud/settings/hooks.d.ts +1 -1
  5. package/crud/settings/hooks.js +5 -18
  6. package/crud/settings/hooks.js.map +1 -1
  7. package/crud/settings/model.d.ts +1 -2
  8. package/crud/settings/model.js +15 -33
  9. package/crud/settings/model.js.map +1 -1
  10. package/crud/settings/password.js +2 -18
  11. package/crud/settings/password.js.map +1 -1
  12. package/crud/settings/secret.js +2 -6
  13. package/crud/settings/secret.js.map +1 -1
  14. package/crud/settings/transform.d.ts +2 -2
  15. package/crud/settings/transform.js +9 -19
  16. package/crud/settings/transform.js.map +1 -1
  17. package/crud/settings/validation.d.ts +45 -4
  18. package/crud/settings/validation.js +18 -28
  19. package/crud/settings/validation.js.map +1 -1
  20. package/crud/settings.crud.d.ts +1 -1
  21. package/crud/settings.crud.js +138 -200
  22. package/crud/settings.crud.js.map +1 -1
  23. package/crud/transport/onTransportBeforeSend.d.ts +2 -2
  24. package/crud/transport/onTransportBeforeSend.js +30 -37
  25. package/crud/transport/onTransportBeforeSend.js.map +1 -1
  26. package/crud/transporter.crud.d.ts +1 -1
  27. package/crud/transporter.crud.js +9 -44
  28. package/crud/transporter.crud.js.map +1 -1
  29. package/graphql/index.js +2 -3
  30. package/graphql/index.js.map +1 -1
  31. package/graphql/settings.d.ts +1 -1
  32. package/graphql/settings.js +12 -18
  33. package/graphql/settings.js.map +1 -1
  34. package/index.d.ts +3 -6
  35. package/index.js +37 -43
  36. package/index.js.map +1 -1
  37. package/package.json +28 -39
  38. package/plugins/CreateTransportPlugin.d.ts +1 -1
  39. package/plugins/CreateTransportPlugin.js +3 -13
  40. package/plugins/CreateTransportPlugin.js.map +1 -1
  41. package/plugins/index.js +3 -3
  42. package/plugins/index.js.map +1 -1
  43. package/transports/createDummyTransport.d.ts +1 -1
  44. package/transports/createDummyTransport.js +3 -3
  45. package/transports/createDummyTransport.js.map +1 -1
  46. package/transports/createSmtpTransport.d.ts +5 -4
  47. package/transports/createSmtpTransport.js +14 -21
  48. package/transports/createSmtpTransport.js.map +1 -1
  49. package/transports/index.d.ts +2 -0
  50. package/transports/index.js +29 -0
  51. package/transports/index.js.map +1 -0
  52. package/types.d.ts +4 -4
  53. package/types.js +3 -1
  54. package/types.js.map +1 -1
  55. package/crud/group.d.ts +0 -2
  56. package/crud/group.js +0 -21
  57. package/crud/group.js.map +0 -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 +0 -24
  66. package/mailers/createDummyMailer.js.map +0 -1
  67. package/mailers/createSmtpMailer.d.ts +0 -13
  68. package/mailers/createSmtpMailer.js +0 -106
  69. package/mailers/createSmtpMailer.js.map +0 -1
@@ -1,35 +1,19 @@
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
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
-
12
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
13
-
14
8
  var _error = _interopRequireDefault(require("@webiny/error"));
15
-
16
9
  var _pubsub = require("@webiny/pubsub");
17
-
18
10
  var _model = require("./settings/model");
19
-
20
11
  var _transform = require("./settings/transform");
21
-
22
12
  var _secret = require("./settings/secret");
23
-
24
13
  var _validation = require("./settings/validation");
25
-
26
14
  var _hooks = require("./settings/hooks");
27
-
28
15
  var _apiSecurity = require("@webiny/api-security");
29
-
30
- const _excluded = ["password"],
31
- _excluded2 = ["password"];
32
-
16
+ const defaultPort = 25;
33
17
  /**
34
18
  * Note that settings cannot be used if there is no secret defined.
35
19
  */
@@ -38,73 +22,60 @@ const createSettingsCrud = async context => {
38
22
  * We need to remove password from all references on create and update in the CMS.
39
23
  */
40
24
  (0, _hooks.attachPasswordObfuscatingHooks)(context);
41
-
42
25
  const getTenant = () => {
43
26
  return context.tenancy.getCurrentTenant().id;
44
27
  };
45
-
46
28
  const validateAccess = async () => {
47
29
  const permission = await context.security.getPermission("mailer.settings");
48
-
49
30
  if (permission) {
50
31
  return;
51
32
  }
52
-
53
33
  throw new _apiSecurity.NotAuthorizedError({
54
34
  data: {
55
35
  reason: `Not allowed to update the mailer settings.`
56
36
  }
57
37
  });
58
38
  };
59
-
60
39
  let secret = null;
61
-
62
40
  try {
63
41
  secret = (0, _secret.getSecret)();
64
42
  } catch (ex) {}
65
-
66
43
  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;
44
+ return context.security.withoutAuthorization(async () => {
45
+ try {
46
+ const model = await context.cms.getModel(_model.SETTINGS_MODEL_ID);
47
+ if (model) {
48
+ return model;
49
+ }
50
+ } catch (ex) {
51
+ throw new _error.default(ex.message, ex.code, ex.data);
73
52
  }
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
53
+ throw new _error.default(`Missing CMS Model "${_model.SETTINGS_MODEL_ID}".`, "CMS_MODEL_MISSING", {
54
+ modelId: _model.SETTINGS_MODEL_ID
55
+ });
82
56
  });
83
- }; // get
84
-
57
+ };
85
58
 
59
+ // get
86
60
  const onSettingsBeforeGet = (0, _pubsub.createTopic)("mailer.onSettingsBeforeGet");
87
61
  const onSettingsAfterGet = (0, _pubsub.createTopic)("mailer.onSettingsAfterGet");
88
- const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError"); // create
89
-
62
+ const onSettingsGetError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
63
+ // create
90
64
  const onSettingsBeforeCreate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeCreate");
91
65
  const onSettingsAfterCreate = (0, _pubsub.createTopic)("mailer.onSettingsAfterCreate");
92
- const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError"); // update
93
-
66
+ const onSettingsCreateError = (0, _pubsub.createTopic)("mailer.onSettingsCreateError");
67
+ // update
94
68
  const onSettingsBeforeUpdate = (0, _pubsub.createTopic)("mailer.onSettingsBeforeUpdate");
95
69
  const onSettingsAfterUpdate = (0, _pubsub.createTopic)("mailer.onSettingsAfterUpdate");
96
70
  const onSettingsUpdateError = (0, _pubsub.createTopic)("mailer.onSettingsUpdateError");
97
-
98
71
  const checkSecret = () => {
99
72
  if (secret) {
100
73
  return;
101
74
  }
102
-
103
75
  throw new _error.default("There must be a password secret defined!", "PASSWORD_SECRET_ERROR", {
104
76
  description: "To store the Mailer settings, you must have a password secret environment variable defined."
105
77
  });
106
78
  };
107
-
108
79
  return {
109
80
  onSettingsAfterGet,
110
81
  onSettingsBeforeGet,
@@ -119,51 +90,45 @@ const createSettingsCrud = async context => {
119
90
  checkSecret();
120
91
  const model = await getModel();
121
92
  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;
93
+ return await context.security.withoutAuthorization(async () => {
94
+ try {
95
+ await onSettingsBeforeGet.publish({
96
+ tenant
97
+ });
98
+ /**
99
+ * We always list because we have no id or something like that to query by.
100
+ * This should return one setting anyway.
101
+ */
102
+ const [entries] = await context.cms.listLatestEntries(model, {
103
+ limit: 1,
104
+ sort: ["createdOn_DESC"]
105
+ });
106
+ const [entry] = entries;
107
+ if (!entry) {
108
+ return null;
109
+ }
110
+ const settings = (0, _transform.transformValuesFromEntry)({
111
+ entry: entry,
112
+ secret
113
+ });
114
+ const passwordlessSettings = {
115
+ ...settings,
116
+ password: ""
117
+ };
118
+ await onSettingsAfterGet.publish({
119
+ tenant,
120
+ settings: passwordlessSettings
121
+ });
122
+ return settings;
123
+ } catch (ex) {
124
+ await onSettingsGetError.publish({
125
+ tenant,
126
+ error: ex
127
+ });
141
128
  }
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;
129
+ return null;
130
+ });
165
131
  },
166
-
167
132
  /**
168
133
  * Method should not be used outside of mailer
169
134
  * @internal
@@ -175,57 +140,46 @@ const createSettingsCrud = async context => {
175
140
  input
176
141
  } = params;
177
142
  const model = await getModel();
178
-
179
- const result = _validation.createValidation.validate(input);
180
-
181
- const error = result.error;
182
-
183
- if (error) {
143
+ const result = _validation.createValidation.safeParse(input);
144
+ if (!result.success) {
184
145
  throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
185
- errors: error.details
146
+ errors: result.error.errors
186
147
  });
187
148
  }
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), {}, {
149
+ const {
150
+ password,
151
+ ...settings
152
+ } = result.data;
153
+ const passwordlessSettings = {
154
+ ...settings,
155
+ port: settings.port || defaultPort,
200
156
  password: ""
157
+ };
158
+ return await context.security.withoutAuthorization(async () => {
159
+ try {
160
+ await onSettingsBeforeCreate.publish({
161
+ settings: passwordlessSettings
162
+ });
163
+ await context.cms.createEntry(model, (0, _transform.transformInputToEntryValues)({
164
+ values: {
165
+ ...passwordlessSettings,
166
+ password
167
+ },
168
+ secret
169
+ }));
170
+ await onSettingsAfterCreate.publish({
171
+ settings: passwordlessSettings
172
+ });
173
+ return passwordlessSettings;
174
+ } catch (ex) {
175
+ await onSettingsCreateError.publish({
176
+ settings: passwordlessSettings,
177
+ error: ex
178
+ });
179
+ throw new _error.default(ex.message, ex.code, ex.data);
180
+ }
201
181
  });
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
182
  },
228
-
229
183
  /**
230
184
  * Method should not be used outside of mailer
231
185
  * @internal
@@ -238,94 +192,78 @@ const createSettingsCrud = async context => {
238
192
  original: initialOriginal
239
193
  } = params;
240
194
  const model = await getModel();
241
-
242
- const result = _validation.updateValidation.validate(input);
243
-
244
- const error = result.error;
245
-
246
- if (error) {
195
+ const result = _validation.updateValidation.safeParse(input);
196
+ if (!result.success) {
247
197
  throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
248
- errors: error.details
198
+ errors: result.error.errors
249
199
  });
250
200
  }
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
- }
201
+ let dbOriginal = null;
202
+ if (!initialOriginal) {
203
+ dbOriginal = await this.getSettings();
260
204
  }
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;
205
+ const original = initialOriginal || dbOriginal;
206
+ if (!original) {
207
+ throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
270
208
  }
271
-
272
- const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
209
+ const {
210
+ password,
211
+ ...settings
212
+ } = result.data;
213
+ const passwordlessSettings = {
214
+ ...settings,
215
+ port: settings.port || original.port || defaultPort,
273
216
  password: ""
217
+ };
218
+ return await context.security.withoutAuthorization(async () => {
219
+ try {
220
+ await onSettingsBeforeUpdate.publish({
221
+ settings: passwordlessSettings,
222
+ original: original
223
+ });
224
+ const transformedInput = (0, _transform.transformInputToEntryValues)({
225
+ values: {
226
+ ...passwordlessSettings,
227
+ password: password || original.password
228
+ },
229
+ secret
230
+ });
231
+ /**
232
+ * We want to make sure that old password gets stored again in case no password was sent in update input.
233
+ */
234
+ await context.cms.updateEntry(model, original.id, transformedInput);
235
+ await onSettingsAfterUpdate.publish({
236
+ settings: passwordlessSettings,
237
+ original
238
+ });
239
+ return passwordlessSettings;
240
+ } catch (ex) {
241
+ await onSettingsUpdateError.publish({
242
+ original,
243
+ settings: passwordlessSettings,
244
+ error: ex
245
+ });
246
+ throw new _error.default(ex.message, ex.code, ex.data);
247
+ }
274
248
  });
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
249
  },
309
-
310
250
  async saveSettings(params) {
311
251
  const {
312
252
  input
313
253
  } = params;
314
254
  const original = await this.getSettings();
315
-
316
255
  if (!original) {
317
256
  return this.createSettings({
318
257
  input
319
258
  });
320
259
  }
321
-
322
260
  return this.updateSettings({
323
261
  input,
324
262
  original
325
263
  });
326
264
  }
327
-
328
265
  };
329
266
  };
267
+ exports.createSettingsCrud = createSettingsCrud;
330
268
 
331
- exports.createSettingsCrud = createSettingsCrud;
269
+ //# sourceMappingURL=settings.crud.js.map
@@ -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":["_error","_interopRequireDefault","require","_pubsub","_model","_transform","_secret","_validation","_hooks","_apiSecurity","defaultPort","createSettingsCrud","context","attachPasswordObfuscatingHooks","getTenant","tenancy","getCurrentTenant","id","validateAccess","permission","security","getPermission","NotAuthorizedError","data","reason","secret","getSecret","ex","getModel","withoutAuthorization","model","cms","SETTINGS_MODEL_ID","WebinyError","message","code","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","dbOriginal","transformedInput","updateEntry","saveSettings","exports"],"sources":["settings.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n ExtendedTransportSettings,\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 { transformInputToEntryValues, transformValuesFromEntry } from \"~/crud/settings/transform\";\nimport { getSecret } from \"~/crud/settings/secret\";\nimport { createValidation, updateValidation } from \"~/crud/settings/validation\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { attachPasswordObfuscatingHooks } from \"~/crud/settings/hooks\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nconst defaultPort = 25;\n/**\n * Note that settings cannot be used if there is no secret defined.\n */\nexport const createSettingsCrud = async (\n context: MailerContext\n): Promise<MailerSettingsContext> => {\n /**\n * We need to remove password from all references on create and update in the CMS.\n */\n attachPasswordObfuscatingHooks(context);\n\n const getTenant = () => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const validateAccess = async () => {\n const permission = await context.security.getPermission(\"mailer.settings\");\n\n if (permission) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to update the mailer settings.`\n }\n });\n };\n\n let secret: string | null = null;\n try {\n secret = getSecret();\n } catch (ex) {}\n\n const getModel = async (): Promise<CmsModel> => {\n return context.security.withoutAuthorization(async () => {\n try {\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 }\n throw new WebinyError(\n `Missing CMS Model \"${SETTINGS_MODEL_ID}\".`,\n \"CMS_MODEL_MISSING\",\n {\n modelId: SETTINGS_MODEL_ID\n }\n );\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 return await context.security.withoutAuthorization(async () => {\n try {\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 }\n return null;\n });\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async createSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input } = params;\n\n const model = await getModel();\n\n const result = createValidation.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n\n const { password, ...settings } = result.data;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || defaultPort,\n password: \"\"\n };\n\n return await context.security.withoutAuthorization(async () => {\n try {\n await onSettingsBeforeCreate.publish({\n settings: passwordlessSettings\n });\n\n await context.cms.createEntry(\n model,\n transformInputToEntryValues({\n values: {\n ...passwordlessSettings,\n password\n },\n secret\n })\n );\n\n await onSettingsAfterCreate.publish({\n settings: passwordlessSettings\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsCreateError.publish({\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n }\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\n let dbOriginal: ExtendedTransportSettings | null = null;\n if (!initialOriginal) {\n dbOriginal = await this.getSettings();\n }\n const original = initialOriginal || dbOriginal;\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 const { password, ...settings } = result.data;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || original.port || defaultPort,\n password: \"\"\n };\n return await context.security.withoutAuthorization(async () => {\n try {\n await onSettingsBeforeUpdate.publish({\n settings: passwordlessSettings,\n original: original\n });\n\n const transformedInput = transformInputToEntryValues({\n values: {\n ...passwordlessSettings,\n password: password || original.password\n },\n secret\n });\n /**\n * We want to make sure that old password gets stored again in case no password was sent in update input.\n */\n await context.cms.updateEntry(model, original.id, transformedInput);\n\n await onSettingsAfterUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsUpdateError.publish({\n original,\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n }\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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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { Topic } from "@webiny/pubsub/types";
2
- import { OnTransportBeforeSendParams } from "../../types";
1
+ import type { Topic } from "@webiny/pubsub/types";
2
+ import type { OnTransportBeforeSendParams } from "../../types";
3
3
  interface Params {
4
4
  onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;
5
5
  }
@@ -1,37 +1,26 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.attachOnTransportBeforeSend = void 0;
9
-
10
- 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),
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
-
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(),
15
+ subject: requiredString.max(1024).min(2),
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 => {
22
+ return !!data.text || !!data.html;
23
+ }, "Either text or html is required.");
35
24
  const attachOnTransportBeforeSend = params => {
36
25
  const {
37
26
  onTransportBeforeSend
@@ -40,14 +29,23 @@ const attachOnTransportBeforeSend = params => {
40
29
  data: input
41
30
  }) => {
42
31
  let result;
43
-
44
32
  try {
45
- result = await schema.validate(input);
46
-
47
- if (!result.error) {
33
+ result = schema.safeParse(input);
34
+ if (result.success) {
48
35
  return;
49
36
  }
37
+ throw new _error.default({
38
+ message: "Error while validating e-mail params.",
39
+ code: "VALIDATION_ERROR",
40
+ data: {
41
+ error: result.error,
42
+ input
43
+ }
44
+ });
50
45
  } catch (ex) {
46
+ if (ex instanceof _error.default) {
47
+ throw ex;
48
+ }
51
49
  throw new _error.default({
52
50
  message: "Error while validating e-mail params.",
53
51
  code: "VALIDATION_ERROR",
@@ -57,13 +55,8 @@ const attachOnTransportBeforeSend = params => {
57
55
  }
58
56
  });
59
57
  }
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
58
  });
67
59
  };
60
+ exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
68
61
 
69
- exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
62
+ //# sourceMappingURL=onTransportBeforeSend.js.map