68 lines
2.5 KiB
TypeScript
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; |