← back to Hub
app/api/sdcc/detail/route.ts
59 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 [
totalDrafts,
draftsByStatus,
newsCount,
petitionCount,
collabCount,
partnerCount,
leadCount,
libraryCount,
recentDrafts,
] = await Promise.all([
query('sdcc', 'SELECT COUNT(*) as count FROM drafts'),
query('sdcc', 'SELECT status, COUNT(*) as count FROM drafts GROUP BY status ORDER BY count DESC'),
query('sdcc', 'SELECT COUNT(*) as count FROM news_items'),
query('sdcc', 'SELECT COUNT(*) as count FROM petitions'),
query('sdcc', 'SELECT COUNT(*) as count FROM collaborations'),
query('sdcc', 'SELECT COUNT(*) as count FROM partners'),
query('sdcc', 'SELECT COUNT(*) as count FROM old_leads'),
query('sdcc', 'SELECT COUNT(*) as count FROM library_items'),
query('sdcc', 'SELECT id, subject, lane, status, created_at FROM drafts ORDER BY created_at DESC LIMIT 5'),
]);
const byStatus: Record<string, number> = {};
for (const row of draftsByStatus.rows) {
byStatus[row.status] = parseInt(row.count);
}
return NextResponse.json({
drafts: {
total: parseInt(totalDrafts.rows[0].count),
byStatus,
},
news: parseInt(newsCount.rows[0].count),
petitions: parseInt(petitionCount.rows[0].count),
collaborations: parseInt(collabCount.rows[0].count),
partners: parseInt(partnerCount.rows[0].count),
leads: parseInt(leadCount.rows[0].count),
library: parseInt(libraryCount.rows[0].count),
recentDrafts: recentDrafts.rows,
});
} catch (err) {
console.error('[sdcc/detail] Error:', (err as Error).message);
return NextResponse.json({ error: 'Failed to fetch SDCC data' }, { status: 500 });
}
}