feat: enhance admin dashboard with dynamic tracker limit selection and optimize database metrics query

This commit is contained in:
g0ldyy
2025-12-01 09:54:33 +01:00
parent 6e2e420d73
commit 5df412125b
3 changed files with 34 additions and 11 deletions
+3 -8
View File
@@ -223,25 +223,20 @@ async def admin_api_metrics(admin_session: str = Cookie(None)):
# Torrents by tracker
top_trackers = await database.fetch_all("""
SELECT tracker, COUNT(*) as count
SELECT tracker, COUNT(*) as count, AVG(seeders) as avg_seeders, AVG(size) as avg_size
FROM torrents
GROUP BY tracker
ORDER BY count DESC
LIMIT 5
""")
tracker_stats = []
for row in top_trackers:
stats = await database.fetch_one(
"SELECT AVG(seeders) as avg_seeders, AVG(size) as avg_size FROM torrents WHERE tracker = :tracker",
{"tracker": row["tracker"]},
)
tracker_stats.append(
{
"tracker": row["tracker"],
"count": row["count"],
"avg_seeders": stats["avg_seeders"],
"avg_size": stats["avg_size"],
"avg_seeders": row["avg_seeders"],
"avg_size": row["avg_size"],
}
)
+2
View File
@@ -631,6 +631,8 @@ async def setup_database():
await database.execute("DELETE FROM active_connections")
await database.execute("DELETE FROM metrics_cache")
except Exception as e:
logger.error(f"Error setting up the database: {e}")
logger.exception(traceback.format_exc())
+29 -3
View File
@@ -956,7 +956,16 @@
<h3><sl-icon name="download"></sl-icon> Torrents Analysis</h3>
<div class="metric-content">
<div class="metric-subsection">
<h4>Top Trackers</h4>
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;">
<h4 style="margin: 0;">Top Trackers</h4>
<sl-select id="tracker-limit" size="small" value="5" style="width: 110px;">
<sl-option value="5">Top 5</sl-option>
<sl-option value="10">Top 10</sl-option>
<sl-option value="20">Top 20</sl-option>
<sl-option value="50">Top 50</sl-option>
<sl-option value="all">All</sl-option>
</sl-select>
</div>
<div id="tracker-stats" class="data-list">
<div class="loading-state">
<sl-spinner></sl-spinner>
@@ -1075,6 +1084,7 @@
initializeDashboard();
});
let currentMetricsData = null;
let connectionsInterval;
let logsInterval;
let lastLogTimestamp = 0;
@@ -1103,6 +1113,13 @@
document
.getElementById("hide-api-logs")
.addEventListener("sl-change", toggleApiLogsVisibility);
document
.getElementById("tracker-limit")
.addEventListener("sl-change", () => {
if (currentMetricsData) {
updateTorrentsSection(currentMetricsData.torrents);
}
});
// Tab change handler
document
@@ -1390,6 +1407,7 @@
try {
const response = await fetch("/admin/api/metrics");
const data = await response.json();
currentMetricsData = data;
updateMetricsOverview(data);
updateTorrentsSection(data.torrents);
@@ -1414,11 +1432,19 @@
function updateTorrentsSection(torrentsData) {
// Update tracker statistics
const trackerContainer = document.getElementById("tracker-stats");
if (torrentsData.by_tracker.length === 0) {
const limitSelect = document.getElementById("tracker-limit");
const limit = limitSelect ? limitSelect.value : "5";
let displayTrackers = torrentsData.by_tracker;
if (limit !== "all") {
displayTrackers = displayTrackers.slice(0, parseInt(limit));
}
if (displayTrackers.length === 0) {
trackerContainer.innerHTML =
'<div class="empty-state"><sl-icon name="database-slash"></sl-icon><p>No tracker data available</p></div>';
} else {
trackerContainer.innerHTML = torrentsData.by_tracker
trackerContainer.innerHTML = displayTrackers
.map(
(tracker) => `
<div class="tracker-item">