feat: add admin maintenance queue
This commit is contained in:
@@ -8,6 +8,10 @@ import type {
|
||||
DashboardData,
|
||||
DashboardHealthSummary,
|
||||
DashboardInsightSeverity,
|
||||
DashboardMaintenanceQueue,
|
||||
DashboardMaintenanceQueueItem,
|
||||
DashboardMaintenanceQueueSummary,
|
||||
DashboardMaintenanceQueueViewItem,
|
||||
DashboardOperationalInsight,
|
||||
DashboardOperationalInsightViewItem,
|
||||
DashboardViewData
|
||||
@@ -21,50 +25,54 @@ type UseDashboardStatsOptions = {
|
||||
|
||||
const activityTimelineLimit = 40
|
||||
|
||||
const emptyDashboardData = (): DashboardViewData => ({
|
||||
hasExtendedStats: false,
|
||||
totalFiles: 0,
|
||||
storageUsed: 0,
|
||||
yesterdayCount: 0,
|
||||
todayCount: 0,
|
||||
yesterdaySize: 0,
|
||||
todaySize: 0,
|
||||
sysUptime: null,
|
||||
activeCount: 0,
|
||||
expiredCount: 0,
|
||||
textCount: 0,
|
||||
fileCount: 0,
|
||||
chunkedCount: 0,
|
||||
usedCount: 0,
|
||||
storageBackend: '-',
|
||||
uploadSizeLimit: 0,
|
||||
openUpload: 0,
|
||||
enableChunk: 0,
|
||||
maxSaveSeconds: 0,
|
||||
healthAttentionCount: 0,
|
||||
healthDangerCount: 0,
|
||||
healthWarningCount: 0,
|
||||
expiringSoonCount: 0,
|
||||
storageIssueCount: 0,
|
||||
neverRetrievedCount: 0,
|
||||
healthyCount: 0,
|
||||
permanentCount: 0,
|
||||
topSuffixes: [],
|
||||
recentFiles: [],
|
||||
recentActivities: [],
|
||||
operationalInsights: [],
|
||||
storageUsedText: '0 Bytes',
|
||||
yesterdaySizeText: '0 Bytes',
|
||||
todaySizeText: '0 Bytes',
|
||||
uploadSizeLimitText: '0 Bytes',
|
||||
sysUptimeText: '-',
|
||||
activeRatio: 0,
|
||||
textRatio: 0,
|
||||
fileRatio: 0,
|
||||
healthyRatio: 0,
|
||||
healthAttentionRatio: 0,
|
||||
todaySizeRatio: 0
|
||||
})
|
||||
function emptyDashboardData(): DashboardViewData {
|
||||
return {
|
||||
hasExtendedStats: false,
|
||||
totalFiles: 0,
|
||||
storageUsed: 0,
|
||||
yesterdayCount: 0,
|
||||
todayCount: 0,
|
||||
yesterdaySize: 0,
|
||||
todaySize: 0,
|
||||
sysUptime: null,
|
||||
activeCount: 0,
|
||||
expiredCount: 0,
|
||||
textCount: 0,
|
||||
fileCount: 0,
|
||||
chunkedCount: 0,
|
||||
usedCount: 0,
|
||||
storageBackend: '-',
|
||||
uploadSizeLimit: 0,
|
||||
openUpload: 0,
|
||||
enableChunk: 0,
|
||||
maxSaveSeconds: 0,
|
||||
healthAttentionCount: 0,
|
||||
healthDangerCount: 0,
|
||||
healthWarningCount: 0,
|
||||
expiringSoonCount: 0,
|
||||
storageIssueCount: 0,
|
||||
neverRetrievedCount: 0,
|
||||
healthyCount: 0,
|
||||
permanentCount: 0,
|
||||
topSuffixes: [],
|
||||
recentFiles: [],
|
||||
recentActivities: [],
|
||||
operationalInsights: [],
|
||||
maintenanceItems: [],
|
||||
maintenanceSummary: emptyMaintenanceSummary(),
|
||||
storageUsedText: '0 Bytes',
|
||||
yesterdaySizeText: '0 Bytes',
|
||||
todaySizeText: '0 Bytes',
|
||||
uploadSizeLimitText: '0 Bytes',
|
||||
sysUptimeText: '-',
|
||||
activeRatio: 0,
|
||||
textRatio: 0,
|
||||
fileRatio: 0,
|
||||
healthyRatio: 0,
|
||||
healthAttentionRatio: 0,
|
||||
todaySizeRatio: 0
|
||||
}
|
||||
}
|
||||
|
||||
const toNumber = (value: number | string | null | undefined) => Number(value || 0)
|
||||
|
||||
@@ -152,6 +160,111 @@ const normalizeOperationalInsights = (
|
||||
}
|
||||
})
|
||||
|
||||
function emptyMaintenanceSummary(): DashboardMaintenanceQueueSummary {
|
||||
return {
|
||||
total: 0,
|
||||
actionableCount: 0,
|
||||
dangerCount: 0,
|
||||
warningCount: 0,
|
||||
successCount: 0,
|
||||
neutralCount: 0,
|
||||
fileQueueCount: 0,
|
||||
settingsCount: 0,
|
||||
strongestSeverity: 'success'
|
||||
}
|
||||
}
|
||||
|
||||
const normalizeMaintenanceQueueItems = (
|
||||
items: DashboardMaintenanceQueueItem[] = []
|
||||
): DashboardMaintenanceQueueViewItem[] =>
|
||||
items
|
||||
.filter((item) => item && item.key)
|
||||
.map((item) => {
|
||||
const action = item.action && typeof item.action === 'object' ? item.action : {}
|
||||
const actionTypeValue =
|
||||
item.actionType ??
|
||||
item.action_type ??
|
||||
action.actionType ??
|
||||
action.action_type ??
|
||||
action.type ??
|
||||
'file_queue'
|
||||
const targetHealthValue =
|
||||
item.targetHealth ??
|
||||
item.target_health ??
|
||||
action.targetHealth ??
|
||||
action.target_health ??
|
||||
action.health ??
|
||||
null
|
||||
const suggestedActionValue =
|
||||
item.suggestedAction ??
|
||||
item.suggested_action ??
|
||||
action.suggestedAction ??
|
||||
action.suggested_action ??
|
||||
'monitor'
|
||||
|
||||
return {
|
||||
...item,
|
||||
count: toNumber(item.count),
|
||||
priority: toNumber(item.priority),
|
||||
severity: normalizeInsightSeverity(item.severity),
|
||||
actionTypeValue,
|
||||
suggestedActionValue,
|
||||
targetHealthValue
|
||||
}
|
||||
})
|
||||
|
||||
const normalizeMaintenanceSummary = (
|
||||
summary: Partial<DashboardMaintenanceQueueSummary> | undefined,
|
||||
items: DashboardMaintenanceQueueViewItem[]
|
||||
): DashboardMaintenanceQueueSummary => ({
|
||||
total: toNumber(summary?.total ?? items.length),
|
||||
actionableCount: toNumber(summary?.actionableCount ?? summary?.actionable_count),
|
||||
actionable_count: toNumber(summary?.actionableCount ?? summary?.actionable_count),
|
||||
dangerCount: toNumber(summary?.dangerCount ?? summary?.danger_count),
|
||||
danger_count: toNumber(summary?.dangerCount ?? summary?.danger_count),
|
||||
warningCount: toNumber(summary?.warningCount ?? summary?.warning_count),
|
||||
warning_count: toNumber(summary?.warningCount ?? summary?.warning_count),
|
||||
successCount: toNumber(summary?.successCount ?? summary?.success_count),
|
||||
success_count: toNumber(summary?.successCount ?? summary?.success_count),
|
||||
neutralCount: toNumber(summary?.neutralCount ?? summary?.neutral_count),
|
||||
neutral_count: toNumber(summary?.neutralCount ?? summary?.neutral_count),
|
||||
fileQueueCount: toNumber(summary?.fileQueueCount ?? summary?.file_queue_count),
|
||||
file_queue_count: toNumber(summary?.fileQueueCount ?? summary?.file_queue_count),
|
||||
settingsCount: toNumber(summary?.settingsCount ?? summary?.settings_count),
|
||||
settings_count: toNumber(summary?.settingsCount ?? summary?.settings_count),
|
||||
strongestSeverity: normalizeInsightSeverity(
|
||||
summary?.strongestSeverity ?? summary?.strongest_severity
|
||||
),
|
||||
strongest_severity: normalizeInsightSeverity(
|
||||
summary?.strongestSeverity ?? summary?.strongest_severity
|
||||
)
|
||||
})
|
||||
|
||||
const normalizeMaintenanceQueue = (
|
||||
detail: DashboardData | DashboardMaintenanceQueue
|
||||
): Pick<DashboardViewData, 'maintenanceItems' | 'maintenanceSummary'> => {
|
||||
const source = detail as DashboardData & DashboardMaintenanceQueue
|
||||
const queue = source.maintenanceQueue ?? source.maintenance_queue ?? source
|
||||
const items = normalizeMaintenanceQueueItems(
|
||||
queue?.items ??
|
||||
queue?.maintenanceItems ??
|
||||
queue?.maintenance_items ??
|
||||
source.maintenanceItems ??
|
||||
source.maintenance_items ??
|
||||
[]
|
||||
)
|
||||
const rawSummary =
|
||||
queue?.summary ??
|
||||
queue?.maintenanceSummary ??
|
||||
queue?.maintenance_summary ??
|
||||
source.maintenanceSummary ??
|
||||
source.maintenance_summary
|
||||
return {
|
||||
maintenanceItems: items,
|
||||
maintenanceSummary: normalizeMaintenanceSummary(rawSummary, items)
|
||||
}
|
||||
}
|
||||
|
||||
const healthSummaryKeys: (keyof DashboardHealthSummary)[] = [
|
||||
'healthAttentionCount',
|
||||
'healthDangerCount',
|
||||
@@ -256,6 +369,9 @@ export function useDashboardStats(options: UseDashboardStatsOptions = {}) {
|
||||
dashboardData.operationalInsights = normalizeOperationalInsights(
|
||||
detail.operationalInsights ?? detail.operational_insights ?? detail.insights ?? []
|
||||
)
|
||||
const maintenanceQueue = normalizeMaintenanceQueue(detail)
|
||||
dashboardData.maintenanceItems = maintenanceQueue.maintenanceItems
|
||||
dashboardData.maintenanceSummary = maintenanceQueue.maintenanceSummary
|
||||
|
||||
dashboardData.storageUsedText = formatFileSize(dashboardData.storageUsed)
|
||||
dashboardData.yesterdaySizeText = formatFileSize(dashboardData.yesterdaySize)
|
||||
|
||||
Reference in New Issue
Block a user