← back to Omega Watches 2

src/app/api/sources/[source]/status/route.ts

56 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: { source: string } }
) {
  const session = await getSession(request);
  if (!session) {
    return NextResponse.json({ success: false, error: { code: "UNAUTHORIZED", message: "Login required" } }, { status: 401 });
  }

  const source = await queryOne(
    "SELECT * FROM data_source WHERE name = $1",
    [params.source]
  );

  if (!source) {
    return NextResponse.json({ success: false, error: { code: "NOT_FOUND", message: "Source not found" } }, { status: 404 });
  }

  const recentRuns = await query(
    `SELECT * FROM collector_run WHERE source_id = $1 ORDER BY created_at DESC LIMIT 20`,
    [source.id]
  );

  const currentParser = await queryOne(
    `SELECT * FROM parser_version WHERE source_id = $1 AND is_current = true`,
    [source.id]
  );

  const eventCounts = await queryOne(
    `SELECT
      COUNT(*) as total_events,
      COUNT(*) FILTER (WHERE event_type = 'auction_realized') as auction_count,
      COUNT(*) FILTER (WHERE event_type = 'marketplace_sold') as marketplace_count,
      COUNT(*) FILTER (WHERE event_type = 'dealer_ask') as dealer_ask_count,
      COUNT(*) FILTER (WHERE is_quarantined) as quarantined_count
    FROM market_event WHERE source_name = $1`,
    [params.source]
  );

  return NextResponse.json({
    success: true,
    data: {
      source,
      recent_runs: recentRuns,
      current_parser: currentParser,
      event_counts: eventCounts,
    },
  });
}