package service import "time" // API Key status constants const ( StatusAPIKeyActive = "active" StatusAPIKeyDisabled = "disabled" StatusAPIKeyQuotaExhausted = "quota_exhausted" StatusAPIKeyExpired = "expired" ) type APIKey struct { ID int64 UserID int64 Key string Name string GroupID *int64 Status string IPWhitelist []string IPBlacklist []string CreatedAt time.Time UpdatedAt time.Time User *User Group *Group // Quota fields Quota float64 // Quota limit in USD (0 = unlimited) QuotaUsed float64 // Used quota amount ExpiresAt *time.Time // Expiration time (nil = never expires) } func (k *APIKey) IsActive() bool { return k.Status == StatusActive } // IsExpired checks if the API key has expired func (k *APIKey) IsExpired() bool { if k.ExpiresAt == nil { return false } return time.Now().After(*k.ExpiresAt) } // IsQuotaExhausted checks if the API key quota is exhausted func (k *APIKey) IsQuotaExhausted() bool { if k.Quota <= 0 { return false // unlimited } return k.QuotaUsed >= k.Quota } // GetQuotaRemaining returns remaining quota (-1 for unlimited) func (k *APIKey) GetQuotaRemaining() float64 { if k.Quota <= 0 { return -1 // unlimited } remaining := k.Quota - k.QuotaUsed if remaining < 0 { return 0 } return remaining } // GetDaysUntilExpiry returns days until expiry (-1 for never expires) func (k *APIKey) GetDaysUntilExpiry() int { if k.ExpiresAt == nil { return -1 // never expires } duration := time.Until(*k.ExpiresAt) if duration < 0 { return 0 } return int(duration.Hours() / 24) }