import { redirect } from "next/navigation"; import { getSession } from "@/lib/auth"; import { db } from "@/lib/db"; import { checkRuntimeConfig } from "@/lib/config"; export const dynamic = "force-dynamic"; export default async function AdminPage({ searchParams }: { searchParams: Promise<{ updated?: string; error?: string }> }) { const user = await getSession(); if (!user || user.role !== "admin") redirect("/"); const query = await searchParams; const failures = db.prepare("SELECT j.id,j.kind,j.trigger,j.status,j.attempts,j.last_error,j.created_at,j.finished_at,s.id AS source_id,s.name FROM sync_jobs j JOIN sources s ON s.id=j.source_id WHERE j.status='failed' OR s.sync_status='error' ORDER BY COALESCE(j.finished_at,j.created_at) DESC LIMIT 100").all() as any[]; const reports = db.prepare("SELECT r.id,r.reason,r.created_at,p.id AS post_id,p.content,u.username FROM reports r JOIN posts p ON p.id=r.post_id LEFT JOIN users u ON u.id=r.reporter_id WHERE r.resolved=0 ORDER BY r.created_at LIMIT 100").all() as any[]; const users = db.prepare("SELECT id,username,role,disabled,created_at FROM users ORDER BY created_at DESC LIMIT 100").all() as any[]; const errors = db.prepare("SELECT scope,message,created_at FROM error_events ORDER BY id DESC LIMIT 30").all() as any[]; const audits = db.prepare("SELECT a.action,a.target_type,a.target_id,a.metadata_json,a.created_at,u.username FROM audit_events a LEFT JOIN users u ON u.id=a.actor_user_id ORDER BY a.id DESC LIMIT 50").all() as any[]; const sources = db.prepare("SELECT s.id,s.name,s.base_url,s.sync_status,s.last_synced_at,s.is_enabled,count(sm.user_id) AS member_count FROM sources s LEFT JOIN source_members sm ON sm.source_id=s.id GROUP BY s.id ORDER BY s.id DESC").all() as any[]; const config = checkRuntimeConfig(); return <>

管理員

{query.updated &&

管理操作已完成。

}{query.error &&

管理操作未完成。

}

待審核檢舉

{reports.length ? :

沒有待審核檢舉。

}

使用者

失敗或異常工作

{failures.length ? :

沒有同步異常。

}

最近系統錯誤

{errors.length ? :

尚無記錄。

}

稽核紀錄

{audits.length ? :

尚無稽核紀錄。

}

所有來源

正式環境設定

{config.ok ?

設定檢查通過。

: }
; }