server: Go 服务器(REST+WSS 网关+JWT+Argon2+配对+素材直链+任务状态机);修复并发下线 send-on-closed-channel、下发查询 SQL 优先级、配对码原子占用、上传体积上限、JWT 默认密钥告警
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
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"`
|
||||
}
|
||||
Reference in New Issue
Block a user