@webiny/api-mailer 0.0.0-unstable.6f45466a1d → 0.0.0-unstable.7be00a75a9

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 (129) hide show
  1. package/constants.js +2 -1
  2. package/constants.js.map +1 -1
  3. package/domain/CodeMailerSettings/abstractions.d.ts +8 -0
  4. package/domain/CodeMailerSettings/abstractions.js +5 -0
  5. package/domain/CodeMailerSettings/abstractions.js.map +1 -0
  6. package/domain/MailTransport/abstractions.d.ts +8 -0
  7. package/domain/MailTransport/abstractions.js +4 -2
  8. package/domain/MailTransport/abstractions.js.map +1 -1
  9. package/domain/MailerService/abstractions.js +2 -1
  10. package/domain/MailerService/abstractions.js.map +1 -1
  11. package/domain/MailerService/errors.js +22 -24
  12. package/domain/MailerService/errors.js.map +1 -1
  13. package/domain/errors.d.ts +8 -4
  14. package/domain/errors.js +41 -37
  15. package/domain/errors.js.map +1 -1
  16. package/exports/api/mailer.d.ts +4 -0
  17. package/exports/api/mailer.js +4 -0
  18. package/features/CodeMailerSettings/CodeMailerSettingsImpl.d.ts +12 -0
  19. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js +23 -0
  20. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js.map +1 -0
  21. package/features/CodeMailerSettings/feature.d.ts +4 -0
  22. package/features/CodeMailerSettings/feature.js +11 -0
  23. package/features/CodeMailerSettings/feature.js.map +1 -0
  24. package/features/DummyTransport/DummyMailTransport.js +11 -9
  25. package/features/DummyTransport/DummyMailTransport.js.map +1 -1
  26. package/features/DummyTransport/DummyMailTransportFactory.d.ts +1 -0
  27. package/features/DummyTransport/DummyMailTransportFactory.js +10 -6
  28. package/features/DummyTransport/DummyMailTransportFactory.js.map +1 -1
  29. package/features/DummyTransport/feature.d.ts +4 -1
  30. package/features/DummyTransport/feature.js +6 -5
  31. package/features/DummyTransport/feature.js.map +1 -1
  32. package/features/GetSettings/GetSettingsRepository.d.ts +6 -5
  33. package/features/GetSettings/GetSettingsRepository.js +44 -29
  34. package/features/GetSettings/GetSettingsRepository.js.map +1 -1
  35. package/features/GetSettings/GetSettingsUseCase.d.ts +3 -4
  36. package/features/GetSettings/GetSettingsUseCase.js +13 -10
  37. package/features/GetSettings/GetSettingsUseCase.js.map +1 -1
  38. package/features/GetSettings/abstractions.d.ts +11 -5
  39. package/features/GetSettings/abstractions.js +3 -2
  40. package/features/GetSettings/abstractions.js.map +1 -1
  41. package/features/GetSettings/feature.d.ts +4 -1
  42. package/features/GetSettings/feature.js +7 -6
  43. package/features/GetSettings/feature.js.map +1 -1
  44. package/features/GetSettings/index.d.ts +1 -1
  45. package/features/GetSettings/index.js +1 -3
  46. package/features/MailerService/ActiveTransport.d.ts +10 -0
  47. package/features/MailerService/ActiveTransport.js +24 -0
  48. package/features/MailerService/ActiveTransport.js.map +1 -0
  49. package/features/MailerService/MailerService.d.ts +3 -2
  50. package/features/MailerService/MailerService.js +39 -42
  51. package/features/MailerService/MailerService.js.map +1 -1
  52. package/features/MailerService/feature.d.ts +4 -1
  53. package/features/MailerService/feature.js +8 -5
  54. package/features/MailerService/feature.js.map +1 -1
  55. package/features/SaveSettings/SaveSettingsRepository.d.ts +1 -1
  56. package/features/SaveSettings/SaveSettingsRepository.js +30 -44
  57. package/features/SaveSettings/SaveSettingsRepository.js.map +1 -1
  58. package/features/SaveSettings/SaveSettingsUseCase.d.ts +6 -2
  59. package/features/SaveSettings/SaveSettingsUseCase.js +41 -41
  60. package/features/SaveSettings/SaveSettingsUseCase.js.map +1 -1
  61. package/features/SaveSettings/abstractions.d.ts +20 -12
  62. package/features/SaveSettings/abstractions.js +5 -8
  63. package/features/SaveSettings/abstractions.js.map +1 -1
  64. package/features/SaveSettings/events.d.ts +3 -3
  65. package/features/SaveSettings/events.js +17 -12
  66. package/features/SaveSettings/events.js.map +1 -1
  67. package/features/SaveSettings/feature.d.ts +4 -1
  68. package/features/SaveSettings/feature.js +7 -6
  69. package/features/SaveSettings/feature.js.map +1 -1
  70. package/features/SaveSettings/index.d.ts +1 -1
  71. package/features/SaveSettings/index.js +1 -3
  72. package/features/SaveSettings/validation.d.ts +3 -17
  73. package/features/SaveSettings/validation.js +14 -13
  74. package/features/SaveSettings/validation.js.map +1 -1
  75. package/features/SendMail/SendMailUseCase.d.ts +1 -1
  76. package/features/SendMail/SendMailUseCase.js +44 -48
  77. package/features/SendMail/SendMailUseCase.js.map +1 -1
  78. package/features/SendMail/abstractions.d.ts +7 -7
  79. package/features/SendMail/abstractions.js +5 -8
  80. package/features/SendMail/abstractions.js.map +1 -1
  81. package/features/SendMail/events.d.ts +4 -4
  82. package/features/SendMail/events.js +24 -17
  83. package/features/SendMail/events.js.map +1 -1
  84. package/features/SendMail/feature.d.ts +4 -1
  85. package/features/SendMail/feature.js +6 -5
  86. package/features/SendMail/feature.js.map +1 -1
  87. package/features/SendMail/index.d.ts +1 -0
  88. package/features/SendMail/index.js +1 -0
  89. package/features/SmtpTransport/SmtpConfig.js +20 -24
  90. package/features/SmtpTransport/SmtpConfig.js.map +1 -1
  91. package/features/SmtpTransport/SmtpMailTransport.d.ts +51 -1
  92. package/features/SmtpTransport/SmtpMailTransport.js +47 -55
  93. package/features/SmtpTransport/SmtpMailTransport.js.map +1 -1
  94. package/features/SmtpTransport/SmtpMailTransportFactory.d.ts +1 -0
  95. package/features/SmtpTransport/SmtpMailTransportFactory.js +10 -6
  96. package/features/SmtpTransport/SmtpMailTransportFactory.js.map +1 -1
  97. package/features/SmtpTransport/feature.d.ts +4 -1
  98. package/features/SmtpTransport/feature.js +6 -5
  99. package/features/SmtpTransport/feature.js.map +1 -1
  100. package/graphql/settings.js +58 -66
  101. package/graphql/settings.js.map +1 -1
  102. package/index.js +12 -16
  103. package/index.js.map +1 -1
  104. package/package.json +29 -32
  105. package/types.js +0 -3
  106. package/utils/isMailboxAddress.d.ts +6 -0
  107. package/utils/isMailboxAddress.js +5 -0
  108. package/utils/isMailboxAddress.js.map +1 -0
  109. package/domain/Encryption/abstractions.d.ts +0 -8
  110. package/domain/Encryption/abstractions.js +0 -4
  111. package/domain/Encryption/abstractions.js.map +0 -1
  112. package/features/Encryption/PasswordEncryption.d.ts +0 -9
  113. package/features/Encryption/PasswordEncryption.js +0 -23
  114. package/features/Encryption/PasswordEncryption.js.map +0 -1
  115. package/features/Encryption/feature.d.ts +0 -1
  116. package/features/Encryption/feature.js +0 -10
  117. package/features/Encryption/feature.js.map +0 -1
  118. package/features/Encryption/utils/password.d.ts +0 -7
  119. package/features/Encryption/utils/password.js +0 -56
  120. package/features/Encryption/utils/password.js.map +0 -1
  121. package/features/Encryption/utils/secret.d.ts +0 -1
  122. package/features/Encryption/utils/secret.js +0 -11
  123. package/features/Encryption/utils/secret.js.map +0 -1
  124. package/features/GetSettings/index.js.map +0 -1
  125. package/features/MailerService/TransportFactory.d.ts +0 -2
  126. package/features/MailerService/TransportFactory.js +0 -31
  127. package/features/MailerService/TransportFactory.js.map +0 -1
  128. package/features/SaveSettings/index.js.map +0 -1
  129. package/types.js.map +0 -1
