@webiny/api-mailer 6.3.0 → 6.4.0-beta.0

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 (82) hide show
  1. package/constants.js +2 -1
  2. package/constants.js.map +1 -1
  3. package/domain/CodeMailerSettings/abstractions.js +2 -1
  4. package/domain/CodeMailerSettings/abstractions.js.map +1 -1
  5. package/domain/MailTransport/abstractions.js +4 -3
  6. package/domain/MailTransport/abstractions.js.map +1 -1
  7. package/domain/MailerService/abstractions.js +2 -1
  8. package/domain/MailerService/abstractions.js.map +1 -1
  9. package/domain/MailerService/errors.js +22 -24
  10. package/domain/MailerService/errors.js.map +1 -1
  11. package/domain/errors.js +40 -44
  12. package/domain/errors.js.map +1 -1
  13. package/exports/api/mailer.js +3 -5
  14. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js +14 -13
  15. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js.map +1 -1
  16. package/features/CodeMailerSettings/feature.js +6 -5
  17. package/features/CodeMailerSettings/feature.js.map +1 -1
  18. package/features/DummyTransport/DummyMailTransport.js +11 -9
  19. package/features/DummyTransport/DummyMailTransport.js.map +1 -1
  20. package/features/DummyTransport/DummyMailTransportFactory.js +10 -7
  21. package/features/DummyTransport/DummyMailTransportFactory.js.map +1 -1
  22. package/features/DummyTransport/feature.js +6 -5
  23. package/features/DummyTransport/feature.js.map +1 -1
  24. package/features/GetSettings/GetSettingsRepository.js +41 -45
  25. package/features/GetSettings/GetSettingsRepository.js.map +1 -1
  26. package/features/GetSettings/GetSettingsUseCase.js +13 -10
  27. package/features/GetSettings/GetSettingsUseCase.js.map +1 -1
  28. package/features/GetSettings/abstractions.js +3 -2
  29. package/features/GetSettings/abstractions.js.map +1 -1
  30. package/features/GetSettings/feature.js +7 -6
  31. package/features/GetSettings/feature.js.map +1 -1
  32. package/features/GetSettings/index.js +1 -3
  33. package/features/MailerService/ActiveTransport.js +18 -14
  34. package/features/MailerService/ActiveTransport.js.map +1 -1
  35. package/features/MailerService/MailerService.js +38 -42
  36. package/features/MailerService/MailerService.js.map +1 -1
  37. package/features/MailerService/feature.js +7 -6
  38. package/features/MailerService/feature.js.map +1 -1
  39. package/features/SaveSettings/SaveSettingsRepository.js +29 -45
  40. package/features/SaveSettings/SaveSettingsRepository.js.map +1 -1
  41. package/features/SaveSettings/SaveSettingsUseCase.js +38 -56
  42. package/features/SaveSettings/SaveSettingsUseCase.js.map +1 -1
  43. package/features/SaveSettings/abstractions.js +5 -17
  44. package/features/SaveSettings/abstractions.js.map +1 -1
  45. package/features/SaveSettings/events.js +16 -11
  46. package/features/SaveSettings/events.js.map +1 -1
  47. package/features/SaveSettings/feature.js +7 -6
  48. package/features/SaveSettings/feature.js.map +1 -1
  49. package/features/SaveSettings/index.js +1 -3
  50. package/features/SaveSettings/validation.d.ts +1 -1
  51. package/features/SaveSettings/validation.js +11 -14
  52. package/features/SaveSettings/validation.js.map +1 -1
  53. package/features/SendMail/SendMailUseCase.js +40 -47
  54. package/features/SendMail/SendMailUseCase.js.map +1 -1
  55. package/features/SendMail/abstractions.js +5 -8
  56. package/features/SendMail/abstractions.js.map +1 -1
  57. package/features/SendMail/events.js +23 -16
  58. package/features/SendMail/events.js.map +1 -1
  59. package/features/SendMail/feature.js +6 -5
  60. package/features/SendMail/feature.js.map +1 -1
  61. package/features/SendMail/index.js +1 -3
  62. package/features/SmtpTransport/SmtpConfig.js +20 -24
  63. package/features/SmtpTransport/SmtpConfig.js.map +1 -1
  64. package/features/SmtpTransport/SmtpMailTransport.js +47 -61
  65. package/features/SmtpTransport/SmtpMailTransport.js.map +1 -1
  66. package/features/SmtpTransport/SmtpMailTransportFactory.js +10 -7
  67. package/features/SmtpTransport/SmtpMailTransportFactory.js.map +1 -1
  68. package/features/SmtpTransport/feature.js +6 -5
  69. package/features/SmtpTransport/feature.js.map +1 -1
  70. package/graphql/settings.js +54 -74
  71. package/graphql/settings.js.map +1 -1
  72. package/index.js +11 -15
  73. package/index.js.map +1 -1
  74. package/package.json +17 -17
  75. package/types.js +0 -3
  76. package/utils/isMailboxAddress.js +3 -10
  77. package/utils/isMailboxAddress.js.map +1 -1
  78. package/exports/api/mailer.js.map +0 -1
  79. package/features/GetSettings/index.js.map +0 -1
  80. package/features/SaveSettings/index.js.map +0 -1
  81. package/features/SendMail/index.js.map +0 -1
  82. package/types.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- export const GetSettingsRepository = createAbstraction("GetSettingsRepository");
3
- export const GetSettingsUseCase = createAbstraction("GetSettingsUseCase");
2
+ const GetSettingsRepository = createAbstraction("GetSettingsRepository");
3
+ const GetSettingsUseCase = createAbstraction("GetSettingsUseCase");
4
+ export { GetSettingsRepository, GetSettingsUseCase };
4
5
 
5
6
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","GetSettingsRepository","GetSettingsUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { TransportSettings } from \"~/types.js\";\n\nexport type MailerSettingsSource = \"code\" | \"storage\" | null;\n\nexport interface ISettingsWithSource {\n settings: TransportSettings | null;\n source: MailerSettingsSource;\n}\n\nexport interface IGetSettingsRepository {\n get(transportName: string): Promise<Result<ISettingsWithSource>>;\n}\n\nexport const GetSettingsRepository =\n createAbstraction<IGetSettingsRepository>(\"GetSettingsRepository\");\n\nexport namespace GetSettingsRepository {\n export type Interface = IGetSettingsRepository;\n export type Return = Promise<Result<ISettingsWithSource>>;\n}\n\nexport interface IGetSettingsUseCase {\n execute(transportName: string): Promise<Result<ISettingsWithSource>>;\n}\n\nexport const GetSettingsUseCase = createAbstraction<IGetSettingsUseCase>(\"GetSettingsUseCase\");\n\nexport namespace GetSettingsUseCase {\n export type Interface = IGetSettingsUseCase;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAevD,OAAO,MAAMC,qBAAqB,GAC9BD,iBAAiB,CAAyB,uBAAuB,CAAC;AAWtE,OAAO,MAAME,kBAAkB,GAAGF,iBAAiB,CAAsB,oBAAoB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/GetSettings/abstractions.js","sources":["../../../src/features/GetSettings/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { TransportSettings } from \"~/types.js\";\n\nexport type MailerSettingsSource = \"code\" | \"storage\" | null;\n\nexport interface ISettingsWithSource {\n settings: TransportSettings | null;\n source: MailerSettingsSource;\n}\n\nexport interface IGetSettingsRepository {\n get(transportName: string): Promise<Result<ISettingsWithSource>>;\n}\n\nexport const GetSettingsRepository =\n createAbstraction<IGetSettingsRepository>(\"GetSettingsRepository\");\n\nexport namespace GetSettingsRepository {\n export type Interface = IGetSettingsRepository;\n export type Return = Promise<Result<ISettingsWithSource>>;\n}\n\nexport interface IGetSettingsUseCase {\n execute(transportName: string): Promise<Result<ISettingsWithSource>>;\n}\n\nexport const GetSettingsUseCase = createAbstraction<IGetSettingsUseCase>(\"GetSettingsUseCase\");\n\nexport namespace GetSettingsUseCase {\n export type Interface = IGetSettingsUseCase;\n}\n"],"names":["GetSettingsRepository","createAbstraction","GetSettingsUseCase"],"mappings":";AAeO,MAAMA,wBACTC,kBAA0C;AAWvC,MAAMC,qBAAqBD,kBAAuC"}
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { GetSettingsRepositoryImplementation } from "./GetSettingsRepository.js";
3
3
  import { GetSettingsUseCaseImplementation } from "./GetSettingsUseCase.js";
