@breadstone/archipel-platform-mailing 0.0.32 → 0.0.34

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 (71) hide show
  1. package/package.json +75 -40
  2. package/src/{tokens/MailModule.d.ts → MailModule.d.ts} +17 -1
  3. package/src/{tokens/MailModule.js → MailModule.js} +35 -17
  4. package/src/{services/strategies → delivering/strategies/logger}/LogDeliveryStrategy.d.ts +2 -2
  5. package/src/{services/strategies → delivering/strategies/logger}/LogDeliveryStrategy.js +1 -1
  6. package/src/delivering/strategies/logger/index.d.ts +1 -0
  7. package/src/{logger → delivering/strategies/logger}/index.js +1 -1
  8. package/src/{services/strategies → delivering/strategies/mailgun}/MailgunDeliveryStrategy.d.ts +2 -2
  9. package/src/{services/strategies → delivering/strategies/mailgun}/MailgunDeliveryStrategy.js +3 -3
  10. package/src/delivering/strategies/mailgun/index.d.ts +2 -0
  11. package/src/{mailgun → delivering/strategies/mailgun}/index.js +3 -3
  12. package/src/{services/strategies → delivering/strategies/postmark}/PostmarkDeliveryStrategy.d.ts +2 -2
  13. package/src/{services/strategies → delivering/strategies/postmark}/PostmarkDeliveryStrategy.js +3 -3
  14. package/src/delivering/strategies/postmark/index.d.ts +2 -0
  15. package/src/{postmark → delivering/strategies/postmark}/index.js +3 -3
  16. package/src/{services/strategies → delivering/strategies/resend}/ResendDeliveryStrategy.d.ts +2 -2
  17. package/src/{services/strategies → delivering/strategies/resend}/ResendDeliveryStrategy.js +3 -3
  18. package/src/delivering/strategies/resend/index.d.ts +2 -0
  19. package/src/{resend → delivering/strategies/resend}/index.js +3 -3
  20. package/src/{services/strategies → delivering/strategies/sendgrid}/SendGridDeliveryStrategy.d.ts +2 -2
  21. package/src/{services/strategies → delivering/strategies/sendgrid}/SendGridDeliveryStrategy.js +3 -3
  22. package/src/delivering/strategies/sendgrid/index.d.ts +2 -0
  23. package/src/{sendgrid → delivering/strategies/sendgrid}/index.js +3 -3
  24. package/src/{services/strategies → delivering/strategies/smtp}/SmtpDeliveryStrategy.d.ts +2 -2
  25. package/src/{services/strategies → delivering/strategies/smtp}/SmtpDeliveryStrategy.js +3 -3
  26. package/src/{smtp → delivering/strategies/smtp}/index.d.ts +1 -1
  27. package/src/{smtp → delivering/strategies/smtp}/index.js +3 -3
  28. package/src/env.js +1 -1
  29. package/src/events/listeners/MailEventSubscriber.d.ts +2 -1
  30. package/src/events/listeners/MailEventSubscriber.js +9 -3
  31. package/src/index.d.ts +5 -4
  32. package/src/index.js +5 -3
  33. package/src/models/IMailTemplate.d.ts +37 -0
  34. package/src/models/IMailTemplate.js +3 -0
  35. package/src/ports/IMailTemplateRepository.d.ts +39 -0
  36. package/src/ports/IMailTemplateRepository.js +3 -0
  37. package/src/services/MailService.d.ts +1 -1
  38. package/src/services/MailService.js +2 -2
  39. package/src/templating/MailTemplateEngine.d.ts +1 -1
  40. package/src/templating/MailTemplateEngine.js +1 -1
  41. package/src/templating/strategies/{BlobTemplateFetchStrategy.d.ts → blob/BlobTemplateFetchStrategy.d.ts} +2 -2
  42. package/src/templating/strategies/{BlobTemplateFetchStrategy.js → blob/BlobTemplateFetchStrategy.js} +1 -1
  43. package/src/templating/strategies/blob/index.d.ts +1 -0
  44. package/src/templating/strategies/blob/index.js +6 -0
  45. package/src/templating/strategies/database/DatabaseTemplateFetchStrategy.d.ts +26 -0
  46. package/src/templating/strategies/database/DatabaseTemplateFetchStrategy.js +65 -0
  47. package/src/templating/strategies/database/index.d.ts +1 -0
  48. package/src/templating/strategies/database/index.js +6 -0
  49. package/src/templating/strategies/{FileTemplateFetchStrategy.d.ts → file/FileTemplateFetchStrategy.d.ts} +2 -2
  50. package/src/templating/strategies/{FileTemplateFetchStrategy.js → file/FileTemplateFetchStrategy.js} +2 -2
  51. package/src/templating/strategies/file/index.d.ts +1 -0
  52. package/src/templating/strategies/file/index.js +6 -0
  53. package/src/{MailTokens.d.ts → tokens/MailTokens.d.ts} +1 -0
  54. package/src/{MailTokens.js → tokens/MailTokens.js} +2 -1
  55. package/src/logger/index.d.ts +0 -1
  56. package/src/mailgun/index.d.ts +0 -2
  57. package/src/postmark/index.d.ts +0 -2
  58. package/src/resend/index.d.ts +0 -2
  59. package/src/sendgrid/index.d.ts +0 -2
  60. /package/src/{services → delivering}/strategies/abstracts/DeliveryStrategyBase.d.ts +0 -0
  61. /package/src/{services → delivering}/strategies/abstracts/DeliveryStrategyBase.js +0 -0
  62. /package/src/{mailgun → delivering/strategies/mailgun}/env.d.ts +0 -0
  63. /package/src/{mailgun → delivering/strategies/mailgun}/env.js +0 -0
  64. /package/src/{postmark → delivering/strategies/postmark}/env.d.ts +0 -0
  65. /package/src/{postmark → delivering/strategies/postmark}/env.js +0 -0
  66. /package/src/{resend → delivering/strategies/resend}/env.d.ts +0 -0
  67. /package/src/{resend → delivering/strategies/resend}/env.js +0 -0
  68. /package/src/{sendgrid → delivering/strategies/sendgrid}/env.d.ts +0 -0
  69. /package/src/{sendgrid → delivering/strategies/sendgrid}/env.js +0 -0
  70. /package/src/{smtp → delivering/strategies/smtp}/env.d.ts +0 -0
  71. /package/src/{smtp → delivering/strategies/smtp}/env.js +0 -0
