asked on
/* eslint-disable no-process-env */
const { Joi } = require('celebrate');
// require and configure dotenv, will load vars in .env in PROCESS.ENV
require('dotenv').config();
// define validation for all the env vars
const envVarsSchema = Joi.object({
NODE_ENV: Joi.string()
.valid('development', 'production', 'test', 'provision')
.default('production'),
PORT: Joi.number().default(4040),
MONGODB_URI: Joi.string()
.required()
.description('Mongo DB host url'),
MONGODB_PORT: Joi.number().default(27017),
MONGODB_DATABASE: Joi.string()
.required()
.description('Mongo DB database'),
MONGODB_READ_PREFERENCE: Joi.string()
.required()
.default('PRIMARY_PREFERRED'),
SESSION_SECRET: Joi.string().required(),
GOOGLE_MAP_KEY: Joi.string().required(),
JWT_SECRET: Joi.string().required(),
SMTP_HOST: Joi.string().required(),
SMTP_PORT: Joi.number().required(),
SMTP_POOL: Joi.string().required(),
RESET_LINK: Joi.string().required(),
SMTP_SENDER_ADDRESS: Joi.string().required(),
DEV_AWS_ACCESS_KEY_ID: Joi.string().required(),
DEV_AWS_SECRET_ACCESS_KEY: Joi.string().required(),
AWS_ACCESS_KEY_ID: Joi.string().required(),
AWS_SECRET_ACCESS_KEY: Joi.string().required(),
USER_RETRIES: Joi.number().required(),
USER_MIN_WAIT: Joi.number().required(),
USER_MAX_WAIT: Joi.number().required(),
GLOBAL_FREE_RETRIES: Joi.number().required(),
GLOBAL_MIN_WAIT: Joi.number().required(),
GLOBAL_MAX_WAIT: Joi.number().required(),
GLOBAL_LIFETIME: Joi.number().required(),
ATTACH_RESET_TO_REQUEST: Joi.string().required(),
REFRESH_TIMEOUT_ON_REQUEST: Joi.string().required(),
PASSWORD_MIN_LENGTH: Joi.number().required(),
SMTP_LINK_EXPIRES_NUMBER: Joi.number().required(),
SMTP_LINK_EXPIRES_PERIOD: Joi.string().required()
})
.unknown()
.required();
const { error, value: envVars } = envVarsSchema.validate(process.env);
if (error) {
throw new Error(`Config validation error: ${error.message}`);
}
const config = {
env: envVars.NODE_ENV,
port: envVars.PORT,
mongo: {
uri: envVars.MONGODB_URI,
port: envVars.MONGODB_PORT,
database: envVars.MONGODB_DATABASE,
readPreference: envVars.MONGODB_READ_PREFERENCE
},
sessionSecret: envVars.SESSION_SECRET,
googleMapKey: envVars.GOOGLE_MAP_KEY,
jwtSecret: envVars.JWT_SECRET,
jwtExpiresIn: envVars.JWT_EXPIRES_IN,
passwordMinLength: envVars.PASSWORD_MIN_LENGTH,
smtp: {
host: envVars.SMTP_HOST,
port: envVars.SMTP_PORT,
awsAccessKeyId: envVars.AWS_ACCESS_KEY_ID,
awsSecretAccessKey: envVars.AWS_SECRET_ACCESS_KEY,
devAwsAccessKeyId: envVars.DEV_AWS_ACCESS_KEY_ID,
devAwsSecretAccessKey: envVars.DEV_AWS_SECRET_ACCESS_KEY,
senderAddress: envVars.SMTP_SENDER_ADDRESS,
resetLink: envVars.RESET_LINK,
momentAddNumber: envVars.SMTP_LINK_EXPIRES_NUMBER,
momentAddPeriod: envVars.SMTP_LINK_EXPIRES_PERIOD
},
userBruteForce: {
freeRetries: envVars.USER_RETRIES,
minWait: envVars.USER_MIN_WAIT,
maxWait: envVars.USER_MAX_WAIT
},
globalBruteForce: {
freeRetries: envVars.GLOBAL_FREE_RETRIES,
minWait: envVars.GLOBAL_MIN_WAIT,
maxWait: envVars.GLOBAL_MAX_WAIT,
lifeTime: envVars.GLOBAL_LIFETIME,
attachResetToRequest: envVars.ATTACH_RESET_TO_REQUEST
}
};
module.exports = config;