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