import { requireOwner, withCors, preflight } from "@/lib/admin"; import { query, type SqlValue } from "@/lib/db"; const PAGE_SIZE = 25; const SELECT_RIDES = ` SELECT r.ride_id, r.origin_address, r.destination_address, r.ride_time, r.fare_price, r.payment_status, r.created_at, u.id AS user_id, u.email AS user_email, json_build_object( 'driver_id', d.id, 'name', d.first_name || ' ' || d.last_name, 'rating', d.rating ) AS driver FROM rides r INNER JOIN drivers d ON d.id = r.driver_id INNER JOIN users u ON u.id = r.user_id `; export async function OPTIONS() { return preflight(); } export async function GET(request: Request) { const auth = await requireOwner(request); if ("error" in auth) return withCors(auth.error); try { const url = new URL(request.url); const status = url.searchParams.get("status")?.trim().toLowerCase() ?? ""; const q = url.searchParams.get("q")?.trim() ?? ""; const page = Math.max(1, Number(url.searchParams.get("page")) || 1); const conds: string[] = []; const params: SqlValue[] = []; if (status) { params.push(status); conds.push(`LOWER(r.payment_status) = $${params.length}`); } if (q) { params.push(`%${q}%`); const n = params.length; conds.push( `(u.email ILIKE $${n} OR (d.first_name || ' ' || d.last_name) ILIKE $${n} OR ` + `r.origin_address ILIKE $${n} OR r.destination_address ILIKE $${n})`, ); } const where = conds.length ? ` WHERE ${conds.join(" AND ")}` : ""; const [{ count }] = await query<{ count: number }>( `SELECT COUNT(*)::int AS count FROM rides r INNER JOIN drivers d ON d.id = r.driver_id INNER JOIN users u ON u.id = r.user_id${where}`, params, ); const rows = await query( `${SELECT_RIDES}${where} ORDER BY r.created_at DESC LIMIT $${params.length + 1} OFFSET $${params.length + 2}`, [...params, PAGE_SIZE, (page - 1) * PAGE_SIZE], ); return withCors( Response.json({ data: rows, total: count, page, pageSize: PAGE_SIZE, pages: Math.max(1, Math.ceil(count / PAGE_SIZE)), }), ); } catch (error) { console.error("[ADMIN_RIDES]: ", error); return withCors( Response.json({ error: "Internal Server Error" }, { status: 500 }), ); } }