From 56e520b2e415ebe1c8d9c9bd5d0528d2acfcabe9 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Wed, 8 Jan 2025 17:09:40 +0100 Subject: [PATCH] refactor(api): provide default env values (#57986) --- api/src/utils/env.ts | 35 +++++++++++++++++++---------------- sample.env | 1 - 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/api/src/utils/env.ts b/api/src/utils/env.ts index 50c814bc7d7..836ab0bc6eb 100644 --- a/api/src/utils/env.ts +++ b/api/src/utils/env.ts @@ -23,13 +23,17 @@ function isAllowedEnv(env: string): env is 'development' | 'production' { return ['development', 'production'].includes(env); } +const _EMAIL_PROVIDER = process.env.EMAIL_PROVIDER || 'ses'; +const _FREECODECAMP_NODE_ENV = + process.env.FREECODECAMP_NODE_ENV || 'production'; + function isAllowedProvider(provider: string): provider is 'ses' | 'nodemailer' { return ['ses', 'nodemailer'].includes(provider); } function createTestConnectionURL(url: string, dbId?: string) { assert.notEqual( - process.env.FREECODECAMP_NODE_ENV, + _FREECODECAMP_NODE_ENV, 'production', "The database URL can't be modified in production." ); @@ -42,10 +46,8 @@ If so, ensure that the environment variable JEST_WORKER_ID is set.` } assert.ok(process.env.HOME_LOCATION); -assert.ok(process.env.FREECODECAMP_NODE_ENV); -assert.ok(isAllowedEnv(process.env.FREECODECAMP_NODE_ENV)); -assert.ok(process.env.EMAIL_PROVIDER); -assert.ok(isAllowedProvider(process.env.EMAIL_PROVIDER)); +assert.ok(isAllowedEnv(_FREECODECAMP_NODE_ENV)); +assert.ok(isAllowedProvider(_EMAIL_PROVIDER)); assert.ok(process.env.AUTH0_CLIENT_ID); assert.ok(process.env.AUTH0_CLIENT_SECRET); assert.ok(process.env.AUTH0_DOMAIN); @@ -69,11 +71,11 @@ function isLogLevel(level: string): level is LogLevel { return LOG_LEVELS.includes(level); } -const LOG_LEVEL = process.env.FCC_API_LOG_LEVEL || 'info'; +const _FCC_API_LOG_LEVEL = process.env.FCC_API_LOG_LEVEL || 'info'; assert.ok( - isLogLevel(LOG_LEVEL), - `FCC_API_LOG_LEVEL must be one of ${LOG_LEVELS.join(', ')}. Found ${LOG_LEVEL}` + isLogLevel(_FCC_API_LOG_LEVEL), + `FCC_API_LOG_LEVEL must be one of ${LOG_LEVELS.join(', ')}. Found ${_FCC_API_LOG_LEVEL}` ); if (process.env.FREECODECAMP_NODE_ENV !== 'development') { @@ -84,11 +86,8 @@ if (process.env.FREECODECAMP_NODE_ENV !== 'development') { 'ses_secret_from_aws', 'The SES secret should be changed from the default value.' ); - assert.ok(process.env.SES_REGION); assert.ok(process.env.COOKIE_DOMAIN); assert.notEqual(process.env.COOKIE_SECRET, 'a_cookie_secret'); - assert.ok(process.env.PORT); - assert.ok(process.env.HOST); assert.ok(process.env.SENTRY_DSN); assert.ok(process.env.SENTRY_ENVIRONMENT); // The following values can exist in development, but production-like @@ -130,6 +129,8 @@ if (process.env.FREECODECAMP_NODE_ENV !== 'development') { } export const HOME_LOCATION = process.env.HOME_LOCATION; +// Mailhog is used in development and test environments, hence the localhost +// default. export const MAILHOG_HOST = process.env.MAILHOG_HOST ?? 'localhost'; export const MONGOHQ_URL = process.env.NODE_ENV === 'test' @@ -139,24 +140,27 @@ export const MONGOHQ_URL = ) : process.env.MONGOHQ_URL; -export const FREECODECAMP_NODE_ENV = process.env.FREECODECAMP_NODE_ENV; export const AUTH0_CLIENT_ID = process.env.AUTH0_CLIENT_ID; export const AUTH0_DOMAIN = process.env.AUTH0_DOMAIN; export const AUTH0_CLIENT_SECRET = process.env.AUTH0_CLIENT_SECRET; +export const EMAIL_PROVIDER = _EMAIL_PROVIDER; export const PORT = process.env.PORT || '3000'; -export const HOST = process.env.HOST || 'localhost'; +// HOST defaults to 0.0.0.0 because the server is intended to be used in a +// container. +export const HOST = process.env.HOST || '0.0.0.0'; export const API_LOCATION = process.env.API_LOCATION; export const FCC_ENABLE_SWAGGER_UI = process.env.FCC_ENABLE_SWAGGER_UI === 'true'; export const FCC_ENABLE_DEV_LOGIN_MODE = process.env.FCC_ENABLE_DEV_LOGIN_MODE === 'true'; +export const FCC_API_LOG_LEVEL = _FCC_API_LOG_LEVEL; export const FCC_ENABLE_SHADOW_CAPTURE = process.env.FCC_ENABLE_SHADOW_CAPTURE === 'true'; export const FCC_ENABLE_EXAM_ENVIRONMENT = process.env.FCC_ENABLE_EXAM_ENVIRONMENT === 'true'; export const FCC_ENABLE_SENTRY_ROUTES = process.env.FCC_ENABLE_SENTRY_ROUTES === 'true'; -export const FCC_API_LOG_LEVEL = LOG_LEVEL; +export const FREECODECAMP_NODE_ENV = _FREECODECAMP_NODE_ENV; export const SENTRY_DSN = process.env.SENTRY_DSN === 'dsn_from_sentry_dashboard' ? '' @@ -170,8 +174,7 @@ export const COOKIE_SECRET = process.env.COOKIE_SECRET; export const JWT_SECRET = process.env.JWT_SECRET; export const SES_ID = process.env.SES_ID; export const SES_SECRET = process.env.SES_SECRET; -export const SES_REGION = process.env.SES_REGION; -export const EMAIL_PROVIDER = process.env.EMAIL_PROVIDER; +export const SES_REGION = process.env.SES_REGION || 'us-east-1'; export const SHOW_UPCOMING_CHANGES = process.env.SHOW_UPCOMING_CHANGES === 'true'; export const STRIPE_SECRET_KEY = process.env.STRIPE_SECRET_KEY; diff --git a/sample.env b/sample.env index 6cec4dc1744..c7f2c04c4f8 100644 --- a/sample.env +++ b/sample.env @@ -64,7 +64,6 @@ LOCAL_MOCK_AUTH=true # New API # --------------------- NODE_ENV=development -PORT=3000 FCC_ENABLE_SWAGGER_UI=true FCC_ENABLE_DEV_LOGIN_MODE=true FCC_ENABLE_SHADOW_CAPTURE=false