package main import "time" type User struct { ID uint `gorm:"primaryKey" json:"id"` Username string `gorm:"uniqueIndex;size:64" json:"username"` PasswordHash string `json:"-"` Role string `gorm:"size:20;index" json:"role"` Status string `gorm:"size:20;index" json:"status"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } type UserPermission struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"uniqueIndex:idx_user_permission" json:"userId"` Permission string `gorm:"uniqueIndex:idx_user_permission;size:64" json:"permission"` Enabled bool `json:"enabled"` } type CreditAccount struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"uniqueIndex" json:"userId"` Balance int64 `json:"balance"` Reserved int64 `json:"reserved"` UpdatedAt time.Time `json:"updatedAt"` } type CreditTransaction struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"index" json:"userId"` Type string `gorm:"index;size:32" json:"type"` Amount int64 `json:"amount"` BalanceAfter int64 `json:"balanceAfter"` ReferenceType string `gorm:"size:32" json:"referenceType"` ReferenceID string `gorm:"size:64" json:"referenceId"` Reason string `json:"reason,omitempty"` CreatedAt time.Time `json:"createdAt"` } type CreditReservation struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"index" json:"userId"` TaskID uint `gorm:"index" json:"taskId"` Amount int64 `json:"amount"` Status string `gorm:"index;size:20" json:"status"` CreatedAt time.Time `json:"createdAt"` CompletedAt *time.Time `json:"completedAt,omitempty"` } type RedeemBatch struct { ID uint `gorm:"primaryKey"` Code string `gorm:"uniqueIndex;size:64" json:"code"` Credits int64 `json:"credits"` Count int `json:"count"` ExpiresAt *time.Time `json:"expiresAt,omitempty"` Note string `json:"note,omitempty"` CreatedBy uint `json:"createdBy"` CreatedAt time.Time `json:"createdAt"` } type RedeemCode struct { ID uint `gorm:"primaryKey"` BatchID uint `gorm:"index" json:"batchId"` CodeHash string `gorm:"uniqueIndex;size:64" json:"-"` Prefix string `gorm:"size:24" json:"prefix"` Credits int64 `json:"credits"` Status string `gorm:"index;size:20" json:"status"` ExpiresAt *time.Time `json:"expiresAt,omitempty"` RedeemedBy *uint `json:"redeemedBy,omitempty"` RedeemedAt *time.Time `json:"redeemedAt,omitempty"` CreatedAt time.Time `json:"createdAt"` } type RedeemRecord struct { ID uint `gorm:"primaryKey"` CodeID uint `gorm:"index" json:"codeId"` BatchID uint `gorm:"index" json:"batchId"` UserID uint `gorm:"index" json:"userId"` Credits int64 `json:"credits"` CreatedAt time.Time `json:"createdAt"` } type WebDAVConfig struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"uniqueIndex" json:"userId"` Enabled bool `json:"enabled"` URL string `json:"url"` Username string `json:"username"` Password string `json:"-"` RootPath string `json:"rootPath"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } type Session struct { ID uint `gorm:"primaryKey"` UserID uint `gorm:"index" json:"userId"` TokenHash string `gorm:"uniqueIndex;size:64" json:"-"` ExpiresAt time.Time `gorm:"index" json:"expiresAt"` CreatedAt time.Time `json:"createdAt"` } type AuditLog struct { ID uint `gorm:"primaryKey"` OperatorID uint `gorm:"index" json:"operatorId"` Action string `gorm:"index;size:64" json:"action"` TargetType string `gorm:"size:32" json:"targetType"` TargetID string `gorm:"size:64" json:"targetId"` Metadata string `json:"metadata,omitempty"` CreatedAt time.Time `json:"createdAt"` } const ( RoleAdmin = "admin" RolePrivileged = "privileged" RoleUser = "user" UserActive = "active" UserDisabled = "disabled" PermDownload = "download" PermRedeem = "redeem" PermWebDAV = "webdav" PermWebDAVConfig = "webdav_config" )