import { Hono } from 'hono'; import { AppContext, adminAuthMiddleware } from '../utils'; const adminRoutes = new Hono(); adminRoutes.use('*', adminAuthMiddleware); adminRoutes.get('/verify-token', (c) => { return c.json({ success: true, valid: true }); }); adminRoutes.get('/users', async (c) => { const { results } = await c.env.DB.prepare('SELECT * FROM users ORDER BY created_at DESC').all(); return c.json({ success: true, users: results || [] }); }); adminRoutes.get('/stats', async (c) => { const totalUsers = await c.env.DB.prepare('SELECT COUNT(*) as cnt FROM users').first(); const activeDrivers = await c.env.DB.prepare('SELECT COUNT(*) as cnt FROM driver_profiles WHERE is_available = 1').first(); const totalRides = await c.env.DB.prepare('SELECT COUNT(*) as cnt FROM rides').first(); const activeRides = await c.env.DB.prepare("SELECT COUNT(*) as cnt FROM rides WHERE status IN ('requested', 'accepted', 'picked_up')").first(); const completedRides = await c.env.DB.prepare("SELECT COUNT(*) as cnt FROM rides WHERE status = 'completed'").first(); return c.json({ success: true, stats: { total_users: totalUsers?.cnt || 0, active_drivers: activeDrivers?.cnt || 0, total_rides: totalRides?.cnt || 0, active_rides: activeRides?.cnt || 0, completed_rides: completedRides?.cnt || 0 } }); }); adminRoutes.get('/rides', async (c) => { const { results } = await c.env.DB.prepare(` SELECT r.*, p.full_name as passenger_name, p.phone as passenger_phone, d.full_name as driver_name, d.phone as driver_phone FROM rides r LEFT JOIN users p ON r.passenger_email = p.email LEFT JOIN users d ON r.driver_email = d.email ORDER BY r.created_at DESC `).all(); return c.json({ success: true, rides: results || [] }); }); adminRoutes.post('/upload', async (c) => { try { const body = await c.req.parseBody(); const file = body['file']; if (!file || !(file instanceof File)) { return c.json({ success: false, msg: 'No file provided' }, 400); } const ext = file.name.split('.').pop() || 'bin'; const key = crypto.randomUUID() + '.' + ext; await c.env.R2.put(key, await file.arrayBuffer(), { httpMetadata: { contentType: file.type } }); return c.json({ success: true, url: '/api/media/' + key }); } catch (error: any) { return c.json({ success: false, msg: error.message }, 500); } }); export default adminRoutes;