feat: added advance mailer configurations from infra config
This commit is contained in:
11
.env.example
11
.env.example
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user