← back to Hub

app/api/patty/detail/route.ts

63 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 [
      totalPetitions,
      petitionsByStatus,
      totalSigs,
      totalCampaigns,
      campaignsByStatus,
      subscriberCount,
      templateCount,
      activePetitions,
    ] = await Promise.all([
      query('patty', 'SELECT COUNT(*) as count FROM petitions'),
      query('patty', 'SELECT status, COUNT(*) as count FROM petitions GROUP BY status ORDER BY count DESC'),
      query('patty', 'SELECT COALESCE(SUM(signature_count), 0) as total FROM petitions'),
      query('patty', 'SELECT COUNT(*) as count FROM email_campaigns'),
      query('patty', 'SELECT status, COUNT(*) as count FROM email_campaigns GROUP BY status ORDER BY count DESC'),
      query('patty', 'SELECT COUNT(*) as count FROM email_subscribers'),
      query('patty', 'SELECT COUNT(*) as count FROM petition_templates'),
      query('patty', 'SELECT id, title, status, signature_count, created_at FROM petitions ORDER BY created_at DESC LIMIT 5'),
    ]);

    const petByStatus: Record<string, number> = {};
    for (const row of petitionsByStatus.rows) {
      petByStatus[row.status] = parseInt(row.count);
    }

    const campByStatus: Record<string, number> = {};
    for (const row of campaignsByStatus.rows) {
      campByStatus[row.status] = parseInt(row.count);
    }

    return NextResponse.json({
      petitions: {
        total: parseInt(totalPetitions.rows[0].count),
        byStatus: petByStatus,
      },
      signatures: parseInt(totalSigs.rows[0].total),
      campaigns: {
        total: parseInt(totalCampaigns.rows[0].count),
        byStatus: campByStatus,
      },
      subscribers: parseInt(subscriberCount.rows[0].count),
      templates: parseInt(templateCount.rows[0].count),
      activePetitions: activePetitions.rows,
    });
  } catch (err) {
    console.error('[patty/detail] Error:', (err as Error).message);
    return NextResponse.json({ error: 'Failed to fetch Patty data' }, { status: 500 });
  }
}