package models import "time" // Base 通用字段 type Base struct { ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } // User 网站用户 type User struct { Base Email string `gorm:"uniqueIndex;size:191" json:"email"` PasswordHash string `gorm:"size:255" json:"-"` Nickname string `gorm:"size:64" json:"nickname"` Role string `gorm:"size:16;default:user" json:"role"` TOTPSecret string `gorm:"size:64" json:"-"` TOTPEnabled bool `gorm:"default:false" json:"totpEnabled"` Status string `gorm:"size:16;default:active" json:"status"` } // Workspace 工作空间(租户) type Workspace struct { Base Name string `gorm:"size:128" json:"name"` OwnerID uint64 `gorm:"index" json:"ownerId"` Plan string `gorm:"size:32;default:free" json:"plan"` Status string `gorm:"size:16;default:active" json:"status"` } // Member 工作空间成员(角色:owner/admin/operator/reviewer/viewer) type Member struct { Base WorkspaceID uint64 `gorm:"uniqueIndex:uk_ws_user" json:"workspaceId"` UserID uint64 `gorm:"uniqueIndex:uk_ws_user" json:"userId"` Role string `gorm:"size:16;default:viewer" json:"role"` } // Account 平台账号(凭据仅在 Agent 本机保险库,服务器零凭据) type Account struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` Platform string `gorm:"size:32;index" json:"platform"` AccountName string `gorm:"size:128" json:"accountName"` Remark string `gorm:"size:255" json:"remark"` AvatarURL string `gorm:"size:512" json:"avatarUrl"` Status string `gorm:"size:16;default:unbound" json:"status"` Health int `gorm:"default:100" json:"health"` AgentDeviceID uint64 `gorm:"index" json:"agentDeviceId"` IPProfile string `gorm:"size:191" json:"ipProfile"` LastActiveAt *time.Time `json:"lastActiveAt"` LastError string `gorm:"size:512" json:"lastError"` } // Material 素材 type Material struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` Name string `gorm:"size:255" json:"name"` Kind string `gorm:"size:16;default:video" json:"kind"` Size int64 `json:"size"` SHA256 string `gorm:"size:64;index" json:"sha256"` Mime string `gorm:"size:128" json:"mime"` StorageKey string `gorm:"size:512" json:"-"` Group string `gorm:"size:64" json:"group"` Tags string `gorm:"type:text" json:"tags"` Status string `gorm:"size:16;default:ready" json:"status"` CreatedBy uint64 `json:"createdBy"` } // Task 发布任务(状态机:draft→pending_review→approved→queued→dispatched→running→success/failed→retrying;可 cancelled/suspended/rejected) type Task struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` Title string `gorm:"size:255" json:"title"` Content string `gorm:"type:text" json:"content"` Tags string `gorm:"type:text" json:"tags"` AccountIDs string `gorm:"type:text" json:"accountIds"` MaterialIDs string `gorm:"type:text" json:"materialIds"` ScheduleAt *time.Time `gorm:"index" json:"scheduleAt"` Status string `gorm:"size:32;index;default:draft" json:"status"` Priority int `gorm:"default:5" json:"priority"` RetryCount int `gorm:"default:0" json:"retryCount"` MaxRetry int `gorm:"default:3" json:"maxRetry"` ErrorMessage string `gorm:"size:1024" json:"errorMessage"` PublishedAt *time.Time `json:"publishedAt"` PublishedURLs string `gorm:"type:text" json:"publishedUrls"` Receipts string `gorm:"type:text" json:"receipts"` CreatedBy uint64 `json:"createdBy"` ReviewedBy uint64 `json:"reviewedBy"` ReviewNote string `gorm:"size:512" json:"reviewNote"` } // AgentDevice 客户端设备(配对时注册 Ed25519 公钥) type AgentDevice struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` Name string `gorm:"size:128" json:"name"` OS string `gorm:"size:32" json:"os"` Version string `gorm:"size:32" json:"version"` PublicKey string `gorm:"type:text" json:"-"` Status string `gorm:"size:16;default:offline" json:"status"` IP string `gorm:"size:64" json:"ip"` Revoked bool `gorm:"default:false" json:"revoked"` LastSeenAt *time.Time `json:"lastSeenAt"` PairedAt time.Time `json:"pairedAt"` } // Challenge 二次验证挑战(qr/sms/confirm/captcha/pending;超时挂起,永不暴力破解) type Challenge struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` AccountID uint64 `gorm:"index" json:"accountId"` DeviceID uint64 `gorm:"index" json:"deviceId"` Platform string `gorm:"size:32" json:"platform"` Kind string `gorm:"size:16" json:"kind"` Status string `gorm:"size:16;default:active" json:"status"` QRToken string `gorm:"size:512" json:"qrToken"` QRURL string `gorm:"size:1024" json:"qrUrl"` Prompt string `gorm:"size:512" json:"prompt"` Payload string `gorm:"type:text" json:"payload"` ExpiresAt time.Time `gorm:"index" json:"expiresAt"` SolvedAt *time.Time `json:"solvedAt"` } // AuditLog 审计日志 type AuditLog struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` UserID uint64 `gorm:"index" json:"userId"` Action string `gorm:"size:64;index" json:"action"` Resource string `gorm:"size:128" json:"resource"` Detail string `gorm:"type:text" json:"detail"` IP string `gorm:"size:64" json:"ip"` } // Notification 站内通知 type Notification struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` UserID uint64 `gorm:"index" json:"userId"` Kind string `gorm:"size:32" json:"kind"` Title string `gorm:"size:255" json:"title"` Content string `gorm:"type:text" json:"content"` Read bool `gorm:"default:false" json:"read"` } // PairingCode 配对码(一次性,5 分钟过期) type PairingCode struct { Base WorkspaceID uint64 `gorm:"index" json:"workspaceId"` Code string `gorm:"size:12;uniqueIndex" json:"code"` ExpiresAt time.Time `json:"expiresAt"` Used bool `gorm:"default:false" json:"used"` DeviceID uint64 `json:"deviceId"` } // TransferToken 素材直链下载 token(短时签名) type TransferToken struct { Base MaterialID uint64 `gorm:"index" json:"materialId"` Token string `gorm:"size:191;uniqueIndex" json:"token"` ExpiresAt time.Time `json:"expiresAt"` }