edtech / apps /api /src /config.ts
CognxSafeTrack
feat: Claude Sonnet 4.6 provider + Stripe billing automation
4a0c3ba
import { z } from 'zod';
import dotenv from 'dotenv';
import path from 'path';
dotenv.config({ path: path.join(__dirname, '../../../../.env') });
const envSchema = z.object({
DATABASE_URL: z.string().url(),
REDIS_URL: z.string().url(),
ADMIN_API_KEY: z.string().min(32),
WHATSAPP_ACCESS_TOKEN: z.string().optional(),
WHATSAPP_PHONE_NUMBER_ID: z.string().optional(),
OPENAI_API_KEY: z.string().optional(),
GOOGLE_AI_API_KEY: z.string().optional(),
ANTHROPIC_API_KEY: z.string().optional(),
STRIPE_SECRET_KEY: z.string().optional(),
STRIPE_WEBHOOK_SECRET: z.string().optional(),
R2_ACCOUNT_ID: z.string().optional(),
R2_ACCESS_KEY_ID: z.string().optional(),
R2_SECRET_ACCESS_KEY: z.string().optional(),
R2_BUCKET: z.string().optional(),
PORT: z.string().default('3001').transform(Number),
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
ENCRYPTION_SECRET: z.string().min(32, 'ENCRYPTION_SECRET must be at least 32 characters')
});
const result = envSchema.safeParse(process.env);
if (!result.success) {
console.error('[CONFIG] ❌ Invalid environment variables:', result.error.format());
throw new Error(`[CONFIG] Missing or invalid environment variables:\n${result.error.message}`);
}
export const config = result.data;