@@ -1,51 +1,51 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
- import { SaveSettingsUseCase, SaveSettingsRepository } from "./abstractions.js";
4
- import { MailerSettingsBeforeSaveEvent, MailerSettingsAfterSaveEvent } from "./events.js";
2
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
3
+ import { SaveSettingsRepository, SaveSettingsUseCase } from "./abstractions.js";
4
+ import { MailerSettingsAfterSaveEvent, MailerSettingsBeforeSaveEvent } from "./events.js";
5
5
  import { saveValidation } from "./validation.js";
6
- import { SettingsValidationError, SettingsPersistenceError, SettingsNotAuthorized } from "../../domain/errors.js";
6
+ import { SettingsLockedByCode, SettingsNotAuthorized, SettingsPersistenceError, SettingsValidationError } from "../../domain/errors.js";
7
7
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
8
+ import { CodeMailerSettings } from "../../domain/CodeMailerSettings/abstractions.js";
9
+ import { ActiveTransport } from "../../domain/MailTransport/abstractions.js";
8
10
  class SaveSettingsUseCaseImpl {
9
- constructor(identityContext, eventPublisher, repository) {
10
- this.identityContext = identityContext;
11
- this.eventPublisher = eventPublisher;
12
- this.repository = repository;
13
- }
14
- async execute(input) {
15
- const permission = await this.identityContext.getPermission("mailer.settings");
16
- if (!permission) {
17
- return Result.fail(new SettingsNotAuthorized());
11
+ constructor(identityContext, eventPublisher, repository, codeSettings, activeTransport){
12
+ this.identityContext = identityContext;
13
+ this.eventPublisher = eventPublisher;
14
+ this.repository = repository;
15
+ this.codeSettings = codeSettings;
16
+ this.activeTransport = activeTransport;
18
17
  }
19
-
20
- // Validate input
21
- const validationResult = saveValidation.safeParse(input);
22
- if (!validationResult.success) {
23
- return Result.fail(new SettingsValidationError(validationResult.error.errors));
18
+ async execute(input) {
19
+ const permission = await this.identityContext.getPermission("mailer.settings");
20
+ if (!permission) return Result.fail(new SettingsNotAuthorized());
21
+ const validationResult = saveValidation.safeParse(input);
22
+ if (!validationResult.success) return Result.fail(new SettingsValidationError(validationResult.error.issues));
23
+ const transportName = this.activeTransport.name();
24
+ if (transportName && null !== this.codeSettings.get(transportName)) return Result.fail(new SettingsLockedByCode());
25
+ const { password: _beforePassword, ...inputForEvent } = input;
26
+ const beforeSaveEvent = new MailerSettingsBeforeSaveEvent({
27
+ input: inputForEvent
28
+ });
29
+ await this.eventPublisher.publish(beforeSaveEvent);
30
+ const result = await this.repository.execute(input);
31
+ if (result.isFail()) return Result.fail(new SettingsPersistenceError(result.error));
32
+ const afterSaveEvent = new MailerSettingsAfterSaveEvent({
33
+ settings: result.value
34
+ });
35
+ await this.eventPublisher.publish(afterSaveEvent);
36
+ return result;
24
37
  }
25
-
26
- // Publish before save event
27
- const beforeSaveEvent = new MailerSettingsBeforeSaveEvent({
28
- input
29
- });
30
- await this.eventPublisher.publish(beforeSaveEvent);
31
-
32
- // Save settings
33
- const result = await this.repository.execute(input);
34
- if (result.isFail()) {
35
- return Result.fail(new SettingsPersistenceError(result.error));
36
- }
37
-
38
- // Publish after save event
39
- const afterSaveEvent = new MailerSettingsAfterSaveEvent({
40
- settings: result.value
41
- });
42
- await this.eventPublisher.publish(afterSaveEvent);
43
- return result;
44
- }
45
38
  }
46
- export const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({
47
- implementation: SaveSettingsUseCaseImpl,
48
- dependencies: [IdentityContext, EventPublisher, SaveSettingsRepository]
39
+ const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({
40
+ implementation: SaveSettingsUseCaseImpl,
41
+ dependencies: [
42
+ IdentityContext,
43
+ EventPublisher,
44
+ SaveSettingsRepository,
45
+ CodeMailerSettings,
46
+ ActiveTransport
47
+ ]
49
48
  });
49
+ export { SaveSettingsUseCaseImplementation };
50
50
 
51
51
  //# sourceMappingURL=SaveSettingsUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","EventPublisher","SaveSettingsUseCase","SaveSettingsRepository","MailerSettingsBeforeSaveEvent","MailerSettingsAfterSaveEvent","saveValidation","SettingsValidationError","SettingsPersistenceError","SettingsNotAuthorized","IdentityContext","SaveSettingsUseCaseImpl","constructor","identityContext","eventPublisher","repository","execute","input","permission","getPermission","fail","validationResult","safeParse","success","error","errors","beforeSaveEvent","publish","result","isFail","afterSaveEvent","settings","value","SaveSettingsUseCaseImplementation","createImplementation","implementation","dependencies"],"sources":["SaveSettingsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n SaveSettingsUseCase,\n SaveSettingsRepository,\n type SaveSettingsInput\n} from \"./abstractions.js\";\nimport { MailerSettingsBeforeSaveEvent, MailerSettingsAfterSaveEvent } from \"./events.js\";\nimport { saveValidation } from \"./validation.js\";\nimport {\n SettingsValidationError,\n SettingsPersistenceError,\n SettingsNotAuthorized\n} from \"~/domain/errors.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nclass SaveSettingsUseCaseImpl implements SaveSettingsUseCase.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private repository: SaveSettingsRepository.Interface\n ) {}\n\n async execute(input: SaveSettingsInput): SaveSettingsUseCase.Return {\n const permission = await this.identityContext.getPermission(\"mailer.settings\");\n\n if (!permission) {\n return Result.fail(new SettingsNotAuthorized());\n }\n\n // Validate input\n const validationResult = saveValidation.safeParse(input);\n if (!validationResult.success) {\n return Result.fail(new SettingsValidationError(validationResult.error.errors));\n }\n\n // Publish before save event\n const beforeSaveEvent = new MailerSettingsBeforeSaveEvent({ input });\n await this.eventPublisher.publish(beforeSaveEvent);\n\n // Save settings\n const result = await this.repository.execute(input);\n\n if (result.isFail()) {\n return Result.fail(new SettingsPersistenceError(result.error));\n }\n\n // Publish after save event\n const afterSaveEvent = new MailerSettingsAfterSaveEvent({ settings: result.value });\n await this.eventPublisher.publish(afterSaveEvent);\n\n return result;\n }\n}\n\nexport const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({\n implementation: SaveSettingsUseCaseImpl,\n dependencies: [IdentityContext, EventPublisher, SaveSettingsRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,mBAAmB,EACnBC,sBAAsB;AAG1B,SAASC,6BAA6B,EAAEC,4BAA4B;AACpE,SAASC,cAAc;AACvB,SACIC,uBAAuB,EACvBC,wBAAwB,EACxBC,qBAAqB;AAEzB,SAASC,eAAe,QAAQ,6DAA6D;AAE7F,MAAMC,uBAAuB,CAA0C;EACnEC,WAAWA,CACCC,eAA0C,EAC1CC,cAAmD,EACnDC,UAA4C,EACtD;IAAA,KAHUF,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,UAA4C,GAA5CA,UAA4C;EACrD;EAEH,MAAMC,OAAOA,CAACC,KAAwB,EAA8B;IAChE,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACL,eAAe,CAACM,aAAa,CAAC,iBAAiB,CAAC;IAE9E,IAAI,CAACD,UAAU,EAAE;MACb,OAAOlB,MAAM,CAACoB,IAAI,CAAC,IAAIX,qBAAqB,CAAC,CAAC,CAAC;IACnD;;IAEA;IACA,MAAMY,gBAAgB,GAAGf,cAAc,CAACgB,SAAS,CAACL,KAAK,CAAC;IACxD,IAAI,CAACI,gBAAgB,CAACE,OAAO,EAAE;MAC3B,OAAOvB,MAAM,CAACoB,IAAI,CAAC,IAAIb,uBAAuB,CAACc,gBAAgB,CAACG,KAAK,CAACC,MAAM,CAAC,CAAC;IAClF;;IAEA;IACA,MAAMC,eAAe,GAAG,IAAItB,6BAA6B,CAAC;MAAEa;IAAM,CAAC,CAAC;IACpE,MAAM,IAAI,CAACH,cAAc,CAACa,OAAO,CAACD,eAAe,CAAC;;IAElD;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACb,UAAU,CAACC,OAAO,CAACC,KAAK,CAAC;IAEnD,IAAIW,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO7B,MAAM,CAACoB,IAAI,CAAC,IAAIZ,wBAAwB,CAACoB,MAAM,CAACJ,KAAK,CAAC,CAAC;IAClE;;IAEA;IACA,MAAMM,cAAc,GAAG,IAAIzB,4BAA4B,CAAC;MAAE0B,QAAQ,EAAEH,MAAM,CAACI;IAAM,CAAC,CAAC;IACnF,MAAM,IAAI,CAAClB,cAAc,CAACa,OAAO,CAACG,cAAc,CAAC;IAEjD,OAAOF,MAAM;EACjB;AACJ;AAEA,OAAO,MAAMK,iCAAiC,GAAG/B,mBAAmB,CAACgC,oBAAoB,CAAC;EACtFC,cAAc,EAAExB,uBAAuB;EACvCyB,YAAY,EAAE,CAAC1B,eAAe,EAAET,cAAc,EAAEE,sBAAsB;AAC1E,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/SaveSettingsUseCase.js","sources":["../../../src/features/SaveSettings/SaveSettingsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n SaveSettingsUseCase,\n SaveSettingsRepository,\n type SaveSettingsInput\n} from \"./abstractions.js\";\nimport { MailerSettingsBeforeSaveEvent, MailerSettingsAfterSaveEvent } from \"./events.js\";\nimport { saveValidation } from \"./validation.js\";\nimport {\n SettingsValidationError,\n SettingsPersistenceError,\n SettingsNotAuthorized,\n SettingsLockedByCode\n} from \"~/domain/errors.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { CodeMailerSettings } from \"~/domain/CodeMailerSettings/abstractions.js\";\nimport { ActiveTransport } from \"~/domain/MailTransport/abstractions.js\";\n\nclass SaveSettingsUseCaseImpl implements SaveSettingsUseCase.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private repository: SaveSettingsRepository.Interface,\n private codeSettings: CodeMailerSettings.Interface,\n private activeTransport: ActiveTransport.Interface\n ) {}\n\n async execute(input: SaveSettingsInput): SaveSettingsUseCase.Return {\n const permission = await this.identityContext.getPermission(\"mailer.settings\");\n\n if (!permission) {\n return Result.fail(new SettingsNotAuthorized());\n }\n\n // Validate input.\n const validationResult = saveValidation.safeParse(input);\n if (!validationResult.success) {\n return Result.fail(new SettingsValidationError(validationResult.error.issues));\n }\n\n // Refuse when settings are defined via code.\n const transportName = this.activeTransport.name();\n if (transportName && this.codeSettings.get(transportName) !== null) {\n return Result.fail(new SettingsLockedByCode());\n }\n\n // Publish before save event. Strip the password — subscribers (audit\n // logs, telemetry) must never see the plaintext value from the input.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password: _beforePassword, ...inputForEvent } = input;\n const beforeSaveEvent = new MailerSettingsBeforeSaveEvent({ input: inputForEvent });\n await this.eventPublisher.publish(beforeSaveEvent);\n\n // Save settings.\n const result = await this.repository.execute(input);\n\n if (result.isFail()) {\n return Result.fail(new SettingsPersistenceError(result.error));\n }\n\n // Publish after save event. The repository return is already password-free\n // (its type is Omit<TransportSettings, \"password\">), so no runtime strip\n // is needed here.\n const afterSaveEvent = new MailerSettingsAfterSaveEvent({ settings: result.value });\n await this.eventPublisher.publish(afterSaveEvent);\n\n return result;\n }\n}\n\nexport const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({\n implementation: SaveSettingsUseCaseImpl,\n dependencies: [\n IdentityContext,\n EventPublisher,\n SaveSettingsRepository,\n CodeMailerSettings,\n ActiveTransport\n ]\n});\n"],"names":["SaveSettingsUseCaseImpl","identityContext","eventPublisher","repository","codeSettings","activeTransport","input","permission","Result","SettingsNotAuthorized","validationResult","saveValidation","SettingsValidationError","transportName","SettingsLockedByCode","_beforePassword","inputForEvent","beforeSaveEvent","MailerSettingsBeforeSaveEvent","result","SettingsPersistenceError","afterSaveEvent","MailerSettingsAfterSaveEvent","SaveSettingsUseCaseImplementation","SaveSettingsUseCase","IdentityContext","EventPublisher","SaveSettingsRepository","CodeMailerSettings","ActiveTransport"],"mappings":";;;;;;;;;AAsBA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,cAAmD,EACnDC,UAA4C,EAC5CC,YAA0C,EAC1CC,eAA0C,CACpD;aALUJ,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,YAAY,GAAZA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QAAQC,KAAwB,EAA8B;QAChE,MAAMC,aAAa,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QAE5D,IAAI,CAACA,YACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAI3B,MAAMC,mBAAmBC,eAAe,SAAS,CAACL;QAClD,IAAI,CAACI,iBAAiB,OAAO,EACzB,OAAOF,OAAO,IAAI,CAAC,IAAII,wBAAwBF,iBAAiB,KAAK,CAAC,MAAM;QAIhF,MAAMG,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI;QAC/C,IAAIA,iBAAiB,AAAyC,SAAzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAACA,gBACvC,OAAOL,OAAO,IAAI,CAAC,IAAIM;QAM3B,MAAM,EAAE,UAAUC,eAAe,EAAE,GAAGC,eAAe,GAAGV;QACxD,MAAMW,kBAAkB,IAAIC,8BAA8B;YAAE,OAAOF;QAAc;QACjF,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACC;QAGlC,MAAME,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACb;QAE7C,IAAIa,OAAO,MAAM,IACb,OAAOX,OAAO,IAAI,CAAC,IAAIY,yBAAyBD,OAAO,KAAK;QAMhE,MAAME,iBAAiB,IAAIC,6BAA6B;YAAE,UAAUH,OAAO,KAAK;QAAC;QACjF,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACE;QAElC,OAAOF;IACX;AACJ;AAEO,MAAMI,oCAAoCC,oBAAoB,oBAAoB,CAAC;IACtF,gBAAgBxB;IAChB,cAAc;QACVyB;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -1,7 +1,7 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import type { DomainEvent, IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
+ import type { DomainEvent, IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { TransportSettings } from "../../types.js";
4
- import { SettingsValidationError, SettingsPersistenceError, SettingsNotAuthorized } from "../../domain/errors.js";
4
+ import { SettingsValidationError, SettingsPersistenceError, SettingsNotAuthorized, SettingsLockedByCode } from "../../domain/errors.js";
5
5
  export interface SaveSettingsInput {
6
6
  host: string;
7
7
  port?: number;
@@ -14,39 +14,47 @@ export interface ISaveSettingsErrors {
14
14
  validation: SettingsValidationError;
15
15
  persistence: SettingsPersistenceError;
16
16
  notAuthorized: SettingsNotAuthorized;
17
+ lockedByCode: SettingsLockedByCode;
17
18
  }
18
19
  type SaveSettingsError = ISaveSettingsErrors[keyof ISaveSettingsErrors];
20
+ /**
21
+ * Save-side returns are password-free. The only path that exposes the password
22
+ * to in-process callers is GetSettingsRepository.get / GetSettingsUseCase.execute
23
+ * (used by MailerService to authenticate SMTP). Everything else — events,
24
+ * GraphQL responses, logs, audit trails — must use this Omit shape.
25
+ */
26
+ export type SavedTransportSettings = Omit<TransportSettings, "password">;
19
27
  export interface ISaveSettingsRepository {
20
- execute(input: SaveSettingsInput): Promise<Result<TransportSettings, SaveSettingsError>>;
28
+ execute(input: SaveSettingsInput): Promise<Result<SavedTransportSettings, SaveSettingsError>>;
21
29
  }
22
30
  export declare const SaveSettingsRepository: import("@webiny/di").Abstraction<ISaveSettingsRepository>;
23
31
  export declare namespace SaveSettingsRepository {
24
32
  type Interface = ISaveSettingsRepository;
25
- type Return = Promise<Result<TransportSettings, SaveSettingsError>>;
33
+ type Return = Promise<Result<SavedTransportSettings, SaveSettingsError>>;
26
34
  type Error = SaveSettingsError;
27
35
  }
28
36
  export interface ISaveSettings {
29
- execute(input: SaveSettingsInput): Promise<Result<TransportSettings, SaveSettingsError>>;
37
+ execute(input: SaveSettingsInput): Promise<Result<SavedTransportSettings, SaveSettingsError>>;
30
38
  }
31
39
  export declare const SaveSettingsUseCase: import("@webiny/di").Abstraction<ISaveSettings>;
32
40
  export declare namespace SaveSettingsUseCase {
33
41
  type Interface = ISaveSettings;
34
- type Return = Promise<Result<TransportSettings, SaveSettingsError>>;
42
+ type Return = Promise<Result<SavedTransportSettings, SaveSettingsError>>;
35
43
  type Error = SaveSettingsError;
36
44
  }
37
45
  export interface MailerSettingsBeforeSavePayload {
38
- input: SaveSettingsInput;
46
+ input: Omit<SaveSettingsInput, "password">;
39
47
  }
40
48
  export interface MailerSettingsAfterSavePayload {
41
- settings: TransportSettings;
49
+ settings: Omit<TransportSettings, "password">;
42
50
  }
43
- export declare const MailerSettingsBeforeSaveHandler: import("@webiny/di").Abstraction<IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>>;
44
- export declare namespace MailerSettingsBeforeSaveHandler {
51
+ export declare const MailerSettingsBeforeSaveEventHandler: import("@webiny/di").Abstraction<IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>>;
52
+ export declare namespace MailerSettingsBeforeSaveEventHandler {
45
53
  type Interface = IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>;
46
54
  type Event = DomainEvent<MailerSettingsBeforeSavePayload>;
47
55
  }
48
- export declare const MailerSettingsAfterSaveHandler: import("@webiny/di").Abstraction<IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>>;
49
- export declare namespace MailerSettingsAfterSaveHandler {
56
+ export declare const MailerSettingsAfterSaveEventHandler: import("@webiny/di").Abstraction<IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>>;
57
+ export declare namespace MailerSettingsAfterSaveEventHandler {
50
58
  type Interface = IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>;
51
59
  type Event = DomainEvent<MailerSettingsAfterSavePayload>;
52
60
  }
@@ -1,11 +1,8 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- export const SaveSettingsRepository = createAbstraction("SaveSettingsRepository");
3
- export const SaveSettingsUseCase = createAbstraction("SaveSettingsUseCase");
4
-
5
- // Domain Events
6
-
7
- // Event Handler Abstractions
8
- export const MailerSettingsBeforeSaveHandler = createAbstraction("MailerSettingsBeforeSaveHandler");
9
- export const MailerSettingsAfterSaveHandler = createAbstraction("MailerSettingsAfterSaveHandler");
2
+ const SaveSettingsRepository = createAbstraction("SaveSettingsRepository");
3
+ const SaveSettingsUseCase = createAbstraction("SaveSettingsUseCase");
4
+ const MailerSettingsBeforeSaveEventHandler = createAbstraction("MailerSettingsBeforeSaveEventHandler");
5
+ const MailerSettingsAfterSaveEventHandler = createAbstraction("MailerSettingsAfterSaveEventHandler");
6
+ export { MailerSettingsAfterSaveEventHandler, MailerSettingsBeforeSaveEventHandler, SaveSettingsRepository, SaveSettingsUseCase };
10
7
 
11
8
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","SaveSettingsRepository","SaveSettingsUseCase","MailerSettingsBeforeSaveHandler","MailerSettingsAfterSaveHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { TransportSettings } from \"~/types.js\";\nimport {\n SettingsValidationError,\n SettingsPersistenceError,\n SettingsNotAuthorized\n} from \"~/domain/errors.js\";\n\nexport interface SaveSettingsInput {\n host: string;\n port?: number;\n user: string;\n password?: string;\n from: string;\n replyTo?: string;\n}\n\nexport interface ISaveSettingsErrors {\n validation: SettingsValidationError;\n persistence: SettingsPersistenceError;\n notAuthorized: SettingsNotAuthorized;\n}\n\ntype SaveSettingsError = ISaveSettingsErrors[keyof ISaveSettingsErrors];\n\nexport interface ISaveSettingsRepository {\n execute(input: SaveSettingsInput): Promise<Result<TransportSettings, SaveSettingsError>>;\n}\n\nexport const SaveSettingsRepository =\n createAbstraction<ISaveSettingsRepository>(\"SaveSettingsRepository\");\n\nexport namespace SaveSettingsRepository {\n export type Interface = ISaveSettingsRepository;\n export type Return = Promise<Result<TransportSettings, SaveSettingsError>>;\n export type Error = SaveSettingsError;\n}\n\nexport interface ISaveSettings {\n execute(input: SaveSettingsInput): Promise<Result<TransportSettings, SaveSettingsError>>;\n}\n\nexport const SaveSettingsUseCase = createAbstraction<ISaveSettings>(\"SaveSettingsUseCase\");\n\nexport namespace SaveSettingsUseCase {\n export type Interface = ISaveSettings;\n export type Return = Promise<Result<TransportSettings, SaveSettingsError>>;\n export type Error = SaveSettingsError;\n}\n\n// Domain Events\nexport interface MailerSettingsBeforeSavePayload {\n input: SaveSettingsInput;\n}\n\nexport interface MailerSettingsAfterSavePayload {\n settings: TransportSettings;\n}\n\n// Event Handler Abstractions\nexport const MailerSettingsBeforeSaveHandler = createAbstraction<\n IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>\n>(\"MailerSettingsBeforeSaveHandler\");\n\nexport namespace MailerSettingsBeforeSaveHandler {\n export type Interface = IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>;\n export type Event = DomainEvent<MailerSettingsBeforeSavePayload>;\n}\n\nexport const MailerSettingsAfterSaveHandler = createAbstraction<\n IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>\n>(\"MailerSettingsAfterSaveHandler\");\n\nexport namespace MailerSettingsAfterSaveHandler {\n export type Interface = IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>;\n export type Event = DomainEvent<MailerSettingsAfterSavePayload>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AA+BvD,OAAO,MAAMC,sBAAsB,GAC/BD,iBAAiB,CAA0B,wBAAwB,CAAC;AAYxE,OAAO,MAAME,mBAAmB,GAAGF,iBAAiB,CAAgB,qBAAqB,CAAC;;AAQ1F;;AASA;AACA,OAAO,MAAMG,+BAA+B,GAAGH,iBAAiB,CAE9D,iCAAiC,CAAC;AAOpC,OAAO,MAAMI,8BAA8B,GAAGJ,iBAAiB,CAE7D,gCAAgC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/abstractions.js","sources":["../../../src/features/SaveSettings/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { TransportSettings } from \"~/types.js\";\nimport {\n SettingsValidationError,\n SettingsPersistenceError,\n SettingsNotAuthorized,\n SettingsLockedByCode\n} from \"~/domain/errors.js\";\n\nexport interface SaveSettingsInput {\n host: string;\n port?: number;\n user: string;\n password?: string;\n from: string;\n replyTo?: string;\n}\n\nexport interface ISaveSettingsErrors {\n validation: SettingsValidationError;\n persistence: SettingsPersistenceError;\n notAuthorized: SettingsNotAuthorized;\n lockedByCode: SettingsLockedByCode;\n}\n\ntype SaveSettingsError = ISaveSettingsErrors[keyof ISaveSettingsErrors];\n\n/**\n * Save-side returns are password-free. The only path that exposes the password\n * to in-process callers is GetSettingsRepository.get / GetSettingsUseCase.execute\n * (used by MailerService to authenticate SMTP). Everything else — events,\n * GraphQL responses, logs, audit trails — must use this Omit shape.\n */\nexport type SavedTransportSettings = Omit<TransportSettings, \"password\">;\n\nexport interface ISaveSettingsRepository {\n execute(input: SaveSettingsInput): Promise<Result<SavedTransportSettings, SaveSettingsError>>;\n}\n\nexport const SaveSettingsRepository =\n createAbstraction<ISaveSettingsRepository>(\"SaveSettingsRepository\");\n\nexport namespace SaveSettingsRepository {\n export type Interface = ISaveSettingsRepository;\n export type Return = Promise<Result<SavedTransportSettings, SaveSettingsError>>;\n export type Error = SaveSettingsError;\n}\n\nexport interface ISaveSettings {\n execute(input: SaveSettingsInput): Promise<Result<SavedTransportSettings, SaveSettingsError>>;\n}\n\nexport const SaveSettingsUseCase = createAbstraction<ISaveSettings>(\"SaveSettingsUseCase\");\n\nexport namespace SaveSettingsUseCase {\n export type Interface = ISaveSettings;\n export type Return = Promise<Result<SavedTransportSettings, SaveSettingsError>>;\n export type Error = SaveSettingsError;\n}\n\n// Domain Events. Both payloads exclude `password` so subscribers (audit logs,\n// telemetry, etc.) cannot accidentally persist plaintext or ciphertext secrets.\nexport interface MailerSettingsBeforeSavePayload {\n input: Omit<SaveSettingsInput, \"password\">;\n}\n\nexport interface MailerSettingsAfterSavePayload {\n settings: Omit<TransportSettings, \"password\">;\n}\n\n// Event Handler Abstractions\nexport const MailerSettingsBeforeSaveEventHandler = createAbstraction<\n IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>\n>(\"MailerSettingsBeforeSaveEventHandler\");\n\nexport namespace MailerSettingsBeforeSaveEventHandler {\n export type Interface = IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>;\n export type Event = DomainEvent<MailerSettingsBeforeSavePayload>;\n}\n\nexport const MailerSettingsAfterSaveEventHandler = createAbstraction<\n IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>\n>(\"MailerSettingsAfterSaveEventHandler\");\n\nexport namespace MailerSettingsAfterSaveEventHandler {\n export type Interface = IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>;\n export type Event = DomainEvent<MailerSettingsAfterSavePayload>;\n}\n"],"names":["SaveSettingsRepository","createAbstraction","SaveSettingsUseCase","MailerSettingsBeforeSaveEventHandler","MailerSettingsAfterSaveEventHandler"],"mappings":";AAyCO,MAAMA,yBACTC,kBAA2C;AAYxC,MAAMC,sBAAsBD,kBAAiC;AAmB7D,MAAME,uCAAuCF,kBAElD;AAOK,MAAMG,sCAAsCH,kBAEjD"}
@@ -1,10 +1,10 @@
1
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
2
2
  import type { MailerSettingsBeforeSavePayload, MailerSettingsAfterSavePayload } from "./abstractions.js";
3
3
  export declare class MailerSettingsBeforeSaveEvent extends DomainEvent<MailerSettingsBeforeSavePayload> {
4
4
  eventType: "mailer.settings.beforeSave";
5
- getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>>;
5
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher/abstractions.js").IEventHandler<DomainEvent<MailerSettingsBeforeSavePayload>>>;
6
6
  }
7
7
  export declare class MailerSettingsAfterSaveEvent extends DomainEvent<MailerSettingsAfterSavePayload> {
8
8
  eventType: "mailer.settings.afterSave";
9
- getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>>;
9
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher/abstractions.js").IEventHandler<DomainEvent<MailerSettingsAfterSavePayload>>>;
10
10
  }
@@ -1,16 +1,21 @@
1
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
- import { MailerSettingsBeforeSaveHandler, MailerSettingsAfterSaveHandler } from "./abstractions.js";
3
- export class MailerSettingsBeforeSaveEvent extends DomainEvent {
4
- eventType = "mailer.settings.beforeSave";
5
- getHandlerAbstraction() {
6
- return MailerSettingsBeforeSaveHandler;
7
- }
1
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { MailerSettingsAfterSaveEventHandler, MailerSettingsBeforeSaveEventHandler } from "./abstractions.js";
3
+ class MailerSettingsBeforeSaveEvent extends DomainEvent {
4
+ getHandlerAbstraction() {
5
+ return MailerSettingsBeforeSaveEventHandler;
6
+ }
7
+ constructor(...args){
8
+ super(...args), this.eventType = "mailer.settings.beforeSave";
9
+ }
8
10
  }
9
- export class MailerSettingsAfterSaveEvent extends DomainEvent {
10
- eventType = "mailer.settings.afterSave";
11
- getHandlerAbstraction() {
12
- return MailerSettingsAfterSaveHandler;
13
- }
11
+ class MailerSettingsAfterSaveEvent extends DomainEvent {
12
+ getHandlerAbstraction() {
13
+ return MailerSettingsAfterSaveEventHandler;
14
+ }
15
+ constructor(...args){
16
+ super(...args), this.eventType = "mailer.settings.afterSave";
17
+ }
14
18
  }
19
+ export { MailerSettingsAfterSaveEvent, MailerSettingsBeforeSaveEvent };
15
20
 
16
21
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["DomainEvent","MailerSettingsBeforeSaveHandler","MailerSettingsAfterSaveHandler","MailerSettingsBeforeSaveEvent","eventType","getHandlerAbstraction","MailerSettingsAfterSaveEvent"],"sources":["events.ts"],"sourcesContent":["import { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport { MailerSettingsBeforeSaveHandler, MailerSettingsAfterSaveHandler } from \"./abstractions.js\";\nimport type {\n MailerSettingsBeforeSavePayload,\n MailerSettingsAfterSavePayload\n} from \"./abstractions.js\";\n\nexport class MailerSettingsBeforeSaveEvent extends DomainEvent<MailerSettingsBeforeSavePayload> {\n eventType = \"mailer.settings.beforeSave\" as const;\n\n getHandlerAbstraction() {\n return MailerSettingsBeforeSaveHandler;\n }\n}\n\nexport class MailerSettingsAfterSaveEvent extends DomainEvent<MailerSettingsAfterSavePayload> {\n eventType = \"mailer.settings.afterSave\" as const;\n\n getHandlerAbstraction() {\n return MailerSettingsAfterSaveHandler;\n }\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,0CAA0C;AACtE,SAASC,+BAA+B,EAAEC,8BAA8B;AAMxE,OAAO,MAAMC,6BAA6B,SAASH,WAAW,CAAkC;EAC5FI,SAAS,GAAG,4BAA4B;EAExCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOJ,+BAA+B;EAC1C;AACJ;AAEA,OAAO,MAAMK,4BAA4B,SAASN,WAAW,CAAiC;EAC1FI,SAAS,GAAG,2BAA2B;EAEvCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOH,8BAA8B;EACzC;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/events.js","sources":["../../../src/features/SaveSettings/events.ts"],"sourcesContent":["import { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n MailerSettingsBeforeSaveEventHandler,\n MailerSettingsAfterSaveEventHandler\n} from \"./abstractions.js\";\nimport type {\n MailerSettingsBeforeSavePayload,\n MailerSettingsAfterSavePayload\n} from \"./abstractions.js\";\n\nexport class MailerSettingsBeforeSaveEvent extends DomainEvent<MailerSettingsBeforeSavePayload> {\n eventType = \"mailer.settings.beforeSave\" as const;\n\n getHandlerAbstraction() {\n return MailerSettingsBeforeSaveEventHandler;\n }\n}\n\nexport class MailerSettingsAfterSaveEvent extends DomainEvent<MailerSettingsAfterSavePayload> {\n eventType = \"mailer.settings.afterSave\" as const;\n\n getHandlerAbstraction() {\n return MailerSettingsAfterSaveEventHandler;\n }\n}\n"],"names":["MailerSettingsBeforeSaveEvent","DomainEvent","MailerSettingsBeforeSaveEventHandler","MailerSettingsAfterSaveEvent","MailerSettingsAfterSaveEventHandler"],"mappings":";;AAUO,MAAMA,sCAAsCC;IAG/C,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAEO,MAAMC,qCAAqCF;IAG9C,wBAAwB;QACpB,OAAOG;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB"}
@@ -1 +1,4 @@
1
- export declare const SaveSettingsFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
1
+ export declare const SaveSettingsFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { SaveSettingsRepositoryImplementation } from "./SaveSettingsRepository.js";
3
3
  import { SaveSettingsUseCaseImplementation } from "./SaveSettingsUseCase.js";
4
- export const SaveSettingsFeature = createFeature({
5
- name: "SaveSettings",
6
- register(container) {
7
- container.register(SaveSettingsRepositoryImplementation).inSingletonScope();
8
- container.register(SaveSettingsUseCaseImplementation);
9
- }
4
+ const SaveSettingsFeature = createFeature({
5
+ name: "SaveSettings",
6
+ register (container) {
7
+ container.register(SaveSettingsRepositoryImplementation).inSingletonScope();
8
+ container.register(SaveSettingsUseCaseImplementation);
9
+ }
10
10
  });
11
+ export { SaveSettingsFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","SaveSettingsRepositoryImplementation","SaveSettingsUseCaseImplementation","SaveSettingsFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { SaveSettingsRepositoryImplementation } from \"./SaveSettingsRepository.js\";\nimport { SaveSettingsUseCaseImplementation } from \"./SaveSettingsUseCase.js\";\n\nexport const SaveSettingsFeature = createFeature({\n name: \"SaveSettings\",\n register(container) {\n container.register(SaveSettingsRepositoryImplementation).inSingletonScope();\n container.register(SaveSettingsUseCaseImplementation);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,oCAAoC;AAC7C,SAASC,iCAAiC;AAE1C,OAAO,MAAMC,mBAAmB,GAAGH,aAAa,CAAC;EAC7CI,IAAI,EAAE,cAAc;EACpBC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,oCAAoC,CAAC,CAACM,gBAAgB,CAAC,CAAC;IAC3ED,SAAS,CAACD,QAAQ,CAACH,iCAAiC,CAAC;EACzD;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/feature.js","sources":["../../../src/features/SaveSettings/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { SaveSettingsRepositoryImplementation } from \"./SaveSettingsRepository.js\";\nimport { SaveSettingsUseCaseImplementation } from \"./SaveSettingsUseCase.js\";\n\nexport const SaveSettingsFeature = createFeature({\n name: \"SaveSettings\",\n register(container) {\n container.register(SaveSettingsRepositoryImplementation).inSingletonScope();\n container.register(SaveSettingsUseCaseImplementation);\n }\n});\n"],"names":["SaveSettingsFeature","createFeature","container","SaveSettingsRepositoryImplementation","SaveSettingsUseCaseImplementation"],"mappings":";;;AAIO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,sCAAsC,gBAAgB;QACzED,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -1 +1 @@
1
- export { SaveSettingsUseCase, MailerSettingsAfterSaveHandler, MailerSettingsBeforeSaveHandler } from "./abstractions.js";
1
+ export { SaveSettingsUseCase, SaveSettingsRepository, MailerSettingsAfterSaveEventHandler, MailerSettingsBeforeSaveEventHandler } from "./abstractions.js";
@@ -1,3 +1 @@
1
- export { SaveSettingsUseCase, MailerSettingsAfterSaveHandler, MailerSettingsBeforeSaveHandler } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { MailerSettingsAfterSaveEventHandler, MailerSettingsBeforeSaveEventHandler, SaveSettingsRepository, SaveSettingsUseCase } from "./abstractions.js";
@@ -1,23 +1,9 @@
1
1
  import zod from "zod";
2
2
  export declare const saveValidation: zod.ZodObject<{
3
- password: zod.ZodEffects<zod.ZodOptional<zod.ZodOptional<zod.ZodNullable<zod.ZodString>>>, string | null, string | null | undefined>;
3
+ password: zod.ZodPipe<zod.ZodOptional<zod.ZodOptional<zod.ZodNullable<zod.ZodString>>>, zod.ZodTransform<string | null, string | null | undefined>>;
4
4
  from: zod.ZodString;
5
5
  port: zod.ZodOptional<zod.ZodNullable<zod.ZodOptional<zod.ZodNumber>>>;
6
- replyTo: zod.ZodEffects<zod.ZodOptional<zod.ZodNullable<zod.ZodOptional<zod.ZodString>>>, string | null | undefined, unknown>;
6
+ replyTo: zod.ZodPreprocess<zod.ZodOptional<zod.ZodNullable<zod.ZodOptional<zod.ZodString>>>>;
7
7
  host: zod.ZodString;
8
8
  user: zod.ZodString;
9
- }, "strip", zod.ZodTypeAny, {
10
- host: string;
11
- user: string;
12
- password: string | null;
13
- from: string;
14
- port?: number | null | undefined;
15
- replyTo?: string | null | undefined;
16
- }, {
17
- host: string;
18
- user: string;
19
- from: string;
20
- port?: number | null | undefined;
21
- password?: string | null | undefined;
22
- replyTo?: unknown;
23
- }>;
9
+ }, zod.core.$strip>;
@@ -1,19 +1,20 @@
1
1
  import zod from "zod";
2
- const password = zod.string().describe("Password");
2
+ import { isMailboxAddress } from "../../utils/isMailboxAddress.js";
3
+ const validation_password = zod.string().describe("Password");
4
+ const mailboxAddress = zod.string().refine(isMailboxAddress, {
5
+ message: "Invalid email address."
6
+ });
3
7
  const common = {
4
- from: zod.string().email().describe("Mail from"),
5
- port: zod.number().optional().nullish().describe("Port"),
6
- replyTo: zod.preprocess(
7
- // We need to set empty strings to `null` before email validation kicks in
8
- value => value === "" ? null : value, zod.string().email().optional().nullish()).describe("Mail reply-to"),
9
- host: zod.string().describe("Hostname"),
10
- user: zod.string().describe("User")
8
+ from: mailboxAddress.describe("Mail from"),
9
+ port: zod.number().optional().nullish().describe("Port"),
10
+ replyTo: zod.preprocess((value)=>"" === value ? null : value, mailboxAddress.optional().nullish()).describe("Mail reply-to"),
11
+ host: zod.string().describe("Hostname"),
12
+ user: zod.string().describe("User")
11
13
  };
12
- export const saveValidation = zod.object({
13
- ...common,
14
- password: password.nullish().optional().transform(value => {
15
- return value === undefined ? null : value;
16
- })
14
+ const saveValidation = zod.object({
15
+ ...common,
16
+ password: validation_password.nullish().optional().transform((value)=>void 0 === value ? null : value)
17
17
  });
18
+ export { saveValidation };
18
19
 
19
20
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["zod","password","string","describe","common","from","email","port","number","optional","nullish","replyTo","preprocess","value","host","user","saveValidation","object","transform","undefined"],"sources":["validation.ts"],"sourcesContent":["import zod from \"zod\";\n\nconst password = zod.string().describe(\"Password\");\n\nconst common = {\n from: zod.string().email().describe(\"Mail from\"),\n port: zod.number().optional().nullish().describe(\"Port\"),\n replyTo: zod\n .preprocess(\n // We need to set empty strings to `null` before email validation kicks in\n value => (value === \"\" ? null : value),\n zod.string().email().optional().nullish()\n )\n .describe(\"Mail reply-to\"),\n host: zod.string().describe(\"Hostname\"),\n user: zod.string().describe(\"User\")\n};\n\nexport const saveValidation = zod.object({\n ...common,\n password: password\n .nullish()\n .optional()\n .transform(value => {\n return value === undefined ? null : value;\n })\n});\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AAErB,MAAMC,QAAQ,GAAGD,GAAG,CAACE,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,UAAU,CAAC;AAElD,MAAMC,MAAM,GAAG;EACXC,IAAI,EAAEL,GAAG,CAACE,MAAM,CAAC,CAAC,CAACI,KAAK,CAAC,CAAC,CAACH,QAAQ,CAAC,WAAW,CAAC;EAChDI,IAAI,EAAEP,GAAG,CAACQ,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,CAACP,QAAQ,CAAC,MAAM,CAAC;EACxDQ,OAAO,EAAEX,GAAG,CACPY,UAAU;EACP;EACAC,KAAK,IAAKA,KAAK,KAAK,EAAE,GAAG,IAAI,GAAGA,KAAM,EACtCb,GAAG,CAACE,MAAM,CAAC,CAAC,CAACI,KAAK,CAAC,CAAC,CAACG,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAC5C,CAAC,CACAP,QAAQ,CAAC,eAAe,CAAC;EAC9BW,IAAI,EAAEd,GAAG,CAACE,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,UAAU,CAAC;EACvCY,IAAI,EAAEf,GAAG,CAACE,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,MAAM;AACtC,CAAC;AAED,OAAO,MAAMa,cAAc,GAAGhB,GAAG,CAACiB,MAAM,CAAC;EACrC,GAAGb,MAAM;EACTH,QAAQ,EAAEA,QAAQ,CACbS,OAAO,CAAC,CAAC,CACTD,QAAQ,CAAC,CAAC,CACVS,SAAS,CAACL,KAAK,IAAI;IAChB,OAAOA,KAAK,KAAKM,SAAS,GAAG,IAAI,GAAGN,KAAK;EAC7C,CAAC;AACT,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/validation.js","sources":["../../../src/features/SaveSettings/validation.ts"],"sourcesContent":["import zod from \"zod\";\nimport { isMailboxAddress } from \"~/utils/isMailboxAddress.js\";\n\nconst password = zod.string().describe(\"Password\");\n\nconst mailboxAddress = zod.string().refine(isMailboxAddress, { message: \"Invalid email address.\" });\n\nconst common = {\n from: mailboxAddress.describe(\"Mail from\"),\n port: zod.number().optional().nullish().describe(\"Port\"),\n replyTo: zod\n .preprocess(\n // We need to set empty strings to `null` before address validation kicks in.\n value => (value === \"\" ? null : value),\n mailboxAddress.optional().nullish()\n )\n .describe(\"Mail reply-to\"),\n host: zod.string().describe(\"Hostname\"),\n user: zod.string().describe(\"User\")\n};\n\nexport const saveValidation = zod.object({\n ...common,\n password: password\n .nullish()\n .optional()\n .transform(value => {\n return value === undefined ? null : value;\n })\n});\n"],"names":["password","zod","mailboxAddress","isMailboxAddress","common","value","saveValidation","undefined"],"mappings":";;AAGA,MAAMA,sBAAWC,IAAI,MAAM,GAAG,QAAQ,CAAC;AAEvC,MAAMC,iBAAiBD,IAAI,MAAM,GAAG,MAAM,CAACE,kBAAkB;IAAE,SAAS;AAAyB;AAEjG,MAAMC,SAAS;IACX,MAAMF,eAAe,QAAQ,CAAC;IAC9B,MAAMD,IAAI,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACjD,SAASA,IAAAA,UACM,CAEPI,CAAAA,QAAUA,AAAU,OAAVA,QAAe,OAAOA,OAChCH,eAAe,QAAQ,GAAG,OAAO,IAEpC,QAAQ,CAAC;IACd,MAAMD,IAAI,MAAM,GAAG,QAAQ,CAAC;IAC5B,MAAMA,IAAI,MAAM,GAAG,QAAQ,CAAC;AAChC;AAEO,MAAMK,iBAAiBL,IAAI,MAAM,CAAC;IACrC,GAAGG,MAAM;IACT,UAAUJ,oBACL,OAAO,GACP,QAAQ,GACR,SAAS,CAACK,CAAAA,QACAA,AAAUE,WAAVF,QAAsB,OAAOA;AAEhD"}
@@ -1,4 +1,4 @@
1
- import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
1
+ import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/eventPublisher/index.js";
2
2
  import { SendMailUseCase } from "./abstractions.js";
3
3
  import { MailerService } from "../../domain/MailerService/abstractions.js";
4
4
  import type { TransportSendData } from "../../types.js";
@@ -1,62 +1,58 @@
1
1
  import zod from "zod";
2
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
2
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import { SendMailUseCase } from "./abstractions.js";
4
- import { MailBeforeSendEvent, MailAfterSendEvent, MailSendErrorEvent } from "./events.js";
4
+ import { MailAfterSendEvent, MailBeforeSendEvent, MailSendErrorEvent } from "./events.js";
5
5
  import { MailerService } from "../../domain/MailerService/abstractions.js";
6
6
  import { MailValidationError } from "../../domain/errors.js";
7
7
  import { Result } from "@webiny/feature/api";
8
+ import { isMailboxAddress } from "../../utils/isMailboxAddress.js";
8
9
  const requiredString = zod.string();
9
- const requiredEmail = requiredString.email();
10
+ const mailboxAddress = zod.string().refine(isMailboxAddress, {
11
+ message: "Invalid email address."
12
+ });
10
13
  const schema = zod.object({
11
- to: zod.array(requiredEmail).optional(),
12
- from: zod.string().email().optional(),
13
- subject: requiredString.max(1024).min(2),
14
- cc: zod.array(requiredEmail).optional(),
15
- bcc: zod.array(requiredEmail).optional(),
16
- replyTo: zod.string().email().optional(),
17
- text: zod.string().optional(),
18
- html: zod.string().optional()
19
- }).refine(data => {
20
- return !!data.text || !!data.html;
21
- }, "Either text or html is required.");
14
+ to: zod.array(mailboxAddress).optional(),
15
+ from: mailboxAddress.optional(),
16
+ subject: requiredString.max(1024).min(2),
17
+ cc: zod.array(mailboxAddress).optional(),
18
+ bcc: zod.array(mailboxAddress).optional(),
19
+ replyTo: mailboxAddress.optional(),
20
+ text: zod.string().optional(),
21
+ html: zod.string().optional()
22
+ }).refine((data)=>!!data.text || !!data.html, "Either text or html is required.");
22
23
  class SendMailUseCaseImpl {
23
- constructor(mailerService, eventPublisher) {
24
- this.mailerService = mailerService;
25
- this.eventPublisher = eventPublisher;
26
- }
27
- async execute(data) {
28
- const validation = schema.safeParse(data);
29
- if (!validation.success) {
30
- return Result.fail(new MailValidationError(validation.error.errors));
24
+ constructor(mailerService, eventPublisher){
25
+ this.mailerService = mailerService;
26
+ this.eventPublisher = eventPublisher;
31
27
  }
32
-
33
- // Publish before send event
34
- await this.eventPublisher.publish(new MailBeforeSendEvent({
35
- data
36
- }));
37
-
38
- // Send mail
39
- const result = await this.mailerService.sendMail(data);
40
- if (result.isFail()) {
41
- // Publish error event
42
- await this.eventPublisher.publish(new MailSendErrorEvent({
43
- data,
44
- error: result.error
45
- }));
46
- return result;
28
+ async execute(data) {
29
+ const validation = schema.safeParse(data);
30
+ if (!validation.success) return Result.fail(new MailValidationError(validation.error.issues));
31
+ await this.eventPublisher.publish(new MailBeforeSendEvent({
32
+ data
33
+ }));
34
+ const result = await this.mailerService.sendMail(data);
35
+ if (result.isFail()) {
36
+ await this.eventPublisher.publish(new MailSendErrorEvent({
37
+ data,
38
+ error: result.error
39
+ }));
40
+ return result;
41
+ }
42
+ await this.eventPublisher.publish(new MailAfterSendEvent({
43
+ data,
44
+ response: result.value
45
+ }));
46
+ return result;
47
47
  }
48
-
49
- // Publish after send event
50
- await this.eventPublisher.publish(new MailAfterSendEvent({
51
- data,
52
- response: result.value
53
- }));
54
- return result;
55
- }
56
48
  }
57
- export const SendMailUseCaseImplementation = SendMailUseCase.createImplementation({
58
- implementation: SendMailUseCaseImpl,
59
- dependencies: [MailerService, EventPublisher]
49
+ const SendMailUseCaseImplementation = SendMailUseCase.createImplementation({
50
+ implementation: SendMailUseCaseImpl,
51
+ dependencies: [
52
+ MailerService,
53
+ EventPublisher
54
+ ]
60
55
  });
56
+ export { SendMailUseCaseImplementation };
61
57
 
62
58
  //# sourceMappingURL=SendMailUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["zod","EventPublisher","SendMailUseCase","MailBeforeSendEvent","MailAfterSendEvent","MailSendErrorEvent","MailerService","MailValidationError","Result","requiredString","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","min","cc","bcc","replyTo","text","html","refine","data","SendMailUseCaseImpl","constructor","mailerService","eventPublisher","execute","validation","safeParse","success","fail","error","errors","publish","result","sendMail","isFail","response","value","SendMailUseCaseImplementation","createImplementation","implementation","dependencies"],"sources":["SendMailUseCase.ts"],"sourcesContent":["import zod from \"zod\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport { SendMailUseCase } from \"./abstractions.js\";\nimport { MailBeforeSendEvent, MailAfterSendEvent, MailSendErrorEvent } from \"./events.js\";\nimport { MailerService } from \"~/domain/MailerService/abstractions.js\";\nimport type { TransportSendData } from \"~/types.js\";\nimport { MailValidationError } from \"~/domain/errors.js\";\nimport { Result } from \"@webiny/feature/api\";\n\nconst requiredString = zod.string();\nconst requiredEmail = requiredString.email();\n\nconst schema = zod\n .object({\n to: zod.array(requiredEmail).optional(),\n from: zod.string().email().optional(),\n subject: requiredString.max(1024).min(2),\n cc: zod.array(requiredEmail).optional(),\n bcc: zod.array(requiredEmail).optional(),\n replyTo: zod.string().email().optional(),\n text: zod.string().optional(),\n html: zod.string().optional()\n })\n .refine(data => {\n return !!data.text || !!data.html;\n }, \"Either text or html is required.\");\n\nclass SendMailUseCaseImpl implements SendMailUseCase.Interface {\n constructor(\n private mailerService: MailerService.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface\n ) {}\n\n async execute(data: TransportSendData) {\n const validation = schema.safeParse(data);\n if (!validation.success) {\n return Result.fail(new MailValidationError(validation.error.errors));\n }\n\n // Publish before send event\n await this.eventPublisher.publish(new MailBeforeSendEvent({ data }));\n\n // Send mail\n const result = await this.mailerService.sendMail(data);\n\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new MailSendErrorEvent({\n data,\n error: result.error\n })\n );\n\n return result;\n }\n\n // Publish after send event\n await this.eventPublisher.publish(\n new MailAfterSendEvent({\n data,\n response: result.value\n })\n );\n\n return result;\n }\n}\n\nexport const SendMailUseCaseImplementation = SendMailUseCase.createImplementation({\n implementation: SendMailUseCaseImpl,\n dependencies: [MailerService, EventPublisher]\n});\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,KAAK;AACrB,SACIC,cAAc,QAEX,0CAA0C;AACjD,SAASC,eAAe;AACxB,SAASC,mBAAmB,EAAEC,kBAAkB,EAAEC,kBAAkB;AACpE,SAASC,aAAa;AAEtB,SAASC,mBAAmB;AAC5B,SAASC,MAAM,QAAQ,qBAAqB;AAE5C,MAAMC,cAAc,GAAGT,GAAG,CAACU,MAAM,CAAC,CAAC;AACnC,MAAMC,aAAa,GAAGF,cAAc,CAACG,KAAK,CAAC,CAAC;AAE5C,MAAMC,MAAM,GAAGb,GAAG,CACbc,MAAM,CAAC;EACJC,EAAE,EAAEf,GAAG,CAACgB,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,CAAC,CAAC;EACvCC,IAAI,EAAElB,GAAG,CAACU,MAAM,CAAC,CAAC,CAACE,KAAK,CAAC,CAAC,CAACK,QAAQ,CAAC,CAAC;EACrCE,OAAO,EAAEV,cAAc,CAACW,GAAG,CAAC,IAAI,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC;EACxCC,EAAE,EAAEtB,GAAG,CAACgB,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,CAAC,CAAC;EACvCM,GAAG,EAAEvB,GAAG,CAACgB,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,CAAC,CAAC;EACxCO,OAAO,EAAExB,GAAG,CAACU,MAAM,CAAC,CAAC,CAACE,KAAK,CAAC,CAAC,CAACK,QAAQ,CAAC,CAAC;EACxCQ,IAAI,EAAEzB,GAAG,CAACU,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC,CAAC;EAC7BS,IAAI,EAAE1B,GAAG,CAACU,MAAM,CAAC,CAAC,CAACO,QAAQ,CAAC;AAChC,CAAC,CAAC,CACDU,MAAM,CAACC,IAAI,IAAI;EACZ,OAAO,CAAC,CAACA,IAAI,CAACH,IAAI,IAAI,CAAC,CAACG,IAAI,CAACF,IAAI;AACrC,CAAC,EAAE,kCAAkC,CAAC;AAE1C,MAAMG,mBAAmB,CAAsC;EAC3DC,WAAWA,CACCC,aAAsC,EACtCC,cAAmD,EAC7D;IAAA,KAFUD,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,cAAmD,GAAnDA,cAAmD;EAC5D;EAEH,MAAMC,OAAOA,CAACL,IAAuB,EAAE;IACnC,MAAMM,UAAU,GAAGrB,MAAM,CAACsB,SAAS,CAACP,IAAI,CAAC;IACzC,IAAI,CAACM,UAAU,CAACE,OAAO,EAAE;MACrB,OAAO5B,MAAM,CAAC6B,IAAI,CAAC,IAAI9B,mBAAmB,CAAC2B,UAAU,CAACI,KAAK,CAACC,MAAM,CAAC,CAAC;IACxE;;IAEA;IACA,MAAM,IAAI,CAACP,cAAc,CAACQ,OAAO,CAAC,IAAIrC,mBAAmB,CAAC;MAAEyB;IAAK,CAAC,CAAC,CAAC;;IAEpE;IACA,MAAMa,MAAM,GAAG,MAAM,IAAI,CAACV,aAAa,CAACW,QAAQ,CAACd,IAAI,CAAC;IAEtD,IAAIa,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;MACjB;MACA,MAAM,IAAI,CAACX,cAAc,CAACQ,OAAO,CAC7B,IAAInC,kBAAkB,CAAC;QACnBuB,IAAI;QACJU,KAAK,EAAEG,MAAM,CAACH;MAClB,CAAC,CACL,CAAC;MAED,OAAOG,MAAM;IACjB;;IAEA;IACA,MAAM,IAAI,CAACT,cAAc,CAACQ,OAAO,CAC7B,IAAIpC,kBAAkB,CAAC;MACnBwB,IAAI;MACJgB,QAAQ,EAAEH,MAAM,CAACI;IACrB,CAAC,CACL,CAAC;IAED,OAAOJ,MAAM;EACjB;AACJ;AAEA,OAAO,MAAMK,6BAA6B,GAAG5C,eAAe,CAAC6C,oBAAoB,CAAC;EAC9EC,cAAc,EAAEnB,mBAAmB;EACnCoB,YAAY,EAAE,CAAC3C,aAAa,EAAEL,cAAc;AAChD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SendMail/SendMailUseCase.js","sources":["../../../src/features/SendMail/SendMailUseCase.ts"],"sourcesContent":["import zod from \"zod\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { SendMailUseCase } from \"./abstractions.js\";\nimport { MailBeforeSendEvent, MailAfterSendEvent, MailSendErrorEvent } from \"./events.js\";\nimport { MailerService } from \"~/domain/MailerService/abstractions.js\";\nimport type { TransportSendData } from \"~/types.js\";\nimport { MailValidationError } from \"~/domain/errors.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { isMailboxAddress } from \"~/utils/isMailboxAddress.js\";\n\nconst requiredString = zod.string();\nconst mailboxAddress = zod.string().refine(isMailboxAddress, { message: \"Invalid email address.\" });\n\nconst schema = zod\n .object({\n to: zod.array(mailboxAddress).optional(),\n from: mailboxAddress.optional(),\n subject: requiredString.max(1024).min(2),\n cc: zod.array(mailboxAddress).optional(),\n bcc: zod.array(mailboxAddress).optional(),\n replyTo: mailboxAddress.optional(),\n text: zod.string().optional(),\n html: zod.string().optional()\n })\n .refine(data => {\n return !!data.text || !!data.html;\n }, \"Either text or html is required.\");\n\nclass SendMailUseCaseImpl implements SendMailUseCase.Interface {\n constructor(\n private mailerService: MailerService.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface\n ) {}\n\n async execute(data: TransportSendData) {\n const validation = schema.safeParse(data);\n if (!validation.success) {\n return Result.fail(new MailValidationError(validation.error.issues));\n }\n\n // Publish before send event\n await this.eventPublisher.publish(new MailBeforeSendEvent({ data }));\n\n // Send mail\n const result = await this.mailerService.sendMail(data);\n\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new MailSendErrorEvent({\n data,\n error: result.error\n })\n );\n\n return result;\n }\n\n // Publish after send event\n await this.eventPublisher.publish(\n new MailAfterSendEvent({\n data,\n response: result.value\n })\n );\n\n return result;\n }\n}\n\nexport const SendMailUseCaseImplementation = SendMailUseCase.createImplementation({\n implementation: SendMailUseCaseImpl,\n dependencies: [MailerService, EventPublisher]\n});\n"],"names":["requiredString","zod","mailboxAddress","isMailboxAddress","schema","data","SendMailUseCaseImpl","mailerService","eventPublisher","validation","Result","MailValidationError","MailBeforeSendEvent","result","MailSendErrorEvent","MailAfterSendEvent","SendMailUseCaseImplementation","SendMailUseCase","MailerService","EventPublisher"],"mappings":";;;;;;;;AAaA,MAAMA,iBAAiBC,IAAI,MAAM;AACjC,MAAMC,iBAAiBD,IAAI,MAAM,GAAG,MAAM,CAACE,kBAAkB;IAAE,SAAS;AAAyB;AAEjG,MAAMC,SAASH,IAAAA,MACJ,CAAC;IACJ,IAAIA,IAAI,KAAK,CAACC,gBAAgB,QAAQ;IACtC,MAAMA,eAAe,QAAQ;IAC7B,SAASF,eAAe,GAAG,CAAC,MAAM,GAAG,CAAC;IACtC,IAAIC,IAAI,KAAK,CAACC,gBAAgB,QAAQ;IACtC,KAAKD,IAAI,KAAK,CAACC,gBAAgB,QAAQ;IACvC,SAASA,eAAe,QAAQ;IAChC,MAAMD,IAAI,MAAM,GAAG,QAAQ;IAC3B,MAAMA,IAAI,MAAM,GAAG,QAAQ;AAC/B,GACC,MAAM,CAACI,CAAAA,OACG,CAAC,CAACA,KAAK,IAAI,IAAI,CAAC,CAACA,KAAK,IAAI,EAClC;AAEP,MAAMC;IACF,YACYC,aAAsC,EACtCC,cAAmD,CAC7D;aAFUD,aAAa,GAAbA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QAAQH,IAAuB,EAAE;QACnC,MAAMI,aAAaL,OAAO,SAAS,CAACC;QACpC,IAAI,CAACI,WAAW,OAAO,EACnB,OAAOC,OAAO,IAAI,CAAC,IAAIC,oBAAoBF,WAAW,KAAK,CAAC,MAAM;QAItE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIG,oBAAoB;YAAEP;QAAK;QAGjE,MAAMQ,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAACR;QAEjD,IAAIQ,OAAO,MAAM,IAAI;YAEjB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,mBAAmB;gBACnBT;gBACA,OAAOQ,OAAO,KAAK;YACvB;YAGJ,OAAOA;QACX;QAGA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,mBAAmB;YACnBV;YACA,UAAUQ,OAAO,KAAK;QAC1B;QAGJ,OAAOA;IACX;AACJ;AAEO,MAAMG,gCAAgCC,gBAAgB,oBAAoB,CAAC;IAC9E,gBAAgBX;IAChB,cAAc;QAACY;QAAeC;KAAe;AACjD"}