feat: integrate Sensei Spook mascot in 4 stances, speech bubbles, and style updates

This commit is contained in:
Ajasra committed 2026-10-28 01:20:01 +08:00
commit e04672db2a
104 files changed
+8262

No files matched your search

+43
View File
@@ -0,0 +1,43 @@
import { NextRequest, NextResponse } from "next/server";
import { isAuthenticated } from "@/lib/admin-auth";
import { getGenerationStats } from "@/lib/storage";
export async function GET(req: NextRequest) {
if (!isAuthenticated(req)) {
return NextResponse.json(
{ error: "Unauthorized. Please login." },
{ status: 401 }
);
}
try {
const { searchParams } = new URL(req.url);
const periodParam = searchParams.get("period") as any;
const rawFromDate = searchParams.get("from") || undefined;
const rawToDate = searchParams.get("to") || undefined;
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
const fromDate = rawFromDate && dateRegex.test(rawFromDate) ? rawFromDate : undefined;
const toDate = rawToDate && dateRegex.test(rawToDate) ? rawToDate : undefined;
const validPeriods = ["day", "week", "month", "all", "custom"];
const period = validPeriods.includes(periodParam) ? periodParam : "week";
const stats = getGenerationStats({
period,
fromDate,
toDate,
});
return NextResponse.json({
success: true,
stats,
});
} catch (error: any) {
console.error("[Portal Stats API] Error:", error);
return NextResponse.json(
{ success: false, error: "Failed to retrieve statistics" },
{ status: 500 }
);
}
}