import { Hono } from 'hono'; import { supabase } from '../supabase.js'; import { listEntries } from '../files.js'; import { requireAdmin, roleOf } from '../auth.js'; import { config } from '../config.js'; import { contentStats } from '../collections.js'; import { manager } from '../plugins.js'; // Kennzahlen für die Admin-Übersicht. Nur Admins; rein lesend. const stats = new Hono(); stats.use('*', requireAdmin); stats.get('/', async (c) => { // Inhalte aus dem Dateisystem zählen — Zähler pro collection.statKey. let content = {}; try { content = contentStats(await listEntries(), config.collections); } catch { /* Filesystem nicht lesbar → leer */ } // Nutzer nach Rolle (GoTrue). const users = { total: 0, admin: 0, editor: 0, user: 0 }; try { const { data } = await supabase.auth.admin.listUsers(); for (const u of data?.users || []) { users.total++; users[roleOf(u)] = (users[roleOf(u)] || 0) + 1; } } catch { /* GoTrue nicht erreichbar */ } // Plugin-Kennzahlen einsammeln (jedes Plugin unter seinem Namen). Nur geladene // Plugins lesen die DB — eine pluginlose Site macht hier null DB-Zugriffe. const pluginStats = await manager.collectStats({}); // Dialog bleibt als eigenes Feld im Vertrag (Admin erwartet { forums, threads, // comments }); fehlt das Plugin, sind es Nullen. const dialog = pluginStats.dialog || { forums: 0, threads: 0, comments: 0 }; return c.json({ content, users, dialog }); }); export default stats;