import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; import { prisma } from "@/lib/prisma"; import { requireSession } from "@/lib/auth/requireSession"; import { computeFinancialImpact } from "@/lib/financial/impact"; const RANGE_MS: Record = { "24h": 24 * 60 * 60 * 1000, "7d": 7 * 24 * 60 * 60 * 1000, "30d": 30 * 24 * 60 * 60 * 1000, }; function canManageFinancials(role?: string | null) { return role === "OWNER"; } function parseDate(input?: string | null) { if (!input) return null; const n = Number(input); if (!Number.isNaN(n)) return new Date(n); const d = new Date(input); return Number.isNaN(d.getTime()) ? null : d; } function pickRange(req: NextRequest) { const url = new URL(req.url); const range = url.searchParams.get("range") ?? "7d"; const now = new Date(); if (range === "custom") { const start = parseDate(url.searchParams.get("start")) ?? new Date(now.getTime() - RANGE_MS["24h"]); const end = parseDate(url.searchParams.get("end")) ?? now; return { start, end }; } const ms = RANGE_MS[range] ?? RANGE_MS["24h"]; return { start: new Date(now.getTime() - ms), end: now }; } export async function GET(req: NextRequest) { const session = await requireSession(); if (!session) return NextResponse.json({ ok: false, error: "Unauthorized" }, { status: 401 }); const membership = await prisma.orgUser.findUnique({ where: { orgId_userId: { orgId: session.orgId, userId: session.userId } }, select: { role: true }, }); if (!canManageFinancials(membership?.role)) { return NextResponse.json({ ok: false, error: "Forbidden" }, { status: 403 }); } const url = new URL(req.url); const { start, end } = pickRange(req); const machineId = url.searchParams.get("machineId") ?? undefined; const location = url.searchParams.get("location") ?? undefined; const sku = url.searchParams.get("sku") ?? undefined; const currency = url.searchParams.get("currency") ?? undefined; const result = await computeFinancialImpact({ orgId: session.orgId, start, end, machineId, location, sku, currency, includeEvents: false, }); return NextResponse.json({ ok: true, ...result }); }