[]]);
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' => []]);
}
?>