@flusys/nestjs-email 1.0.0-rc

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 (131) hide show
  1. package/README.md +552 -0
  2. package/cjs/config/email-config.service.js +81 -0
  3. package/cjs/config/email.constants.js +22 -0
  4. package/cjs/config/index.js +19 -0
  5. package/cjs/controllers/email-config.controller.js +101 -0
  6. package/cjs/controllers/email-send.controller.js +142 -0
  7. package/cjs/controllers/email-template.controller.js +128 -0
  8. package/cjs/controllers/index.js +20 -0
  9. package/cjs/docs/email-swagger.config.js +176 -0
  10. package/cjs/docs/index.js +11 -0
  11. package/cjs/dtos/email-config.dto.js +238 -0
  12. package/cjs/dtos/email-send.dto.js +444 -0
  13. package/cjs/dtos/email-template.dto.js +283 -0
  14. package/cjs/dtos/index.js +20 -0
  15. package/cjs/entities/email-config-base.entity.js +111 -0
  16. package/cjs/entities/email-config-with-company.entity.js +63 -0
  17. package/cjs/entities/email-config.entity.js +25 -0
  18. package/cjs/entities/email-template-base.entity.js +133 -0
  19. package/cjs/entities/email-template-with-company.entity.js +65 -0
  20. package/cjs/entities/email-template.entity.js +30 -0
  21. package/cjs/entities/index.js +41 -0
  22. package/cjs/enums/email-provider-type.enum.js +18 -0
  23. package/cjs/enums/index.js +18 -0
  24. package/cjs/index.js +28 -0
  25. package/cjs/interfaces/email-config.interface.js +4 -0
  26. package/cjs/interfaces/email-module-options.interface.js +4 -0
  27. package/cjs/interfaces/email-provider.interface.js +4 -0
  28. package/cjs/interfaces/email-template.interface.js +4 -0
  29. package/cjs/interfaces/index.js +21 -0
  30. package/cjs/modules/email.module.js +161 -0
  31. package/cjs/modules/index.js +18 -0
  32. package/cjs/providers/email-factory.service.js +144 -0
  33. package/cjs/providers/email-provider.registry.js +41 -0
  34. package/cjs/providers/index.js +22 -0
  35. package/cjs/providers/mailgun-provider.js +107 -0
  36. package/cjs/providers/sendgrid-provider.js +135 -0
  37. package/cjs/providers/smtp-provider.js +166 -0
  38. package/cjs/services/email-datasource.provider.js +187 -0
  39. package/cjs/services/email-provider-config.service.js +150 -0
  40. package/cjs/services/email-send.service.js +211 -0
  41. package/cjs/services/email-template.service.js +158 -0
  42. package/cjs/services/index.js +21 -0
  43. package/cjs/utils/email-templates.util.js +129 -0
  44. package/cjs/utils/index.js +18 -0
  45. package/config/email-config.service.d.ts +16 -0
  46. package/config/email.constants.d.ts +2 -0
  47. package/config/index.d.ts +2 -0
  48. package/controllers/email-config.controller.d.ts +17 -0
  49. package/controllers/email-send.controller.d.ts +11 -0
  50. package/controllers/email-template.controller.d.ts +25 -0
  51. package/controllers/index.d.ts +3 -0
  52. package/docs/email-swagger.config.d.ts +3 -0
  53. package/docs/index.d.ts +1 -0
  54. package/dtos/email-config.dto.d.ts +30 -0
  55. package/dtos/email-send.dto.d.ts +46 -0
  56. package/dtos/email-template.dto.d.ts +39 -0
  57. package/dtos/index.d.ts +3 -0
  58. package/entities/email-config-base.entity.d.ts +11 -0
  59. package/entities/email-config-with-company.entity.d.ts +4 -0
  60. package/entities/email-config.entity.d.ts +3 -0
  61. package/entities/email-template-base.entity.d.ts +14 -0
  62. package/entities/email-template-with-company.entity.d.ts +4 -0
  63. package/entities/email-template.entity.d.ts +3 -0
  64. package/entities/index.d.ts +7 -0
  65. package/enums/email-provider-type.enum.d.ts +5 -0
  66. package/enums/index.d.ts +1 -0
  67. package/fesm/config/email-config.service.js +71 -0
  68. package/fesm/config/email.constants.js +4 -0
  69. package/fesm/config/index.js +2 -0
  70. package/fesm/controllers/email-config.controller.js +91 -0
  71. package/fesm/controllers/email-send.controller.js +132 -0
  72. package/fesm/controllers/email-template.controller.js +118 -0
  73. package/fesm/controllers/index.js +3 -0
  74. package/fesm/docs/email-swagger.config.js +172 -0
  75. package/fesm/docs/index.js +1 -0
  76. package/fesm/dtos/email-config.dto.js +217 -0
  77. package/fesm/dtos/email-send.dto.js +414 -0
  78. package/fesm/dtos/email-template.dto.js +262 -0
  79. package/fesm/dtos/index.js +3 -0
  80. package/fesm/entities/email-config-base.entity.js +101 -0
  81. package/fesm/entities/email-config-with-company.entity.js +53 -0
  82. package/fesm/entities/email-config.entity.js +15 -0
  83. package/fesm/entities/email-template-base.entity.js +123 -0
  84. package/fesm/entities/email-template-with-company.entity.js +55 -0
  85. package/fesm/entities/email-template.entity.js +20 -0
  86. package/fesm/entities/index.js +20 -0
  87. package/fesm/enums/email-provider-type.enum.js +8 -0
  88. package/fesm/enums/index.js +1 -0
  89. package/fesm/index.js +11 -0
  90. package/fesm/interfaces/email-config.interface.js +1 -0
  91. package/fesm/interfaces/email-module-options.interface.js +1 -0
  92. package/fesm/interfaces/email-provider.interface.js +1 -0
  93. package/fesm/interfaces/email-template.interface.js +1 -0
  94. package/fesm/interfaces/index.js +4 -0
  95. package/fesm/modules/email.module.js +151 -0
  96. package/fesm/modules/index.js +1 -0
  97. package/fesm/providers/email-factory.service.js +93 -0
  98. package/fesm/providers/email-provider.registry.js +31 -0
  99. package/fesm/providers/index.js +5 -0
  100. package/fesm/providers/mailgun-provider.js +97 -0
  101. package/fesm/providers/sendgrid-provider.js +125 -0
  102. package/fesm/providers/smtp-provider.js +115 -0
  103. package/fesm/services/email-datasource.provider.js +136 -0
  104. package/fesm/services/email-provider-config.service.js +140 -0
  105. package/fesm/services/email-send.service.js +201 -0
  106. package/fesm/services/email-template.service.js +148 -0
  107. package/fesm/services/index.js +4 -0
  108. package/fesm/utils/email-templates.util.js +111 -0
  109. package/fesm/utils/index.js +1 -0
  110. package/index.d.ts +10 -0
  111. package/interfaces/email-config.interface.d.ts +34 -0
  112. package/interfaces/email-module-options.interface.d.ts +25 -0
  113. package/interfaces/email-provider.interface.d.ts +34 -0
  114. package/interfaces/email-template.interface.d.ts +64 -0
  115. package/interfaces/index.d.ts +4 -0
  116. package/modules/email.module.d.ts +9 -0
  117. package/modules/index.d.ts +1 -0
  118. package/package.json +105 -0
  119. package/providers/email-factory.service.d.ts +14 -0
  120. package/providers/email-provider.registry.d.ts +10 -0
  121. package/providers/index.d.ts +5 -0
  122. package/providers/mailgun-provider.d.ts +11 -0
  123. package/providers/sendgrid-provider.d.ts +11 -0
  124. package/providers/smtp-provider.d.ts +11 -0
  125. package/services/email-datasource.provider.d.ts +25 -0
  126. package/services/email-provider-config.service.d.ts +32 -0
  127. package/services/email-send.service.d.ts +20 -0
  128. package/services/email-template.service.d.ts +31 -0
  129. package/services/index.d.ts +4 -0
  130. package/utils/email-templates.util.d.ts +2 -0
  131. package/utils/index.d.ts +1 -0
