# API Configuration Guide ## Overview This document outlines the robust, environment-aware API configuration system implemented for the Vitron frontend application. The system eliminates hardcoded API endpoints and provides dynamic configuration based on environment variables. ## Architecture ### ๐Ÿ—๏ธ Core Components 1. **Dynamic BASE_PATH** (`src/api/types/runtime.ts`) - Auto-generated API types now use environment-aware BASE_PATH - Supports both client-side and server-side environments - Graceful fallbacks for different deployment scenarios 2. **Centralized API Config** (`app/utils/api-config.ts`) - Utility functions for all API endpoints (HTTP, WebSocket, Site URLs) - Environment detection and fallback logic - Type-safe configuration management 3. **API Client Factory** (`app/utils/api-client-factory.ts`) - Centralized factory for creating configured API clients - Consistent authentication header management - Single source of truth for API configuration ## ๐ŸŒ Environment Configuration ### Development Environment ```env VITE_API_BASE_URL=https://api.dev.vitrown.com VITE_API_SOCKET_BASE_URL=wss://api.dev.vitrown.com VITE_SITE_URL=https://dev.vitrown.com VITE_DOMAIN_URL=https://dev.vitrown.com ``` ### Production Environment ```env VITE_API_BASE_URL=https://api.prod.vitrown.com VITE_API_SOCKET_BASE_URL=wss://api.prod.vitrown.com VITE_SITE_URL=https://vitrown.com VITE_DOMAIN_URL=https://vitrown.com ``` ## ๐Ÿ”„ Configuration Resolution Order The system follows this priority order for configuration resolution: 1. **Client-side Remix ENV injection** (`window.ENV.VITE_*`) 2. **Vite import.meta.env** (build-time injection) 3. **Node.js process.env** (server-side) 4. **Environment-based fallbacks** 5. **Static fallbacks** (development defaults) ## ๐Ÿ“ Usage Examples ### Using API Client Factory (Recommended) ```typescript import { createUserManagementApi } from "~/utils/api-client-factory"; // In your hook or component const userApi = createUserManagementApi(token); const response = await userApi.userManagementSendOtpPost({ phoneNumber: "1234567890" }); ``` ### Using Centralized Config ```typescript import { getApiBaseUrl, getSocketBaseUrl } from "~/utils/api-config"; // For WebSocket connections const wsUrl = `${getSocketBaseUrl()}/ws/chat/${threadId}/?token=${token}`; // For manual fetch calls const response = await fetch(`${getApiBaseUrl()}/api/custom-endpoint`); ``` ### Environment Detection ```typescript import { isProduction, isDevelopment } from "~/utils/api-config"; if (isProduction()) { // Production-specific logic } ``` ## ๐Ÿš€ Benefits ### DevOps Advantages 1. **Environment Parity**: Same codebase works across all environments 2. **Configuration as Code**: All API endpoints defined in environment variables 3. **Zero Hardcoded Values**: No more environment-specific builds 4. **Deployment Flexibility**: Easy to switch between staging/prod domains 5. **Container-Ready**: Perfect for Docker and Kubernetes deployments ### Development Benefits 1. **Type Safety**: Full TypeScript support with proper fallbacks 2. **Centralized Management**: Single source of truth for all API configuration 3. **Consistent Auth**: Automatic bearer token injection 4. **Error Resilience**: Graceful fallbacks prevent runtime failures ## ๐Ÿ”ง Migration Guide ### Updating Existing Hooks **Before:** ```typescript const basePath = import.meta.env.VITE_API_BASE_URL; const config = new Configuration({ basePath, headers: { /* ... */ } }); const api = new UserManagementApi(config); ``` **After:** ```typescript import { createUserManagementApi } from "~/utils/api-client-factory"; const api = createUserManagementApi(token); ``` ### Updating WebSocket Connections **Before:** ```typescript const baseSocketPath = import.meta.env.VITE_API_SOCKET_BASE_URL; ``` **After:** ```typescript import { getSocketBaseUrl } from "~/utils/api-config"; const baseSocketPath = getSocketBaseUrl(); ``` ## ๐Ÿงช Testing Configuration ### Local Development ```bash # Test development configuration npm run dev # Test production configuration locally NODE_ENV=production npm run build npm run start ``` ### Environment Variables Testing ```bash # Override for testing VITE_API_BASE_URL=https://api.staging.vitrown.com npm run dev ``` ## ๐Ÿ”’ Security Considerations 1. **No Secrets in Config**: Only public endpoints are configured 2. **Runtime Token Injection**: Authentication tokens added at request time 3. **Fallback Safety**: Default fallbacks prevent exposure of internal services 4. **Type Safety**: Prevents configuration errors at compile time ## ๐Ÿ“Š Monitoring & Debugging ### Environment Verification ```typescript import { getApiConfig } from "~/utils/api-config"; console.log("Current API Configuration:", getApiConfig()); ``` ### Build-time Verification Check your build output for correct environment variable injection: ```bash npm run build # Verify the built files contain correct API endpoints ``` ## ๐Ÿšจ Troubleshooting ### Common Issues 1. **Undefined Environment Variables** - Ensure `.env.production` has all required variables - Check Vite prefix requirements (`VITE_` prefix) 2. **Server-Side vs Client-Side** - Use `window.ENV` for Remix server-injected variables - Use `import.meta.env` for Vite build-time injection 3. **Docker/Container Issues** - Ensure environment variables are passed to container - Use `docker-compose.yml` environment section ### Debug Commands ```bash # Check current environment npm run generate:types # Regenerate API types npm run typecheck # Verify TypeScript compilation npm run build # Test production build ``` ## ๐ŸŽฏ Future Enhancements - [ ] Runtime configuration refresh (for long-running apps) - [ ] Configuration validation middleware - [ ] Health check endpoints for configuration verification - [ ] Automated environment variable documentation generation