← back to Omega Watches 2
src/app/api/models/[reference]/timeseries/route.ts
90 lines
import { NextRequest, NextResponse } from "next/server";
import { query, queryOne } from "@/lib/db";
import { getSession } from "@/lib/auth";
export const dynamic = "force-dynamic";
export async function GET(
request: NextRequest,
{ params }: { params: { reference: string } }
) {
const session = await getSession(request);
if (!session) {
return NextResponse.json({ success: false, error: { code: "UNAUTHORIZED", message: "Login required" } }, { status: 401 });
}
const { searchParams } = new URL(request.url);
const eventTypes = searchParams.get("event_types")?.split(",") || null;
const dateFrom = searchParams.get("date_from");
const dateTo = searchParams.get("date_to");
const includeAsks = searchParams.get("include_asks") === "true";
// Find reference
const ref = await queryOne(
"SELECT * FROM watch_reference WHERE reference_number = $1",
[params.reference]
);
if (!ref) {
return NextResponse.json({ success: false, error: { code: "NOT_FOUND", message: "Reference not found" } }, { status: 404 });
}
// Build market events time series
let eventWhere = "WHERE me.reference_id = $1 AND NOT me.is_quarantined";
const eventParams: any[] = [ref.id];
if (!includeAsks) {
eventWhere += " AND me.event_type NOT IN ('dealer_ask', 'forum_listing')";
}
if (eventTypes) {
eventParams.push(eventTypes);
eventWhere += ` AND me.event_type = ANY($${eventParams.length})`;
}
if (dateFrom) {
eventParams.push(dateFrom);
eventWhere += ` AND me.sale_date >= $${eventParams.length}`;
}
if (dateTo) {
eventParams.push(dateTo);
eventWhere += ` AND me.sale_date <= $${eventParams.length}`;
}
const events = await query(
`SELECT
me.sale_date AS date,
me.price_usd AS value,
me.source_name AS source,
me.event_type,
me.condition_normalized AS condition,
me.fee_semantics
FROM market_event me
${eventWhere}
AND me.sale_date IS NOT NULL AND me.price_usd IS NOT NULL
ORDER BY me.sale_date`,
eventParams
);
// Get MSRP series
const msrp = await query(
`SELECT captured_date AS date, msrp_amount AS value, region_code, currency
FROM msrp_snapshot
WHERE reference_id = $1
ORDER BY captured_date`,
[ref.id]
);
return NextResponse.json({
success: true,
data: {
reference: ref,
market_events: events,
msrp_history: msrp,
},
meta: {
market_event_count: events.length,
msrp_snapshot_count: msrp.length,
timestamp: new Date().toISOString(),
},
});
}