← 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(),
    },
  });
}