app-s01qyw/backend/src/routes/admin.ts
2026-09-29 20:05:51 +05:30

68 lines
2.5 KiB
TypeScript

import { Hono } from 'hono';
import { AppContext, adminAuthMiddleware } from '../utils';
const adminRoutes = new Hono<AppContext>();
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<any>();
const activeDrivers = await c.env.DB.prepare('SELECT COUNT(*) as cnt FROM driver_profiles WHERE is_available = 1').first<any>();
const totalRides = await c.env.DB.prepare('SELECT COUNT(*) as cnt FROM rides').first<any>();
const activeRides = await c.env.DB.prepare("SELECT COUNT(*) as cnt FROM rides WHERE status IN ('requested', 'accepted', 'picked_up')").first<any>();
const completedRides = await c.env.DB.prepare("SELECT COUNT(*) as cnt FROM rides WHERE status = 'completed'").first<any>();
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;