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