package statuspage import "time" // StatusPage represents a public status page configuration type StatusPage struct { ID string `json:"id" db:"id"` Name string `json:"name" db:"name"` Slug string `json:"slug" db:"slug"` Title string `json:"title" db:"title"` Description string `json:"description" db:"description"` Logo string `json:"logo" db:"logo"` Favicon string `json:"favicon" db:"favicon"` Theme string `json:"theme" db:"theme"` // light, dark, auto CustomCSS string `json:"custom_css" db:"custom_css"` Public bool `json:"public" db:"public"` ShowUptime bool `json:"show_uptime" db:"show_uptime"` UserID string `json:"user" db:"user"` Created time.Time `json:"created" db:"created"` Updated time.Time `json:"updated" db:"updated"` } // StatusPageMonitor links monitors to a status page type StatusPageMonitor struct { ID string `json:"id" db:"id"` StatusPageID string `json:"status_page" db:"status_page"` MonitorID string `json:"monitor" db:"monitor"` DisplayName string `json:"display_name" db:"display_name"` Group string `json:"group" db:"group"` SortOrder int `json:"sort_order" db:"sort_order"` UserID string `json:"user" db:"user"` } // PublicIncident represents an incident for public display type PublicIncident struct { ID string `json:"id"` Title string `json:"title"` Description string `json:"description"` Status string `json:"status"` Severity string `json:"severity"` StartedAt time.Time `json:"started_at"` ResolvedAt time.Time `json:"resolved_at,omitempty"` } // PublicStatusPage represents a status page for public viewing type PublicStatusPage struct { ID string `json:"id"` Name string `json:"name"` Title string `json:"title"` Description string `json:"description"` Logo string `json:"logo"` Favicon string `json:"favicon"` Theme string `json:"theme"` CustomCSS string `json:"custom_css,omitempty"` Monitors []PublicMonitorStatus `json:"monitors"` Incidents []PublicIncident `json:"incidents"` OverallStatus string `json:"overall_status"` UpdatedAt time.Time `json:"updated_at"` } // PublicMonitorStatus represents a monitor's status for public display type PublicMonitorStatus struct { ID string `json:"id"` Name string `json:"name"` DisplayName string `json:"display_name"` Group string `json:"group"` Status string `json:"status"` Uptime24h float64 `json:"uptime_24h"` Uptime7d float64 `json:"uptime_7d"` Uptime30d float64 `json:"uptime_30d"` LastCheck time.Time `json:"last_check"` } // CreateStatusPageRequest represents a status page creation request type CreateStatusPageRequest struct { Name string `json:"name"` Slug string `json:"slug"` Title string `json:"title"` Description string `json:"description,omitempty"` Logo string `json:"logo,omitempty"` Favicon string `json:"favicon,omitempty"` Theme string `json:"theme,omitempty"` CustomCSS string `json:"custom_css,omitempty"` Public bool `json:"public"` ShowUptime bool `json:"show_uptime,omitempty"` } // UpdateStatusPageRequest represents a status page update request type UpdateStatusPageRequest struct { Name *string `json:"name,omitempty"` Title *string `json:"title,omitempty"` Description *string `json:"description,omitempty"` Logo *string `json:"logo,omitempty"` Favicon *string `json:"favicon,omitempty"` Theme *string `json:"theme,omitempty"` CustomCSS *string `json:"custom_css,omitempty"` Public *bool `json:"public,omitempty"` ShowUptime *bool `json:"show_uptime,omitempty"` } // StatusPageMonitorRequest represents adding a monitor to a status page type StatusPageMonitorRequest struct { MonitorID string `json:"monitor"` DisplayName string `json:"display_name,omitempty"` Group string `json:"group,omitempty"` SortOrder int `json:"sort_order,omitempty"` } // StatusPageResponse represents a status page response type StatusPageResponse struct { ID string `json:"id"` Name string `json:"name"` Slug string `json:"slug"` Title string `json:"title"` Description string `json:"description"` Logo string `json:"logo"` Favicon string `json:"favicon"` Theme string `json:"theme"` Public bool `json:"public"` ShowUptime bool `json:"show_uptime"` MonitorCount int `json:"monitor_count"` Created string `json:"created"` Updated string `json:"updated"` } // Overall status constants const ( StatusOperational = "operational" StatusDegraded = "degraded" StatusPartial = "partial_outage" StatusMajor = "major_outage" ) // Theme constants const ( ThemeLight = "light" ThemeDark = "dark" ThemeAuto = "auto" ) // ValidateTheme validates and returns a theme func ValidateTheme(theme string) string { switch theme { case ThemeLight, ThemeDark, ThemeAuto: return theme default: return ThemeAuto } }