← back to PoppyPetitions

app/api/settings/stats/route.ts

62 lines

import { NextRequest, NextResponse } from 'next/server';
import { verifyAuth } from '@/lib/auth';
import { query } from '@/lib/db';

export async function GET(request: NextRequest) {
  const user = verifyAuth(request);
  if (!user) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  try {
    // Database stats — run all queries in parallel
    const [
      petitionResult,
      agentResult,
      voteResult,
      commentResult,
      computeResult,
      agentHealthResult,
      dbCheckResult,
    ] = await Promise.all([
      query('SELECT COUNT(*)::int AS count FROM poppy.petitions'),
      query('SELECT COUNT(*)::int AS count, COUNT(*) FILTER (WHERE is_active) ::int AS active FROM poppy.agents'),
      query('SELECT COUNT(*)::int AS count FROM poppy.votes'),
      query('SELECT COUNT(*)::int AS count FROM poppy.comments'),
      query('SELECT COUNT(*)::int AS count, COALESCE(SUM(total_tokens), 0)::bigint AS total_tokens, COALESCE(SUM(cost_usd), 0)::numeric(10,6) AS total_cost FROM poppy.compute_usage'),
      query(`
        SELECT COUNT(*)::int AS agent_count,
               MAX(created_at) AS last_activity
        FROM poppy.compute_usage
      `),
      query('SELECT 1 AS ok'),
    ]);

    return NextResponse.json({
      system: {
        version: '0.1.0',
        database_status: dbCheckResult.rows.length > 0 ? 'connected' : 'error',
        ai_model: 'Gemini 2.0 Flash',
        agent_source: 'Rolodex (port 9891)',
      },
      database: {
        total_petitions: petitionResult.rows[0]?.count ?? 0,
        total_agents: agentResult.rows[0]?.count ?? 0,
        active_agents: agentResult.rows[0]?.active ?? 0,
        total_votes: voteResult.rows[0]?.count ?? 0,
        total_comments: commentResult.rows[0]?.count ?? 0,
        total_compute_actions: computeResult.rows[0]?.count ?? 0,
        total_compute_tokens: computeResult.rows[0]?.total_tokens ?? 0,
        total_compute_cost: computeResult.rows[0]?.total_cost ?? 0,
      },
      agent_health: {
        agent_count: agentHealthResult.rows[0]?.agent_count ?? 0,
        last_activity: agentHealthResult.rows[0]?.last_activity ?? null,
      },
    });
  } catch (err) {
    console.error('[settings/stats GET]', (err as Error).message);
    return NextResponse.json({ error: 'Internal error' }, { status: 500 });
  }
}