dashboard stats

This commit is contained in:
2026-04-27 22:24:42 -04:00
parent 7397f947f8
commit 8339762dce
2 changed files with 29 additions and 17 deletions
+8 -4
View File
@@ -23,9 +23,10 @@ router = APIRouter(prefix="/system", tags=["System"])
class DashboardStatsSchema(BaseModel):
total_files_indexed: int
monitored_files_count: int
hashed_files_count: int
total_data_size: int
archived_data_size: int
ignored_files_count: int
ignored_data_size: int
unprotected_files_count: int
@@ -172,7 +173,8 @@ def get_dashboard_stats(db_session: Session = Depends(get_db)):
SUM(CASE WHEN is_ignored = 0 AND id NOT IN (SELECT filesystem_state_id FROM file_versions) THEN 1 ELSE 0 END) as unprotected_count,
SUM(CASE WHEN is_ignored = 0 AND id NOT IN (SELECT filesystem_state_id FROM file_versions) THEN size ELSE 0 END) as unprotected_size,
SUM(CASE WHEN is_indexed = 1 AND is_ignored = 0 THEN 1 ELSE 0 END) as hashed_count,
SUM(CASE WHEN is_ignored = 0 THEN 1 ELSE 0 END) as eligible_count
SUM(CASE WHEN is_ignored = 0 THEN 1 ELSE 0 END) as eligible_count,
SUM(CASE WHEN id IN (SELECT filesystem_state_id FROM file_versions) THEN size ELSE 0 END) as archived_size
FROM filesystem_state
""")
@@ -183,10 +185,11 @@ def get_dashboard_stats(db_session: Session = Depends(get_db)):
unprotected_count, unprotected_size = res[4] or 0, res[5] or 0
hashed_count = res[6] or 0
eligible_count = res[7] or 0
archived_size = res[8] or 0
else:
total_count = total_size = ignored_count = ignored_size = unprotected_count = (
unprotected_size
) = hashed_count = eligible_count = 0
) = hashed_count = eligible_count = archived_size = 0
media_counts = {
"LTO": db_session.query(models.StorageMedia)
@@ -212,9 +215,10 @@ def get_dashboard_stats(db_session: Session = Depends(get_db)):
redundancy_percentage = (total_versions / eligible_redundancy_count) * 100
return DashboardStatsSchema(
total_files_indexed=eligible_count,
monitored_files_count=eligible_count,
hashed_files_count=hashed_count,
total_data_size=total_size,
archived_data_size=archived_size,
ignored_files_count=ignored_count,
ignored_data_size=ignored_size,
unprotected_files_count=unprotected_count,
+21 -13
View File
@@ -140,9 +140,9 @@
<div class="grid grid-cols-2 gap-x-12 gap-y-10 relative z-10">
<div class="space-y-4">
<div>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Discovered Files</span>
<h4 class="text-4xl font-black text-text-primary mono tracking-tighter">{stats.total_files_indexed.toLocaleString()}</h4>
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">TOTAL OBJECTS IN INDEX</p>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Monitored Files</span>
<h4 class="text-4xl font-black text-text-primary mono tracking-tighter">{stats.monitored_files_count.toLocaleString()}</h4>
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">OBJECTS TRACKED FOR ARCHIVAL</p>
</div>
</div>
@@ -151,14 +151,30 @@
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Hashed File Count</span>
<h4 class="text-4xl font-black text-text-primary mono tracking-tighter">
{stats.hashed_files_count.toLocaleString()}
<span class="text-sm font-bold text-text-secondary opacity-30">/ {stats.total_files_indexed.toLocaleString()}</span>
<span class="text-sm font-bold text-text-secondary opacity-30">/ {stats.monitored_files_count.toLocaleString()}</span>
</h4>
<div class="w-full bg-bg-primary h-1.5 mt-3 rounded-full border border-border-color overflow-hidden">
<div class="bg-blue-500 h-full transition-all duration-1000" style="width: {(stats.hashed_files_count / (stats.total_files_indexed || 1)) * 100}%"></div>
<div class="bg-blue-500 h-full transition-all duration-1000" style="width: {(stats.hashed_files_count / (stats.monitored_files_count || 1)) * 100}%"></div>
</div>
</div>
</div>
<div class="space-y-4">
<div>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Ignored Objects</span>
<h4 class="text-4xl font-black text-text-secondary mono tracking-tighter">{stats.ignored_files_count.toLocaleString()}</h4>
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">OBJECTS EXCLUDED FROM POLICY</p>
</div>
</div>
<div class="space-y-4">
<div>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Archived Data</span>
<h4 class="text-4xl font-black text-success-color mono tracking-tighter">{formatSize(stats.archived_data_size)}</h4>
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">TOTAL UNIQUE BYTES ON MEDIA</p>
</div>
</div>
<div class="space-y-4">
<div>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Vulnerable Data</span>
@@ -166,14 +182,6 @@
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">BYTES PENDING ARCHIVAL</p>
</div>
</div>
<div class="space-y-4">
<div>
<span class="text-[10px] font-black uppercase tracking-widest text-text-secondary opacity-50 block mb-1">Vulnerable Objects</span>
<h4 class="text-4xl font-black text-error-color mono tracking-tighter">{stats.unprotected_files_count.toLocaleString()}</h4>
<p class="text-[9px] font-bold text-text-secondary uppercase mt-2">OBJECTS PENDING ARCHIVAL</p>
</div>
</div>
</div>
<div class="mt-12 pt-8 border-t border-border-color/30 grid grid-cols-2 gap-8">