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