Files
panel/resources/scripts/api/admin/overview/getOverview.ts
Eric Wang 8e1729ec6f feat: add admin overview dashboard with metrics endpoint
Adds /api/admin/overview returning cached aggregate metrics for servers,
nodes, capacity, addresses, backups, and ISOs, plus a refreshed admin
dashboard UI consuming it via SWR.

Refactored from #153:
- Split OverviewService into focused per-section methods over a single
  orchestrator, dropping the monolithic freshMetrics()
- Dropped the recent-activity panel and supporting index migration —
  ActivityLog has no writers in the codebase, so the panel always
  rendered empty
- Removed the 999.99 percent cap; overallocation is a legitimate state
  and the frontend already clamps bar width
- Added capacity byte-conversion and restoring-bucket test cases

Co-Authored-By: Ajdin <AjdinDev@users.noreply.github.com>
2026-05-28 21:22:40 -04:00

114 lines
2.4 KiB
TypeScript

import http from '@/api/http'
export interface DashboardMetric {
allocated: number
total: number
percent: number
}
export interface DashboardSummary {
servers: number
nodes: number
users: number
locations: number
failedServers: number
}
export interface DashboardServers {
total: number
ready: number
installing: number
suspended: number
restoring: number
deleting: number
failed: number
statuses: Record<string, number>
}
export interface DashboardAddresses {
pools: number
total: number
assigned: number
available: number
percent: number
}
export interface DashboardBackups {
total: number
successful: number
pending: number
failed: number
}
export interface DashboardIsos {
total: number
successful: number
pending: number
}
export interface DashboardNode {
id: number
name: string
cluster: string
fqdn: string
servers: number
memory: DashboardMetric
disk: DashboardMetric
}
export interface DashboardOverview {
generatedAt: string
summary: DashboardSummary
servers: DashboardServers
capacity: {
memory: DashboardMetric
disk: DashboardMetric
}
addresses: DashboardAddresses
backups: DashboardBackups
isos: DashboardIsos
nodes: DashboardNode[]
}
const rawMetric = (data: any): DashboardMetric => ({
allocated: data.allocated,
total: data.total,
percent: data.percent,
})
export const rawDataToOverview = (data: any): DashboardOverview => ({
generatedAt: data.generated_at,
summary: {
servers: data.summary.servers,
nodes: data.summary.nodes,
users: data.summary.users,
locations: data.summary.locations,
failedServers: data.summary.failed_servers,
},
servers: data.servers,
capacity: {
memory: rawMetric(data.capacity.memory),
disk: rawMetric(data.capacity.disk),
},
addresses: data.addresses,
backups: data.backups,
isos: data.isos,
nodes: data.nodes.map((node: any) => ({
id: node.id,
name: node.name,
cluster: node.cluster,
fqdn: node.fqdn,
servers: node.servers,
memory: rawMetric(node.memory),
disk: rawMetric(node.disk),
})),
})
const getOverview = async (): Promise<DashboardOverview> => {
const { data } = await http.get('/api/admin/overview')
return rawDataToOverview(data.data)
}
export default getOverview