churchtube/admin/logs.php

81 lines
4.0 KiB
PHP

<?php
require_once '../includes/db.php';
require_once '../includes/auth.php';
requireAdmin();
$type_filter = $_GET['type'] ?? '';
$query = "SELECT l.*, u.username FROM logs l LEFT JOIN users u ON l.user_id = u.id";
$params = [];
if ($type_filter) {
$query .= " WHERE l.type = ?";
$params = [$type_filter];
}
$query .= " ORDER BY l.created_at DESC LIMIT 100";
$stmt = $pdo->prepare($query);
$stmt->execute($params);
$logs = $stmt->fetchAll();
ob_start();
require_once '../includes/header.php';
$header = ob_get_clean();
echo str_replace(['assets/', 'index.php', 'login.php', 'logout.php', 'admin/'], ['../assets/', '../index.php', '../login.php', '../logout.php', './'], $header);
?>
<div style="max-width: 1200px; margin: 40px auto; padding: 0 24px;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 32px;">
<h1>System Logs</h1>
<div style="display: flex; gap: 12px;">
<select onchange="window.location.href='?type='+this.value" class="btn" style="background: var(--glass); color: var(--text-main); border: 1px solid var(--glass-border);">
<option value="">All Logs</option>
<option value="auth" <?= $type_filter === 'auth' ? 'selected' : '' ?>>Auth</option>
<option value="play" <?= $type_filter === 'play' ? 'selected' : '' ?>>Plays</option>
<option value="comment" <?= $type_filter === 'comment' ? 'selected' : '' ?>>Comments</option>
<option value="error" <?= $type_filter === 'error' ? 'selected' : '' ?>>Errors</option>
<option value="system" <?= $type_filter === 'system' ? 'selected' : '' ?>>System</option>
</select>
<a href="index.php" class="btn" style="background: var(--glass);">Back to Dashboard</a>
</div>
</div>
<div style="background: var(--bg-card); border-radius: 16px; border: 1px solid var(--glass-border); overflow: hidden;">
<table style="width: 100%; border-collapse: collapse; text-align: left;">
<thead>
<tr style="background: var(--glass); color: var(--text-muted); font-size: 0.85rem; text-transform: uppercase;">
<th style="padding: 16px;">Time</th>
<th style="padding: 16px;">Type</th>
<th style="padding: 16px;">User</th>
<th style="padding: 16px;">Message</th>
<th style="padding: 16px;">IP Address</th>
</tr>
</thead>
<tbody>
<?php foreach ($logs as $l): ?>
<tr style="border-bottom: 1px solid var(--glass-border);">
<td style="padding: 16px; font-size: 0.85rem; color: var(--text-muted);"><?= date('M d, H:i:s', strtotime($l['created_at'])) ?></td>
<td style="padding: 16px;">
<span style="padding: 4px 8px; border-radius: 4px; font-size: 0.75rem; background: <?=
$l['type'] === 'error' ? '#ff4081' : (
$l['type'] === 'auth' ? '#7c4dff' : (
$l['type'] === 'play' ? '#4caf50' : 'var(--glass)')) ?>;">
<?= strtoupper($l['type']) ?>
</span>
</td>
<td style="padding: 16px;"><?= htmlspecialchars($l['username'] ?? 'Guest') ?></td>
<td style="padding: 16px; font-size: 0.9rem;"><?= htmlspecialchars($l['message']) ?></td>
<td style="padding: 16px; font-size: 0.85rem; color: var(--text-muted);"><?= htmlspecialchars($l['ip_address']) ?></td>
</tr>
<?php endforeach; ?>
<?php if (empty($logs)): ?>
<tr>
<td colspan="5" style="padding: 40px; text-align: center; color: var(--text-muted);">No logs found.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
<?php require_once '../includes/footer.php'; ?>