← back to Omega Watches 2

src/app/api/condition-mappings/route.ts

80 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 mappings = await query(`
    SELECT id, source_name, source_category, normalized_grade,
           score_0_100, version, created_at
    FROM condition_mapping
    ORDER BY source_name, score_0_100 DESC
  `);

  // Group by source
  const bySource: Record<string, any[]> = {};
  for (const m of mappings) {
    const src = (m as any).source_name;
    if (!bySource[src]) bySource[src] = [];
    bySource[src].push(m);
  }

  // Summary
  const stats = {
    total_mappings: mappings.length,
    sources: Object.keys(bySource).length,
    grades: [...new Set(mappings.map((m: any) => m.normalized_grade))],
  };

  return NextResponse.json({
    success: true,
    data: { mappings, by_source: bySource, stats },
  });
}

export async function POST(request: NextRequest) {
  const session = await getSession(request);
  if (!session) {
    return NextResponse.json(
      { success: false, error: { code: "UNAUTHORIZED", message: "Login required" } },
      { status: 401 }
    );
  }

  if (session.role !== "admin") {
    return NextResponse.json(
      { success: false, error: { code: "FORBIDDEN", message: "Admin role required" } },
      { status: 403 }
    );
  }

  const { source_name, source_category, normalized_grade, score_0_100 } = await request.json();

  if (!source_name || !source_category || !normalized_grade || score_0_100 === undefined) {
    return NextResponse.json(
      { success: false, error: { code: "MISSING_PARAMS", message: "All fields required" } },
      { status: 400 }
    );
  }

  const result = await query(
    `INSERT INTO condition_mapping (source_name, source_category, normalized_grade, score_0_100)
     VALUES ($1, $2, $3, $4)
     ON CONFLICT (source_name, source_category, version) DO UPDATE
     SET normalized_grade = $3, score_0_100 = $4
     RETURNING *`,
    [source_name, source_category, normalized_grade, score_0_100]
  );

  return NextResponse.json({ success: true, data: result[0] });
}