← back to Hub
app/api/freddy/detail/route.ts
46 lines
import { NextRequest, NextResponse } from 'next/server';
import { verifyAuth } from '@/lib/auth';
import { query } from '@/lib/db';
export const dynamic = 'force-dynamic';
export async function GET(request: NextRequest) {
const user = verifyAuth(request);
if (!user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
try {
const [
causeCount,
orgCount,
granterCount,
matchCount,
contactCount,
revenueTotal,
topCauses,
] = await Promise.all([
query('freddy', 'SELECT COUNT(*) as count FROM causes'),
query('freddy', 'SELECT COUNT(*) as count FROM organizations'),
query('freddy', 'SELECT COUNT(*) as count FROM granters'),
query('freddy', 'SELECT COUNT(*) as count FROM matches'),
query('freddy', 'SELECT COUNT(*) as count FROM contacts'),
query('freddy', 'SELECT COALESCE(SUM(commission_amount), 0) as total FROM revenue'),
query('freddy', 'SELECT id, title, total_votes, urgency_score, status FROM causes ORDER BY total_votes DESC NULLS LAST LIMIT 5'),
]);
return NextResponse.json({
causes: parseInt(causeCount.rows[0].count),
organizations: parseInt(orgCount.rows[0].count),
granters: parseInt(granterCount.rows[0].count),
matches: parseInt(matchCount.rows[0].count),
contacts: parseInt(contactCount.rows[0].count),
revenue_total: parseFloat(revenueTotal.rows[0].total) || 0,
topCauses: topCauses.rows,
});
} catch (err) {
console.error('[freddy/detail] Error:', (err as Error).message);
return NextResponse.json({ error: 'Failed to fetch Freddy data' }, { status: 500 });
}
}