[]]); exit; } try { $sql = "SELECT l.id, l.action, l.details, l.ip_address, l.created_at, u.name as user_name, u.role as user_role FROM activity_logs l LEFT JOIN users u ON l.user_id = u.id ORDER BY l.created_at DESC LIMIT 1000"; // limit to prevent huge payloads $stmt = $pdo->prepare($sql); $stmt->execute(); $logs = $stmt->fetchAll(); $data = []; foreach ($logs as $log) { $actor = ''; if ($log['user_name']) { $badge = $log['user_role'] === 'admin' ? 'Admin' : ''; $actor = '
' . htmlspecialchars($log['user_name']) . '' . $badge . '
'; } else { // System or failed login if (strpos($log['action'], 'CRON') !== false) { $actor = ' System (Cron)'; } else { $actor = ' Guest / System'; } } // Format action nicely $action_html = htmlspecialchars($log['action']); if (strpos($log['action'], 'LOGIN') !== false) { $action_html = ' ' . $action_html . ''; } elseif (strpos($log['action'], 'CREATE') !== false) { $action_html = ' ' . $action_html . ''; } elseif (strpos($log['action'], 'UPDATE') !== false) { $action_html = ' ' . $action_html . ''; } elseif (strpos($log['action'], 'DELETE') !== false) { $action_html = ' ' . $action_html . ''; } elseif (strpos($log['action'], 'CRON') !== false) { $action_html = ' ' . $action_html . ''; } $data[] = [ 'id' => $log['id'], 'created_at' => date('d/m/Y H:i:s', strtotime($log['created_at'])), 'user' => $actor, 'action' => $action_html, 'details' => '
' . htmlspecialchars($log['details']) . '
', 'ip_address' => '' . htmlspecialchars($log['ip_address']) . '' ]; } echo json_encode(['data' => $data]); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage(), 'data' => []]); } ?>