package/package.json CHANGED
@@ -1,29 +1,39 @@
1
1
  {
2
2
  "name": "@breadstone/archipel-platform-mailing",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "description": "Email delivery with strategy-based transport and template engines for NestJS applications.",
5
5
  "type": "commonjs",
6
6
  "main": "./src/index.js",
7
7
  "types": "./src/index.d.ts",
8
+ "sideEffects": false,
8
9
  "typesVersions": {
9
10
  "*": {
10
- "log": [
11
- "./src/log/index.d.ts"
11
+ "delivering/logger": [
12
+ "./src/delivering/strategies/logger/index.d.ts"
12
13
  ],
13
- "smtp": [
14
- "./src/smtp/index.d.ts"
14
+ "delivering/smtp": [
15
+ "./src/delivering/strategies/smtp/index.d.ts"
15
16
  ],
16
- "mailgun": [
17
- "./src/mailgun/index.d.ts"
17
+ "delivering/mailgun": [
18
+ "./src/delivering/strategies/mailgun/index.d.ts"
18
19
  ],
19
- "postmark": [
20
- "./src/postmark/index.d.ts"
20
+ "delivering/postmark": [
21
+ "./src/delivering/strategies/postmark/index.d.ts"
21
22
  ],
22
- "resend": [
23
- "./src/resend/index.d.ts"
23
+ "delivering/resend": [
24
+ "./src/delivering/strategies/resend/index.d.ts"
24
25
  ],
25
- "sendgrid": [
26
- "./src/sendgrid/index.d.ts"
26
+ "delivering/sendgrid": [
27
+ "./src/delivering/strategies/sendgrid/index.d.ts"
28
+ ],
29
+ "templating/blob": [
30
+ "./src/templating/strategies/blob/index.d.ts"
31
+ ],
32
+ "templating/file": [
33
+ "./src/templating/strategies/file/index.d.ts"
34
+ ],
35
+ "templating/database": [
36
+ "./src/templating/strategies/database/index.d.ts"
27
37
  ],
28
38
  "health": [
29
39
  "./src/health/index.d.ts"
@@ -35,40 +45,65 @@
35
45
  "types": "./src/index.d.ts",
36
46
  "default": "./src/index.js"
37
47
  },
38
- "./log": {
39
- "types": "./src/log/index.d.ts",
40
- "default": "./src/log/index.js"
48
+ "./delivering/logger": {
49
+ "types": "./src/delivering/strategies/logger/index.d.ts",
50
+ "default": "./src/delivering/strategies/logger/index.js"
51
+ },
52
+ "./delivering/smtp": {
53
+ "types": "./src/delivering/strategies/smtp/index.d.ts",
54
+ "default": "./src/delivering/strategies/smtp/index.js"
55
+ },
56
+ "./delivering/mailgun": {
57
+ "types": "./src/delivering/strategies/mailgun/index.d.ts",
58
+ "default": "./src/delivering/strategies/mailgun/index.js"
59
+ },
60
+ "./delivering/postmark": {
61
+ "types": "./src/delivering/strategies/postmark/index.d.ts",
62
+ "default": "./src/delivering/strategies/postmark/index.js"
41
63
  },
42
- "./smtp": {
43
- "types": "./src/smtp/index.d.ts",
44
- "default": "./src/smtp/index.js"
64
+ "./delivering/resend": {
65
+ "types": "./src/delivering/strategies/resend/index.d.ts",
66
+ "default": "./src/delivering/strategies/resend/index.js"
45
67
  },
46
- "./mailgun": {
47
- "types": "./src/mailgun/index.d.ts",
48
- "default": "./src/mailgun/index.js"
68
+ "./delivering/sendgrid": {
69
+ "types": "./src/delivering/strategies/sendgrid/index.d.ts",
70
+ "default": "./src/delivering/strategies/sendgrid/index.js"
49
71
  },
50
- "./postmark": {
51
- "types": "./src/postmark/index.d.ts",
52
- "default": "./src/postmark/index.js"
72
+ "./templating/blob": {
73
+ "types": "./src/templating/strategies/blob/index.d.ts",
74
+ "default": "./src/templating/strategies/blob/index.js"
53
75
  },
54
- "./resend": {
55
- "types": "./src/resend/index.d.ts",
56
- "default": "./src/resend/index.js"
76
+ "./templating/file": {
77
+ "types": "./src/templating/strategies/file/index.d.ts",
78
+ "default": "./src/templating/strategies/file/index.js"
57
79
  },
58
- "./sendgrid": {
59
- "types": "./src/sendgrid/index.d.ts",
60
- "default": "./src/sendgrid/index.js"
80
+ "./templating/database": {
81
+ "types": "./src/templating/strategies/database/index.d.ts",
82
+ "default": "./src/templating/strategies/database/index.js"
61
83
  },
62
84
  "./health": {
63
85
  "types": "./src/health/index.d.ts",
64
86
  "default": "./src/health/index.js"
65
87
  },
66
88
  "./package.json": "./package.json",
67
- "./smtp/index": "./src/smtp/index.js",
68
- "./postmark/index": "./src/postmark/index.js",
69
- "./resend/index": "./src/resend/index.js",
70
- "./sendgrid/index": "./src/sendgrid/index.js",
71
- "./mailgun/index": "./src/mailgun/index.js",
89
+ "./delivering/strategies/logger": "./src/delivering/strategies/logger/index.js",
90
+ "./delivering/strategies/logger/index": "./src/delivering/strategies/logger/index.js",
91
+ "./delivering/strategies/smtp": "./src/delivering/strategies/smtp/index.js",
92
+ "./delivering/strategies/smtp/index": "./src/delivering/strategies/smtp/index.js",
93
+ "./delivering/strategies/postmark": "./src/delivering/strategies/postmark/index.js",
94
+ "./delivering/strategies/postmark/index": "./src/delivering/strategies/postmark/index.js",
95
+ "./delivering/strategies/resend": "./src/delivering/strategies/resend/index.js",
96
+ "./delivering/strategies/resend/index": "./src/delivering/strategies/resend/index.js",
97
+ "./delivering/strategies/sendgrid": "./src/delivering/strategies/sendgrid/index.js",
98
+ "./delivering/strategies/sendgrid/index": "./src/delivering/strategies/sendgrid/index.js",
99
+ "./delivering/strategies/mailgun": "./src/delivering/strategies/mailgun/index.js",
100
+ "./delivering/strategies/mailgun/index": "./src/delivering/strategies/mailgun/index.js",
101
+ "./templating/strategies/blob": "./src/templating/strategies/blob/index.js",
102
+ "./templating/strategies/blob/index": "./src/templating/strategies/blob/index.js",
103
+ "./templating/strategies/file": "./src/templating/strategies/file/index.js",
104
+ "./templating/strategies/file/index": "./src/templating/strategies/file/index.js",
105
+ "./templating/strategies/database": "./src/templating/strategies/database/index.js",
106
+ "./templating/strategies/database/index": "./src/templating/strategies/database/index.js",
72
107
  "./health/index": "./src/health/index.js"
73
108
  },
74
109
  "license": "MIT",
@@ -99,10 +134,10 @@
99
134
  "README.md"
100
135
  ],
101
136
  "dependencies": {
102
- "@breadstone/archipel-platform-blob-storage": "0.0.32",
103
- "@breadstone/archipel-platform-configuration": "0.0.32",
104
- "@breadstone/archipel-platform-core": "0.0.32",
105
- "@breadstone/archipel-platform-resources": "0.0.32",
137
+ "@breadstone/archipel-platform-blob-storage": "0.0.34",
138
+ "@breadstone/archipel-platform-configuration": "0.0.34",
139
+ "@breadstone/archipel-platform-core": "0.0.34",
140
+ "@breadstone/archipel-platform-resources": "0.0.34",
106
141
  "tslib": "2.8.1"
107
142
  },
108
143
  "peerDependencies": {
@@ -1,5 +1,6 @@
1
1
  import type { IConfigRegistryEntry } from '@breadstone/archipel-platform-configuration';
2
- import { type DynamicModule } from '@nestjs/common';
2
+ import { type DynamicModule, type Provider } from '@nestjs/common';
3
+ import type { IMailTemplateRepository } from './ports/IMailTemplateRepository';
3
4
  /**
4
5
  * Options for configuring the {@link MailModule}.
5
6
  *
@@ -16,6 +17,21 @@ export interface IMailModuleOptions {
16
17
  * Merged with the platform default entries.
17
18
  */
18
19
  readonly configEntries?: ReadonlyArray<Omit<IConfigRegistryEntry, 'module'>>;
20
+ /**
21
+ * Provider for the `IMailTemplateRepository` port.
22
+ * Required when `MAIL_TEMPLATE_STRATEGY` is set to `'database'`.
23
+ *
24
+ * Example:
25
+ * ```typescript
26
+ * MailModule.register({
27
+ * templateRepositoryProvider: {
28
+ * provide: MAIL_TEMPLATE_REPOSITORY_TOKEN,
29
+ * useClass: PrismaMailTemplateRepository,
30
+ * }
31
+ * })
32
+ * ```
33
+ */
34
+ readonly templateRepositoryProvider?: Provider<IMailTemplateRepository>;
19
35
  }
20
36
  /**
21
37
  * Represents the mail module.
@@ -9,13 +9,13 @@ const archipel_platform_configuration_1 = require("@breadstone/archipel-platform
9
9
  const archipel_platform_core_1 = require("@breadstone/archipel-platform-core");
10
10
  const archipel_platform_resources_1 = require("@breadstone/archipel-platform-resources");
11
11
  const common_1 = require("@nestjs/common");
12
- const env_1 = require("../env");
13
- const MailEventSubscriber_1 = require("../events/listeners/MailEventSubscriber");
14
- const MailTokens_1 = require("../MailTokens");
15
- const MailService_1 = require("../services/MailService");
16
- const MailVerificationService_1 = require("../services/MailVerificationService");
17
- const SmtpConnectionVerifier_1 = require("../services/SmtpConnectionVerifier");
18
- const MailTemplateEngine_1 = require("../templating/MailTemplateEngine");
12
+ const env_1 = require("./env");
13
+ const MailEventSubscriber_1 = require("./events/listeners/MailEventSubscriber");
14
+ const MailService_1 = require("./services/MailService");
15
+ const MailVerificationService_1 = require("./services/MailVerificationService");
16
+ const SmtpConnectionVerifier_1 = require("./services/SmtpConnectionVerifier");
17
+ const MailTemplateEngine_1 = require("./templating/MailTemplateEngine");
18
+ const MailTokens_1 = require("./tokens/MailTokens");
19
19
  /**
20
20
  * Represents the mail module.
21
21
  *
@@ -36,53 +36,71 @@ let MailModule = MailModule_1 = class MailModule {
36
36
  static register(options) {
37
37
  const isGlobal = options?.isGlobal ?? true;
38
38
  const configEntries = options?.configEntries ?? env_1.PLATFORM_MAILING_CONFIG_ENTRIES;
39
+ const additionalProviders = [];
40
+ if (options?.templateRepositoryProvider) {
41
+ additionalProviders.push(options.templateRepositoryProvider);
42
+ }
39
43
  return {
40
44
  module: MailModule_1,
41
45
  global: isGlobal,
42
46
  imports: [archipel_platform_configuration_1.ConfigModule.register('platform-mailing', configEntries), archipel_platform_blob_storage_1.BlobModule, archipel_platform_core_1.EventModule],
43
47
  providers: [
48
+ ...additionalProviders,
44
49
  {
45
50
  provide: MailTokens_1.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN,
46
- useFactory: async (configService, blobService, resourceManager) => {
51
+ useFactory: async (configService, blobService, resourceManager, ...extra) => {
47
52
  const templateStrategy = configService.get(env_1.MAIL_TEMPLATE_STRATEGY.key);
48
53
  if (templateStrategy === 'file') {
49
- const { FileTemplateFetchStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../templating/strategies/FileTemplateFetchStrategy')));
54
+ const { FileTemplateFetchStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./templating/strategies/file/FileTemplateFetchStrategy')));
50
55
  return new FileTemplateFetchStrategy(resourceManager);
51
56
  }
52
57
  if (templateStrategy === 'blob') {
53
- const { BlobTemplateFetchStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../templating/strategies/BlobTemplateFetchStrategy')));
58
+ const { BlobTemplateFetchStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./templating/strategies/blob/BlobTemplateFetchStrategy')));
54
59
  return new BlobTemplateFetchStrategy(blobService);
55
60
  }
61
+ if (templateStrategy === 'database') {
62
+ const repository = extra[0];
63
+ if (!repository) {
64
+ throw new Error("Template strategy 'database' requires a templateRepositoryProvider in MailModule.register() options.");
65
+ }
66
+ const { DatabaseTemplateFetchStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./templating/strategies/database/DatabaseTemplateFetchStrategy')));
67
+ return new DatabaseTemplateFetchStrategy(repository);
68
+ }
56
69
  throw new Error(`Unknown template strategy: ${templateStrategy}`);
57
70
  },
58
- inject: [archipel_platform_configuration_1.ConfigService, archipel_platform_blob_storage_1.BlobService, archipel_platform_resources_1.ResourceManager],
71
+ inject: [
72
+ archipel_platform_configuration_1.ConfigService,
73
+ archipel_platform_blob_storage_1.BlobService,
74
+ archipel_platform_resources_1.ResourceManager,
75
+ ...(options?.templateRepositoryProvider ? [MailTokens_1.MAIL_TEMPLATE_REPOSITORY_TOKEN] : []),
76
+ ],
59
77
  },
60
78
  {
61
79
  provide: MailTokens_1.MAIL_DELIVERY_STRATEGY_TOKEN,
62
80
  useFactory: async (configService) => {
63
81
  const deliveryStrategy = configService.get(env_1.MAIL_DELIVERY_STRATEGY.key);
64
82
  if (deliveryStrategy === 'log') {
65
- const { LogDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/LogDeliveryStrategy')));
83
+ const { LogDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/logger/LogDeliveryStrategy')));
66
84
  return new LogDeliveryStrategy();
67
85
  }
68
86
  if (deliveryStrategy === 'smtp') {
69
- const { SmtpDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/SmtpDeliveryStrategy')));
87
+ const { SmtpDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/smtp/SmtpDeliveryStrategy')));
70
88
  return new SmtpDeliveryStrategy(configService);
71
89
  }
72
90
  if (deliveryStrategy === 'postmark') {
73
- const { PostmarkDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/PostmarkDeliveryStrategy')));
91
+ const { PostmarkDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/postmark/PostmarkDeliveryStrategy')));
74
92
  return new PostmarkDeliveryStrategy(configService);
75
93
  }
76
94
  if (deliveryStrategy === 'resend') {
77
- const { ResendDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/ResendDeliveryStrategy')));
95
+ const { ResendDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/resend/ResendDeliveryStrategy')));
78
96
  return new ResendDeliveryStrategy(configService);
79
97
  }
80
98
  if (deliveryStrategy === 'sendgrid') {
81
- const { SendGridDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/SendGridDeliveryStrategy')));
99
+ const { SendGridDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/sendgrid/SendGridDeliveryStrategy')));
82
100
  return new SendGridDeliveryStrategy(configService);
83
101
  }
84
102
  if (deliveryStrategy === 'mailgun') {
85
- const { MailgunDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('../services/strategies/MailgunDeliveryStrategy')));
103
+ const { MailgunDeliveryStrategy } = await Promise.resolve().then(() => tslib_1.__importStar(require('./delivering/strategies/mailgun/MailgunDeliveryStrategy')));
86
104
  return new MailgunDeliveryStrategy(configService);
87
105
  }
88
106
  throw new Error(`Unknown delivery strategy: ${deliveryStrategy}`);
@@ -1,4 +1,4 @@
1
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
1
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
2
2
  /**
3
3
  * The `LogDeliveryStrategy` class.
4
4
  *
@@ -12,5 +12,5 @@ export declare class LogDeliveryStrategy extends DeliveryStrategyBase {
12
12
  * @public
13
13
  */
14
14
  constructor();
15
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
15
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
16
16
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.LogDeliveryStrategy = void 0;
5
5
  const common_1 = require("@nestjs/common");
6
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
6
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
7
7
  // #endregion
8
8
  /**
9
9
  * The `LogDeliveryStrategy` class.
@@ -0,0 +1 @@
1
+ export { LogDeliveryStrategy } from './LogDeliveryStrategy';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LogDeliveryStrategy = void 0;
4
- var LogDeliveryStrategy_1 = require("../services/strategies/LogDeliveryStrategy");
4
+ var LogDeliveryStrategy_1 = require("./LogDeliveryStrategy");
5
5
  Object.defineProperty(exports, "LogDeliveryStrategy", { enumerable: true, get: function () { return LogDeliveryStrategy_1.LogDeliveryStrategy; } });
6
6
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
2
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
3
3
  /**
4
4
  * Delivers emails via the Mailgun API.
5
5
  *
@@ -25,5 +25,5 @@ export declare class MailgunDeliveryStrategy extends DeliveryStrategyBase {
25
25
  * @param content - Email body content (plain text or HTML)
26
26
  * @param isHtml - Flag to indicate whether the email is HTML (true) or plain text (false)
27
27
  */
28
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
28
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
29
29
  }
@@ -6,9 +6,9 @@ const tslib_1 = require("tslib");
6
6
  const common_1 = require("@nestjs/common");
7
7
  const form_data_1 = tslib_1.__importDefault(require("form-data"));
8
8
  const mailgun_js_1 = tslib_1.__importDefault(require("mailgun.js"));
9
- const env_1 = require("../../env");
10
- const MailDeliveryError_1 = require("../../errors/MailDeliveryError");
11
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
9
+ const env_1 = require("../../../env");
10
+ const MailDeliveryError_1 = require("../../../errors/MailDeliveryError");
11
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
12
12
  // #endregion
13
13
  /**
14
14
  * Delivers emails via the Mailgun API.
@@ -0,0 +1,2 @@
1
+ export { MAILGUN_API_KEY, MAILGUN_CONFIG_ENTRIES, MAILGUN_DOMAIN } from './env';
2
+ export { MailgunDeliveryStrategy } from './MailgunDeliveryStrategy';
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MAILGUN_DOMAIN = exports.MAILGUN_CONFIG_ENTRIES = exports.MAILGUN_API_KEY = exports.MailgunDeliveryStrategy = void 0;
4
- var MailgunDeliveryStrategy_1 = require("../services/strategies/MailgunDeliveryStrategy");
5
- Object.defineProperty(exports, "MailgunDeliveryStrategy", { enumerable: true, get: function () { return MailgunDeliveryStrategy_1.MailgunDeliveryStrategy; } });
3
+ exports.MailgunDeliveryStrategy = exports.MAILGUN_DOMAIN = exports.MAILGUN_CONFIG_ENTRIES = exports.MAILGUN_API_KEY = void 0;
6
4
  var env_1 = require("./env");
7
5
  Object.defineProperty(exports, "MAILGUN_API_KEY", { enumerable: true, get: function () { return env_1.MAILGUN_API_KEY; } });
8
6
  Object.defineProperty(exports, "MAILGUN_CONFIG_ENTRIES", { enumerable: true, get: function () { return env_1.MAILGUN_CONFIG_ENTRIES; } });
9
7
  Object.defineProperty(exports, "MAILGUN_DOMAIN", { enumerable: true, get: function () { return env_1.MAILGUN_DOMAIN; } });
8
+ var MailgunDeliveryStrategy_1 = require("./MailgunDeliveryStrategy");
9
+ Object.defineProperty(exports, "MailgunDeliveryStrategy", { enumerable: true, get: function () { return MailgunDeliveryStrategy_1.MailgunDeliveryStrategy; } });
10
10
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
2
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
3
3
  /**
4
4
  * The `PostmarkDeliveryStrategy` class.
5
5
  *
@@ -24,5 +24,5 @@ export declare class PostmarkDeliveryStrategy extends DeliveryStrategyBase {
24
24
  * @param content - Email body content (plain text or HTML)
25
25
  * @param isHtml - Flag to indicate whether the email is HTML (true) or plain text (false)
26
26
  */
27
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
27
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
28
28
  }
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.PostmarkDeliveryStrategy = void 0;
5
5
  const common_1 = require("@nestjs/common");
6
6
  const postmark_1 = require("postmark");
7
- const env_1 = require("../../env");
8
- const MailDeliveryError_1 = require("../../errors/MailDeliveryError");
9
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
7
+ const env_1 = require("../../../env");
8
+ const MailDeliveryError_1 = require("../../../errors/MailDeliveryError");
9
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
10
10
  // #endregion
11
11
  /**
12
12
  * The `PostmarkDeliveryStrategy` class.
@@ -0,0 +1,2 @@
1
+ export { POSTMARK_API_KEY, POSTMARK_CONFIG_ENTRIES } from './env';
2
+ export { PostmarkDeliveryStrategy } from './PostmarkDeliveryStrategy';
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.POSTMARK_CONFIG_ENTRIES = exports.POSTMARK_API_KEY = exports.PostmarkDeliveryStrategy = void 0;
4
- var PostmarkDeliveryStrategy_1 = require("../services/strategies/PostmarkDeliveryStrategy");
5
- Object.defineProperty(exports, "PostmarkDeliveryStrategy", { enumerable: true, get: function () { return PostmarkDeliveryStrategy_1.PostmarkDeliveryStrategy; } });
3
+ exports.PostmarkDeliveryStrategy = exports.POSTMARK_CONFIG_ENTRIES = exports.POSTMARK_API_KEY = void 0;
6
4
  var env_1 = require("./env");
7
5
  Object.defineProperty(exports, "POSTMARK_API_KEY", { enumerable: true, get: function () { return env_1.POSTMARK_API_KEY; } });
8
6
  Object.defineProperty(exports, "POSTMARK_CONFIG_ENTRIES", { enumerable: true, get: function () { return env_1.POSTMARK_CONFIG_ENTRIES; } });
7
+ var PostmarkDeliveryStrategy_1 = require("./PostmarkDeliveryStrategy");
8
+ Object.defineProperty(exports, "PostmarkDeliveryStrategy", { enumerable: true, get: function () { return PostmarkDeliveryStrategy_1.PostmarkDeliveryStrategy; } });
9
9
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
2
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
3
3
  /**
4
4
  * Delivers emails via the Resend API.
5
5
  *
@@ -24,5 +24,5 @@ export declare class ResendDeliveryStrategy extends DeliveryStrategyBase {
24
24
  * @param content - Email body content (plain text or HTML)
25
25
  * @param isHtml - Flag to indicate whether the email is HTML (true) or plain text (false)
26
26
  */
27
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
27
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
28
28
  }
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.ResendDeliveryStrategy = void 0;
5
5
  const common_1 = require("@nestjs/common");
6
6
  const resend_1 = require("resend");
7
- const env_1 = require("../../env");
8
- const MailDeliveryError_1 = require("../../errors/MailDeliveryError");
9
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
7
+ const env_1 = require("../../../env");
8
+ const MailDeliveryError_1 = require("../../../errors/MailDeliveryError");
9
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
10
10
  // #endregion
11
11
  /**
12
12
  * Delivers emails via the Resend API.
@@ -0,0 +1,2 @@
1
+ export { RESEND_API_KEY, RESEND_CONFIG_ENTRIES } from './env';
2
+ export { ResendDeliveryStrategy } from './ResendDeliveryStrategy';
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RESEND_CONFIG_ENTRIES = exports.RESEND_API_KEY = exports.ResendDeliveryStrategy = void 0;
4
- var ResendDeliveryStrategy_1 = require("../services/strategies/ResendDeliveryStrategy");
5
- Object.defineProperty(exports, "ResendDeliveryStrategy", { enumerable: true, get: function () { return ResendDeliveryStrategy_1.ResendDeliveryStrategy; } });
3
+ exports.ResendDeliveryStrategy = exports.RESEND_CONFIG_ENTRIES = exports.RESEND_API_KEY = void 0;
6
4
  var env_1 = require("./env");
7
5
  Object.defineProperty(exports, "RESEND_API_KEY", { enumerable: true, get: function () { return env_1.RESEND_API_KEY; } });
8
6
  Object.defineProperty(exports, "RESEND_CONFIG_ENTRIES", { enumerable: true, get: function () { return env_1.RESEND_CONFIG_ENTRIES; } });
7
+ var ResendDeliveryStrategy_1 = require("./ResendDeliveryStrategy");
8
+ Object.defineProperty(exports, "ResendDeliveryStrategy", { enumerable: true, get: function () { return ResendDeliveryStrategy_1.ResendDeliveryStrategy; } });
9
9
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
2
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
3
3
  /**
4
4
  * Delivers emails via the SendGrid API.
5
5
  *
@@ -23,5 +23,5 @@ export declare class SendGridDeliveryStrategy extends DeliveryStrategyBase {
23
23
  * @param content - Email body content (plain text or HTML)
24
24
  * @param isHtml - Flag to indicate whether the email is HTML (true) or plain text (false)
25
25
  */
26
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
26
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
27
27
  }
@@ -5,9 +5,9 @@ exports.SendGridDeliveryStrategy = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const common_1 = require("@nestjs/common");
7
7
  const mail_1 = tslib_1.__importDefault(require("@sendgrid/mail"));
8
- const env_1 = require("../../env");
9
- const MailDeliveryError_1 = require("../../errors/MailDeliveryError");
10
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
8
+ const env_1 = require("../../../env");
9
+ const MailDeliveryError_1 = require("../../../errors/MailDeliveryError");
10
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
11
11
  // #endregion
12
12
  /**
13
13
  * Delivers emails via the SendGrid API.
@@ -0,0 +1,2 @@
1
+ export { SENDGRID_API_KEY, SENDGRID_CONFIG_ENTRIES } from './env';
2
+ export { SendGridDeliveryStrategy } from './SendGridDeliveryStrategy';
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SENDGRID_CONFIG_ENTRIES = exports.SENDGRID_API_KEY = exports.SendGridDeliveryStrategy = void 0;
4
- var SendGridDeliveryStrategy_1 = require("../services/strategies/SendGridDeliveryStrategy");
5
- Object.defineProperty(exports, "SendGridDeliveryStrategy", { enumerable: true, get: function () { return SendGridDeliveryStrategy_1.SendGridDeliveryStrategy; } });
3
+ exports.SendGridDeliveryStrategy = exports.SENDGRID_CONFIG_ENTRIES = exports.SENDGRID_API_KEY = void 0;
6
4
  var env_1 = require("./env");
7
5
  Object.defineProperty(exports, "SENDGRID_API_KEY", { enumerable: true, get: function () { return env_1.SENDGRID_API_KEY; } });
8
6
  Object.defineProperty(exports, "SENDGRID_CONFIG_ENTRIES", { enumerable: true, get: function () { return env_1.SENDGRID_CONFIG_ENTRIES; } });
7
+ var SendGridDeliveryStrategy_1 = require("./SendGridDeliveryStrategy");
8
+ Object.defineProperty(exports, "SendGridDeliveryStrategy", { enumerable: true, get: function () { return SendGridDeliveryStrategy_1.SendGridDeliveryStrategy; } });
9
9
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
- import { DeliveryStrategyBase } from './abstracts/DeliveryStrategyBase';
2
+ import { DeliveryStrategyBase } from '../abstracts/DeliveryStrategyBase';
3
3
  /**
4
4
  * The `SmtpDeliveryStrategy` class.
5
5
  *
@@ -24,5 +24,5 @@ export declare class SmtpDeliveryStrategy extends DeliveryStrategyBase {
24
24
  * @param content - Email body content (plain text or HTML)
25
25
  * @param isHtml - Flag to indicate whether the email is HTML (true) or plain text (false)
26
26
  */
27
- send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../models/IMailAttachment').IMailAttachment>): Promise<void>;
27
+ send(from: string, to: string, subject: string, content: string, isHtml: boolean, _attachments?: Array<import('../../../models/IMailAttachment').IMailAttachment>): Promise<void>;
28
28
  }
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.SmtpDeliveryStrategy = void 0;
5
5
  const common_1 = require("@nestjs/common");
6
6
  const nodemailer_1 = require("nodemailer");
7
- const env_1 = require("../../env");
8
- const MailDeliveryError_1 = require("../../errors/MailDeliveryError");
9
- const DeliveryStrategyBase_1 = require("./abstracts/DeliveryStrategyBase");
7
+ const env_1 = require("../../../env");
8
+ const MailDeliveryError_1 = require("../../../errors/MailDeliveryError");
9
+ const DeliveryStrategyBase_1 = require("../abstracts/DeliveryStrategyBase");
10
10
  // #endregion
11
11
  /**
12
12
  * The `SmtpDeliveryStrategy` class.
@@ -1,2 +1,2 @@
1
- export { SmtpDeliveryStrategy } from '../services/strategies/SmtpDeliveryStrategy';
2
1
  export { SMTP_CONFIG_ENTRIES, SMTP_HOST, SMTP_PASSWORD, SMTP_PORT, SMTP_SECURE, SMTP_USER } from './env';
2
+ export { SmtpDeliveryStrategy } from './SmtpDeliveryStrategy';
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SMTP_USER = exports.SMTP_SECURE = exports.SMTP_PORT = exports.SMTP_PASSWORD = exports.SMTP_HOST = exports.SMTP_CONFIG_ENTRIES = exports.SmtpDeliveryStrategy = void 0;
4
- var SmtpDeliveryStrategy_1 = require("../services/strategies/SmtpDeliveryStrategy");
5
- Object.defineProperty(exports, "SmtpDeliveryStrategy", { enumerable: true, get: function () { return SmtpDeliveryStrategy_1.SmtpDeliveryStrategy; } });
3
+ exports.SmtpDeliveryStrategy = exports.SMTP_USER = exports.SMTP_SECURE = exports.SMTP_PORT = exports.SMTP_PASSWORD = exports.SMTP_HOST = exports.SMTP_CONFIG_ENTRIES = void 0;
6
4
  var env_1 = require("./env");
7
5
  Object.defineProperty(exports, "SMTP_CONFIG_ENTRIES", { enumerable: true, get: function () { return env_1.SMTP_CONFIG_ENTRIES; } });
8
6
  Object.defineProperty(exports, "SMTP_HOST", { enumerable: true, get: function () { return env_1.SMTP_HOST; } });
@@ -10,4 +8,6 @@ Object.defineProperty(exports, "SMTP_PASSWORD", { enumerable: true, get: functio
10
8
  Object.defineProperty(exports, "SMTP_PORT", { enumerable: true, get: function () { return env_1.SMTP_PORT; } });
11
9
  Object.defineProperty(exports, "SMTP_SECURE", { enumerable: true, get: function () { return env_1.SMTP_SECURE; } });
12
10
  Object.defineProperty(exports, "SMTP_USER", { enumerable: true, get: function () { return env_1.SMTP_USER; } });
11
+ var SmtpDeliveryStrategy_1 = require("./SmtpDeliveryStrategy");
12
+ Object.defineProperty(exports, "SmtpDeliveryStrategy", { enumerable: true, get: function () { return SmtpDeliveryStrategy_1.SmtpDeliveryStrategy; } });
13
13
  //# sourceMappingURL=index.js.map
package/src/env.js CHANGED
@@ -65,7 +65,7 @@ exports.MAIL_PORT = (0, archipel_platform_configuration_1.createConfigKey)('MAIL
65
65
  /** All configuration entries required by `platform-mailing`. */
66
66
  exports.PLATFORM_MAILING_CONFIG_ENTRIES = [
67
67
  // Strategy
68
- { key: exports.MAIL_TEMPLATE_STRATEGY, required: true, description: 'Template-fetch strategy (file, blob).' },
68
+ { key: exports.MAIL_TEMPLATE_STRATEGY, required: true, description: 'Template-fetch strategy (file, blob, database).' },
69
69
  {
70
70
  key: exports.MAIL_DELIVERY_STRATEGY,
71
71
  required: true,
@@ -1,5 +1,5 @@
1
- import { OnModuleDestroy } from '@nestjs/common';
2
1
  import { EventHub } from '@breadstone/archipel-platform-core';
2
+ import { OnModuleDestroy } from '@nestjs/common';
3
3
  import { MailService } from '../../services/MailService';
4
4
  /**
5
5
  * Bridges verification email events to the {@link MailService} delivery workflow.
@@ -9,6 +9,7 @@ import { MailService } from '../../services/MailService';
9
9
  export declare class MailEventSubscriber implements OnModuleDestroy {
10
10
  private readonly _mailService;
11
11
  private readonly _subscription;
12
+ private readonly _logger;
12
13
  /**
13
14
  * Initializes a new instance of the {@link MailEventSubscriber} class.
14
15
  *
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  // #region Imports
3
+ var MailEventSubscriber_1;
3
4
  Object.defineProperty(exports, "__esModule", { value: true });
4
5
  exports.MailEventSubscriber = void 0;
5
6
  const tslib_1 = require("tslib");
6
- const common_1 = require("@nestjs/common");
7
7
  const archipel_platform_core_1 = require("@breadstone/archipel-platform-core");
8
+ const common_1 = require("@nestjs/common");
8
9
  const MailService_1 = require("../../services/MailService");
9
10
  const MailEventKeys_1 = require("../MailEventKeys");
10
11
  // #endregion
@@ -13,7 +14,7 @@ const MailEventKeys_1 = require("../MailEventKeys");
13
14
  *
14
15
  * @public
15
16
  */
16
- let MailEventSubscriber = class MailEventSubscriber {
17
+ let MailEventSubscriber = MailEventSubscriber_1 = class MailEventSubscriber {
17
18
  // #endregion
18
19
  // #region Ctor
19
20
  /**
@@ -24,11 +25,16 @@ let MailEventSubscriber = class MailEventSubscriber {
24
25
  * @param eventHub The shared event hub that emits verification email requests.
25
26
  */
26
27
  constructor(mailService, eventHub) {
28
+ this._logger = new common_1.Logger(MailEventSubscriber_1.name);
27
29
  this._mailService = mailService;
28
30
  this._subscription = eventHub.observe(MailEventKeys_1.SEND_MAIL_EVENT_KEY).subscribe({
29
31
  next: (payload) => {
32
+ this._logger.debug(`Received mail event for recipient ${(0, archipel_platform_core_1.maskSensitive)(payload.recipientEmail)} with subject "${(0, archipel_platform_core_1.maskSensitive)(payload.subject)}"`);
30
33
  void this.handle(payload);
31
34
  },
35
+ error: (err) => {
36
+ this._logger.error('Error handling mail event', err);
37
+ },
32
38
  });
33
39
  }
34
40
  // #endregion
@@ -60,7 +66,7 @@ let MailEventSubscriber = class MailEventSubscriber {
60
66
  }
61
67
  };
62
68
  exports.MailEventSubscriber = MailEventSubscriber;
63
- exports.MailEventSubscriber = MailEventSubscriber = tslib_1.__decorate([
69
+ exports.MailEventSubscriber = MailEventSubscriber = MailEventSubscriber_1 = tslib_1.__decorate([
64
70
  (0, common_1.Injectable)(),
65
71
  tslib_1.__metadata("design:paramtypes", [MailService_1.MailService, archipel_platform_core_1.EventHub])
66
72
  ], MailEventSubscriber);
package/src/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
+ export * from './delivering/strategies/abstracts/DeliveryStrategyBase';
1
2
  export * from './env';
2
3
  export * from './errors/MailDeliveryError';
3
4
  export * from './events';
4
- export * from './MailTokens';
5
+ export * from './MailModule';
5
6
  export * from './models/IMailAttachment';
7
+ export * from './models/IMailTemplate';
8
+ export * from './ports/IMailTemplateRepository';
6
9
  export * from './services/MailService';
7
10
  export * from './services/MailVerificationService';
8
11
  export * from './services/SmtpConnectionVerifier';
9
- export * from './services/strategies/abstracts/DeliveryStrategyBase';
10
12
  export * from './templating/MailTemplateEngine';
11
13
  export * from './templating/strategies/abstracts/TemplateFetchStrategyBase';
12
- export * from './tokens/MailModule';
13
- export type { IMailModuleOptions } from './tokens/MailModule';
14
+ export * from './tokens/MailTokens';
package/src/index.js CHANGED
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./delivering/strategies/abstracts/DeliveryStrategyBase"), exports);
4
5
  tslib_1.__exportStar(require("./env"), exports);
5
6
  tslib_1.__exportStar(require("./errors/MailDeliveryError"), exports);
6
7
  tslib_1.__exportStar(require("./events"), exports);
7
- tslib_1.__exportStar(require("./MailTokens"), exports);
8
+ tslib_1.__exportStar(require("./MailModule"), exports);
8
9
  tslib_1.__exportStar(require("./models/IMailAttachment"), exports);
10
+ tslib_1.__exportStar(require("./models/IMailTemplate"), exports);
11
+ tslib_1.__exportStar(require("./ports/IMailTemplateRepository"), exports);
9
12
  tslib_1.__exportStar(require("./services/MailService"), exports);
10
13
  tslib_1.__exportStar(require("./services/MailVerificationService"), exports);
11
14
  tslib_1.__exportStar(require("./services/SmtpConnectionVerifier"), exports);
12
- tslib_1.__exportStar(require("./services/strategies/abstracts/DeliveryStrategyBase"), exports);
13
15
  tslib_1.__exportStar(require("./templating/MailTemplateEngine"), exports);
14
16
  tslib_1.__exportStar(require("./templating/strategies/abstracts/TemplateFetchStrategyBase"), exports);
15
- tslib_1.__exportStar(require("./tokens/MailModule"), exports);
17
+ tslib_1.__exportStar(require("./tokens/MailTokens"), exports);
16
18
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Represents a single mail template record stored in a persistent store.
3
+ *
4
+ * @public
5
+ */
6
+ export interface IMailTemplate {
7
+ /**
8
+ * Unique template key used to identify this template (e.g. `AuthRegister`, `AppointmentInvitation`).
9
+ */
10
+ readonly key: string;
11
+ /**
12
+ * Locale identifier (e.g. `de`, `en`). Used for multi-language support.
13
+ * When `undefined`, it is the default/fallback template.
14
+ */
15
+ readonly locale?: string;
16
+ /**
17
+ * Default subject line for this template.
18
+ * Can contain placeholders (e.g. `{{appName}}`).
19
+ */
20
+ readonly subject: string;
21
+ /**
22
+ * HTML body of the template. Contains Handlebars-style placeholders.
23
+ */
24
+ readonly htmlBody?: string;
25
+ /**
26
+ * Plain-text body of the template. Contains Handlebars-style placeholders.
27
+ */
28
+ readonly txtBody?: string;
29
+ /**
30
+ * Human-readable description of this template's purpose.
31
+ */
32
+ readonly description?: string;
33
+ /**
34
+ * List of placeholder names expected by this template (for documentation/validation).
35
+ */
36
+ readonly placeholders?: ReadonlyArray<string>;
37
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IMailTemplate.js.map
@@ -0,0 +1,39 @@
1
+ import type { IMailTemplate } from '../models/IMailTemplate';
2
+ /**
3
+ * Port interface for mail template persistence.
4
+ *
5
+ * Applications must implement this interface and register the implementation
6
+ * via the `MAIL_TEMPLATE_REPOSITORY_TOKEN` when using the `database` template strategy.
7
+ *
8
+ * @public
9
+ */
10
+ export interface IMailTemplateRepository {
11
+ /**
12
+ * Finds a template by its unique key and optional locale.
13
+ * When no locale is provided, returns the default (locale-agnostic) template.
14
+ *
15
+ * @param key - The template key (e.g. `AuthRegister`).
16
+ * @param locale - Optional locale identifier (e.g. `de`, `en`).
17
+ * @returns The matching template, or `undefined` if not found.
18
+ */
19
+ findByKey(key: string, locale?: string): Promise<IMailTemplate | undefined>;
20
+ /**
21
+ * Returns all templates available in the store.
22
+ */
23
+ findAll(): Promise<Array<IMailTemplate>>;
24
+ /**
25
+ * Creates or updates a template. Upsert semantics: if a template with the
26
+ * same `key` and `locale` exists, it is overwritten.
27
+ *
28
+ * @param template - The template to persist.
29
+ * @returns The persisted template.
30
+ */
31
+ upsert(template: IMailTemplate): Promise<IMailTemplate>;
32
+ /**
33
+ * Deletes a template by key and locale.
34
+ *
35
+ * @param key - The template key.
36
+ * @param locale - Optional locale. When omitted, deletes the default template.
37
+ */
38
+ delete(key: string, locale?: string): Promise<void>;
39
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IMailTemplateRepository.js.map
@@ -1,7 +1,7 @@
1
1
  import { ConfigService } from '@breadstone/archipel-platform-configuration';
2
+ import { DeliveryStrategyBase } from '../delivering/strategies/abstracts/DeliveryStrategyBase';
2
3
  import { type IMailAttachment } from '../models/IMailAttachment';
3
4
  import { MailTemplateEngine } from '../templating/MailTemplateEngine';
4
- import { DeliveryStrategyBase } from './strategies/abstracts/DeliveryStrategyBase';
5
5
  /**
6
6
  * Represents the `MailService` class.
7
7
  *
@@ -5,11 +5,11 @@ exports.MailService = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const archipel_platform_configuration_1 = require("@breadstone/archipel-platform-configuration");
7
7
  const common_1 = require("@nestjs/common");
8
+ const DeliveryStrategyBase_1 = require("../delivering/strategies/abstracts/DeliveryStrategyBase");
8
9
  const env_1 = require("../env");
9
10
  const IMailAttachment_1 = require("../models/IMailAttachment");
10
- const MailTokens_1 = require("../MailTokens");
11
11
  const MailTemplateEngine_1 = require("../templating/MailTemplateEngine");
12
- const DeliveryStrategyBase_1 = require("./strategies/abstracts/DeliveryStrategyBase");
12
+ const MailTokens_1 = require("../tokens/MailTokens");
13
13
  // #endregion
14
14
  /**
15
15
  * Represents the `MailService` class.
@@ -1,6 +1,6 @@
1
1
  import { ContentTemplateEngine } from '@breadstone/archipel-platform-core';
2
2
  import { OnModuleInit } from '@nestjs/common';
3
- import { MailTemplateFormat } from '../MailTokens';
3
+ import { MailTemplateFormat } from '../tokens/MailTokens';
4
4
  import { TemplateFetchStrategyBase } from './strategies/abstracts/TemplateFetchStrategyBase';
5
5
  /**
6
6
  * The `MailTemplateEngine` class.
@@ -5,7 +5,7 @@ exports.MailTemplateEngine = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const archipel_platform_core_1 = require("@breadstone/archipel-platform-core");
7
7
  const common_1 = require("@nestjs/common");
8
- const MailTokens_1 = require("../MailTokens");
8
+ const MailTokens_1 = require("../tokens/MailTokens");
9
9
  const TemplateFetchStrategyBase_1 = require("./strategies/abstracts/TemplateFetchStrategyBase");
10
10
  // #endregion
11
11
  /**
@@ -1,6 +1,6 @@
1
1
  import { BlobService } from '@breadstone/archipel-platform-blob-storage';
2
- import { IMailTemplateVariants } from '../../MailTokens';
3
- import { TemplateFetchStrategyBase } from './abstracts/TemplateFetchStrategyBase';
2
+ import { IMailTemplateVariants } from '../../../tokens/MailTokens';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
4
  /**
5
5
  * The `BlobTemplateFetchStrategy` class.
6
6
  *
@@ -5,7 +5,7 @@ exports.BlobTemplateFetchStrategy = void 0;
5
5
  const archipel_platform_blob_storage_1 = require("@breadstone/archipel-platform-blob-storage");
6
6
  const common_1 = require("@nestjs/common");
7
7
  const node_path_1 = require("node:path");
8
- const TemplateFetchStrategyBase_1 = require("./abstracts/TemplateFetchStrategyBase");
8
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
9
9
  // #endregion
10
10
  /**
11
11
  * The `BlobTemplateFetchStrategy` class.
@@ -0,0 +1 @@
1
+ export { BlobTemplateFetchStrategy } from './BlobTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlobTemplateFetchStrategy = void 0;
4
+ var BlobTemplateFetchStrategy_1 = require("./BlobTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "BlobTemplateFetchStrategy", { enumerable: true, get: function () { return BlobTemplateFetchStrategy_1.BlobTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,26 @@
1
+ import type { IMailTemplateRepository } from '../../../ports/IMailTemplateRepository';
2
+ import type { IMailTemplateVariants } from '../../../tokens/MailTokens';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
+ /**
5
+ * Template fetch strategy that loads templates from a database via the
6
+ * {@link IMailTemplateRepository} port.
7
+ *
8
+ * Applications provide the concrete repository implementation at module
9
+ * registration time. This strategy loads all templates on module init
10
+ * and caches them in-memory.
11
+ *
12
+ * @public
13
+ */
14
+ export declare class DatabaseTemplateFetchStrategy extends TemplateFetchStrategyBase {
15
+ private readonly _repository;
16
+ private readonly _logger;
17
+ constructor(repository: IMailTemplateRepository);
18
+ /**
19
+ * Loads all templates from the database and returns them grouped by key.
20
+ * Only the default locale (no locale or first match) is loaded into the
21
+ * in-memory cache used by `MailTemplateEngine`.
22
+ *
23
+ * @public
24
+ */
25
+ load(): Promise<Record<string, IMailTemplateVariants>>;
26
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ // #region Imports
3
+ var DatabaseTemplateFetchStrategy_1;
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.DatabaseTemplateFetchStrategy = void 0;
6
+ const tslib_1 = require("tslib");
7
+ const common_1 = require("@nestjs/common");
8
+ const MailTokens_1 = require("../../../tokens/MailTokens");
9
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
10
+ // #endregion
11
+ /**
12
+ * Template fetch strategy that loads templates from a database via the
13
+ * {@link IMailTemplateRepository} port.
14
+ *
15
+ * Applications provide the concrete repository implementation at module
16
+ * registration time. This strategy loads all templates on module init
17
+ * and caches them in-memory.
18
+ *
19
+ * @public
20
+ */
21
+ let DatabaseTemplateFetchStrategy = DatabaseTemplateFetchStrategy_1 = class DatabaseTemplateFetchStrategy extends TemplateFetchStrategyBase_1.TemplateFetchStrategyBase {
22
+ // #endregion
23
+ // #region Ctor
24
+ constructor(repository) {
25
+ super();
26
+ this._logger = new common_1.Logger(DatabaseTemplateFetchStrategy_1.name);
27
+ this._repository = repository;
28
+ }
29
+ // #endregion
30
+ // #region Methods
31
+ /**
32
+ * Loads all templates from the database and returns them grouped by key.
33
+ * Only the default locale (no locale or first match) is loaded into the
34
+ * in-memory cache used by `MailTemplateEngine`.
35
+ *
36
+ * @public
37
+ */
38
+ async load() {
39
+ const templates = {};
40
+ const allTemplates = await this._repository.findAll();
41
+ for (const template of allTemplates) {
42
+ const key = template.key;
43
+ if (!templates[key]) {
44
+ templates[key] = {};
45
+ }
46
+ // Only set if not already filled (first match wins — default locale preferred)
47
+ if (template.htmlBody && !templates[key].html) {
48
+ templates[key].html = template.htmlBody;
49
+ }
50
+ if (template.txtBody && !templates[key].txt) {
51
+ templates[key].txt = template.txtBody;
52
+ }
53
+ }
54
+ const templateCount = Object.keys(templates).length;
55
+ this._logger.log(`${templateCount} template(s) loaded from database`);
56
+ return templates;
57
+ }
58
+ };
59
+ exports.DatabaseTemplateFetchStrategy = DatabaseTemplateFetchStrategy;
60
+ exports.DatabaseTemplateFetchStrategy = DatabaseTemplateFetchStrategy = DatabaseTemplateFetchStrategy_1 = tslib_1.__decorate([
61
+ (0, common_1.Injectable)(),
62
+ tslib_1.__param(0, (0, common_1.Inject)(MailTokens_1.MAIL_TEMPLATE_REPOSITORY_TOKEN)),
63
+ tslib_1.__metadata("design:paramtypes", [Object])
64
+ ], DatabaseTemplateFetchStrategy);
65
+ //# sourceMappingURL=DatabaseTemplateFetchStrategy.js.map
@@ -0,0 +1 @@
1
+ export { DatabaseTemplateFetchStrategy } from './DatabaseTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseTemplateFetchStrategy = void 0;
4
+ var DatabaseTemplateFetchStrategy_1 = require("./DatabaseTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "DatabaseTemplateFetchStrategy", { enumerable: true, get: function () { return DatabaseTemplateFetchStrategy_1.DatabaseTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
1
  import { ResourceManager } from '@breadstone/archipel-platform-resources';
2
- import { TemplateFetchStrategyBase } from './abstracts/TemplateFetchStrategyBase';
3
- import { IMailTemplateVariants } from '../../MailTokens';
2
+ import { IMailTemplateVariants } from '../../../tokens/MailTokens';
3
+ import { TemplateFetchStrategyBase } from '../abstracts/TemplateFetchStrategyBase';
4
4
  /**
5
5
  * The `FileTemplateFetchStrategy` class.
6
6
  *
@@ -4,9 +4,9 @@ var FileTemplateFetchStrategy_1;
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.FileTemplateFetchStrategy = void 0;
6
6
  const tslib_1 = require("tslib");
7
- const common_1 = require("@nestjs/common");
8
7
  const archipel_platform_resources_1 = require("@breadstone/archipel-platform-resources");
9
- const TemplateFetchStrategyBase_1 = require("./abstracts/TemplateFetchStrategyBase");
8
+ const common_1 = require("@nestjs/common");
9
+ const TemplateFetchStrategyBase_1 = require("../abstracts/TemplateFetchStrategyBase");
10
10
  // #endregion
11
11
  /**
12
12
  * The `FileTemplateFetchStrategy` class.
@@ -0,0 +1 @@
1
+ export { FileTemplateFetchStrategy } from './FileTemplateFetchStrategy';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileTemplateFetchStrategy = void 0;
4
+ var FileTemplateFetchStrategy_1 = require("./FileTemplateFetchStrategy");
5
+ Object.defineProperty(exports, "FileTemplateFetchStrategy", { enumerable: true, get: function () { return FileTemplateFetchStrategy_1.FileTemplateFetchStrategy; } });
6
+ //# sourceMappingURL=index.js.map
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export declare const MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN: unique symbol;
7
7
  export declare const MAIL_DELIVERY_STRATEGY_TOKEN: unique symbol;
8
+ export declare const MAIL_TEMPLATE_REPOSITORY_TOKEN: unique symbol;
8
9
  /**
9
10
  * Union type of all supported template formats.
10
11
  */
@@ -7,7 +7,8 @@
7
7
  */
8
8
  // #endregion
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.MAIL_DELIVERY_STRATEGY_TOKEN = exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = void 0;
10
+ exports.MAIL_TEMPLATE_REPOSITORY_TOKEN = exports.MAIL_DELIVERY_STRATEGY_TOKEN = exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = void 0;
11
11
  exports.MAIL_TEMPLATE_FETCH_STRATEGY_TOKEN = Symbol('MailTemplateFetchStrategy');
12
12
  exports.MAIL_DELIVERY_STRATEGY_TOKEN = Symbol('MailDeliveryStrategy');
13
+ exports.MAIL_TEMPLATE_REPOSITORY_TOKEN = Symbol('MailTemplateRepository');
13
14
  //# sourceMappingURL=MailTokens.js.map
@@ -1 +0,0 @@
1
- export { LogDeliveryStrategy } from '../services/strategies/LogDeliveryStrategy';
@@ -1,2 +0,0 @@
1
- export { MailgunDeliveryStrategy } from '../services/strategies/MailgunDeliveryStrategy';
2
- export { MAILGUN_API_KEY, MAILGUN_CONFIG_ENTRIES, MAILGUN_DOMAIN } from './env';
@@ -1,2 +0,0 @@
1
- export { PostmarkDeliveryStrategy } from '../services/strategies/PostmarkDeliveryStrategy';
2
- export { POSTMARK_API_KEY, POSTMARK_CONFIG_ENTRIES } from './env';
@@ -1,2 +0,0 @@
1
- export { ResendDeliveryStrategy } from '../services/strategies/ResendDeliveryStrategy';
2
- export { RESEND_API_KEY, RESEND_CONFIG_ENTRIES } from './env';
@@ -1,2 +0,0 @@
1
- export { SendGridDeliveryStrategy } from '../services/strategies/SendGridDeliveryStrategy';
2
- export { SENDGRID_API_KEY, SENDGRID_CONFIG_ENTRIES } from './env';
File without changes