← back to Norma
app/api/social/analytics/route.ts
60 lines
import { NextRequest, NextResponse } from 'next/server';
import { query } from '@/lib/db';
import { requireRole } from '@/lib/require-role';
/**
* GET /api/social/analytics?platform=twitter&days=30
* Returns analytics data for a platform.
*/
export async function GET(request: NextRequest) {
const auth = requireRole(request, 'admin', 'staff');
if (auth instanceof NextResponse) return auth;
const { searchParams } = new URL(request.url);
const platform = searchParams.get('platform') || 'twitter';
const days = Math.min(parseInt(searchParams.get('days') || '30', 10), 365);
const accountResult = await query(
`SELECT id FROM social_accounts WHERE platform = $1 LIMIT 1`,
[platform]
);
if (accountResult.rows.length === 0) {
return NextResponse.json({ analytics: [], platform });
}
const accountId = accountResult.rows[0].id;
const result = await query(
`SELECT date, followers, followers_delta,
total_likes, total_comments, total_shares,
total_views, total_reach, engagement_rate
FROM social_analytics
WHERE account_id = $1 AND date >= CURRENT_DATE - $2::integer
ORDER BY date ASC`,
[accountId, days]
);
if (result.rows.length === 0) {
const postStats = await query(
`SELECT
DATE(created_at) as date,
COUNT(*) as post_count,
SUM(likes) as total_likes,
SUM(comments) as total_comments,
SUM(shares) as total_shares,
SUM(views) as total_views,
SUM(reach) as total_reach
FROM social_posts
WHERE account_id = $1
AND created_at >= CURRENT_DATE - $2::integer
GROUP BY DATE(created_at)
ORDER BY date ASC`,
[accountId, days]
);
return NextResponse.json({ analytics: postStats.rows, platform, source: 'posts' });
}
return NextResponse.json({ analytics: result.rows, platform, source: 'analytics' });
}