import type { Metadata } from "next"; import { cookies } from "next/headers"; import { authCookieHeader } from "@/lib/cookies"; import { fetchAdminContentCounts, fetchAdminContentPosts, fetchAdminContentComments, type AdminContentComment, type AdminContentPost, type AdminContentStatus, } from "@/lib/api"; import { getMeCached, getPublicSettingsCached } from "@/lib/serverData"; import { canModerateAny, isSuperOrOwner } from "@/lib/roles"; import Forbidden from "../Forbidden"; import ContentAdmin, { type ContentKind } from "./ContentAdmin"; export const metadata: Metadata = { title: "内容管理", }; const STATUSES: AdminContentStatus[] = ["live", "published", "pending", "rejected", "deleted"]; function parseStatus(v?: string): AdminContentStatus { return v && STATUSES.includes(v as AdminContentStatus) ? (v as AdminContentStatus) : "live"; } function parseKind(v?: string): ContentKind { return v === "comments" ? "comments" : "posts"; } interface ContentPageProps { searchParams: Promise<{ status?: string; kind?: string }>; } export default async function AdminContentPage({ searchParams }: ContentPageProps) { const sp = await searchParams; const initialStatus = parseStatus(sp.status); const initialKind = parseKind(sp.kind); const cookie = authCookieHeader(await cookies()); const me = await getMeCached(cookie || undefined); if (!me.user || !canModerateAny(me.user)) { return ; } let initialPosts: AdminContentPost[] = []; let initialPostsTotal = 0; let initialComments: AdminContentComment[] = []; let initialCommentsTotal = 0; let initError = ""; const [listSettled, counts] = await Promise.all([ initialKind === "comments" ? fetchAdminContentComments(1, initialStatus, cookie || undefined) .then((res) => ({ ok: true as const, kind: "comments" as const, res })) .catch((e) => ({ ok: false as const, error: e instanceof Error ? e.message : "获取内容列表失败", })) : fetchAdminContentPosts(1, initialStatus, cookie || undefined) .then((res) => ({ ok: true as const, kind: "posts" as const, res })) .catch((e) => ({ ok: false as const, error: e instanceof Error ? e.message : "获取内容列表失败", })), fetchAdminContentCounts(cookie || undefined), ]); if (listSettled.ok) { if (listSettled.kind === "posts") { initialPosts = listSettled.res.posts; initialPostsTotal = listSettled.res.total; } else { initialComments = listSettled.res.comments; initialCommentsTotal = listSettled.res.total; } } else { initError = listSettled.error; } const settings = await getPublicSettingsCached(); return ( ); }