Files
2026-08-29 18:38:38 +02:00

183 lines
4.1 KiB
Go

package model
import "time"
// Settings are global to the single-admin installation.
type Settings struct {
UpdateIntervalSeconds int
UpdaterEnabled bool
IPv6Enabled bool
IPv4Endpoints []string
IPv6Endpoints []string
LastIPv4 string
LastIPv6 string
LastRunAt time.Time
LastRunStatus string
UpdatedAt time.Time
}
// Credential is a reusable, encrypted Hetzner project token.
type Credential struct {
ID int64
Label string
Ciphertext []byte
Nonce []byte
Fingerprint string
CreatedAt time.Time
}
// Zone is one Hetzner DNS zone selected by the administrator.
type Zone struct {
ID int64
CredentialID int64
ProviderID string
Name string
CreatedAt time.Time
LastSyncAt time.Time
LastError string
}
// Target is the desired state for one host name and its dynamic address families.
type Target struct {
ID int64
ZoneID int64
RecordName string
FQDN string
UpdateIPv4 bool
UpdateIPv6 bool
Active bool
StaticIPv4 string
StaticIPv6 string
Description string
TTL int
LastUpdatedAt time.Time
LastStatus string
LastError string
CreatedAt time.Time
ArchivedAt time.Time
}
// CNAMERecord is a static DNS alias managed directly in a zone. It is kept
// separate from Target because the DynDNS worker must never overwrite it.
type CNAMERecord struct {
ID int64
ZoneID int64
Active bool
RecordName string
FQDN string
Destination string
Description string
TTL int
CreatedAt time.Time
UpdatedAt time.Time
}
// PiHoleIntegration is one remotely managed Pi-hole v6 instance. API
// passwords are returned separately and never exposed to templates.
type PiHoleIntegration struct {
ID int64
Name string
BaseURL string
InsecureTLS bool
CreatedAt time.Time
UpdatedAt time.Time
LastSyncAt time.Time
LastError string
}
type PiHoleCredential struct {
Ciphertext []byte
Nonce []byte
}
// SoftwareUpdateSettings contains the locally persisted update state. The
// encrypted registry credential is returned only to trusted backend components and
// is never passed to templates.
type SoftwareUpdateSettings struct {
RegistryUsername string
TokenCiphertext []byte
TokenNonce []byte
LatestVersion string
ReleaseURL string
DesiredVersion string
LastCheckedAt time.Time
LastError string
UpdatedAt time.Time
}
// PiHoleRecordLink tracks whether a local DNS entry is managed by this UI or
// merely retained at Pi-hole after being removed from the active WebUI list.
type PiHoleRecordLink struct {
ID int64
IntegrationID int64
Active bool
Value string
CreatedAt time.Time
UpdatedAt time.Time
ArchivedAt time.Time
}
type User struct {
ID int64
Username string
DisplayName string
Role string
Active bool
CreatedAt time.Time
UpdatedAt time.Time
LastLoginAt time.Time
}
func (u User) IsAdmin() bool { return u.Role == "admin" }
type AccessGrant struct {
ID int64
UserID int64
ZoneID int64
TargetID *int64
CanManageTargets bool
CanCreateTargets bool
}
// Session deliberately contains only hashes/random CSRF material, never a password.
type Session struct {
ID int64
UserID int64
Username string
DisplayName string
Role string
TokenHash string
CSRFToken string
CreatedAt time.Time
ExpiresAt time.Time
ReauthUntil time.Time
}
type AuditEvent struct {
ID int64
CreatedAt time.Time
Kind string
Message string
}
type UpdateRun struct {
ID int64
StartedAt time.Time
FinishedAt time.Time
Status string
IPv4 string
IPv6 string
Summary string
}
type Dashboard struct {
Settings Settings
Zones []Zone
ActiveTargets int
RecentRuns []UpdateRun
RecentEvents []AuditEvent
NextRunAt time.Time
SchedulerRunning bool
ErrorCount int
}