SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
2.3 KB · 42 lines typescript
Raw Blame History
1import { NextResponse } from "next/server";2import { apiError } from "@/lib/api.ts";3import { requireRole } from "@/lib/auth/session.ts";4import { all, get } from "@/lib/db/index.ts";5import { getBudgets } from "@/lib/usage.ts";67export async function GET() {8  try {9    await requireRole("instructor");10    const n = (sql: string, ...p: unknown[]) => get<{ n: number }>(sql, ...p)?.n ?? 0;11    const overview = {12      users: n("SELECT COUNT(*) as n FROM users"),13      students: n("SELECT COUNT(*) as n FROM users WHERE role = 'student'"),14      activeWeek: n("SELECT COUNT(DISTINCT user_id) as n FROM activity_log WHERE created_at >= datetime('now','-7 days')"),15      conversations: n("SELECT COUNT(*) as n FROM conversations"),16      messages: n("SELECT COUNT(*) as n FROM messages"),17      documents: n("SELECT COUNT(*) as n FROM documents"),18      chunks: n("SELECT COUNT(*) as n FROM chunks"),19      flagsOpen: n("SELECT COUNT(*) as n FROM report_flags WHERE resolved = 0"),20      apiErrors7d: n("SELECT COUNT(*) as n FROM usage_log WHERE ok = 0 AND created_at >= datetime('now','-7 days')"),21      costMonth: get<{ c: number }>("SELECT COALESCE(SUM(cost),0) as c FROM usage_log WHERE created_at >= datetime('now','start of month')")?.c ?? 0,22      costToday: get<{ c: number }>("SELECT COALESCE(SUM(cost),0) as c FROM usage_log WHERE created_at >= datetime('now','start of day')")?.c ?? 0,23      budgets: getBudgets(),24      lastIngestion: get("SELECT id, started_at, finished_at, status, chunks_created, files_ingested FROM ingestion_runs ORDER BY id DESC LIMIT 1"),25      costByDay: all(26        `SELECT date(created_at) as day, ROUND(SUM(cost), 4) as cost, COUNT(*) as calls27         FROM usage_log WHERE created_at >= datetime('now','-14 days') GROUP BY day ORDER BY day`28      ),29      topModels: all(30        `SELECT model, COUNT(*) as calls, ROUND(SUM(cost),4) as cost, SUM(tokens_in) as tin, SUM(tokens_out) as tout31         FROM usage_log WHERE created_at >= datetime('now','-30 days') GROUP BY model ORDER BY calls DESC LIMIT 10`32      ),33      invalidCitations7d: n(34        `SELECT COUNT(*) as n FROM activity_log WHERE kind='chat' AND created_at >= datetime('now','-7 days') AND json_extract(meta,'$.invalidCitations') > 0`35      ),36    };37    return NextResponse.json(overview);38  } catch (e) {39    return apiError(e);40  }41}42