topfans/backend/pkg/models/asset.go
2026-04-07 22:29:48 +08:00

216 lines
8.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"time"
"gorm.io/gorm"
)
// ========== 资产表模型 ==========
// Asset 资产表模型
type Asset struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
OwnerUID int64 `gorm:"not null;index:idx_assets_owner_star;column:owner_uid"`
StarID int64 `gorm:"not null;index:idx_assets_owner_star;index:idx_assets_star_active;column:star_id"`
Name string `gorm:"type:varchar(100);not null;column:name"`
CoverURL string `gorm:"type:varchar(500);not null;column:cover_url"`
MaterialURL *string `gorm:"type:varchar(500);column:material_url"` // 用户上传的素材URL后续会定期清理
// 预留字段(后续功能扩展)
Description *string `gorm:"type:text;column:description"` // 藏品描述(预留)
Rarity *int32 `gorm:"column:rarity"` // 稀有度(预留)
Tags StringArray `gorm:"type:jsonb;column:tags"` // 标签预留JSON数组
Visibility string `gorm:"type:varchar(20);default:'private';column:visibility"` // 可见性private, friends, public预留
// 状态字段
Status int32 `gorm:"not null;default:0;index:idx_assets_status;column:status"` // 0:Pending, 1:Active
// 链上信息(目前模拟,后续引入区块链功能)
TxHash *string `gorm:"type:varchar(100);index:idx_assets_tx_hash;column:tx_hash"` // Web3:交易哈希
BlockNumber *int64 `gorm:"column:block_number"` // 区块号
// 社交相关(与 Social Service 交互)
LikeCount int32 `gorm:"not null;default:0;column:like_count"` // 点赞数
IsOriginal bool `gorm:"default:false;column:is_original"` // 是否自制藏品(用户自己上传素材)
// 时间戳字段
CreatedAt int64 `gorm:"not null;index:idx_assets_created_at,sort:desc;column:created_at"`
UpdatedAt int64 `gorm:"not null;column:updated_at"`
MintedAt *int64 `gorm:"column:minted_at"` // 上链成功时间(毫秒时间戳)
// 软删除
DeletedAt *int64 `gorm:"index:idx_assets_deleted_at;column:deleted_at"` // 软删除时间戳
IsActive bool `gorm:"default:true;not null;index:idx_assets_star_active;column:is_active"`
// 关联关系
Owner User `gorm:"foreignKey:OwnerUID;references:ID;constraint:OnDelete:CASCADE"`
Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"`
}
// TableName 指定表名
func (Asset) TableName() string {
return "assets"
}
// BeforeCreate 创建前钩子
func (a *Asset) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
a.CreatedAt = now
a.UpdatedAt = now
// 设置默认值
if a.Status == 0 {
a.Status = AssetStatusPending
}
if a.Visibility == "" {
a.Visibility = AssetVisibilityPrivate
}
if !a.IsActive {
a.IsActive = true
}
return nil
}
// BeforeUpdate 更新前钩子
func (a *Asset) BeforeUpdate(tx *gorm.DB) error {
a.UpdatedAt = time.Now().UnixMilli()
return nil
}
// IsPending 检查资产是否为待处理状态
func (a *Asset) IsPending() bool {
return a.Status == AssetStatusPending
}
// IsActiveStatus 检查资产是否已激活状态为Active
func (a *Asset) IsActiveStatus() bool {
return a.Status == AssetStatusActive
}
// 资产状态常量
const (
AssetStatusPending = 0 // 待处理(创建中)
AssetStatusActive = 1 // 已激活(上链成功,目前模拟)
// 预留AssetStatusMinting = 2 // 上链中
// 预留AssetStatusFailed = 3 // 上链失败
)
// 资产可见性常量
const (
AssetVisibilityPrivate = "private" // 私有(仅自己可见)
AssetVisibilityFriends = "friends" // 好友可见(预留)
AssetVisibilityPublic = "public" // 公开(预留)
)
// ========== 铸造订单表模型 ==========
// MintOrder 铸造订单表模型
type MintOrder struct {
OrderID string `gorm:"primaryKey;type:varchar(100);column:order_id"` // 铸造订单号UUID
UserID int64 `gorm:"not null;index:idx_mint_orders_user_star;column:user_id"`
AssetID *int64 `gorm:"index:idx_mint_orders_asset;column:asset_id"` // 关联资产(生成后回填)
StarID int64 `gorm:"not null;index:idx_mint_orders_user_star;column:star_id"`
Status string `gorm:"type:varchar(20);not null;default:'PENDING';index:idx_mint_orders_status;column:status"` // PENDING/PROCESSING/SUCCESS/FAILED
CostCrystal int64 `gorm:"default:0;column:cost_crystal"` // 消耗的水晶数量
ErrorMessage *string `gorm:"type:text;column:error_message"` // 错误信息(如果失败)
RetryCount int32 `gorm:"default:0;column:retry_count"` // 重试次数
// 阶段一(预创建)保存的素材与元数据,用于“继续铸造/取消铸造”的流程
MaterialURL *string `gorm:"type:varchar(500);column:material_url"` // 用户上传的素材URL阶段一写入
Name *string `gorm:"type:varchar(100);column:name"` // 藏品名称(阶段一写入,可选)
Description *string `gorm:"type:text;column:description"` // 藏品描述(阶段一写入,可选)
MaterialType *string `gorm:"type:varchar(50);column:material_type"` // 素材类型(可选)
Event *string `gorm:"type:varchar(100);column:event"` // 藏品事件(可选)
CreatedAt int64 `gorm:"not null;index:idx_mint_orders_created_at,sort:desc;column:created_at"`
UpdatedAt int64 `gorm:"not null;column:updated_at"`
MintedAt *int64 `gorm:"column:minted_at"` // 上链成功时间(用于 Task Service 事件)
// 关联关系
User User `gorm:"foreignKey:UserID;references:ID;constraint:OnDelete:CASCADE"`
Asset *Asset `gorm:"foreignKey:AssetID;references:ID;constraint:OnDelete:SET NULL"`
Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"`
}
// TableName 指定表名
func (MintOrder) TableName() string {
return "mint_orders"
}
// BeforeCreate 创建前钩子
func (mo *MintOrder) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
mo.CreatedAt = now
mo.UpdatedAt = now
// 设置默认状态
if mo.Status == "" {
mo.Status = MintOrderStatusPending
}
return nil
}
// BeforeUpdate 更新前钩子
func (mo *MintOrder) BeforeUpdate(tx *gorm.DB) error {
mo.UpdatedAt = time.Now().UnixMilli()
return nil
}
// IsPending 检查订单是否为待处理状态
func (mo *MintOrder) IsPending() bool {
return mo.Status == MintOrderStatusPending
}
// IsProcessing 检查订单是否处理中
func (mo *MintOrder) IsProcessing() bool {
return mo.Status == MintOrderStatusProcessing
}
// IsSuccess 检查订单是否成功
func (mo *MintOrder) IsSuccess() bool {
return mo.Status == MintOrderStatusSuccess
}
// IsFailed 检查订单是否失败
func (mo *MintOrder) IsFailed() bool {
return mo.Status == MintOrderStatusFailed
}
// 铸造订单状态常量
const (
MintOrderStatusPending = "PENDING" // 待处理
MintOrderStatusProcessing = "PROCESSING" // 处理中(上链中,目前模拟)
MintOrderStatusSuccess = "SUCCESS" // 成功
MintOrderStatusFailed = "FAILED" // 失败
MintOrderStatusCancelled = "CANCELLED" // 已取消
)
// ========== 点赞记录表模型 ==========
// AssetLike 点赞记录表模型
type AssetLike struct {
ID int64 `gorm:"primaryKey;autoIncrement;column:id"`
AssetID int64 `gorm:"not null;uniqueIndex:uk_asset_likes_user_asset;index:idx_asset_likes_asset;column:asset_id"`
UserID int64 `gorm:"not null;uniqueIndex:uk_asset_likes_user_asset;index:idx_asset_likes_user_star;column:user_id"`
StarID int64 `gorm:"not null;index:idx_asset_likes_user_star;column:star_id"` // 用于数据隔离和查询优化
CreatedAt int64 `gorm:"not null;index:idx_asset_likes_user_star,sort:desc;index:idx_asset_likes_asset,sort:desc;column:created_at"`
// 关联关系
Asset Asset `gorm:"foreignKey:AssetID;references:ID;constraint:OnDelete:CASCADE"`
User User `gorm:"foreignKey:UserID;references:ID;constraint:OnDelete:CASCADE"`
Star Star `gorm:"foreignKey:StarID;references:StarID;constraint:OnDelete:CASCADE"`
}
// TableName 指定表名
func (AssetLike) TableName() string {
return "asset_likes"
}
// BeforeCreate 创建前钩子
func (al *AssetLike) BeforeCreate(tx *gorm.DB) error {
now := time.Now().UnixMilli()
al.CreatedAt = now
return nil
}