xtablo-source/api/src/config.ts
Arthur Belleville 75328fbe96
Format codebase
2025-10-10 08:50:56 +02:00

95 lines
3.5 KiB
TypeScript

import dotenv from "dotenv";
export interface AppConfig {
NODE_ENV: "development" | "production" | "test" | "staging";
PORT: number;
SUPABASE_URL: string;
SUPABASE_SERVICE_ROLE_KEY: string;
SUPABASE_CONNECTION_STRING: string;
STREAM_CHAT_API_KEY: string;
STREAM_CHAT_API_SECRET: string;
EMAIL_USER: string;
EMAIL_CLIENT_ID: string;
EMAIL_CLIENT_SECRET: string;
EMAIL_REFRESH_TOKEN: string;
XTABLO_URL: string;
R2_ACCOUNT_ID: string;
R2_ACCESS_KEY_ID: string;
R2_SECRET_ACCESS_KEY: string;
CORS_ORIGIN: string[];
LOG_LEVEL: "debug" | "info" | "warn" | "error";
SYNC_CALS_SECRET: string;
}
function validateEnvVar(name: string, value: string | undefined): string {
if (!value) {
throw new Error(`Missing required environment variable: ${name}`);
}
return value;
}
function createConfig(): AppConfig {
const NODE_ENV = (process.env.NODE_ENV || "development") as
| "development"
| "production"
| "staging"
| "test";
dotenv.config({ path: `.env.${NODE_ENV}` });
// Base configuration
const baseConfig: AppConfig = {
NODE_ENV,
PORT: parseInt(process.env.PORT || "8080", 10),
SUPABASE_URL: validateEnvVar("SUPABASE_URL", process.env.SUPABASE_URL),
SUPABASE_SERVICE_ROLE_KEY: validateEnvVar(
"SUPABASE_SERVICE_ROLE_KEY",
process.env.SUPABASE_SERVICE_ROLE_KEY
),
SUPABASE_CONNECTION_STRING: process.env.SUPABASE_CONNECTION_STRING || "",
STREAM_CHAT_API_KEY: validateEnvVar("STREAM_CHAT_API_KEY", process.env.STREAM_CHAT_API_KEY),
STREAM_CHAT_API_SECRET: validateEnvVar(
"STREAM_CHAT_API_SECRET",
process.env.STREAM_CHAT_API_SECRET
),
EMAIL_USER: validateEnvVar("EMAIL_USER", process.env.EMAIL_USER),
EMAIL_CLIENT_ID: validateEnvVar("EMAIL_CLIENT_ID", process.env.EMAIL_CLIENT_ID),
EMAIL_CLIENT_SECRET: validateEnvVar("EMAIL_CLIENT_SECRET", process.env.EMAIL_CLIENT_SECRET),
EMAIL_REFRESH_TOKEN: validateEnvVar("EMAIL_REFRESH_TOKEN", process.env.EMAIL_REFRESH_TOKEN),
CORS_ORIGIN: [process.env.CORS_ORIGIN || "https://app.xtablo.com"],
XTABLO_URL: process.env.XTABLO_URL || "https://app.xtablo.com",
R2_ACCOUNT_ID: validateEnvVar("R2_ACCOUNT_ID", process.env.R2_ACCOUNT_ID),
R2_ACCESS_KEY_ID: validateEnvVar("R2_ACCESS_KEY_ID", process.env.R2_ACCESS_KEY_ID),
R2_SECRET_ACCESS_KEY: validateEnvVar("R2_SECRET_ACCESS_KEY", process.env.R2_SECRET_ACCESS_KEY),
SYNC_CALS_SECRET: process.env.SYNC_CALS_SECRET || "",
LOG_LEVEL: "info",
};
// Environment-specific configurations
if (NODE_ENV === "development") {
baseConfig.LOG_LEVEL = "debug";
} else if (NODE_ENV === "production") {
baseConfig.LOG_LEVEL = "info";
} else if (NODE_ENV === "test") {
baseConfig.LOG_LEVEL = "warn";
}
// Log configuration info
// console.info(`Configuration loaded for ${NODE_ENV} environment:`);
// console.info(`- Port: ${baseConfig.PORT}`);
// console.info(`- CORS Origins: ${baseConfig.CORS_ORIGIN.join(", ")}`);
// console.info(`- Log Level: ${baseConfig.LOG_LEVEL}`);
// console.info(`- XTablo URL: ${baseConfig.XTABLO_URL}`);
// console.info(`- Supabase URL: ${baseConfig.SUPABASE_URL}`);
// console.info(`- Stream Chat API Key: ${baseConfig.STREAM_CHAT_API_KEY}`);
// console.info(`- Email User: ${baseConfig.EMAIL_USER}`);
// console.info(`- Email Key: ${baseConfig.EMAIL_KEY}`);
return baseConfig;
}
export const config = createConfig();
// Helper functions for common environment checks
export const isDevelopment = () => config.NODE_ENV === "development";
export const isProduction = () => config.NODE_ENV === "production";