4
- export const GetSettingsFeature = createFeature({
5
- name: "GetSettings",
6
- register(container) {
7
- container.register(GetSettingsRepositoryImplementation).inSingletonScope();
8
- container.register(GetSettingsUseCaseImplementation);
9
- }
4
+ const GetSettingsFeature = createFeature({
5
+ name: "GetSettings",
6
+ register (container) {
7
+ container.register(GetSettingsRepositoryImplementation).inSingletonScope();
8
+ container.register(GetSettingsUseCaseImplementation);
9
+ }
10
10
  });
11
+ export { GetSettingsFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","GetSettingsRepositoryImplementation","GetSettingsUseCaseImplementation","GetSettingsFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetSettingsRepositoryImplementation } from \"./GetSettingsRepository.js\";\nimport { GetSettingsUseCaseImplementation } from \"./GetSettingsUseCase.js\";\n\nexport const GetSettingsFeature = createFeature({\n name: \"GetSettings\",\n register(container) {\n container.register(GetSettingsRepositoryImplementation).inSingletonScope();\n container.register(GetSettingsUseCaseImplementation);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,mCAAmC;AAC5C,SAASC,gCAAgC;AAEzC,OAAO,MAAMC,kBAAkB,GAAGH,aAAa,CAAC;EAC5CI,IAAI,EAAE,aAAa;EACnBC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,mCAAmC,CAAC,CAACM,gBAAgB,CAAC,CAAC;IAC1ED,SAAS,CAACD,QAAQ,CAACH,gCAAgC,CAAC;EACxD;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/GetSettings/feature.js","sources":["../../../src/features/GetSettings/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetSettingsRepositoryImplementation } from \"./GetSettingsRepository.js\";\nimport { GetSettingsUseCaseImplementation } from \"./GetSettingsUseCase.js\";\n\nexport const GetSettingsFeature = createFeature({\n name: \"GetSettings\",\n register(container) {\n container.register(GetSettingsRepositoryImplementation).inSingletonScope();\n container.register(GetSettingsUseCaseImplementation);\n }\n});\n"],"names":["GetSettingsFeature","createFeature","container","GetSettingsRepositoryImplementation","GetSettingsUseCaseImplementation"],"mappings":";;;AAIO,MAAMA,qBAAqBC,cAAc;IAC5C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,qCAAqC,gBAAgB;QACxED,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -1,3 +1 @@
1
- export { GetSettingsUseCase, GetSettingsRepository } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { GetSettingsRepository, GetSettingsUseCase } from "./abstractions.js";
@@ -1,20 +1,24 @@
1
- import { ActiveTransport as ActiveTransportAbstraction, MailTransportFactory } from "../../domain/MailTransport/abstractions.js";
1
+ import { ActiveTransport, MailTransportFactory } from "../../domain/MailTransport/abstractions.js";
2
2
  class ActiveTransportImpl {
3
- constructor(transportFactories) {
4
- this.transportFactories = transportFactories;
5
- }
6
- name() {
7
- if (this.transportFactories.length === 0) {
8
- return null;
3
+ constructor(transportFactories){
4
+ this.transportFactories = transportFactories;
5
+ }
6
+ name() {
7
+ if (0 === this.transportFactories.length) return null;
8
+ return this.transportFactories[this.transportFactories.length - 1].name;
9
9
  }
10
- return this.transportFactories[this.transportFactories.length - 1].name;
11
- }
12
10
  }
13
- export const ActiveTransport = ActiveTransportAbstraction.createImplementation({
14
- implementation: ActiveTransportImpl,
15
- dependencies: [[MailTransportFactory, {
16
- multiple: true
17
- }]]
11
+ const ActiveTransport_ActiveTransport = ActiveTransport.createImplementation({
12
+ implementation: ActiveTransportImpl,
13
+ dependencies: [
14
+ [
15
+ MailTransportFactory,
16
+ {
17
+ multiple: true
18
+ }
19
+ ]
20
+ ]
18
21
  });
22
+ export { ActiveTransport_ActiveTransport as ActiveTransport };
19
23
 
20
24
  //# sourceMappingURL=ActiveTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ActiveTransport","ActiveTransportAbstraction","MailTransportFactory","ActiveTransportImpl","constructor","transportFactories","name","length","createImplementation","implementation","dependencies","multiple"],"sources":["ActiveTransport.ts"],"sourcesContent":["import {\n ActiveTransport as ActiveTransportAbstraction,\n MailTransportFactory\n} from \"~/domain/MailTransport/abstractions.js\";\n\nclass ActiveTransportImpl implements ActiveTransportAbstraction.Interface {\n constructor(private transportFactories: MailTransportFactory.Interface[]) {}\n\n name(): string | null {\n if (this.transportFactories.length === 0) {\n return null;\n }\n return this.transportFactories[this.transportFactories.length - 1].name;\n }\n}\n\nexport const ActiveTransport = ActiveTransportAbstraction.createImplementation({\n implementation: ActiveTransportImpl,\n dependencies: [[MailTransportFactory, { multiple: true }]]\n});\n"],"mappings":"AAAA,SACIA,eAAe,IAAIC,0BAA0B,EAC7CC,oBAAoB;AAGxB,MAAMC,mBAAmB,CAAiD;EACtEC,WAAWA,CAASC,kBAAoD,EAAE;IAAA,KAAtDA,kBAAoD,GAApDA,kBAAoD;EAAG;EAE3EC,IAAIA,CAAA,EAAkB;IAClB,IAAI,IAAI,CAACD,kBAAkB,CAACE,MAAM,KAAK,CAAC,EAAE;MACtC,OAAO,IAAI;IACf;IACA,OAAO,IAAI,CAACF,kBAAkB,CAAC,IAAI,CAACA,kBAAkB,CAACE,MAAM,GAAG,CAAC,CAAC,CAACD,IAAI;EAC3E;AACJ;AAEA,OAAO,MAAMN,eAAe,GAAGC,0BAA0B,CAACO,oBAAoB,CAAC;EAC3EC,cAAc,EAAEN,mBAAmB;EACnCO,YAAY,EAAE,CAAC,CAACR,oBAAoB,EAAE;IAAES,QAAQ,EAAE;EAAK,CAAC,CAAC;AAC7D,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/MailerService/ActiveTransport.js","sources":["../../../src/features/MailerService/ActiveTransport.ts"],"sourcesContent":["import {\n ActiveTransport as ActiveTransportAbstraction,\n MailTransportFactory\n} from \"~/domain/MailTransport/abstractions.js\";\n\nclass ActiveTransportImpl implements ActiveTransportAbstraction.Interface {\n constructor(private transportFactories: MailTransportFactory.Interface[]) {}\n\n name(): string | null {\n if (this.transportFactories.length === 0) {\n return null;\n }\n return this.transportFactories[this.transportFactories.length - 1].name;\n }\n}\n\nexport const ActiveTransport = ActiveTransportAbstraction.createImplementation({\n implementation: ActiveTransportImpl,\n dependencies: [[MailTransportFactory, { multiple: true }]]\n});\n"],"names":["ActiveTransportImpl","transportFactories","ActiveTransport","ActiveTransportAbstraction","MailTransportFactory"],"mappings":";AAKA,MAAMA;IACF,YAAoBC,kBAAoD,CAAE;aAAtDA,kBAAkB,GAAlBA;IAAuD;IAE3E,OAAsB;QAClB,IAAI,AAAmC,MAAnC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAC9B,OAAO;QAEX,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI;IAC3E;AACJ;AAEO,MAAMC,kCAAkBC,gBAAAA,oBAA+C,CAAC;IAC3E,gBAAgBH;IAChB,cAAc;QAAC;YAACI;YAAsB;gBAAE,UAAU;YAAK;SAAE;KAAC;AAC9D"}
@@ -1,53 +1,49 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { MailerService as Abstraction } from "../../domain/MailerService/abstractions.js";
3
- import { NoTransportAvailableError, NoSettingsConfiguredError, TransportSendError } from "../../domain/MailerService/errors.js";
2
+ import { MailerService } from "../../domain/MailerService/abstractions.js";
3
+ import { NoSettingsConfiguredError, NoTransportAvailableError, TransportSendError } from "../../domain/MailerService/errors.js";
4
4
  import { ActiveTransport, MailTransportFactory } from "../../domain/MailTransport/abstractions.js";
5
5
  import { GetSettingsRepository } from "../GetSettings/abstractions.js";
6
6
  class MailerServiceImpl {
7
- constructor(getSettingsRepository, activeTransport, transportFactories) {
8
- this.getSettingsRepository = getSettingsRepository;
9
- this.activeTransport = activeTransport;
10
- this.transportFactories = transportFactories;
11
- }
12
- async sendMail(data) {
13
- const transportName = this.activeTransport.name();
14
- if (!transportName) {
15
- return Result.fail(new NoTransportAvailableError());
7
+ constructor(getSettingsRepository, activeTransport, transportFactories){
8
+ this.getSettingsRepository = getSettingsRepository;
9
+ this.activeTransport = activeTransport;
10
+ this.transportFactories = transportFactories;
16
11
  }
17
- const result = await this.getSettingsRepository.get(transportName);
18
- const {
19
- settings
20
- } = result.value;
21
- if (!settings) {
22
- return Result.fail(new NoSettingsConfiguredError());
12
+ async sendMail(data) {
13
+ const transportName = this.activeTransport.name();
14
+ if (!transportName) return Result.fail(new NoTransportAvailableError());
15
+ const result = await this.getSettingsRepository.get(transportName);
16
+ const { settings } = result.value;
17
+ if (!settings) return Result.fail(new NoSettingsConfiguredError());
18
+ const transport = await this.getTransport(transportName, settings);
19
+ if (!transport) return Result.fail(new NoTransportAvailableError());
20
+ try {
21
+ const response = await transport.send(data);
22
+ if (response.error) return Result.fail(new TransportSendError(response.error));
23
+ return Result.ok(response);
24
+ } catch (error) {
25
+ return Result.fail(new TransportSendError(error));
26
+ }
23
27
  }
24
- const transport = await this.getTransport(transportName, settings);
25
- if (!transport) {
26
- return Result.fail(new NoTransportAvailableError());
28
+ async getTransport(transportName, settings) {
29
+ const factory = this.transportFactories.find((f)=>f.name === transportName);
30
+ if (!factory) return null;
31
+ return factory.createTransport(settings);
27
32
  }
28
- try {
29
- const response = await transport.send(data);
30
- if (response.error) {
31
- return Result.fail(new TransportSendError(response.error));
32
- }
33
- return Result.ok(response);
34
- } catch (error) {
35
- return Result.fail(new TransportSendError(error));
36
- }
37
- }
38
- async getTransport(transportName, settings) {
39
- const factory = this.transportFactories.find(f => f.name === transportName);
40
- if (!factory) {
41
- return null;
42
- }
43
- return factory.createTransport(settings);
44
- }
45
33
  }
46
- export const MailerService = Abstraction.createImplementation({
47
- implementation: MailerServiceImpl,
48
- dependencies: [GetSettingsRepository, ActiveTransport, [MailTransportFactory, {
49
- multiple: true
50
- }]]
34
+ const MailerService_MailerService = MailerService.createImplementation({
35
+ implementation: MailerServiceImpl,
36
+ dependencies: [
37
+ GetSettingsRepository,
38
+ ActiveTransport,
39
+ [
40
+ MailTransportFactory,
41
+ {
42
+ multiple: true
43
+ }
44
+ ]
45
+ ]
51
46
  });
47
+ export { MailerService_MailerService as MailerService };
52
48
 
53
49
  //# sourceMappingURL=MailerService.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","MailerService","Abstraction","NoTransportAvailableError","NoSettingsConfiguredError","TransportSendError","ActiveTransport","MailTransportFactory","GetSettingsRepository","MailerServiceImpl","constructor","getSettingsRepository","activeTransport","transportFactories","sendMail","data","transportName","name","fail","result","get","settings","value","transport","getTransport","response","send","error","ok","factory","find","f","createTransport","createImplementation","implementation","dependencies","multiple"],"sources":["MailerService.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { MailerService as Abstraction } from \"~/domain/MailerService/abstractions.js\";\nimport {\n NoTransportAvailableError,\n NoSettingsConfiguredError,\n TransportSendError\n} from \"~/domain/MailerService/errors.js\";\nimport {\n ActiveTransport,\n MailTransport,\n MailTransportFactory\n} from \"~/domain/MailTransport/abstractions.js\";\nimport { GetSettingsRepository } from \"../GetSettings/abstractions.js\";\nimport type { TransportSettings, TransportSendData } from \"~/types.js\";\n\nclass MailerServiceImpl implements Abstraction.Interface {\n constructor(\n private getSettingsRepository: GetSettingsRepository.Interface,\n private activeTransport: ActiveTransport.Interface,\n private transportFactories: MailTransportFactory.Interface[]\n ) {}\n\n async sendMail<T = any>(data: TransportSendData): Abstraction.Return<T> {\n const transportName = this.activeTransport.name();\n\n if (!transportName) {\n return Result.fail(new NoTransportAvailableError());\n }\n\n const result = await this.getSettingsRepository.get(transportName);\n const { settings } = result.value;\n\n if (!settings) {\n return Result.fail(new NoSettingsConfiguredError());\n }\n\n const transport = await this.getTransport(transportName, settings);\n\n if (!transport) {\n return Result.fail(new NoTransportAvailableError());\n }\n\n try {\n const response = await transport.send(data);\n\n if (response.error) {\n return Result.fail(new TransportSendError(response.error));\n }\n\n return Result.ok(response);\n } catch (error) {\n return Result.fail(new TransportSendError(error));\n }\n }\n\n private async getTransport(\n transportName: string,\n settings: TransportSettings\n ): Promise<MailTransport.Interface | null> {\n const factory = this.transportFactories.find(f => f.name === transportName);\n if (!factory) {\n return null;\n }\n return factory.createTransport(settings);\n }\n}\n\nexport const MailerService = Abstraction.createImplementation({\n implementation: MailerServiceImpl,\n dependencies: [\n GetSettingsRepository,\n ActiveTransport,\n [MailTransportFactory, { multiple: true }]\n ]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,aAAa,IAAIC,WAAW;AACrC,SACIC,yBAAyB,EACzBC,yBAAyB,EACzBC,kBAAkB;AAEtB,SACIC,eAAe,EAEfC,oBAAoB;AAExB,SAASC,qBAAqB;AAG9B,MAAMC,iBAAiB,CAAkC;EACrDC,WAAWA,CACCC,qBAAsD,EACtDC,eAA0C,EAC1CC,kBAAoD,EAC9D;IAAA,KAHUF,qBAAsD,GAAtDA,qBAAsD;IAAA,KACtDC,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,kBAAoD,GAApDA,kBAAoD;EAC7D;EAEH,MAAMC,QAAQA,CAAUC,IAAuB,EAAyB;IACpE,MAAMC,aAAa,GAAG,IAAI,CAACJ,eAAe,CAACK,IAAI,CAAC,CAAC;IAEjD,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOhB,MAAM,CAACkB,IAAI,CAAC,IAAIf,yBAAyB,CAAC,CAAC,CAAC;IACvD;IAEA,MAAMgB,MAAM,GAAG,MAAM,IAAI,CAACR,qBAAqB,CAACS,GAAG,CAACJ,aAAa,CAAC;IAClE,MAAM;MAAEK;IAAS,CAAC,GAAGF,MAAM,CAACG,KAAK;IAEjC,IAAI,CAACD,QAAQ,EAAE;MACX,OAAOrB,MAAM,CAACkB,IAAI,CAAC,IAAId,yBAAyB,CAAC,CAAC,CAAC;IACvD;IAEA,MAAMmB,SAAS,GAAG,MAAM,IAAI,CAACC,YAAY,CAACR,aAAa,EAAEK,QAAQ,CAAC;IAElE,IAAI,CAACE,SAAS,EAAE;MACZ,OAAOvB,MAAM,CAACkB,IAAI,CAAC,IAAIf,yBAAyB,CAAC,CAAC,CAAC;IACvD;IAEA,IAAI;MACA,MAAMsB,QAAQ,GAAG,MAAMF,SAAS,CAACG,IAAI,CAACX,IAAI,CAAC;MAE3C,IAAIU,QAAQ,CAACE,KAAK,EAAE;QAChB,OAAO3B,MAAM,CAACkB,IAAI,CAAC,IAAIb,kBAAkB,CAACoB,QAAQ,CAACE,KAAK,CAAC,CAAC;MAC9D;MAEA,OAAO3B,MAAM,CAAC4B,EAAE,CAACH,QAAQ,CAAC;IAC9B,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZ,OAAO3B,MAAM,CAACkB,IAAI,CAAC,IAAIb,kBAAkB,CAACsB,KAAK,CAAC,CAAC;IACrD;EACJ;EAEA,MAAcH,YAAYA,CACtBR,aAAqB,EACrBK,QAA2B,EACY;IACvC,MAAMQ,OAAO,GAAG,IAAI,CAAChB,kBAAkB,CAACiB,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACd,IAAI,KAAKD,aAAa,CAAC;IAC3E,IAAI,CAACa,OAAO,EAAE;MACV,OAAO,IAAI;IACf;IACA,OAAOA,OAAO,CAACG,eAAe,CAACX,QAAQ,CAAC;EAC5C;AACJ;AAEA,OAAO,MAAMpB,aAAa,GAAGC,WAAW,CAAC+B,oBAAoB,CAAC;EAC1DC,cAAc,EAAEzB,iBAAiB;EACjC0B,YAAY,EAAE,CACV3B,qBAAqB,EACrBF,eAAe,EACf,CAACC,oBAAoB,EAAE;IAAE6B,QAAQ,EAAE;EAAK,CAAC,CAAC;AAElD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/MailerService/MailerService.js","sources":["../../../src/features/MailerService/MailerService.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { MailerService as Abstraction } from \"~/domain/MailerService/abstractions.js\";\nimport {\n NoTransportAvailableError,\n NoSettingsConfiguredError,\n TransportSendError\n} from \"~/domain/MailerService/errors.js\";\nimport {\n ActiveTransport,\n MailTransport,\n MailTransportFactory\n} from \"~/domain/MailTransport/abstractions.js\";\nimport { GetSettingsRepository } from \"../GetSettings/abstractions.js\";\nimport type { TransportSettings, TransportSendData } from \"~/types.js\";\n\nclass MailerServiceImpl implements Abstraction.Interface {\n constructor(\n private getSettingsRepository: GetSettingsRepository.Interface,\n private activeTransport: ActiveTransport.Interface,\n private transportFactories: MailTransportFactory.Interface[]\n ) {}\n\n async sendMail<T = any>(data: TransportSendData): Abstraction.Return<T> {\n const transportName = this.activeTransport.name();\n\n if (!transportName) {\n return Result.fail(new NoTransportAvailableError());\n }\n\n const result = await this.getSettingsRepository.get(transportName);\n const { settings } = result.value;\n\n if (!settings) {\n return Result.fail(new NoSettingsConfiguredError());\n }\n\n const transport = await this.getTransport(transportName, settings);\n\n if (!transport) {\n return Result.fail(new NoTransportAvailableError());\n }\n\n try {\n const response = await transport.send(data);\n\n if (response.error) {\n return Result.fail(new TransportSendError(response.error));\n }\n\n return Result.ok(response);\n } catch (error) {\n return Result.fail(new TransportSendError(error));\n }\n }\n\n private async getTransport(\n transportName: string,\n settings: TransportSettings\n ): Promise<MailTransport.Interface | null> {\n const factory = this.transportFactories.find(f => f.name === transportName);\n if (!factory) {\n return null;\n }\n return factory.createTransport(settings);\n }\n}\n\nexport const MailerService = Abstraction.createImplementation({\n implementation: MailerServiceImpl,\n dependencies: [\n GetSettingsRepository,\n ActiveTransport,\n [MailTransportFactory, { multiple: true }]\n ]\n});\n"],"names":["MailerServiceImpl","getSettingsRepository","activeTransport","transportFactories","data","transportName","Result","NoTransportAvailableError","result","settings","NoSettingsConfiguredError","transport","response","TransportSendError","error","factory","f","MailerService","Abstraction","GetSettingsRepository","ActiveTransport","MailTransportFactory"],"mappings":";;;;;AAeA,MAAMA;IACF,YACYC,qBAAsD,EACtDC,eAA0C,EAC1CC,kBAAoD,CAC9D;aAHUF,qBAAqB,GAArBA;aACAC,eAAe,GAAfA;aACAC,kBAAkB,GAAlBA;IACT;IAEH,MAAM,SAAkBC,IAAuB,EAAyB;QACpE,MAAMC,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI;QAE/C,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAG3B,MAAMC,SAAS,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAACH;QACpD,MAAM,EAAEI,QAAQ,EAAE,GAAGD,OAAO,KAAK;QAEjC,IAAI,CAACC,UACD,OAAOH,OAAO,IAAI,CAAC,IAAII;QAG3B,MAAMC,YAAY,MAAM,IAAI,CAAC,YAAY,CAACN,eAAeI;QAEzD,IAAI,CAACE,WACD,OAAOL,OAAO,IAAI,CAAC,IAAIC;QAG3B,IAAI;YACA,MAAMK,WAAW,MAAMD,UAAU,IAAI,CAACP;YAEtC,IAAIQ,SAAS,KAAK,EACd,OAAON,OAAO,IAAI,CAAC,IAAIO,mBAAmBD,SAAS,KAAK;YAG5D,OAAON,OAAO,EAAE,CAACM;QACrB,EAAE,OAAOE,OAAO;YACZ,OAAOR,OAAO,IAAI,CAAC,IAAIO,mBAAmBC;QAC9C;IACJ;IAEA,MAAc,aACVT,aAAqB,EACrBI,QAA2B,EACY;QACvC,MAAMM,UAAU,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAACC,CAAAA,IAAKA,EAAE,IAAI,KAAKX;QAC7D,IAAI,CAACU,SACD,OAAO;QAEX,OAAOA,QAAQ,eAAe,CAACN;IACnC;AACJ;AAEO,MAAMQ,8BAAgBC,cAAAA,oBAAgC,CAAC;IAC1D,gBAAgBlB;IAChB,cAAc;QACVmB;QACAC;QACA;YAACC;YAAsB;gBAAE,UAAU;YAAK;SAAE;KAC7C;AACL"}
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { MailerService } from "./MailerService.js";
3
3
  import { ActiveTransport } from "./ActiveTransport.js";
4
- export const MailerServiceFeature = createFeature({
5
- name: "Mailer/MailerService",
6
- register(container) {
7
- container.register(ActiveTransport).inSingletonScope();
8
- container.register(MailerService).inSingletonScope();
9
- }
4
+ const MailerServiceFeature = createFeature({
5
+ name: "Mailer/MailerService",
6
+ register (container) {
7
+ container.register(ActiveTransport).inSingletonScope();
8
+ container.register(MailerService).inSingletonScope();
9
+ }
10
10
  });
11
+ export { MailerServiceFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","MailerService","ActiveTransport","MailerServiceFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { MailerService } from \"./MailerService.js\";\nimport { ActiveTransport } from \"./ActiveTransport.js\";\n\nexport const MailerServiceFeature = createFeature({\n name: \"Mailer/MailerService\",\n register(container) {\n container.register(ActiveTransport).inSingletonScope();\n container.register(MailerService).inSingletonScope();\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,aAAa;AACtB,SAASC,eAAe;AAExB,OAAO,MAAMC,oBAAoB,GAAGH,aAAa,CAAC;EAC9CI,IAAI,EAAE,sBAAsB;EAC5BC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACH,eAAe,CAAC,CAACK,gBAAgB,CAAC,CAAC;IACtDD,SAAS,CAACD,QAAQ,CAACJ,aAAa,CAAC,CAACM,gBAAgB,CAAC,CAAC;EACxD;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/MailerService/feature.js","sources":["../../../src/features/MailerService/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { MailerService } from \"./MailerService.js\";\nimport { ActiveTransport } from \"./ActiveTransport.js\";\n\nexport const MailerServiceFeature = createFeature({\n name: \"Mailer/MailerService\",\n register(container) {\n container.register(ActiveTransport).inSingletonScope();\n container.register(MailerService).inSingletonScope();\n }\n});\n"],"names":["MailerServiceFeature","createFeature","container","ActiveTransport","MailerService"],"mappings":";;;AAIO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,iBAAiB,gBAAgB;QACpDD,UAAU,QAAQ,CAACE,eAAe,gBAAgB;IACtD;AACJ"}
@@ -6,54 +6,38 @@ import { KeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js"
6
6
  import { MAILER_TRANSPORT_SETTINGS } from "../../constants.js";
7
7
  const DEFAULT_PORT = 25;
8
8
  class SaveSettingsRepositoryImpl {
9
- constructor(keyValueStore, encryption) {
10
- this.keyValueStore = keyValueStore;
11
- this.encryption = encryption;
12
- }
13
- async execute(input) {
14
- // Check if settings exist
15
- const existingResult = await this.keyValueStore.get(MAILER_TRANSPORT_SETTINGS);
16
- const existingSettings = existingResult.isOk() ? existingResult.value : null;
17
- const transportSettings = existingSettings ?? {};
18
-
19
- // If updating and no password provided, keep the existing password
20
- let passwordToStore = input.password || "";
21
- if (!input.password && existingSettings) {
22
- passwordToStore = this.encryption.decrypt(transportSettings.password || "");
9
+ constructor(keyValueStore, encryption){
10
+ this.keyValueStore = keyValueStore;
11
+ this.encryption = encryption;
23
12
  }
24
-
25
- // Encrypt password
26
- const encryptedPassword = this.encryption.encrypt(passwordToStore);
27
-
28
- // Prepare data
29
- const data = {
30
- host: input.host ?? transportSettings.host,
31
- port: input.port ?? transportSettings.port ?? DEFAULT_PORT,
32
- user: input.user ?? transportSettings.user,
33
- password: encryptedPassword,
34
- from: input.from ?? transportSettings.from,
35
- replyTo: input.replyTo ?? transportSettings.replyTo
36
- };
37
-
38
- // Save settings.
39
- const result = await this.keyValueStore.set(MAILER_TRANSPORT_SETTINGS, data);
40
- if (result.isFail()) {
41
- return Result.fail(new SettingsPersistenceError(result.error));
13
+ async execute(input) {
14
+ const existingResult = await this.keyValueStore.get(MAILER_TRANSPORT_SETTINGS);
15
+ const existingSettings = existingResult.isOk() ? existingResult.value : null;
16
+ const transportSettings = existingSettings ?? {};
17
+ let passwordToStore = input.password || "";
18
+ if (!input.password && existingSettings) passwordToStore = this.encryption.decrypt(transportSettings.password || "");
19
+ const encryptedPassword = this.encryption.encrypt(passwordToStore);
20
+ const data = {
21
+ host: input.host ?? transportSettings.host,
22
+ port: input.port ?? transportSettings.port ?? DEFAULT_PORT,
23
+ user: input.user ?? transportSettings.user,
24
+ password: encryptedPassword,
25
+ from: input.from ?? transportSettings.from,
26
+ replyTo: input.replyTo ?? transportSettings.replyTo
27
+ };
28
+ const result = await this.keyValueStore.set(MAILER_TRANSPORT_SETTINGS, data);
29
+ if (result.isFail()) return Result.fail(new SettingsPersistenceError(result.error));
30
+ const { password: _password, ...savedSettings } = data;
31
+ return Result.ok(savedSettings);
42
32
  }
43
-
44
- // Return the stored state without the password. Callers that need the
45
- // plaintext password go through GetSettingsRepository.get(transportName).
46
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
47
- const {
48
- password: _password,
49
- ...savedSettings
50
- } = data;
51
- return Result.ok(savedSettings);
52
- }
53
33
  }
54
- export const SaveSettingsRepositoryImplementation = SaveSettingsRepository.createImplementation({
55
- implementation: SaveSettingsRepositoryImpl,
56
- dependencies: [KeyValueStore, Encryption]
34
+ const SaveSettingsRepositoryImplementation = SaveSettingsRepository.createImplementation({
35
+ implementation: SaveSettingsRepositoryImpl,
36
+ dependencies: [
37
+ KeyValueStore,
38
+ Encryption
39
+ ]
57
40
  });
41
+ export { SaveSettingsRepositoryImplementation };
58
42
 
59
43
  //# sourceMappingURL=SaveSettingsRepository.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","Encryption","SaveSettingsRepository","SettingsPersistenceError","KeyValueStore","MAILER_TRANSPORT_SETTINGS","DEFAULT_PORT","SaveSettingsRepositoryImpl","constructor","keyValueStore","encryption","execute","input","existingResult","get","existingSettings","isOk","value","transportSettings","passwordToStore","password","decrypt","encryptedPassword","encrypt","data","host","port","user","from","replyTo","result","set","isFail","fail","error","_password","savedSettings","ok","SaveSettingsRepositoryImplementation","createImplementation","implementation","dependencies"],"sources":["SaveSettingsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { SaveSettingsRepository, type SaveSettingsInput } from \"./abstractions.js\";\nimport type { TransportSettings } from \"~/types.js\";\nimport { SettingsPersistenceError } from \"~/domain/errors.js\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { MAILER_TRANSPORT_SETTINGS } from \"~/constants.js\";\n\nconst DEFAULT_PORT = 25;\n\nclass SaveSettingsRepositoryImpl implements SaveSettingsRepository.Interface {\n constructor(\n private keyValueStore: KeyValueStore.Interface,\n private encryption: Encryption.Interface\n ) {}\n\n async execute(input: SaveSettingsInput): SaveSettingsRepository.Return {\n // Check if settings exist\n const existingResult =\n await this.keyValueStore.get<TransportSettings>(MAILER_TRANSPORT_SETTINGS);\n const existingSettings = existingResult.isOk() ? existingResult.value : null;\n const transportSettings: Partial<TransportSettings> = existingSettings ?? {};\n\n // If updating and no password provided, keep the existing password\n let passwordToStore = input.password || \"\";\n if (!input.password && existingSettings) {\n passwordToStore = this.encryption.decrypt(transportSettings.password || \"\");\n }\n\n // Encrypt password\n const encryptedPassword = this.encryption.encrypt(passwordToStore);\n\n // Prepare data\n const data = {\n host: input.host ?? transportSettings.host,\n port: input.port ?? transportSettings.port ?? DEFAULT_PORT,\n user: input.user ?? transportSettings.user,\n password: encryptedPassword,\n from: input.from ?? transportSettings.from,\n replyTo: input.replyTo ?? transportSettings.replyTo\n };\n\n // Save settings.\n const result = await this.keyValueStore.set(MAILER_TRANSPORT_SETTINGS, data);\n\n if (result.isFail()) {\n return Result.fail(new SettingsPersistenceError(result.error));\n }\n\n // Return the stored state without the password. Callers that need the\n // plaintext password go through GetSettingsRepository.get(transportName).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password: _password, ...savedSettings } = data as TransportSettings;\n return Result.ok(savedSettings);\n }\n}\n\nexport const SaveSettingsRepositoryImplementation = SaveSettingsRepository.createImplementation({\n implementation: SaveSettingsRepositoryImpl,\n dependencies: [KeyValueStore, Encryption]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,UAAU,QAAQ,+CAA+C;AAC1E,SAASC,sBAAsB;AAE/B,SAASC,wBAAwB;AACjC,SAASC,aAAa,QAAQ,kDAAkD;AAChF,SAASC,yBAAyB;AAElC,MAAMC,YAAY,GAAG,EAAE;AAEvB,MAAMC,0BAA0B,CAA6C;EACzEC,WAAWA,CACCC,aAAsC,EACtCC,UAAgC,EAC1C;IAAA,KAFUD,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,UAAgC,GAAhCA,UAAgC;EACzC;EAEH,MAAMC,OAAOA,CAACC,KAAwB,EAAiC;IACnE;IACA,MAAMC,cAAc,GAChB,MAAM,IAAI,CAACJ,aAAa,CAACK,GAAG,CAAoBT,yBAAyB,CAAC;IAC9E,MAAMU,gBAAgB,GAAGF,cAAc,CAACG,IAAI,CAAC,CAAC,GAAGH,cAAc,CAACI,KAAK,GAAG,IAAI;IAC5E,MAAMC,iBAA6C,GAAGH,gBAAgB,IAAI,CAAC,CAAC;;IAE5E;IACA,IAAII,eAAe,GAAGP,KAAK,CAACQ,QAAQ,IAAI,EAAE;IAC1C,IAAI,CAACR,KAAK,CAACQ,QAAQ,IAAIL,gBAAgB,EAAE;MACrCI,eAAe,GAAG,IAAI,CAACT,UAAU,CAACW,OAAO,CAACH,iBAAiB,CAACE,QAAQ,IAAI,EAAE,CAAC;IAC/E;;IAEA;IACA,MAAME,iBAAiB,GAAG,IAAI,CAACZ,UAAU,CAACa,OAAO,CAACJ,eAAe,CAAC;;IAElE;IACA,MAAMK,IAAI,GAAG;MACTC,IAAI,EAAEb,KAAK,CAACa,IAAI,IAAIP,iBAAiB,CAACO,IAAI;MAC1CC,IAAI,EAAEd,KAAK,CAACc,IAAI,IAAIR,iBAAiB,CAACQ,IAAI,IAAIpB,YAAY;MAC1DqB,IAAI,EAAEf,KAAK,CAACe,IAAI,IAAIT,iBAAiB,CAACS,IAAI;MAC1CP,QAAQ,EAAEE,iBAAiB;MAC3BM,IAAI,EAAEhB,KAAK,CAACgB,IAAI,IAAIV,iBAAiB,CAACU,IAAI;MAC1CC,OAAO,EAAEjB,KAAK,CAACiB,OAAO,IAAIX,iBAAiB,CAACW;IAChD,CAAC;;IAED;IACA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACrB,aAAa,CAACsB,GAAG,CAAC1B,yBAAyB,EAAEmB,IAAI,CAAC;IAE5E,IAAIM,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOhC,MAAM,CAACiC,IAAI,CAAC,IAAI9B,wBAAwB,CAAC2B,MAAM,CAACI,KAAK,CAAC,CAAC;IAClE;;IAEA;IACA;IACA;IACA,MAAM;MAAEd,QAAQ,EAAEe,SAAS;MAAE,GAAGC;IAAc,CAAC,GAAGZ,IAAyB;IAC3E,OAAOxB,MAAM,CAACqC,EAAE,CAACD,aAAa,CAAC;EACnC;AACJ;AAEA,OAAO,MAAME,oCAAoC,GAAGpC,sBAAsB,CAACqC,oBAAoB,CAAC;EAC5FC,cAAc,EAAEjC,0BAA0B;EAC1CkC,YAAY,EAAE,CAACrC,aAAa,EAAEH,UAAU;AAC5C,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/SaveSettings/SaveSettingsRepository.js","sources":["../../../src/features/SaveSettings/SaveSettingsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { SaveSettingsRepository, type SaveSettingsInput } from \"./abstractions.js\";\nimport type { TransportSettings } from \"~/types.js\";\nimport { SettingsPersistenceError } from \"~/domain/errors.js\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { MAILER_TRANSPORT_SETTINGS } from \"~/constants.js\";\n\nconst DEFAULT_PORT = 25;\n\nclass SaveSettingsRepositoryImpl implements SaveSettingsRepository.Interface {\n constructor(\n private keyValueStore: KeyValueStore.Interface,\n private encryption: Encryption.Interface\n ) {}\n\n async execute(input: SaveSettingsInput): SaveSettingsRepository.Return {\n // Check if settings exist\n const existingResult =\n await this.keyValueStore.get<TransportSettings>(MAILER_TRANSPORT_SETTINGS);\n const existingSettings = existingResult.isOk() ? existingResult.value : null;\n const transportSettings: Partial<TransportSettings> = existingSettings ?? {};\n\n // If updating and no password provided, keep the existing password\n let passwordToStore = input.password || \"\";\n if (!input.password && existingSettings) {\n passwordToStore = this.encryption.decrypt(transportSettings.password || \"\");\n }\n\n // Encrypt password\n const encryptedPassword = this.encryption.encrypt(passwordToStore);\n\n // Prepare data\n const data = {\n host: input.host ?? transportSettings.host,\n port: input.port ?? transportSettings.port ?? DEFAULT_PORT,\n user: input.user ?? transportSettings.user,\n password: encryptedPassword,\n from: input.from ?? transportSettings.from,\n replyTo: input.replyTo ?? transportSettings.replyTo\n };\n\n // Save settings.\n const result = await this.keyValueStore.set(MAILER_TRANSPORT_SETTINGS, data);\n\n if (result.isFail()) {\n return Result.fail(new SettingsPersistenceError(result.error));\n }\n\n // Return the stored state without the password. Callers that need the\n // plaintext password go through GetSettingsRepository.get(transportName).\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password: _password, ...savedSettings } = data as TransportSettings;\n return Result.ok(savedSettings);\n }\n}\n\nexport const SaveSettingsRepositoryImplementation = SaveSettingsRepository.createImplementation({\n implementation: SaveSettingsRepositoryImpl,\n dependencies: [KeyValueStore, Encryption]\n});\n"],"names":["DEFAULT_PORT","SaveSettingsRepositoryImpl","keyValueStore","encryption","input","existingResult","MAILER_TRANSPORT_SETTINGS","existingSettings","transportSettings","passwordToStore","encryptedPassword","data","result","Result","SettingsPersistenceError","_password","savedSettings","SaveSettingsRepositoryImplementation","SaveSettingsRepository","KeyValueStore","Encryption"],"mappings":";;;;;;AAQA,MAAMA,eAAe;AAErB,MAAMC;IACF,YACYC,aAAsC,EACtCC,UAAgC,CAC1C;aAFUD,aAAa,GAAbA;aACAC,UAAU,GAAVA;IACT;IAEH,MAAM,QAAQC,KAAwB,EAAiC;QAEnE,MAAMC,iBACF,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAoBC;QACpD,MAAMC,mBAAmBF,eAAe,IAAI,KAAKA,eAAe,KAAK,GAAG;QACxE,MAAMG,oBAAgDD,oBAAoB,CAAC;QAG3E,IAAIE,kBAAkBL,MAAM,QAAQ,IAAI;QACxC,IAAI,CAACA,MAAM,QAAQ,IAAIG,kBACnBE,kBAAkB,IAAI,CAAC,UAAU,CAAC,OAAO,CAACD,kBAAkB,QAAQ,IAAI;QAI5E,MAAME,oBAAoB,IAAI,CAAC,UAAU,CAAC,OAAO,CAACD;QAGlD,MAAME,OAAO;YACT,MAAMP,MAAM,IAAI,IAAII,kBAAkB,IAAI;YAC1C,MAAMJ,MAAM,IAAI,IAAII,kBAAkB,IAAI,IAAIR;YAC9C,MAAMI,MAAM,IAAI,IAAII,kBAAkB,IAAI;YAC1C,UAAUE;YACV,MAAMN,MAAM,IAAI,IAAII,kBAAkB,IAAI;YAC1C,SAASJ,MAAM,OAAO,IAAII,kBAAkB,OAAO;QACvD;QAGA,MAAMI,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAACN,2BAA2BK;QAEvE,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,yBAAyBF,OAAO,KAAK;QAMhE,MAAM,EAAE,UAAUG,SAAS,EAAE,GAAGC,eAAe,GAAGL;QAClD,OAAOE,OAAO,EAAE,CAACG;IACrB;AACJ;AAEO,MAAMC,uCAAuCC,uBAAuB,oBAAoB,CAAC;IAC5F,gBAAgBjB;IAChB,cAAc;QAACkB;QAAeC;KAAW;AAC7C"}
@@ -1,69 +1,51 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
3
- import { SaveSettingsUseCase, SaveSettingsRepository } from "./abstractions.js";
4
- import { MailerSettingsBeforeSaveEvent, MailerSettingsAfterSaveEvent } from "./events.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, SettingsLockedByCode } 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
8
  import { CodeMailerSettings } from "../../domain/CodeMailerSettings/abstractions.js";
9
9
  import { ActiveTransport } from "../../domain/MailTransport/abstractions.js";
10
10
  class SaveSettingsUseCaseImpl {
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;
17
- }
18
- async execute(input) {
19
- const permission = await this.identityContext.getPermission("mailer.settings");
20
- if (!permission) {
21
- 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;
22
17
  }
23
-
24
- // Validate input.
25
- const validationResult = saveValidation.safeParse(input);
26
- if (!validationResult.success) {
27
- return Result.fail(new SettingsValidationError(validationResult.error.issues));
28
- }
29
-
30
- // Refuse when settings are defined via code.
31
- const transportName = this.activeTransport.name();
32
- if (transportName && this.codeSettings.get(transportName) !== null) {
33
- return Result.fail(new SettingsLockedByCode());
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;
34
37
  }
35
-
36
- // Publish before save event. Strip the password — subscribers (audit
37
- // logs, telemetry) must never see the plaintext value from the input.
38
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
- const {
40
- password: _beforePassword,
41
- ...inputForEvent
42
- } = input;
43
- const beforeSaveEvent = new MailerSettingsBeforeSaveEvent({
44
- input: inputForEvent
45
- });
46
- await this.eventPublisher.publish(beforeSaveEvent);
47
-
48
- // Save settings.
49
- const result = await this.repository.execute(input);
50
- if (result.isFail()) {
51
- return Result.fail(new SettingsPersistenceError(result.error));
52
- }
53
-
54
- // Publish after save event. The repository return is already password-free
55
- // (its type is Omit<TransportSettings, "password">), so no runtime strip
56
- // is needed here.
57
- const afterSaveEvent = new MailerSettingsAfterSaveEvent({
58
- settings: result.value
59
- });
60
- await this.eventPublisher.publish(afterSaveEvent);
61
- return result;
62
- }
63
38
  }
64
- export const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({
65
- implementation: SaveSettingsUseCaseImpl,
66
- dependencies: [IdentityContext, EventPublisher, SaveSettingsRepository, CodeMailerSettings, ActiveTransport]
39
+ const SaveSettingsUseCaseImplementation = SaveSettingsUseCase.createImplementation({
40
+ implementation: SaveSettingsUseCaseImpl,
41
+ dependencies: [
42
+ IdentityContext,
43
+ EventPublisher,
44
+ SaveSettingsRepository,
45
+ CodeMailerSettings,
46
+ ActiveTransport
47
+ ]
67
48
  });
49
+ export { SaveSettingsUseCaseImplementation };
68
50
 
69
51
  //# sourceMappingURL=SaveSettingsUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","EventPublisher","SaveSettingsUseCase","SaveSettingsRepository","MailerSettingsBeforeSaveEvent","MailerSettingsAfterSaveEvent","saveValidation","SettingsValidationError","SettingsPersistenceError","SettingsNotAuthorized","SettingsLockedByCode","IdentityContext","CodeMailerSettings","ActiveTransport","SaveSettingsUseCaseImpl","constructor","identityContext","eventPublisher","repository","codeSettings","activeTransport","execute","input","permission","getPermission","fail","validationResult","safeParse","success","error","issues","transportName","name","get","password","_beforePassword","inputForEvent","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/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"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,mDAAmD;AAC1D,SACIC,mBAAmB,EACnBC,sBAAsB;AAG1B,SAASC,6BAA6B,EAAEC,4BAA4B;AACpE,SAASC,cAAc;AACvB,SACIC,uBAAuB,EACvBC,wBAAwB,EACxBC,qBAAqB,EACrBC,oBAAoB;AAExB,SAASC,eAAe,QAAQ,6DAA6D;AAC7F,SAASC,kBAAkB;AAC3B,SAASC,eAAe;AAExB,MAAMC,uBAAuB,CAA0C;EACnEC,WAAWA,CACCC,eAA0C,EAC1CC,cAAmD,EACnDC,UAA4C,EAC5CC,YAA0C,EAC1CC,eAA0C,EACpD;IAAA,KALUJ,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,UAA4C,GAA5CA,UAA4C;IAAA,KAC5CC,YAA0C,GAA1CA,YAA0C;IAAA,KAC1CC,eAA0C,GAA1CA,eAA0C;EACnD;EAEH,MAAMC,OAAOA,CAACC,KAAwB,EAA8B;IAChE,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACP,eAAe,CAACQ,aAAa,CAAC,iBAAiB,CAAC;IAE9E,IAAI,CAACD,UAAU,EAAE;MACb,OAAOvB,MAAM,CAACyB,IAAI,CAAC,IAAIhB,qBAAqB,CAAC,CAAC,CAAC;IACnD;;IAEA;IACA,MAAMiB,gBAAgB,GAAGpB,cAAc,CAACqB,SAAS,CAACL,KAAK,CAAC;IACxD,IAAI,CAACI,gBAAgB,CAACE,OAAO,EAAE;MAC3B,OAAO5B,MAAM,CAACyB,IAAI,CAAC,IAAIlB,uBAAuB,CAACmB,gBAAgB,CAACG,KAAK,CAACC,MAAM,CAAC,CAAC;IAClF;;IAEA;IACA,MAAMC,aAAa,GAAG,IAAI,CAACX,eAAe,CAACY,IAAI,CAAC,CAAC;IACjD,IAAID,aAAa,IAAI,IAAI,CAACZ,YAAY,CAACc,GAAG,CAACF,aAAa,CAAC,KAAK,IAAI,EAAE;MAChE,OAAO/B,MAAM,CAACyB,IAAI,CAAC,IAAIf,oBAAoB,CAAC,CAAC,CAAC;IAClD;;IAEA;IACA;IACA;IACA,MAAM;MAAEwB,QAAQ,EAAEC,eAAe;MAAE,GAAGC;IAAc,CAAC,GAAGd,KAAK;IAC7D,MAAMe,eAAe,GAAG,IAAIjC,6BAA6B,CAAC;MAAEkB,KAAK,EAAEc;IAAc,CAAC,CAAC;IACnF,MAAM,IAAI,CAACnB,cAAc,CAACqB,OAAO,CAACD,eAAe,CAAC;;IAElD;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACrB,UAAU,CAACG,OAAO,CAACC,KAAK,CAAC;IAEnD,IAAIiB,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOxC,MAAM,CAACyB,IAAI,CAAC,IAAIjB,wBAAwB,CAAC+B,MAAM,CAACV,KAAK,CAAC,CAAC;IAClE;;IAEA;IACA;IACA;IACA,MAAMY,cAAc,GAAG,IAAIpC,4BAA4B,CAAC;MAAEqC,QAAQ,EAAEH,MAAM,CAACI;IAAM,CAAC,CAAC;IACnF,MAAM,IAAI,CAAC1B,cAAc,CAACqB,OAAO,CAACG,cAAc,CAAC;IAEjD,OAAOF,MAAM;EACjB;AACJ;AAEA,OAAO,MAAMK,iCAAiC,GAAG1C,mBAAmB,CAAC2C,oBAAoB,CAAC;EACtFC,cAAc,EAAEhC,uBAAuB;EACvCiC,YAAY,EAAE,CACVpC,eAAe,EACfV,cAAc,EACdE,sBAAsB,EACtBS,kBAAkB,EAClBC,eAAe;AAEvB,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,20 +1,8 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
-
3
- /**
4
- * Save-side returns are password-free. The only path that exposes the password
5
- * to in-process callers is GetSettingsRepository.get / GetSettingsUseCase.execute
6
- * (used by MailerService to authenticate SMTP). Everything else — events,
7
- * GraphQL responses, logs, audit trails — must use this Omit shape.
8
- */
9
-
10
- export const SaveSettingsRepository = createAbstraction("SaveSettingsRepository");
11
- export const SaveSettingsUseCase = createAbstraction("SaveSettingsUseCase");
12
-
13
- // Domain Events. Both payloads exclude `password` so subscribers (audit logs,
14
- // telemetry, etc.) cannot accidentally persist plaintext or ciphertext secrets.
15
-
16
- // Event Handler Abstractions
17
- export const MailerSettingsBeforeSaveEventHandler = createAbstraction("MailerSettingsBeforeSaveEventHandler");
18
- export const MailerSettingsAfterSaveEventHandler = createAbstraction("MailerSettingsAfterSaveEventHandler");
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 };
19
7
 
20
8
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","SaveSettingsRepository","SaveSettingsUseCase","MailerSettingsBeforeSaveEventHandler","MailerSettingsAfterSaveEventHandler"],"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/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"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AA6BvD;AACA;AACA;AACA;AACA;AACA;;AAOA,OAAO,MAAMC,sBAAsB,GAC/BD,iBAAiB,CAA0B,wBAAwB,CAAC;AAYxE,OAAO,MAAME,mBAAmB,GAAGF,iBAAiB,CAAgB,qBAAqB,CAAC;;AAQ1F;AACA;;AASA;AACA,OAAO,MAAMG,oCAAoC,GAAGH,iBAAiB,CAEnE,sCAAsC,CAAC;AAOzC,OAAO,MAAMI,mCAAmC,GAAGJ,iBAAiB,CAElE,qCAAqC,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"}