krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v3.2.1: 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}