![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/.cursor-server/data/User/History/d8b65c3/ |
<?php
session_start();
header('Content-Type: application/json');
// Check if user is logged in and is admin
if (!isset($_SESSION['user_id']) || !isset($_SESSION['is_admin']) || !$_SESSION['is_admin']) {
http_response_code(401);
echo json_encode(['error' => 'Unauthorized']);
exit;
}
require_once 'config/database.php';
$pdo = getDBConnection();
if (!$pdo) {
http_response_code(500);
echo json_encode(['error' => 'Database connection failed']);
exit;
}
try {
$action = $_GET['action'] ?? 'stats';
switch ($action) {
case 'stats':
// Get comprehensive statistics
$stats = [];
// User stats
$stmt = $pdo->prepare("SELECT COUNT(*) as total FROM users");
$stmt->execute();
$stats['totalUsers'] = $stmt->fetch()['total'];
$stmt = $pdo->prepare("SELECT COUNT(*) as total FROM users WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)");
$stmt->execute();
$stats['newUsers'] = $stmt->fetch()['total'];
$stmt = $pdo->prepare("SELECT COUNT(*) as total FROM users WHERE plan IN ('starter', 'pro')");
$stmt->execute();
$stats['premiumUsers'] = $stmt->fetch()['total'];
// Track stats
$stmt = $pdo->prepare("SELECT COUNT(*) as total FROM music_tracks");
$stmt->execute();
$stats['totalTracks'] = $stmt->fetch()['total'];
$stmt = $pdo->prepare("
SELECT
COUNT(CASE WHEN status = 'complete' THEN 1 END) as completed,
COUNT(CASE WHEN status = 'processing' THEN 1 END) as processing,
COUNT(CASE WHEN status = 'failed' THEN 1 END) as failed
FROM music_tracks
");
$stmt->execute();
$trackStats = $stmt->fetch();
$stats['trackStats'] = $trackStats;
$stmt = $pdo->prepare("
SELECT COUNT(*) as total
FROM music_tracks
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
");
$stmt->execute();
$stats['newTracks'] = $stmt->fetch()['total'];
// Duration stats
$stmt = $pdo->prepare("
SELECT
AVG(duration) as avg_duration,
MIN(duration) as min_duration,
MAX(duration) as max_duration,
COUNT(CASE WHEN duration < 60 THEN 1 END) as short_tracks,
COUNT(CASE WHEN duration >= 60 AND duration < 180 THEN 1 END) as medium_tracks,
COUNT(CASE WHEN duration >= 180 THEN 1 END) as long_tracks
FROM music_tracks
WHERE status = 'complete' AND duration > 0
");
$stmt->execute();
$stats['durationStats'] = $stmt->fetch();
echo json_encode(['success' => true, 'data' => $stats]);
break;
case 'recent_activity':
// Get recent activity
$stmt = $pdo->prepare("
SELECT
mt.id,
mt.title,
mt.status,
mt.duration,
mt.created_at,
u.name as user_name,
u.plan
FROM music_tracks mt
JOIN users u ON mt.user_id = u.id
ORDER BY mt.created_at DESC
LIMIT 20
");
$stmt->execute();
$recentActivity = $stmt->fetchAll();
echo json_encode(['success' => true, 'data' => $recentActivity]);
break;
case 'top_users':
// Get top users
$stmt = $pdo->prepare("
SELECT
u.id,
u.name,
u.plan,
COUNT(mt.id) as total_tracks,
COUNT(CASE WHEN mt.status = 'complete' THEN 1 END) as completed_tracks,
COUNT(CASE WHEN mt.status = 'processing' THEN 1 END) as processing_tracks,
COUNT(CASE WHEN mt.status = 'failed' THEN 1 END) as failed_tracks,
MAX(mt.created_at) as last_activity
FROM users u
LEFT JOIN music_tracks mt ON u.id = mt.user_id
GROUP BY u.id, u.name, u.plan
ORDER BY total_tracks DESC
LIMIT 15
");
$stmt->execute();
$topUsers = $stmt->fetchAll();
echo json_encode(['success' => true, 'data' => $topUsers]);
break;
case 'user_stats':
// Get user track statistics
$stmt = $pdo->prepare("
SELECT
u.name,
u.plan,
COUNT(CASE WHEN mt.status = 'complete' THEN 1 END) as completed,
COUNT(CASE WHEN mt.status = 'processing' THEN 1 END) as processing,
COUNT(CASE WHEN mt.status = 'failed' THEN 1 END) as failed
FROM users u
LEFT JOIN music_tracks mt ON u.id = mt.user_id
GROUP BY u.id, u.name, u.plan
HAVING completed > 0 OR processing > 0 OR failed > 0
ORDER BY (completed + processing + failed) DESC
");
$stmt->execute();
$userStats = $stmt->fetchAll();
echo json_encode(['success' => true, 'data' => $userStats]);
break;
case 'plan_stats':
// Get plan statistics
$stmt = $pdo->prepare("
SELECT
u.plan,
COUNT(u.id) as user_count,
COUNT(mt.id) as total_tracks,
COUNT(CASE WHEN mt.status = 'complete' THEN 1 END) as completed_tracks,
AVG(mt.duration) as avg_duration
FROM users u
LEFT JOIN music_tracks mt ON u.id = mt.user_id
GROUP BY u.plan
ORDER BY user_count DESC
");
$stmt->execute();
$planStats = $stmt->fetchAll();
echo json_encode(['success' => true, 'data' => $planStats]);
break;
case 'retry_failed':
// Bulk retry failed tracks
$stmt = $pdo->prepare("
SELECT id, user_id, title
FROM music_tracks
WHERE status = 'failed'
ORDER BY created_at DESC
");
$stmt->execute();
$failedTracks = $stmt->fetchAll();
$retried = 0;
foreach ($failedTracks as $track) {
// Update status to processing
$updateStmt = $pdo->prepare("
UPDATE music_tracks
SET status = 'processing', updated_at = NOW()
WHERE id = ?
");
$updateStmt->execute([$track['id']]);
$retried++;
}
echo json_encode([
'success' => true,
'message' => "Retried $retried failed tracks",
'retried' => $retried
]);
break;
default:
http_response_code(400);
echo json_encode(['error' => 'Invalid action']);
}
} catch (Exception $e) {
error_log("Admin API Error: " . $e->getMessage());
http_response_code(500);
echo json_encode(['error' => 'Internal server error']);
}
?>