// apps/admin/server/api/stats.get.ts // // Server-side proxy: holt aggregierte Admin-Stats vom Backend. // Admin-Secret bleibt server-only (NIE im Client-Bundle landen lassen). // // Auth-Modell: client ruft /api/stats auf (Nuxt-server-route), // hier wird x-admin-secret aus runtimeConfig.adminSecret an Backend weitergereicht. export interface AdminStats { users: { total: number; newThisWeek: number }; posts: { total: number; newThisWeek: number }; domains: { pending: number; approved: number }; feedback: { pending: number; total: number }; lyra: { postsLast30d: number }; } export default defineEventHandler(async (_event): Promise => { const config = useRuntimeConfig(); const apiBase = config.public.apiBase; const adminSecret = config.adminSecret; if (!adminSecret) { throw createError({ statusCode: 500, statusMessage: "ADMIN_SECRET nicht konfiguriert (Infisical-Var fehlt)", }); } try { const data = await $fetch(`${apiBase}/api/admin/stats`, { method: "GET", headers: { "x-admin-secret": adminSecret }, }); return data; } catch (err: any) { throw createError({ statusCode: err?.statusCode ?? 502, statusMessage: err?.statusMessage ?? err?.message ?? "Backend-Request fehlgeschlagen", }); } });