feat(admin): overview dashboard sections + system temperature/load sensors (0.85.0) (#11)
All checks were successful
deploy / test-backend (push) Successful in 25m9s
deploy / test-frontend (push) Successful in 10m13s
deploy / build-and-push (push) Successful in 10m25s
deploy / deploy (push) Successful in 12s

This commit was merged in pull request #11.
This commit is contained in:
2026-06-16 18:46:28 +00:00
parent 8445f338f6
commit cde4aca98b
17 changed files with 1270 additions and 59 deletions

View File

@@ -160,8 +160,24 @@ export type MemoryStats = {
percent_used: number;
};
export type LoadAvg = {
one: number;
five: number;
fifteen: number;
};
export type CpuStats = {
percent_used: number;
load_avg: LoadAvg;
/** Per-core usage percentages, one entry per logical core. */
per_core: number[];
};
export type TempStat = {
label: string;
celsius: number;
max_celsius: number | null;
critical_celsius: number | null;
};
export type Alert = {
@@ -173,6 +189,9 @@ export type SystemStats = {
disk: DiskStats | null;
memory: MemoryStats;
cpu: CpuStats;
/** Hardware temperature sensors. Empty when none are exposed (e.g.
* inside a container without `/sys` access). */
temperatures: TempStat[];
alerts: Alert[];
};
@@ -180,6 +199,41 @@ export async function getSystemStats(): Promise<SystemStats> {
return request<SystemStats>('/v1/admin/system');
}
// ---- overview aggregates ---------------------------------------------------
export type UsersOverview = {
total: number;
admins: number;
newest_username: string | null;
newest_created_at: string | null;
};
export type MangasOverview = {
total: number;
synced: number;
in_progress: number;
dropped: number;
total_chapters: number;
total_pages: number;
newest_title: string | null;
newest_seen_at: string | null;
};
export type AnalysisOverview = {
analyzed_pages: number;
total_pages: number;
};
export type OverviewStats = {
users: UsersOverview;
mangas: MangasOverview;
analysis: AnalysisOverview;
};
export async function getOverviewStats(): Promise<OverviewStats> {
return request<OverviewStats>('/v1/admin/overview');
}
// ---- storage usage ---------------------------------------------------------
export type TopManga = {