-
Tuan Hoang Dinh Anh authoredTuan Hoang Dinh Anh authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
const dotenv = require('dotenv');
const path = require('path');
const Joi = require('joi');
dotenv.config({ path: path.join(__dirname, '../../.env') });
const envVarsSchema = Joi.object()
.keys({
NODE_ENV: Joi.string().valid('production', 'development', 'test').required(),
PORT: Joi.number().default(3000),
MONGODB_URL: Joi.string().required().description('Mongo DB url'),
// CORS Settings
CORS_ORIGIN: Joi.string().description('CORS regex'),
// JWT
JWT_SECRET: Joi.string().required().description('JWT secret key'),
JWT_ACCESS_EXPIRATION_MINUTES: Joi.number().default(30).description('minutes after which access tokens expire'),
JWT_REFRESH_EXPIRATION_DAYS: Joi.number().default(30).description('days after which refresh tokens expire'),
JWT_RESET_PASSWORD_EXPIRATION_MINUTES: Joi.number()
.default(10)
.description('minutes after which reset password token expires'),
JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: Joi.number()
.default(10)
.description('minutes after which verify email token expires'),
JWT_COOKIE_NAME: Joi.string().default('token').description('JWT cookie name'),
JWT_COOKIE_DOMAIN: Joi.string().default('').description('JWT cookie domain'),
SMTP_HOST: Joi.string().description('server that will send the emails'),
SMTP_PORT: Joi.number().description('port to connect to the email server'),
SMTP_USERNAME: Joi.string().description('username for email server'),
SMTP_PASSWORD: Joi.string().description('password for email server'),
EMAIL_FROM: Joi.string().description('the from field in the emails sent by the app'),
CACHE_BASE_URL: Joi.string().description('Cache base url'),
LOG_BASE_URL: Joi.string().description('Log base url'),
CLIENT_BASE_URL: Joi.string().description('Client base url').default('http://localhost:3000'),
BREVO_API_KEY: Joi.string().description('Brevo API key'),
BREVO_BASE_URL: Joi.string().description('Brevo base url'),
GITHUB_CLIENT_ID: Joi.string().description('Github client id'),
GITHUB_CLIENT_SECRET: Joi.string().description('Github client secret'),
UPLOAD_PORT: Joi.number().required().description('Upload port'),
UPLOAD_DOMAIN: Joi.string().required().description('Upload domain'),
// AWS,
AWS_PUBLIC_KEY: Joi.string().description('AWS public key'),
AWS_SECRET_KEY: Joi.string().description('AWS secret key'),
// OpenAI,
OPENAI_API_KEY: Joi.string().description('OpenAI API key'),
OPENAI_ENDPOINT_URL: Joi.string().description('OpenAI endpoint url'),
// GenAI
GENAI_ALLOWED_EMAILS: Joi.string().description('GenAI allowed emails'),
// ETAS
ETAS_ENABLED: Joi.boolean().description('ETAS enabled'),
ETAS_CLIENT_ID: Joi.string().description('ETAS client id'),
ETAS_CLIENT_SECRET: Joi.string().description('ETAS client secret'),
ETAS_SCOPE: Joi.string().description('ETAS scope'),
ETAS_INSTANCE_ENDPOINT: Joi.string().description('ETAS instance endpoint'),
ETAS_DEV_INSTANCE_ENDPOINT: Joi.string().description('ETAS dev instance endpoint'),
// Certivity
CERTIVITY_CLIENT_ID: Joi.string().description('Certivity client id'),
CERTIVITY_CLIENT_SECRET: Joi.string().description('Certivity client secret'),
STRICT_AUTH: Joi.boolean().description('Strict auth'),
// Admin emails
ADMIN_EMAILS: Joi.string().description('Admin emails'),
ADMIN_PASSWORD: Joi.string().description('Admin password'),
// Change Logs max size
LOGS_MAX_SIZE: Joi.number().default(100).description('Max size of change logs in megabytes'),
})
.unknown();
const { value: envVars, error } = envVarsSchema.prefs({ errors: { label: 'key' } }).validate(process.env);
if (error) {
throw new Error(`Config validation error: ${error.message}`);
}
const config = {
env: envVars.NODE_ENV,
port: envVars.PORT,
strictAuth: envVars.STRICT_AUTH,
cors: {
regex: (envVars.CORS_ORIGIN || 'localhost:\\d+,127\\.0\\.0\\.1:\\d+')
.split(',')
.map((i) => i.trim())
.filter(Boolean)
.map((i) => new RegExp(i)),
},
mongoose: {
url: envVars.MONGODB_URL + (envVars.NODE_ENV === 'test' ? '-test' : ''),
options: {
useCreateIndex: true,
useNewUrlParser: true,
useUnifiedTopology: true,
},
},
jwt: {
secret: envVars.JWT_SECRET,
accessExpirationValue: envVars.JWT_ACCESS_EXPIRATION_MINUTES,
accessExpirationUnit: 'minutes',
refreshExpirationDays: envVars.JWT_REFRESH_EXPIRATION_DAYS,
resetPasswordExpirationMinutes: envVars.JWT_RESET_PASSWORD_EXPIRATION_MINUTES,
verifyEmailExpirationMinutes: envVars.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES,
cookie: {
name: envVars.JWT_COOKIE_NAME,
options: {
secure: true,
httpOnly: true,
sameSite: 'None',
...(envVars.NODE_ENV === 'production' && { domain: envVars.JWT_COOKIE_DOMAIN }),
},
},
},
email: {
smtp: {
host: envVars.SMTP_HOST,
port: envVars.SMTP_PORT,
auth: {
user: envVars.SMTP_USERNAME,
pass: envVars.SMTP_PASSWORD,
},
},
from: envVars.EMAIL_FROM,
},
cacheBaseUrl: envVars.CACHE_BASE_URL,
logBaseUrl: envVars.LOG_BASE_URL,
client: {
baseUrl: envVars.CLIENT_BASE_URL,
},
brevo: {
apiKey: envVars.BREVO_API_KEY,
baseUrl: envVars.BREVO_BASE_URL,
},
constraints: {
model: {
maximumAuthorizedUsers: 1000,
},
},
github: {
clientId: process.env.GITHUB_CLIENT_ID,
clientSecret: process.env.GITHUB_CLIENT_SECRET,
},
services: {
upload: {
port: envVars.UPLOAD_PORT,
domain: envVars.UPLOAD_DOMAIN,
},
log: {
port: envVars.LOG_PORT || 9600,
},
cache: {
baseUrl: 'https://cache.digitalauto.tech',
},
},
openai: {
apiKey: envVars.OPENAI_API_KEY,
endpointUrl: envVars.OPENAI_ENDPOINT_URL,
},
aws: {
publicKey: envVars.AWS_PUBLIC_KEY,
secretKey: envVars.AWS_SECRET_KEY,
},
genAI: {
allowedEmails: envVars.GENAI_ALLOWED_EMAILS?.split(',') || [],
},
etas: {
enabled: envVars.ETAS_ENABLED,
clientId: envVars.ETAS_CLIENT_ID,
clientSecret: envVars.ETAS_CLIENT_SECRET,
scope: envVars.ETAS_SCOPE,
instanceEndpoint: envVars.ETAS_INSTANCE_ENDPOINT,
developmentEndpoint: envVars.ETAS_DEV_INSTANCE_ENDPOINT,
},
githubIssueSubmitUrl: 'https://api.github.com/repos/digital-auto/vehicle_signal_specification/issues',
certivity: {
authBaseUrl: 'https://certivity-dev.eu.auth0.com/oauth/token',
authAudience: 'https://service-api-dev.certivity.io',
authGrantType: 'client_credentials',
clientId: envVars.CERTIVITY_CLIENT_ID,
clientSecret: envVars.CERTIVITY_CLIENT_SECRET,
regulationBaseUrl: 'https://ctvt-service-api.azurewebsites.net/api/v1/protected/regulation',
},
sso: {
msGraphMeEndpoint: 'https://graph.microsoft.com/v1.0/me',
},
adminEmails: envVars.ADMIN_EMAILS?.split(',') || [],
adminPassword: envVars.ADMIN_PASSWORD,
logsMaxSize: envVars.LOGS_MAX_SIZE,
};
if (config.env === 'development') {
config.jwt.accessExpirationUnit = 'days';
}
module.exports = config;