feat: add local auth billing and usage management
This commit is contained in:
61
app/api/admin/usage/route.ts
Normal file
61
app/api/admin/usage/route.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
import { jsonError, jsonOk } from "@/lib/server/api";
|
||||
import { requireAdminSession } from "@/lib/server/auth/current-user";
|
||||
import { listPlatformOrganizations } from "@/lib/server/account-store";
|
||||
import { hasSuperAdminAccess } from "@/lib/auth/permissions";
|
||||
import { getAdminUsageReport } from "@/lib/server/usage-service";
|
||||
import type { GenerationCapability, GenerationProvider } from "@/lib/types";
|
||||
|
||||
export const runtime = "nodejs";
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
export async function GET(request: Request) {
|
||||
try {
|
||||
const session = await requireAdminSession();
|
||||
const url = new URL(request.url);
|
||||
const isSuperAdmin = hasSuperAdminAccess(session.user);
|
||||
const organizations = (await listPlatformOrganizations({ includeDisabled: isSuperAdmin }))
|
||||
.filter((organization) => isSuperAdmin || organization.id === session.user.organizationId)
|
||||
.map((organization) => ({ organizationId: organization.id, organizationName: organization.name }));
|
||||
const report = await getAdminUsageReport({
|
||||
startDate: optionalParam(url, "startDate"),
|
||||
endDate: optionalParam(url, "endDate"),
|
||||
organizationId: isSuperAdmin ? optionalParam(url, "organizationId") : session.user.organizationId,
|
||||
ownerId: isSuperAdmin ? optionalParam(url, "ownerId") : undefined,
|
||||
capability: parseCapability(optionalParam(url, "capability")),
|
||||
provider: parseProvider(optionalParam(url, "provider"))
|
||||
}, organizations);
|
||||
if (isSuperAdmin) return jsonOk(report);
|
||||
return jsonOk({
|
||||
...report,
|
||||
accounts: [],
|
||||
recent: [],
|
||||
options: { ...report.options, accounts: [] }
|
||||
});
|
||||
} catch (error) {
|
||||
return jsonError(error, 500, { request, source: "api.admin.usage", logClientErrors: true });
|
||||
}
|
||||
}
|
||||
|
||||
function optionalParam(url: URL, name: string): string | undefined {
|
||||
return url.searchParams.get(name)?.trim() || undefined;
|
||||
}
|
||||
|
||||
function parseCapability(value?: string): GenerationCapability | undefined {
|
||||
if (!value) return undefined;
|
||||
if (value === "image.generate" || value === "video.generate") {
|
||||
return value;
|
||||
}
|
||||
throw badRequest("不支持的功能类型。");
|
||||
}
|
||||
|
||||
function parseProvider(value?: string): GenerationProvider | undefined {
|
||||
if (!value) return undefined;
|
||||
if (value === "volcengine-visual" || value === "evolink" || value === "seedance" || value === "bailian") {
|
||||
return value;
|
||||
}
|
||||
throw badRequest("不支持的服务商。");
|
||||
}
|
||||
|
||||
function badRequest(message: string): Error & { status: number } {
|
||||
return Object.assign(new Error(message), { status: 400 });
|
||||
}
|
||||
Reference in New Issue
Block a user