wiwiway / src /app /api /usage /utilization /route.ts
Claude Code
Sync gateway codebase without binaries
116b4cb
Raw
History Blame Contribute Delete
2.14 kB
import { NextResponse } from "next/server";
import { getAggregatedSnapshots } from "@/lib/db/quotaSnapshots";
import type { ProviderUtilizationResponse, UtilizationTimeRange } from "@/shared/types/utilization";
import { BUCKET_SIZES } from "@/shared/types/utilization";
const VALID_RANGES: UtilizationTimeRange[] = ["1h", "24h", "7d", "30d"];
function getRangeStartIso(range: UtilizationTimeRange): string {
const end = new Date();
const start = new Date(end);
switch (range) {
case "1h":
start.setHours(start.getHours() - 1);
break;
case "24h":
start.setDate(start.getDate() - 1);
break;
case "7d":
start.setDate(start.getDate() - 7);
break;
case "30d":
start.setDate(start.getDate() - 30);
break;
}
return start.toISOString();
}
export async function GET(request: Request) {
try {
const { searchParams } = new URL(request.url);
const rangeParam = searchParams.get("range");
const providerParam = searchParams.get("provider");
if (!rangeParam || !VALID_RANGES.includes(rangeParam as UtilizationTimeRange)) {
return NextResponse.json(
{ error: "Invalid range. Must be one of: 1h, 24h, 7d, 30d" },
{ status: 400 }
);
}
const range = rangeParam as UtilizationTimeRange;
const since = getRangeStartIso(range);
const bucketMinutes = BUCKET_SIZES[range];
const aggregateByParam = searchParams.get("aggregateBy");
const aggregateBy = aggregateByParam === "connection" ? "connection" : "provider";
const data = getAggregatedSnapshots({
provider: providerParam || undefined,
since,
bucketMinutes,
aggregateBy,
});
const providers = Array.from(new Set(data.map((d) => d.provider)));
const response: ProviderUtilizationResponse = {
timeRange: range,
bucketSizeMinutes: bucketMinutes,
providers,
data,
};
return NextResponse.json(response);
} catch (error) {
console.error("Error fetching utilization data:", error);
return NextResponse.json({ error: "Failed to fetch utilization data" }, { status: 500 });
}
}