This commit is contained in:
DullJZ
2025-08-22 21:15:56 +08:00
commit 37b6adb6de
16 changed files with 3838 additions and 0 deletions
+163
View File
@@ -0,0 +1,163 @@
package storage
import (
"database/sql/driver"
"encoding/json"
"time"
"gorm.io/gorm"
)
// Object 对象信息模型
type Object struct {
ID uint `gorm:"primaryKey" json:"id"`
Key string `gorm:"uniqueIndex;size:512;not null" json:"key"`
BucketName string `gorm:"index;size:255;not null" json:"bucket_name"`
Size int64 `gorm:"not null;default:0" json:"size"`
Metadata JSON `gorm:"type:json" json:"metadata,omitempty"`
ContentType string `gorm:"size:128" json:"content_type,omitempty"`
ETag string `gorm:"size:128" json:"etag,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}
// TableName 指定表名
func (Object) TableName() string {
return "objects"
}
// BucketStats 存储桶统计信息模型
type BucketStats struct {
ID uint `gorm:"primaryKey" json:"id"`
BucketName string `gorm:"uniqueIndex;size:255;not null" json:"bucket_name"`
ObjectCount int64 `gorm:"not null;default:0" json:"object_count"`
TotalSize int64 `gorm:"not null;default:0" json:"total_size"`
LastCheckedAt time.Time `json:"last_checked_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// TableName 指定表名
func (BucketStats) TableName() string {
return "bucket_stats"
}
// UploadSession 上传会话模型(用于跟踪分片上传)
type UploadSession struct {
ID uint `gorm:"primaryKey" json:"id"`
UploadID string `gorm:"uniqueIndex;size:255;not null" json:"upload_id"`
Key string `gorm:"index;size:512;not null" json:"key"`
BucketName string `gorm:"index;size:255;not null" json:"bucket_name"`
TotalParts int `gorm:"not null;default:0" json:"total_parts"`
CompletedParts int `gorm:"not null;default:0" json:"completed_parts"`
Size int64 `gorm:"not null;default:0" json:"size"`
Status string `gorm:"size:32;not null;default:'pending'" json:"status"` // pending, completed, aborted
ExpiresAt time.Time `gorm:"index" json:"expires_at"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}
// TableName 指定表名
func (UploadSession) TableName() string {
return "upload_sessions"
}
// AccessLog 访问日志模型
type AccessLog struct {
ID uint `gorm:"primaryKey" json:"id"`
Action string `gorm:"index;size:32;not null" json:"action"` // upload, download, delete
Key string `gorm:"index;size:512;not null" json:"key"`
BucketName string `gorm:"index;size:255" json:"bucket_name"`
Size int64 `gorm:"default:0" json:"size"`
ClientIP string `gorm:"size:64" json:"client_ip"`
UserAgent string `gorm:"size:512" json:"user_agent"`
Success bool `gorm:"default:true" json:"success"`
ErrorMsg string `gorm:"type:text" json:"error_msg,omitempty"`
ResponseTime int64 `gorm:"default:0" json:"response_time"` // 响应时间(毫秒)
CreatedAt time.Time `gorm:"index" json:"created_at"`
}
// TableName 指定表名
func (AccessLog) TableName() string {
return "access_logs"
}
// JSON 自定义JSON类型,用于存储元数据
type JSON map[string]interface{}
// Value 实现driver.Valuer接口
func (j JSON) Value() (driver.Value, error) {
if j == nil {
return nil, nil
}
return json.Marshal(j)
}
// Scan 实现sql.Scanner接口
func (j *JSON) Scan(value interface{}) error {
if value == nil {
*j = make(map[string]interface{})
return nil
}
var data []byte
switch v := value.(type) {
case []byte:
data = v
case string:
data = []byte(v)
default:
data = []byte("{}")
}
return json.Unmarshal(data, j)
}
// BeforeCreate GORM钩子 - 创建前
func (o *Object) BeforeCreate(tx *gorm.DB) error {
if o.Metadata == nil {
o.Metadata = make(JSON)
}
return nil
}
// BeforeCreate GORM钩子 - 创建前设置过期时间
func (u *UploadSession) BeforeCreate(tx *gorm.DB) error {
if u.ExpiresAt.IsZero() {
u.ExpiresAt = time.Now().Add(24 * time.Hour) // 默认24小时过期
}
return nil
}
// IsExpired 检查上传会话是否过期
func (u *UploadSession) IsExpired() bool {
return time.Now().After(u.ExpiresAt)
}
// ObjectFilter 对象查询过滤器
type ObjectFilter struct {
Key string
BucketName string
Prefix string
MinSize int64
MaxSize int64
StartTime time.Time
EndTime time.Time
Limit int
Offset int
}
// AccessLogFilter 访问日志查询过滤器
type AccessLogFilter struct {
Action string
Key string
BucketName string
ClientIP string
Success *bool
StartTime time.Time
EndTime time.Time
Limit int
Offset int
}