204 lines
6.3 KiB
TypeScript
204 lines
6.3 KiB
TypeScript
import dotenv from 'dotenv';
|
|
import path from 'path';
|
|
import * as yup from 'yup';
|
|
|
|
dotenv.config({ path: path.join(__dirname, '../../.env') });
|
|
|
|
const envVarsSchema = yup
|
|
.object()
|
|
.shape({
|
|
NODE_ENV: yup
|
|
.string()
|
|
.oneOf(['production', 'development', 'test'])
|
|
.required(),
|
|
PORT: yup.number().default(3000),
|
|
// FRONTEND_URL: yup.string().required('Frontend URL is required'),
|
|
//JWT
|
|
JWT_SECRET: yup.string().required('JWT secret key is required'),
|
|
JWT_ACCESS_EXPIRATION_MINUTES: yup
|
|
.number()
|
|
.default(1440)
|
|
.required('minutes after which access tokens expire'),
|
|
JWT_REFRESH_EXPIRATION_DAYS: yup
|
|
.number()
|
|
.default(30)
|
|
.required('days after which refresh tokens expire'),
|
|
JWT_RESET_PASSWORD_EXPIRATION_MINUTES: yup
|
|
.number()
|
|
.default(10)
|
|
.required('minutes after which reset password token expires'),
|
|
JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: yup
|
|
.number()
|
|
.default(10)
|
|
.required('minutes after which verify email token expires'),
|
|
AWS_REGION: yup.string().required('AWS region is required'),
|
|
S3_BUCKET_NAME: yup.string().required('S3 bucket name is required'),
|
|
//SMTP and BREVO
|
|
BREVO_SMTP_HOST: yup
|
|
.string()
|
|
.nullable()
|
|
.required('server that will send the emails'),
|
|
BREVO_SMTP_PORT: yup
|
|
.number()
|
|
.nullable()
|
|
.required('port to connect to the email server'),
|
|
BREVO_SMTP_USER: yup
|
|
.string()
|
|
.nullable()
|
|
.required('username for email server'),
|
|
BREVO_SMTP_PASS: yup
|
|
.string()
|
|
.nullable()
|
|
.required('password for email server'),
|
|
BREVO_FROM_EMAIL: yup
|
|
.string()
|
|
.nullable()
|
|
.required('the from field in the emails sent by the app'),
|
|
BREVO_EMAIL_API_KEY: yup
|
|
.string()
|
|
.nullable()
|
|
.required('the from field in the emails sent by the app api key'),
|
|
BREVO_API_BASEURL: yup.string().required('Brevo base URL is required'),
|
|
// Minglar Admin
|
|
MINGLAR_ADMIN_EMAIL: yup.string().required('Minglar admin email address is required.'),
|
|
MINGLAR_ADMIN_NAME: yup.string().required('Minglar admin name is required.'),
|
|
// //one signal
|
|
// ONESIGNAL_APPID: yup.string().required('One signal app id is required'),
|
|
// ONESIGNAL_REST_APIKEY: yup
|
|
// .string()
|
|
// .required('One signal api key is required'),
|
|
//branch IO
|
|
// BRANCH_IO_KEY: yup.string().required('Branch IO key is required'),
|
|
|
|
// DataBase
|
|
DB_USERNAME: yup.string().required('DB Username is required'),
|
|
DB_PASSWORD: yup.string().required('DB Password is required'),
|
|
DB_DATABASE_NAME: yup.string().required('Database name is required'),
|
|
DB_HOSTNAME: yup
|
|
.string()
|
|
.default('127.0.0.1')
|
|
.required('DB Hostname is required'),
|
|
DB_PORT: yup.number().default(3306).required('DB Port is required'),
|
|
//OTP Bypass
|
|
BYPASS_OTP: yup.boolean().default(false).required('Bypass OTP is required'),
|
|
// Email links
|
|
AM_INVITATION_LINK: yup.string().required('Link to send in AM invitation mail is required'),
|
|
HOST_LINK: yup.string().required('Link to host panel is required'),
|
|
HOST_LINK_PQ: yup.string().required('Link to host panel pqp is required')
|
|
})
|
|
.noUnknown(true);
|
|
|
|
// Validate and prepare the configuration
|
|
function getConfig() {
|
|
try {
|
|
// Validate the environment variables
|
|
const envVars = envVarsSchema.validateSync(process.env, {
|
|
abortEarly: false, // Validate all fields before throwing errors
|
|
stripUnknown: true, // Remove fields not in the schema
|
|
});
|
|
|
|
// Return the validated configuration
|
|
return {
|
|
env: envVars.NODE_ENV,
|
|
port: envVars.PORT,
|
|
jwt: {
|
|
secret: envVars.JWT_SECRET,
|
|
accessExpirationMinutes: envVars.JWT_ACCESS_EXPIRATION_MINUTES,
|
|
refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS,
|
|
resetPasswordExpirationMinutes:
|
|
envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES,
|
|
verifyEmailExpirationMinutes:
|
|
envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES,
|
|
},
|
|
database: {
|
|
development: {
|
|
host: envVars.DB_HOSTNAME,
|
|
port: envVars.DB_PORT,
|
|
username: envVars.DB_USERNAME,
|
|
password: envVars.DB_PASSWORD,
|
|
database: envVars.DB_DATABASE_NAME,
|
|
logging: false,
|
|
},
|
|
test: {
|
|
host: envVars.DB_HOSTNAME,
|
|
port: envVars.DB_PORT,
|
|
username: envVars.DB_USERNAME,
|
|
password: envVars.DB_PASSWORD,
|
|
database: envVars.DB_DATABASE_NAME,
|
|
logging: false,
|
|
socketPath: '/var/run/mysqld/mysqld.sock',
|
|
},
|
|
production: {
|
|
host: envVars.DB_HOSTNAME,
|
|
port: envVars.DB_PORT,
|
|
username: envVars.DB_USERNAME,
|
|
password: envVars.DB_PASSWORD,
|
|
database: envVars.DB_DATABASE_NAME,
|
|
logging: false,
|
|
socketPath: '/var/run/mysqld/mysqld.sock',
|
|
},
|
|
},
|
|
aws: {
|
|
region: envVars.AWS_REGION,
|
|
bucketName: envVars.S3_BUCKET_NAME,
|
|
},
|
|
byPassOTP: envVars.BYPASS_OTP,
|
|
// BaseURL: envVars.BASEURL,
|
|
// FRONTEND_URL: envVars.FRONTEND_URL,
|
|
email: {
|
|
smtp: {
|
|
host: envVars?.BREVO_SMTP_HOST,
|
|
port: envVars?.BREVO_SMTP_PORT,
|
|
secure: envVars?.BREVO_SMTP_PORT == 465, // true for 465, false for other ports
|
|
auth: {
|
|
user: envVars?.BREVO_SMTP_USER,
|
|
pass: envVars?.BREVO_SMTP_PASS,
|
|
},
|
|
},
|
|
from: envVars?.BREVO_FROM_EMAIL,
|
|
api_key: envVars?.BREVO_EMAIL_API_KEY,
|
|
BrevobaseURL: envVars?.BREVO_API_BASEURL,
|
|
},
|
|
//Minglar admin
|
|
MinglarAdminEmail: envVars.MINGLAR_ADMIN_EMAIL,
|
|
MinglarAdminName: envVars.MINGLAR_ADMIN_NAME,
|
|
AM_INVITATION_LINK: envVars.AM_INVITATION_LINK,
|
|
HOST_LINK: envVars.HOST_LINK,
|
|
HOST_LINK_PQ: envVars.HOST_LINK_PQ,
|
|
// oneSignal: {
|
|
// appID: envVars.ONESIGNAL_APPID,
|
|
// restApiKey: envVars.ONESIGNAL_REST_APIKEY,
|
|
// },
|
|
// branchIO: {
|
|
// branchIOKey: envVars.BRANCH_IO_KEY,
|
|
// },
|
|
};
|
|
} catch (error: unknown) {
|
|
if (error instanceof yup.ValidationError) {
|
|
console.error('Validation Errors:', error.errors.join(', '));
|
|
} else {
|
|
console.error('Unexpected error during configuration validation:', error);
|
|
}
|
|
|
|
console.error(
|
|
'Server shut down due to incomplete environment variable configuration.'
|
|
);
|
|
process.exit(1); // Exit with error code 1
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Created By : Angad Chauhan
|
|
* Created at : 31/1/25
|
|
* Use : For google login .env file global variable
|
|
*/
|
|
// export const googleConfig = {
|
|
// clientID: process.env.GOOGLE_CLIENT_ID!,
|
|
// clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
|
|
// callbackURL: process.env.GOOGLE_CALLBACK_URL!,
|
|
// };
|
|
|
|
// Validate and export configuration only if validation succeeds
|
|
const config = getConfig();
|
|
export default config;
|