218 lines
8.8 KiB
Go
218 lines
8.8 KiB
Go
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"` // 藏品描述(预留)
|
||
Grade *int32 `gorm:"column:grade"` // 星册等级(铸爱流程创建时默认为1)
|
||
Tags StringArray `gorm:"type:jsonb;column:tags"` // 标签(预留,JSON数组)
|
||
Visibility string `gorm:"type:varchar(20);default:'private';column:visibility"` // 可见性:private, friends, public(预留)
|
||
Info string `gorm:"type:text;column:info"` // 藏品信息(必填)
|
||
|
||
// 状态字段
|
||
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"` // 藏品事件(可选)
|
||
Info *string `gorm:"type:text;column:info"` // 藏品信息(必填)
|
||
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
|
||
}
|