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