feat: added advance mailer configurations from infra config

This commit is contained in:
mirarifhasan
2024-05-21 20:17:46 +06:00
parent 742eca6d10
commit 5f52acacc0
6 changed files with 164 additions and 15 deletions

View File

@@ -36,9 +36,18 @@ MICROSOFT_TENANT="common"
# Mailer config # Mailer config
MAILER_SMTP_ENABLE="true" MAILER_SMTP_ENABLE="true"
MAILER_SMTP_URL="smtps://user@domain.com:pass@smtp.domain.com" MAILER_USE_ADVANCE_CONFIGS="false"
MAILER_ADDRESS_FROM='"From Name Here" <from@example.com>' MAILER_ADDRESS_FROM='"From Name Here" <from@example.com>'
MAILER_SMTP_URL="smtps://user@domain.com:pass@smtp.domain.com" # if MAILER_USE_ADVANCE_CONFIGS is true
MAILER_SMTP_HOST="smtp.domain.com" # if MAILER_USE_ADVANCE_CONFIGS is false
MAILER_SMTP_PORT="587" # if MAILER_USE_ADVANCE_CONFIGS is false
MAILER_SMTP_SECURE="true" # if MAILER_USE_ADVANCE_CONFIGS is false
MAILER_SMTP_USER="user@domain.com" # if MAILER_USE_ADVANCE_CONFIGS is false
MAILER_SMTP_PASSWORD="pass" # if MAILER_USE_ADVANCE_CONFIGS is false
MAILER_TLS_REJECT_UNAUTHORIZED="true" # if MAILER_USE_ADVANCE_CONFIGS is false
# Rate Limit Config # Rate Limit Config
RATE_LIMIT_TTL=60 # In seconds RATE_LIMIT_TTL=60 # In seconds
RATE_LIMIT_MAX=100 # Max requests per IP RATE_LIMIT_MAX=100 # Max requests per IP

View File

