/** * LandveX Intelligence Lab API * * Updated with API Key Management module. */ import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import missionImportRoutes from './routes/mission-import'; import versionRoutes from './routes/version'; import { createApiKeyRoutes } from './routes/api-keys'; import { ApiKeyService } from './services/api-key-service'; import { apiKeyAuth } from './middleware/api-key-auth'; import { PostgresApiKeyRepository, PostgresApiKeyUsageRepository, PostgresApiKeyConfig, } from '../../infrastructure/src/adapters/postgresql/postgres-api-key-repository'; const app = express(); const PORT = process.env.PORT || 3000; // PostgreSQL config from environment const pgConfig: PostgresApiKeyConfig = { host: process.env.PG_HOST || 'localhost', port: parseInt(process.env.PG_PORT || '5432', 10), database: process.env.PG_DATABASE || 'landvex', user: process.env.PG_USER || 'landvex', password: process.env.PG_PASSWORD || '', ssl: process.env.PG_SSL === 'true' ? true : undefined, }; // Initialize repositories and services const apiKeyRepo = new PostgresApiKeyRepository(pgConfig); const usageRepo = new PostgresApiKeyUsageRepository(pgConfig); const apiKeyService = new ApiKeyService(apiKeyRepo, usageRepo); // Initialize database tables (in production, use migrations instead) async function initDatabase(): Promise { await apiKeyRepo.init(); await usageRepo.init(); } // Middleware app.use(helmet()); app.use(cors()); app.use(express.json()); // API Key authentication for protected routes // Excludes health check, version, and admin API key management endpoints app.use(apiKeyAuth({ service: apiKeyService, excludePaths: ['/health', '/version', '/api-keys'], })); // Routes app.use('/api/v1/missions', missionImportRoutes); app.use('/version', versionRoutes); app.use('/api-keys', createApiKeyRoutes(apiKeyService)); // Health check app.get('/health', (_req, res) => { res.json({ status: 'ok', version: '0.2.0-apikeys' }); }); // Start server async function start() { await initDatabase(); app.listen(PORT, () => { console.log(`🚀 LandveX API running on port ${PORT}`); console.log(`📹 Mission Import: POST /api/v1/missions/import`); console.log(`🔑 API Key Mgmt: POST /api-keys`); console.log(`🏥 Health Check: GET /health`); }); } if (require.main === module) { start().catch(err => { console.error('Failed to start server:', err); process.exit(1); }); } export default app;