package models import ( "encoding/json" "time" ) type User struct { ID int Username string PasswordHash string Role string CreatedAt time.Time } type ShareLink struct { ID int Token string ServerID *int ExpiresAt *time.Time MaxUses int ValidityDays *int UseCount int CreatedAt time.Time CleanedAt *time.Time TrafficQuotaGB *float64 TrafficUsedGB float64 SubscriptionUntil *time.Time AllowedServerIDs json.RawMessage } type ShareCreation struct { ID int64 ShareLinkID int ServerID int Protocol string ClientID string ConnectionName string ResponseJSON *string CreatedAt time.Time DeletedAt *time.Time } type RenewalCode struct { ID int Code string AddDays int MaxUses int UseCount int ShareLinkID *int CodeExpiresAt *time.Time Note *string CodeTarget string CreatedAt time.Time } type Member struct { ID int Username string Email *string PasswordHash string CreatedAt time.Time LastLoginAt *time.Time } type MemberSubscription struct { MemberID int ExpiresAt *time.Time ValidityDays *int MaxConfigs int ConfigCount int CleanedAt *time.Time } type ServerInfo struct { ID int `json:"id"` Label string `json:"label"` Name string `json:"name,omitempty"` Protocols []string `json:"protocols"` Disabled bool `json:"disabled"` Flag string `json:"flag,omitempty"` FlagURL string `json:"flag_url,omitempty"` Speed string `json:"speed,omitempty"` Notice string `json:"notice,omitempty"` } func (l ShareLink) IsFloating() bool { return l.ValidityDays != nil && *l.ValidityDays > 0 && l.ExpiresAt == nil } func (l ShareLink) IsExpired() bool { if l.IsFloating() { return false } if l.ExpiresAt == nil { return true } return l.ExpiresAt.Before(time.Now()) } func (l ShareLink) ExpiresLabel() string { if l.ExpiresAt != nil { return l.ExpiresAt.Format("2006-01-02 15:04:05") } if l.ValidityDays != nil && *l.ValidityDays > 0 { return "с первого конфига — " + itoa(*l.ValidityDays) + " дн." } return "—" } func itoa(n int) string { if n == 0 { return "0" } neg := n < 0 if neg { n = -n } var b [20]byte i := len(b) for n > 0 { i-- b[i] = byte('0' + n%10) n /= 10 } if neg { i-- b[i] = '-' } return string(b[i:]) }