@@ -678,6 +678,26 @@ export const MAILER_SMTP_URL_UNDEFINED = 'mailer/smtp_url_undefined' as const;
export const MAILER_FROM_ADDRESS_UNDEFINED = export const MAILER_FROM_ADDRESS_UNDEFINED =
'mailer/from_address_undefined' as const; 'mailer/from_address_undefined' as const;
/**
* MAILER_SMTP_USER environment variable is not defined
* (MailerModule)
*/
export const MAILER_SMTP_USER_UNDEFINED = 'mailer/smtp_user_undefined' as const;
/**
* MAILER_SMTP_PASSWORD environment variable is not defined
* (MailerModule)
*/
export const MAILER_SMTP_PASSWORD_UNDEFINED =
'mailer/smtp_password_undefined' as const;
/**
* MAILER_USE_GRANULAR environment variable is not defined
* (MailerModule)
*/
export const MAILER_USE_ADVANCE_CONFIGS_INVALID_VALUE =
'mailer/use_advance_configs_invalid_value' as const;
/** /**
* SharedRequest invalid request JSON format * SharedRequest invalid request JSON format
* (ShortcodeService) * (ShortcodeService)

View File

@@ -33,10 +33,17 @@ const AuthProviderConfigurations = {
InfraConfigEnum.MICROSOFT_SCOPE, InfraConfigEnum.MICROSOFT_SCOPE,
InfraConfigEnum.MICROSOFT_TENANT, InfraConfigEnum.MICROSOFT_TENANT,
], ],
[AuthProvider.EMAIL]: [ [AuthProvider.EMAIL]: !!process.env.MAILER_USE_ADVANCE_CONFIGS
InfraConfigEnum.MAILER_SMTP_URL, ? [
InfraConfigEnum.MAILER_ADDRESS_FROM, InfraConfigEnum.MAILER_SMTP_HOST,
], InfraConfigEnum.MAILER_SMTP_PORT,
InfraConfigEnum.MAILER_SMTP_SECURE,
InfraConfigEnum.MAILER_SMTP_USER,
InfraConfigEnum.MAILER_SMTP_PASSWORD,
InfraConfigEnum.MAILER_TLS_REJECT_UNAUTHORIZED,
InfraConfigEnum.MAILER_ADDRESS_FROM,
]
: [InfraConfigEnum.MAILER_SMTP_URL, InfraConfigEnum.MAILER_ADDRESS_FROM],
}; };
/** /**
@@ -79,6 +86,10 @@ export async function getDefaultInfraConfigs(): Promise<
name: InfraConfigEnum.MAILER_SMTP_ENABLE, name: InfraConfigEnum.MAILER_SMTP_ENABLE,
value: process.env.MAILER_SMTP_ENABLE ?? 'true', value: process.env.MAILER_SMTP_ENABLE ?? 'true',
}, },
{
name: InfraConfigEnum.MAILER_USE_ADVANCE_CONFIGS,
value: process.env.MAILER_USE_ADVANCE_CONFIGS ?? 'false',
},
{ {
name: InfraConfigEnum.MAILER_SMTP_URL, name: InfraConfigEnum.MAILER_SMTP_URL,
value: process.env.MAILER_SMTP_URL, value: process.env.MAILER_SMTP_URL,
@@ -87,6 +98,30 @@ export async function getDefaultInfraConfigs(): Promise<
name: InfraConfigEnum.MAILER_ADDRESS_FROM, name: InfraConfigEnum.MAILER_ADDRESS_FROM,
value: process.env.MAILER_ADDRESS_FROM, value: process.env.MAILER_ADDRESS_FROM,
}, },
{
name: InfraConfigEnum.MAILER_SMTP_HOST,
value: process.env.MAILER_SMTP_HOST,
},
{
name: InfraConfigEnum.MAILER_SMTP_PORT,
value: process.env.MAILER_SMTP_PORT,
},
{
name: InfraConfigEnum.MAILER_SMTP_SECURE,
value: process.env.MAILER_SMTP_SECURE,
},
{
name: InfraConfigEnum.MAILER_SMTP_USER,
value: process.env.MAILER_SMTP_USER,
},
{
name: InfraConfigEnum.MAILER_SMTP_PASSWORD,
value: process.env.MAILER_SMTP_PASSWORD,
},
{
name: InfraConfigEnum.MAILER_TLS_REJECT_UNAUTHORIZED,
value: process.env.MAILER_TLS_REJECT_UNAUTHORIZED,
},
{ {
name: InfraConfigEnum.GOOGLE_CLIENT_ID, name: InfraConfigEnum.GOOGLE_CLIENT_ID,
value: process.env.GOOGLE_CLIENT_ID, value: process.env.GOOGLE_CLIENT_ID,

View File

@@ -370,6 +370,13 @@ export class InfraConfigService implements OnModuleInit {
) )
return E.left(INFRA_CONFIG_INVALID_INPUT); return E.left(INFRA_CONFIG_INVALID_INPUT);
break; break;
case InfraConfigEnum.MAILER_USE_ADVANCE_CONFIGS:
if (
infraConfigs[i].value !== 'true' &&
infraConfigs[i].value !== 'false'
)
return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_SMTP_URL: case InfraConfigEnum.MAILER_SMTP_URL:
const isValidUrl = validateSMTPUrl(infraConfigs[i].value); const isValidUrl = validateSMTPUrl(infraConfigs[i].value);
if (!isValidUrl) return E.left(INFRA_CONFIG_INVALID_INPUT); if (!isValidUrl) return E.left(INFRA_CONFIG_INVALID_INPUT);
@@ -378,6 +385,32 @@ export class InfraConfigService implements OnModuleInit {
const isValidEmail = validateSMTPEmail(infraConfigs[i].value); const isValidEmail = validateSMTPEmail(infraConfigs[i].value);
if (!isValidEmail) return E.left(INFRA_CONFIG_INVALID_INPUT); if (!isValidEmail) return E.left(INFRA_CONFIG_INVALID_INPUT);
break; break;
case InfraConfigEnum.MAILER_SMTP_HOST:
if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_SMTP_PORT:
if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_SMTP_SECURE:
if (
infraConfigs[i].value !== 'true' &&
infraConfigs[i].value !== 'false'
)
return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_SMTP_USER:
if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_SMTP_PASSWORD:
if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.MAILER_TLS_REJECT_UNAUTHORIZED:
if (
infraConfigs[i].value !== 'true' &&
infraConfigs[i].value !== 'false'
)
return E.left(INFRA_CONFIG_INVALID_INPUT);
break;
case InfraConfigEnum.GOOGLE_CLIENT_ID: case InfraConfigEnum.GOOGLE_CLIENT_ID:
if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT); if (!infraConfigs[i].value) return E.left(INFRA_CONFIG_INVALID_INPUT);
break; break;

View File

@@ -5,32 +5,76 @@ import { MailerService } from './mailer.service';
import { throwErr } from 'src/utils'; import { throwErr } from 'src/utils';
import { import {
MAILER_FROM_ADDRESS_UNDEFINED, MAILER_FROM_ADDRESS_UNDEFINED,
MAILER_SMTP_PASSWORD_UNDEFINED,
MAILER_SMTP_URL_UNDEFINED, MAILER_SMTP_URL_UNDEFINED,
MAILER_SMTP_USER_UNDEFINED,
MAILER_USE_ADVANCE_CONFIGS_INVALID_VALUE,
} from 'src/errors'; } from 'src/errors';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { loadInfraConfiguration } from 'src/infra-config/helper'; import { loadInfraConfiguration } from 'src/infra-config/helper';
import { MailerEventListener } from './mailer.listener'; import { MailerEventListener } from './mailer.listener';
import { TransportType } from '@nestjs-modules/mailer/dist/interfaces/mailer-options.interface';
@Global() @Global()
@Module({}) @Module({})
export class MailerModule { export class MailerModule {
static async register() { static async register() {
const config = new ConfigService();
const env = await loadInfraConfiguration(); const env = await loadInfraConfiguration();
// If mailer SMTP is DISABLED, return the module without any configuration // If mailer SMTP is DISABLED, return the module without any configuration (service, listener, etc.)
if (env.INFRA.MAILER_SMTP_ENABLE !== 'true') { if (env.INFRA.MAILER_SMTP_ENABLE !== 'true') {
console.log('Mailer SMTP is disabled'); console.log('Mailer SMTP is disabled');
return { module: MailerModule }; return { module: MailerModule };
} }
// If mailer is ENABLED, return the module with configuration // If mailer is ENABLED, return the module with configuration (service, listener, etc.)
let mailerSmtpUrl = env.INFRA.MAILER_SMTP_URL; let transportOption: TransportType;
let mailerAddressFrom = env.INFRA.MAILER_ADDRESS_FROM;
if (!env.INFRA.MAILER_SMTP_URL || !env.INFRA.MAILER_ADDRESS_FROM) { const mailerAddressFrom =
const config = new ConfigService(); env.INFRA.MAILER_ADDRESS_FROM ??
mailerSmtpUrl = config.get('MAILER_SMTP_URL'); config.get('MAILER_ADDRESS_FROM') ??
mailerAddressFrom = config.get('MAILER_ADDRESS_FROM'); throwErr(MAILER_SMTP_URL_UNDEFINED);
if (
(env.INFRA.MAILER_USE_ADVANCE_CONFIGS ??
config.get('MAILER_USE_ADVANCE_CONFIGS')) === 'false'
) {
console.log('Using simple mailer configuration');
transportOption =
env.INFRA.MAILER_SMTP_URL ??
config.get('MAILER_SMTP_URL') ??
throwErr(MAILER_SMTP_URL_UNDEFINED);
} else if (
(env.INFRA.MAILER_USE_ADVANCE_CONFIGS ??
config.get('MAILER_USE_ADVANCE_CONFIGS')) === 'true'
) {
console.log('Using advance mailer configuration');
transportOption = {
host: env.INFRA.MAILER_SMTP_HOST ?? config.get('MAILER_SMTP_HOST'),
port: +env.INFRA.MAILER_SMTP_PORT ?? +config.get('MAILER_SMTP_PORT'),
secure:
!!env.INFRA.MAILER_SMTP_SECURE ?? !!config.get('MAILER_SMTP_SECURE'),
auth: {
user:
env.INFRA.MAILER_SMTP_USER ??
config.get('MAILER_SMTP_USER') ??
throwErr(MAILER_SMTP_USER_UNDEFINED),
pass:
env.INFRA.MAILER_SMTP_PASSWORD ??
config.get('MAILER_SMTP_PASSWORD') ??
throwErr(MAILER_SMTP_PASSWORD_UNDEFINED),
},
tls: {
rejectUnauthorized:
!!env.INFRA.MAILER_TLS_REJECT_UNAUTHORIZED ??
!!config.get('MAILER_TLS_REJECT_UNAUTHORIZED'),
},
};
} else {
throwErr(MAILER_USE_ADVANCE_CONFIGS_INVALID_VALUE);
} }
return { return {
@@ -38,9 +82,9 @@ export class MailerModule {
providers: [MailerService, MailerEventListener], providers: [MailerService, MailerEventListener],
imports: [ imports: [
NestMailerModule.forRoot({ NestMailerModule.forRoot({
transport: mailerSmtpUrl ?? throwErr(MAILER_SMTP_URL_UNDEFINED), transport: transportOption,
defaults: { defaults: {
from: mailerAddressFrom ?? throwErr(MAILER_FROM_ADDRESS_UNDEFINED), from: mailerAddressFrom,
}, },
template: { template: {
dir: __dirname + '/templates', dir: __dirname + '/templates',

View File

@@ -1,8 +1,16 @@
export enum InfraConfigEnum { export enum InfraConfigEnum {
MAILER_SMTP_ENABLE = 'MAILER_SMTP_ENABLE', MAILER_SMTP_ENABLE = 'MAILER_SMTP_ENABLE',
MAILER_USE_ADVANCE_CONFIGS = 'MAILER_USE_ADVANCE_CONFIGS',
MAILER_SMTP_URL = 'MAILER_SMTP_URL', MAILER_SMTP_URL = 'MAILER_SMTP_URL',
MAILER_ADDRESS_FROM = 'MAILER_ADDRESS_FROM', MAILER_ADDRESS_FROM = 'MAILER_ADDRESS_FROM',
MAILER_SMTP_HOST = 'MAILER_SMTP_HOST',
MAILER_SMTP_PORT = 'MAILER_SMTP_PORT',
MAILER_SMTP_SECURE = 'MAILER_SMTP_SECURE',
MAILER_SMTP_USER = 'MAILER_SMTP_USER',
MAILER_SMTP_PASSWORD = 'MAILER_SMTP_PASSWORD',
MAILER_TLS_REJECT_UNAUTHORIZED = 'MAILER_TLS_REJECT_UNAUTHORIZED',
GOOGLE_CLIENT_ID = 'GOOGLE_CLIENT_ID', GOOGLE_CLIENT_ID = 'GOOGLE_CLIENT_ID',
GOOGLE_CLIENT_SECRET = 'GOOGLE_CLIENT_SECRET', GOOGLE_CLIENT_SECRET = 'GOOGLE_CLIENT_SECRET',
GOOGLE_CALLBACK_URL = 'GOOGLE_CALLBACK_URL', GOOGLE_CALLBACK_URL = 'GOOGLE_CALLBACK_URL',