← back to Omega Watches 2

src/app/api/references/route.ts

72 lines

import { NextRequest, NextResponse } from "next/server";
import { query } from "@/lib/db";
import { getSession } from "@/lib/auth";

export const dynamic = "force-dynamic";

export async function GET(request: NextRequest) {
  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 collection = searchParams.get("collection");
  const search = searchParams.get("q");

  let where = "WHERE 1=1";
  const params: any[] = [];
  let idx = 1;

  if (collection) {
    where += ` AND wr.collection = $${idx++}`;
    params.push(collection);
  }
  if (search) {
    where += ` AND (wr.reference_number ILIKE $${idx} OR wr.model_name ILIKE $${idx} OR wr.collection ILIKE $${idx})`;
    params.push(`%${search}%`);
    idx++;
  }

  const references = await query(
    `SELECT
      wr.*,
      (SELECT COUNT(*) FROM market_event me WHERE me.reference_id = wr.id) AS event_count,
      (SELECT COUNT(*) FROM msrp_snapshot ms WHERE ms.reference_id = wr.id) AS msrp_count,
      (SELECT ms.msrp_amount FROM msrp_snapshot ms
       WHERE ms.reference_id = wr.id AND ms.region_code = 'US'
       ORDER BY ms.captured_date DESC LIMIT 1) AS latest_msrp,
      (SELECT AVG(me.price_usd) FROM market_event me
       WHERE me.reference_id = wr.id AND me.price_usd IS NOT NULL
       AND me.event_type IN ('auction_realized', 'marketplace_sold')) AS avg_market_price,
      (SELECT me.price_usd FROM market_event me
       WHERE me.reference_id = wr.id AND me.price_usd IS NOT NULL
       ORDER BY me.sale_date DESC LIMIT 1) AS latest_sale_price,
      (SELECT me.sale_date FROM market_event me
       WHERE me.reference_id = wr.id AND me.sale_date IS NOT NULL
       ORDER BY me.sale_date DESC LIMIT 1) AS latest_sale_date
    FROM watch_reference wr
    ${where}
    ORDER BY wr.collection, wr.model_name`,
    params
  );

  const summary = await query(
    `SELECT
      (SELECT COUNT(*) FROM watch_reference) AS total_references,
      (SELECT COUNT(*) FROM market_event) AS total_events,
      (SELECT COUNT(*) FROM msrp_snapshot) AS total_snapshots,
      (SELECT COUNT(DISTINCT collection) FROM watch_reference) AS collection_count`
  );

  return NextResponse.json({
    success: true,
    data: references,
    summary: summary[0],
    meta: { timestamp: new Date().toISOString() },
  });
}