← 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 });
}
}