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