← back to Omega Watches 2
src/app/api/fx-rates/route.ts
89 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 }
);
}
// Latest rate for each currency pair
const latestRates = await query(`
SELECT DISTINCT ON (currency_from, currency_to)
id, currency_from, currency_to, rate, rate_date, source, created_at
FROM fx_rate
ORDER BY currency_from, currency_to, rate_date DESC
`);
// Rate history (last 30 days, all pairs)
const history = await query(`
SELECT currency_from, currency_to, rate, rate_date, source
FROM fx_rate
WHERE rate_date > CURRENT_DATE - 30
ORDER BY currency_from, rate_date DESC
`);
// Summary stats
const stats = await query(`
SELECT
COUNT(DISTINCT (currency_from, currency_to)) as pairs,
COUNT(*) as total_rates,
MIN(rate_date) as earliest,
MAX(rate_date) as latest
FROM fx_rate
`);
return NextResponse.json({
success: true,
data: {
latest: latestRates,
history,
stats: stats[0],
},
});
}
// POST: Add or update FX rates
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" && session.role !== "operator") {
return NextResponse.json(
{ success: false, error: { code: "FORBIDDEN", message: "Admin or operator role required" } },
{ status: 403 }
);
}
const { currency_from, rate, rate_date, source = "manual" } = await request.json();
if (!currency_from || !rate || !rate_date) {
return NextResponse.json(
{ success: false, error: { code: "MISSING_PARAMS", message: "currency_from, rate, and rate_date required" } },
{ status: 400 }
);
}
const result = await query(
`INSERT INTO fx_rate (currency_from, currency_to, rate, rate_date, source)
VALUES ($1, 'USD', $2, $3, $4)
ON CONFLICT (currency_from, currency_to, rate_date, source)
DO UPDATE SET rate = $2
RETURNING *`,
[currency_from.toUpperCase(), rate, rate_date, source]
);
return NextResponse.json({ success: true, data: result[0] });
}