krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v3.0.4: Hutch/Models/SystemStatusModels.swift · raw
1import Foundation
2
3enum StatusLevel: String, Codable, Sendable {
4 case operational
5 case degraded
6 case majorOutage
7 case maintenance
8 case unknown
9
10 var displayName: String {
11 switch self {
12 case .operational:
13 "Operational"
14 case .degraded:
15 "Degraded"
16 case .majorOutage:
17 "Major outage"
18 case .maintenance:
19 "Maintenance"
20 case .unknown:
21 "Unknown"
22 }
23 }
24
25 var requiresAttention: Bool {
26 switch self {
27 case .degraded, .majorOutage, .maintenance:
28 true
29 case .operational, .unknown:
30 false
31 }
32 }
33}
34
35struct StatusServiceState: Identifiable, Hashable, Codable, Sendable {
36 let id: String
37 let name: String
38 let slug: String?
39 let status: StatusLevel
40 let description: String?
41}
42
43struct StatusIncident: Identifiable, Hashable, Codable, Sendable {
44 let id: String
45 let title: String
46 let summary: String?
47 let url: URL?
48 let publishedAt: Date
49 let updatedAt: Date?
50 let isActive: Bool?
51}
52
53struct SystemStatusSnapshot: Hashable, Codable, Sendable {
54 let services: [StatusServiceState]
55 let activeIncidents: [StatusIncident]
56 let lastUpdated: Date
57
58 var disruptedServices: [StatusServiceState] {
59 services.filter { $0.status.requiresAttention }
60 }
61
62 var hasDisruption: Bool {
63 !disruptedServices.isEmpty
64 }
65
66 var overallStatusText: String {
67 hasDisruption ? "Experiencing disruptions" : "All monitored services operational"
68 }
69
70 var bannerSummary: String {
71 if disruptedServices.count == 1, let service = disruptedServices.first {
72 return "\(service.name) disrupted"
73 }
74 if disruptedServices.count > 1 {
75 return "\(disruptedServices.count) services disrupted"
76 }
77 return "SourceHut service disruption"
78 }
79}
80
81struct SystemStatusPageData: Sendable {
82 let snapshot: SystemStatusSnapshot
83 let recentIncidents: [StatusIncident]
84}