03cbe283df
Rework the VHS demo so the README screenshots actually entice a download. Demo data / tooling: - seed.yaml: real, reachable service URLs (detail now shows nextcloud.com, not example.com); Auth Portal -> non-resolving home.arpa host so it reads as a believable, reliably-DOWN monitor - backfill: transient outages for Nextcloud/Jellyfin/Immich aligned with their state changes (uptime % now matches); log timestamps derived from now so the Logs view reads chronologically; real SSL warning; three probe nodes across regions; seeded alert send health - demo.tape: shorter warm-up, added Nodes + theme captures, ordered so every shot stays inside the 60s node-freshness window (consistent probe count) - vhs/crop: new tool to trim the empty terminal border around each screenshot - setup.sh: build backfill up front for deterministic timing; UPTOP_DEMO=1 Supporting code: - persist alert send health (new alert_health table, load on startup, best-effort save on send) so health/last-sent survive restarts - latency Min/Avg/Max ignore failed checks (no more "Min 0ms") - correct "probe"/"probes" pluralization - stable status dot instead of an animated spinner under UPTOP_DEMO
79 lines
2.3 KiB
Go
79 lines
2.3 KiB
Go
package store
|
|
|
|
import (
|
|
"gitea.lerkolabs.com/lerko/uptop/internal/models"
|
|
)
|
|
|
|
type Store interface {
|
|
Init() error
|
|
|
|
// Sites
|
|
GetSites() ([]models.Site, error)
|
|
AddSite(site models.Site) error
|
|
UpdateSite(site models.Site) error
|
|
UpdateSitePaused(id int, paused bool) error
|
|
DeleteSite(id int) error
|
|
|
|
// Alerts
|
|
GetAllAlerts() ([]models.AlertConfig, error)
|
|
GetAlert(id int) (models.AlertConfig, error)
|
|
AddAlert(name, aType string, settings map[string]string) error
|
|
UpdateAlert(id int, name, aType string, settings map[string]string) error
|
|
DeleteAlert(id int) error
|
|
|
|
// Declarative config support
|
|
GetSiteByName(name string) (models.Site, error)
|
|
GetAlertByName(name string) (models.AlertConfig, error)
|
|
AddSiteReturningID(site models.Site) (int, error)
|
|
AddAlertReturningID(name, aType string, settings map[string]string) (int, error)
|
|
|
|
// Users
|
|
GetAllUsers() ([]models.User, error)
|
|
AddUser(username, publicKey, role string) error
|
|
UpdateUser(id int, username, publicKey, role string) error
|
|
DeleteUser(id int) error
|
|
|
|
// History
|
|
SaveCheck(siteID int, latencyNs int64, isUp bool) error
|
|
SaveCheckFromNode(siteID int, nodeID string, latencyNs int64, isUp bool) error
|
|
LoadAllHistory(limit int) (map[int][]models.CheckRecord, error)
|
|
|
|
// State Changes
|
|
SaveStateChange(siteID int, fromStatus, toStatus, errorReason string) error
|
|
GetStateChanges(siteID int, limit int) ([]models.StateChange, error)
|
|
|
|
// Nodes
|
|
RegisterNode(node models.ProbeNode) error
|
|
GetNode(id string) (models.ProbeNode, error)
|
|
GetAllNodes() ([]models.ProbeNode, error)
|
|
UpdateNodeLastSeen(id string) error
|
|
DeleteNode(id string) error
|
|
|
|
// Alert Health
|
|
LoadAlertHealth() (map[int]models.AlertHealthRecord, error)
|
|
SaveAlertHealth(h models.AlertHealthRecord) error
|
|
|
|
// Logs
|
|
SaveLog(message string) error
|
|
LoadLogs(limit int) ([]string, error)
|
|
|
|
// Maintenance Windows
|
|
GetActiveMaintenanceWindows() ([]models.MaintenanceWindow, error)
|
|
GetAllMaintenanceWindows(limit int) ([]models.MaintenanceWindow, error)
|
|
AddMaintenanceWindow(mw models.MaintenanceWindow) error
|
|
EndMaintenanceWindow(id int) error
|
|
DeleteMaintenanceWindow(id int) error
|
|
IsMonitorInMaintenance(monitorID int) (bool, error)
|
|
|
|
// Preferences
|
|
GetPreference(key string) (string, error)
|
|
SetPreference(key, value string) error
|
|
|
|
// Backup & Restore
|
|
ExportData() (models.Backup, error)
|
|
ImportData(data models.Backup) error
|
|
|
|
// Lifecycle
|
|
Close() error
|
|
}
|