@@ -0,0 +1,16 @@
1
+ import { DatabaseMode } from '@flusys/nestjs-core';
2
+ import { IModuleConfigService } from '@flusys/nestjs-shared/interfaces';
3
+ import { EmailModuleOptions } from '../interfaces';
4
+ export declare class EmailConfigService implements IModuleConfigService {
5
+ private readonly options;
6
+ constructor(options: EmailModuleOptions);
7
+ isCompanyFeatureEnabled(): boolean;
8
+ getDatabaseMode(): DatabaseMode;
9
+ isMultiTenant(): boolean;
10
+ getRateLimitPerMinute(): number;
11
+ isLoggingEnabled(): boolean;
12
+ getDefaultProvider(): string | undefined;
13
+ getDefaultFromName(): string;
14
+ getDefaultDatabaseConfig(): import("@flusys/nestjs-core").IDatabaseConfig;
15
+ getOptions(): EmailModuleOptions;
16
+ }
@@ -0,0 +1,2 @@
1
+ export declare const EMAIL_MODULE_OPTIONS = "EMAIL_MODULE_OPTIONS";
2
+ export declare const DEFAULT_FROM_NAME = "FLUSYS";
@@ -0,0 +1,2 @@
1
+ export * from './email.constants';
2
+ export * from './email-config.service';
@@ -0,0 +1,17 @@
1
+ import { CreateEmailConfigDto, EmailConfigResponseDto, UpdateEmailConfigDto } from '../dtos';
2
+ import { EmailProviderConfigService } from '../services';
3
+ declare const EmailConfigController_base: abstract new (service: EmailProviderConfigService) => {
4
+ service: EmailProviderConfigService;
5
+ insert(addDto: CreateEmailConfigDto, user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailConfigResponseDto>>;
6
+ insertMany(addDto: CreateEmailConfigDto[], user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<EmailConfigResponseDto>>;
7
+ getById(id: string, body: import("@flusys/nestjs-shared/dtos").GetByIdBodyDto, user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailConfigResponseDto>>;
8
+ update(updateDto: UpdateEmailConfigDto, user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailConfigResponseDto>>;
9
+ updateMany(updateDtos: UpdateEmailConfigDto[], user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<EmailConfigResponseDto>>;
10
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared/dtos").FilterAndPaginationDto, user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared/dtos").ListResponseDto<EmailConfigResponseDto>>;
11
+ delete(deleteDto: import("@flusys/nestjs-shared/dtos").DeleteDto, user: import("@flusys/nestjs-shared/interfaces").ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").MessageResponseDto>;
12
+ };
13
+ export declare class EmailConfigController extends EmailConfigController_base {
14
+ emailConfigService: EmailProviderConfigService;
15
+ constructor(emailConfigService: EmailProviderConfigService);
16
+ }
17
+ export {};
@@ -0,0 +1,11 @@
1
+ import { SingleResponseDto } from '@flusys/nestjs-shared/dtos';
2
+ import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
3
+ import { EmailSendResultDto, SendEmailDto, SendTemplateEmailDto, TestEmailDto } from '../dtos';
4
+ import { EmailSendService } from '../services';
5
+ export declare class EmailSendController {
6
+ private readonly emailSendService;
7
+ constructor(emailSendService: EmailSendService);
8
+ sendEmail(dto: SendEmailDto, user: ILoggedUserInfo): Promise<SingleResponseDto<EmailSendResultDto>>;
9
+ sendTemplateEmail(dto: SendTemplateEmailDto, user: ILoggedUserInfo): Promise<SingleResponseDto<EmailSendResultDto>>;
10
+ sendTestEmail(dto: TestEmailDto, user: ILoggedUserInfo): Promise<SingleResponseDto<EmailSendResultDto>>;
11
+ }
@@ -0,0 +1,25 @@
1
+ import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
2
+ import { CreateEmailTemplateDto, EmailTemplateResponseDto, UpdateEmailTemplateDto } from '../dtos';
3
+ import { IEmailTemplate } from '../interfaces';
4
+ import { EmailTemplateService } from '../services';
5
+ declare const EmailTemplateController_base: abstract new (service: EmailTemplateService) => {
6
+ service: EmailTemplateService;
7
+ insert(addDto: CreateEmailTemplateDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailTemplateResponseDto>>;
8
+ insertMany(addDto: CreateEmailTemplateDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<EmailTemplateResponseDto>>;
9
+ getById(id: string, body: import("@flusys/nestjs-shared/dtos").GetByIdBodyDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailTemplateResponseDto>>;
10
+ update(updateDto: UpdateEmailTemplateDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").SingleResponseDto<EmailTemplateResponseDto>>;
11
+ updateMany(updateDtos: UpdateEmailTemplateDto[], user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").BulkResponseDto<EmailTemplateResponseDto>>;
12
+ getAll(filterAndPaginationDto: import("@flusys/nestjs-shared/dtos").FilterAndPaginationDto, user: ILoggedUserInfo | null, search?: string): Promise<import("@flusys/nestjs-shared/dtos").ListResponseDto<EmailTemplateResponseDto>>;
13
+ delete(deleteDto: import("@flusys/nestjs-shared/dtos").DeleteDto, user: ILoggedUserInfo | null): Promise<import("@flusys/nestjs-shared/dtos").MessageResponseDto>;
14
+ };
15
+ export declare class EmailTemplateController extends EmailTemplateController_base {
16
+ emailTemplateService: EmailTemplateService;
17
+ constructor(emailTemplateService: EmailTemplateService);
18
+ getBySlug(body: {
19
+ slug: string;
20
+ }, user: ILoggedUserInfo): Promise<{
21
+ success: boolean;
22
+ data: IEmailTemplate | null;
23
+ }>;
24
+ }
25
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './email-config.controller';
2
+ export * from './email-template.controller';
3
+ export * from './email-send.controller';
@@ -0,0 +1,3 @@
1
+ import { IBootstrapAppConfig } from '@flusys/nestjs-core';
2
+ import { IModuleSwaggerOptions } from '@flusys/nestjs-core/docs';
3
+ export declare function emailSwaggerConfig(bootstrapConfig?: IBootstrapAppConfig): IModuleSwaggerOptions;
@@ -0,0 +1 @@
1
+ export { emailSwaggerConfig } from './email-swagger.config';
@@ -0,0 +1,30 @@
1
+ import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
2
+ import { EmailProviderTypeEnum } from '../enums';
3
+ export declare class CreateEmailConfigDto {
4
+ name: string;
5
+ provider: EmailProviderTypeEnum;
6
+ config: Record<string, any>;
7
+ fromEmail?: string;
8
+ fromName?: string;
9
+ isActive?: boolean;
10
+ isDefault?: boolean;
11
+ }
12
+ export declare class UpdateEmailConfigDto {
13
+ id: string;
14
+ name?: string;
15
+ provider?: EmailProviderTypeEnum;
16
+ config?: Record<string, any>;
17
+ fromEmail?: string;
18
+ fromName?: string;
19
+ isActive?: boolean;
20
+ isDefault?: boolean;
21
+ }
22
+ export declare class EmailConfigResponseDto extends IdentityResponseDto {
23
+ name: string;
24
+ provider: EmailProviderTypeEnum;
25
+ config: Record<string, any>;
26
+ fromEmail: string | null;
27
+ fromName: string | null;
28
+ isActive: boolean;
29
+ isDefault: boolean;
30
+ }
@@ -0,0 +1,46 @@
1
+ import { ValidationArguments, ValidatorConstraintInterface } from 'class-validator';
2
+ export declare class IsEmailOrEmailArrayConstraint implements ValidatorConstraintInterface {
3
+ private readonly emailRegex;
4
+ validate(value: unknown): boolean;
5
+ defaultMessage(args: ValidationArguments): string;
6
+ }
7
+ export declare class EmailAttachmentDto {
8
+ filename: string;
9
+ content: string;
10
+ contentType?: string;
11
+ }
12
+ export declare class SendEmailDto {
13
+ to: string | string[];
14
+ cc?: string | string[];
15
+ bcc?: string | string[];
16
+ subject: string;
17
+ html: string;
18
+ text?: string;
19
+ from?: string;
20
+ fromName?: string;
21
+ replyTo?: string;
22
+ emailConfigId?: string;
23
+ attachments?: EmailAttachmentDto[];
24
+ }
25
+ export declare class SendTemplateEmailDto {
26
+ templateId?: string;
27
+ templateSlug?: string;
28
+ to: string | string[];
29
+ cc?: string | string[];
30
+ bcc?: string | string[];
31
+ variables?: Record<string, any>;
32
+ from?: string;
33
+ fromName?: string;
34
+ replyTo?: string;
35
+ emailConfigId?: string;
36
+ attachments?: EmailAttachmentDto[];
37
+ }
38
+ export declare class TestEmailDto {
39
+ emailConfigId: string;
40
+ recipient: string;
41
+ }
42
+ export declare class EmailSendResultDto {
43
+ success: boolean;
44
+ messageId?: string;
45
+ error?: string;
46
+ }
@@ -0,0 +1,39 @@
1
+ import { IdentityResponseDto } from '@flusys/nestjs-shared/dtos';
2
+ export declare class CreateEmailTemplateDto {
3
+ name: string;
4
+ slug: string;
5
+ description?: string;
6
+ subject: string;
7
+ schema: Record<string, unknown>;
8
+ htmlContent: string;
9
+ textContent?: string;
10
+ isActive?: boolean;
11
+ isHtml?: boolean;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ export declare class UpdateEmailTemplateDto {
15
+ id: string;
16
+ name?: string;
17
+ slug?: string;
18
+ description?: string;
19
+ subject?: string;
20
+ schema?: Record<string, unknown>;
21
+ htmlContent?: string;
22
+ textContent?: string;
23
+ isActive?: boolean;
24
+ isHtml?: boolean;
25
+ metadata?: Record<string, unknown>;
26
+ }
27
+ export declare class EmailTemplateResponseDto extends IdentityResponseDto {
28
+ name: string;
29
+ slug: string;
30
+ description: string | null;
31
+ subject: string;
32
+ schema: Record<string, unknown>;
33
+ htmlContent: string;
34
+ textContent: string | null;
35
+ schemaVersion: number;
36
+ isActive: boolean;
37
+ isHtml: boolean;
38
+ metadata: Record<string, unknown> | null;
39
+ }
@@ -0,0 +1,3 @@
1
+ export * from './email-config.dto';
2
+ export * from './email-template.dto';
3
+ export * from './email-send.dto';
@@ -0,0 +1,11 @@
1
+ import { Identity } from '@flusys/nestjs-shared/entities';
2
+ import { EmailProviderTypeEnum } from '../enums';
3
+ export declare abstract class EmailConfigBase extends Identity {
4
+ name: string;
5
+ provider: EmailProviderTypeEnum;
6
+ config: Record<string, any>;
7
+ fromEmail: string | null;
8
+ fromName: string | null;
9
+ isActive: boolean;
10
+ isDefault: boolean;
11
+ }
@@ -0,0 +1,4 @@
1
+ import { EmailConfigBase } from './email-config-base.entity';
2
+ export declare class EmailConfigWithCompany extends EmailConfigBase {
3
+ companyId: string | null;
4
+ }
@@ -0,0 +1,3 @@
1
+ import { EmailConfigBase } from './email-config-base.entity';
2
+ export declare class EmailConfig extends EmailConfigBase {
3
+ }
@@ -0,0 +1,14 @@
1
+ import { Identity } from '@flusys/nestjs-shared/entities';
2
+ export declare abstract class EmailTemplateBase extends Identity {
3
+ name: string;
4
+ slug: string;
5
+ description: string | null;
6
+ subject: string;
7
+ schema: Record<string, unknown>;
8
+ htmlContent: string;
9
+ textContent: string | null;
10
+ schemaVersion: number;
11
+ isActive: boolean;
12
+ isHtml: boolean;
13
+ metadata: Record<string, unknown> | null;
14
+ }
@@ -0,0 +1,4 @@
1
+ import { EmailTemplateBase } from './email-template-base.entity';
2
+ export declare class EmailTemplateWithCompany extends EmailTemplateBase {
3
+ companyId: string | null;
4
+ }
@@ -0,0 +1,3 @@
1
+ import { EmailTemplateBase } from './email-template-base.entity';
2
+ export declare class EmailTemplate extends EmailTemplateBase {
3
+ }
@@ -0,0 +1,7 @@
1
+ export * from './email-config-base.entity';
2
+ export * from './email-config.entity';
3
+ export * from './email-config-with-company.entity';
4
+ export * from './email-template-base.entity';
5
+ export * from './email-template.entity';
6
+ export * from './email-template-with-company.entity';
7
+ export declare function getEmailEntitiesByConfig(enableCompanyFeature: boolean): any[];
@@ -0,0 +1,5 @@
1
+ export declare enum EmailProviderTypeEnum {
2
+ SMTP = "smtp",
3
+ SENDGRID = "sendgrid",
4
+ MAILGUN = "mailgun"
5
+ }
@@ -0,0 +1 @@
1
+ export * from './email-provider-type.enum';
@@ -0,0 +1,71 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ function _ts_decorate(decorators, target, key, desc) {
15
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
19
+ }
20
+ function _ts_metadata(k, v) {
21
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
+ }
23
+ function _ts_param(paramIndex, decorator) {
24
+ return function(target, key) {
25
+ decorator(target, key, paramIndex);
26
+ };
27
+ }
28
+ import { Inject, Injectable } from '@nestjs/common';
29
+ import { EmailModuleOptions } from '../interfaces';
30
+ import { EMAIL_MODULE_OPTIONS, DEFAULT_FROM_NAME } from './email.constants';
31
+ export class EmailConfigService {
32
+ isCompanyFeatureEnabled() {
33
+ return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
34
+ }
35
+ getDatabaseMode() {
36
+ return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
37
+ }
38
+ isMultiTenant() {
39
+ return this.getDatabaseMode() === 'multi-tenant';
40
+ }
41
+ getRateLimitPerMinute() {
42
+ return this.options.config?.rateLimitPerMinute ?? 60;
43
+ }
44
+ isLoggingEnabled() {
45
+ return this.options.config?.enableLogging ?? false;
46
+ }
47
+ getDefaultProvider() {
48
+ return this.options.config?.defaultProvider;
49
+ }
50
+ getDefaultFromName() {
51
+ return DEFAULT_FROM_NAME;
52
+ }
53
+ getDefaultDatabaseConfig() {
54
+ return this.options.config?.defaultDatabaseConfig;
55
+ }
56
+ getOptions() {
57
+ return this.options;
58
+ }
59
+ constructor(options){
60
+ _define_property(this, "options", void 0);
61
+ this.options = options;
62
+ }
63
+ }
64
+ EmailConfigService = _ts_decorate([
65
+ Injectable(),
66
+ _ts_param(0, Inject(EMAIL_MODULE_OPTIONS)),
67
+ _ts_metadata("design:type", Function),
68
+ _ts_metadata("design:paramtypes", [
69
+ typeof EmailModuleOptions === "undefined" ? Object : EmailModuleOptions
70
+ ])
71
+ ], EmailConfigService);
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Email Module Constants
3
+ */ export const EMAIL_MODULE_OPTIONS = 'EMAIL_MODULE_OPTIONS';
4
+ export const DEFAULT_FROM_NAME = 'FLUSYS';
@@ -0,0 +1,2 @@
1
+ export * from './email.constants';
2
+ export * from './email-config.service';
@@ -0,0 +1,91 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ function _ts_decorate(decorators, target, key, desc) {
15
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
19
+ }
20
+ function _ts_metadata(k, v) {
21
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
+ }
23
+ function _ts_param(paramIndex, decorator) {
24
+ return function(target, key) {
25
+ decorator(target, key, paramIndex);
26
+ };
27
+ }
28
+ import { createApiController, EMAIL_CONFIG_PERMISSIONS } from '@flusys/nestjs-shared/classes';
29
+ import { Controller, Inject } from '@nestjs/common';
30
+ import { ApiTags } from '@nestjs/swagger';
31
+ import { CreateEmailConfigDto, EmailConfigResponseDto, UpdateEmailConfigDto } from '../dtos';
32
+ import { EmailProviderConfigService } from '../services';
33
+ export class EmailConfigController extends createApiController(CreateEmailConfigDto, UpdateEmailConfigDto, EmailConfigResponseDto, {
34
+ security: {
35
+ insert: {
36
+ level: 'permission',
37
+ permissions: [
38
+ EMAIL_CONFIG_PERMISSIONS.CREATE
39
+ ]
40
+ },
41
+ insertMany: {
42
+ level: 'permission',
43
+ permissions: [
44
+ EMAIL_CONFIG_PERMISSIONS.CREATE
45
+ ]
46
+ },
47
+ getById: {
48
+ level: 'permission',
49
+ permissions: [
50
+ EMAIL_CONFIG_PERMISSIONS.READ
51
+ ]
52
+ },
53
+ getAll: {
54
+ level: 'permission',
55
+ permissions: [
56
+ EMAIL_CONFIG_PERMISSIONS.READ
57
+ ]
58
+ },
59
+ update: {
60
+ level: 'permission',
61
+ permissions: [
62
+ EMAIL_CONFIG_PERMISSIONS.UPDATE
63
+ ]
64
+ },
65
+ updateMany: {
66
+ level: 'permission',
67
+ permissions: [
68
+ EMAIL_CONFIG_PERMISSIONS.UPDATE
69
+ ]
70
+ },
71
+ delete: {
72
+ level: 'permission',
73
+ permissions: [
74
+ EMAIL_CONFIG_PERMISSIONS.DELETE
75
+ ]
76
+ }
77
+ }
78
+ }) {
79
+ constructor(emailConfigService){
80
+ super(emailConfigService), _define_property(this, "emailConfigService", void 0), this.emailConfigService = emailConfigService;
81
+ }
82
+ }
83
+ EmailConfigController = _ts_decorate([
84
+ ApiTags('Email Config'),
85
+ Controller('email/email-config'),
86
+ _ts_param(0, Inject(EmailProviderConfigService)),
87
+ _ts_metadata("design:type", Function),
88
+ _ts_metadata("design:paramtypes", [
89
+ typeof EmailProviderConfigService === "undefined" ? Object : EmailProviderConfigService
90
+ ])
91
+ ], EmailConfigController);
@@ -0,0 +1,132 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ function _ts_decorate(decorators, target, key, desc) {
15
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
18
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
19
+ }
20
+ function _ts_metadata(k, v) {
21
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
+ }
23
+ function _ts_param(paramIndex, decorator) {
24
+ return function(target, key) {
25
+ decorator(target, key, paramIndex);
26
+ };
27
+ }
28
+ import { CurrentUser, RequirePermission } from '@flusys/nestjs-shared/decorators';
29
+ import { JwtAuthGuard } from '@flusys/nestjs-shared/guards';
30
+ import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
31
+ import { Body, Controller, Inject, Post, UseGuards } from '@nestjs/common';
32
+ import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
33
+ import { SendEmailDto, SendTemplateEmailDto, TestEmailDto } from '../dtos';
34
+ import { EmailSendService } from '../services';
35
+ export class EmailSendController {
36
+ async sendEmail(dto, user) {
37
+ const result = await this.emailSendService.sendEmail(dto, user);
38
+ return {
39
+ success: result.success,
40
+ message: result.success ? 'Email sent successfully' : 'Failed to send email',
41
+ data: {
42
+ success: result.success,
43
+ messageId: result.messageId,
44
+ error: result.error
45
+ }
46
+ };
47
+ }
48
+ async sendTemplateEmail(dto, user) {
49
+ const result = await this.emailSendService.sendTemplateEmail(dto, user);
50
+ return {
51
+ success: result.success,
52
+ message: result.success ? 'Template email sent successfully' : 'Failed to send template email',
53
+ data: {
54
+ success: result.success,
55
+ messageId: result.messageId,
56
+ error: result.error
57
+ }
58
+ };
59
+ }
60
+ async sendTestEmail(dto, user) {
61
+ const result = await this.emailSendService.sendTestEmail(dto.emailConfigId, dto.recipient, user);
62
+ return {
63
+ success: result.success,
64
+ message: result.success ? 'Test email sent successfully' : 'Failed to send test email',
65
+ data: {
66
+ success: result.success,
67
+ messageId: result.messageId,
68
+ error: result.error
69
+ }
70
+ };
71
+ }
72
+ constructor(emailSendService){
73
+ _define_property(this, "emailSendService", void 0);
74
+ this.emailSendService = emailSendService;
75
+ }
76
+ }
77
+ _ts_decorate([
78
+ Post('direct'),
79
+ RequirePermission('email.send'),
80
+ ApiOperation({
81
+ summary: 'Send email directly with custom content'
82
+ }),
83
+ _ts_param(0, Body()),
84
+ _ts_param(1, CurrentUser()),
85
+ _ts_metadata("design:type", Function),
86
+ _ts_metadata("design:paramtypes", [
87
+ typeof SendEmailDto === "undefined" ? Object : SendEmailDto,
88
+ typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
89
+ ]),
90
+ _ts_metadata("design:returntype", Promise)
91
+ ], EmailSendController.prototype, "sendEmail", null);
92
+ _ts_decorate([
93
+ Post('template'),
94
+ RequirePermission('email.send'),
95
+ ApiOperation({
96
+ summary: 'Send email using a template with variable interpolation'
97
+ }),
98
+ _ts_param(0, Body()),
99
+ _ts_param(1, CurrentUser()),
100
+ _ts_metadata("design:type", Function),
101
+ _ts_metadata("design:paramtypes", [
102
+ typeof SendTemplateEmailDto === "undefined" ? Object : SendTemplateEmailDto,
103
+ typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
104
+ ]),
105
+ _ts_metadata("design:returntype", Promise)
106
+ ], EmailSendController.prototype, "sendTemplateEmail", null);
107
+ _ts_decorate([
108
+ Post('test'),
109
+ RequirePermission('email.send'),
110
+ ApiOperation({
111
+ summary: 'Send a test email to verify configuration'
112
+ }),
113
+ _ts_param(0, Body()),
114
+ _ts_param(1, CurrentUser()),
115
+ _ts_metadata("design:type", Function),
116
+ _ts_metadata("design:paramtypes", [
117
+ typeof TestEmailDto === "undefined" ? Object : TestEmailDto,
118
+ typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
119
+ ]),
120
+ _ts_metadata("design:returntype", Promise)
121
+ ], EmailSendController.prototype, "sendTestEmail", null);
122
+ EmailSendController = _ts_decorate([
123
+ ApiTags('Email Send'),
124
+ ApiBearerAuth(),
125
+ Controller('email/send'),
126
+ UseGuards(JwtAuthGuard),
127
+ _ts_param(0, Inject(EmailSendService)),
128
+ _ts_metadata("design:type", Function),
129
+ _ts_metadata("design:paramtypes", [
130
+ typeof EmailSendService === "undefined" ? Object : EmailSendService
131
+ ])
132
+ ], EmailSendController);