import { Hono } from 'hono'; import { cors } from 'hono/cors'; import { config } from './config'; import { requestLogger } from './middleware/logger'; import { errorHandler } from './middleware/error-handler'; import { authMiddleware } from './middleware/auth'; import { authRoutes } from './routes/auth'; import { overviewRoutes } from './routes/overview'; import { projectRoutes } from './routes/projects'; import { memberRoutes } from './routes/members'; import { okrRoutes } from './routes/okr'; import { gitRoutes } from './routes/git'; import { adminRoutes } from './routes/admin'; // Importing db triggers auto-migration on first load (B-07 fix) import { db } from './db/index'; import { seedAdminUser } from './db/seed-auto'; import { startScheduler } from './sync/scheduler'; const app = new Hono(); // Global middleware app.use('*', cors({ origin: ['http://localhost:5173', 'http://localhost:3201', 'https://devperf.airlabs.art'], allowMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], allowHeaders: ['Content-Type', 'Authorization'], })); app.use('*', requestLogger); // Health check (public) app.get('/api/health', (c) => { const startTime = process.uptime(); return c.json({ code: 0, data: { status: 'ok', version: '1.0.0', uptime: Math.floor(startTime), dbConnected: true, }, message: 'success', }); }); // Auth routes (public) app.route('/api/auth', authRoutes); // Protected routes app.use('/api/*', authMiddleware); app.route('/api', overviewRoutes); app.route('/api', projectRoutes); app.route('/api', memberRoutes); app.route('/api', okrRoutes); app.route('/api', gitRoutes); app.route('/api', adminRoutes); // Error handler app.onError(errorHandler); // Auto-seed admin user on startup (safe to call repeatedly) seedAdminUser().catch((err) => { console.error('[Seed] Failed to seed admin user:', err); }); // 启动自动同步(每天凌晨 2 点 + 启动时首次同步) startScheduler(); // Start server const port = config.PORT; console.info(`DevPerf Dashboard API starting on port ${port}`); export default { port, fetch: app.fetch, idleTimeout: 120, // AI 分析可能耗时较长 };