feat: add multi-user auth and permission schema

This commit is contained in:
OpenClaw Agent
2026-09-17 02:09:24 +08:00
parent 72fdd3b74c
commit 7628390966
4 changed files with 330 additions and 29 deletions
+125
View File
@@ -0,0 +1,125 @@
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:"uniqueIndex" 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"
)