API/model/purchased_server.go
2025-10-09 10:44:22 +08:00

159 lines
4.1 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 model
import (
"errors"
"one-api/common"
)
// PurchasedServer 已购服务器表
type PurchasedServer struct {
Id int `json:"id"`
UserId int `json:"user_id" gorm:"index"` // 用户ID
ServerId int `json:"server_id" gorm:"index"` // 服务器配置ID
ServerTitle string `json:"server_title" gorm:"type:varchar(255)"` // 服务器标题(冗余字段,防止配置被删除)
ServerConfig string `json:"server_config" gorm:"type:text"` // 服务器配置(冗余字段)
Price float64 `json:"price"` // 购买价格
Duration int `json:"duration"` // 购买时长(天)
PurchaseTime int64 `json:"purchase_time" gorm:"bigint;index"` // 购买时间
ExpireTime int64 `json:"expire_time" gorm:"bigint;index"` // 到期时间
Status int `json:"status" gorm:"default:1"` // 状态:1-正常,2-已过期
TradeNo string `json:"trade_no" gorm:"type:varchar(255);index"` // 交易单号
}
func (ps *PurchasedServer) Insert() error {
return DB.Create(ps).Error
}
func (ps *PurchasedServer) Update() error {
return DB.Save(ps).Error
}
func GetPurchasedServerById(id int) (*PurchasedServer, error) {
if id == 0 {
return nil, errors.New("id 为空")
}
ps := PurchasedServer{Id: id}
err := DB.First(&ps, "id = ?", id).Error
return &ps, err
}
func GetPurchasedServerByTradeNo(tradeNo string) (*PurchasedServer, error) {
var ps PurchasedServer
err := DB.Where("trade_no = ?", tradeNo).First(&ps).Error
if err != nil {
return nil, err
}
return &ps, nil
}
func GetAllPurchasedServers(pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) {
tx := DB.Begin()
if tx.Error != nil {
return nil, 0, tx.Error
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err = tx.Model(&PurchasedServer{}).Count(&total).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
err = tx.Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
if err = tx.Commit().Error; err != nil {
return nil, 0, err
}
return servers, total, nil
}
func GetUserPurchasedServers(userId int, pageInfo *common.PageInfo) (servers []*PurchasedServer, total int64, err error) {
tx := DB.Begin()
if tx.Error != nil {
return nil, 0, tx.Error
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err = tx.Model(&PurchasedServer{}).Where("user_id = ?", userId).Count(&total).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
err = tx.Where("user_id = ?", userId).Order("id desc").Limit(pageInfo.GetPageSize()).Offset(pageInfo.GetStartIdx()).Find(&servers).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
if err = tx.Commit().Error; err != nil {
return nil, 0, err
}
return servers, total, nil
}
func SearchPurchasedServers(keyword string, startIdx int, num int) (servers []*PurchasedServer, total int64, err error) {
tx := DB.Begin()
if tx.Error != nil {
return nil, 0, tx.Error
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
query := tx.Model(&PurchasedServer{})
if keyword != "" {
// 支持按用户ID、服务器标题搜索
query = query.Where("server_title LIKE ? OR user_id = ?", "%"+keyword+"%", keyword)
}
err = query.Count(&total).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
err = query.Order("id desc").Limit(num).Offset(startIdx).Find(&servers).Error
if err != nil {
tx.Rollback()
return nil, 0, err
}
if err = tx.Commit().Error; err != nil {
return nil, 0, err
}
return servers, total, nil
}
func DeletePurchasedServerById(id int) error {
if id == 0 {
return errors.New("id 为空")
}
return DB.Delete(&PurchasedServer{}, "id = ?", id).Error
}
// UpdateExpiredServers 更新过期服务器状态
func UpdateExpiredServers() error {
now := common.GetTimestamp()
return DB.Model(&PurchasedServer{}).
Where("expire_time < ? AND status = ?", now, 1).
Update("status", 2).Error
}