206 lines
5.0 KiB
Go
206 lines
5.0 KiB
Go
package dao
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"time"
|
||
"twin-api/app/common/model"
|
||
"twin-api/base/global"
|
||
|
||
"git.u8t.cn/open/go-server/utils"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type Pkg struct {
|
||
db *gorm.DB
|
||
}
|
||
|
||
func NewPackage() *Pkg {
|
||
return &Pkg{
|
||
db: global.GetDB(),
|
||
}
|
||
}
|
||
|
||
func (p *Pkg) TableName() string {
|
||
return "tw_package"
|
||
}
|
||
|
||
func (p *Pkg) Create(m *model.Pkg) error {
|
||
return p.db.Table(p.TableName()).Create(m).Error
|
||
}
|
||
|
||
func (p *Pkg) Update(m *model.Pkg) error {
|
||
return p.db.Table(p.TableName()).Save(m).Error
|
||
}
|
||
|
||
func (p *Pkg) UpdateCols(m *model.Pkg, cols ...string) error {
|
||
return p.db.Table(p.TableName()).Select(cols).Updates(m).Error
|
||
}
|
||
|
||
func (p *Pkg) Delete(m *model.Pkg) error {
|
||
return p.db.Table(p.TableName()).Where("id = ?", m.Id).Updates(map[string]any{
|
||
"status": model.PkgDelete,
|
||
"update_time": time.Now().Unix(),
|
||
}).Error
|
||
}
|
||
|
||
func (p *Pkg) Get(id int64) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
if err := p.db.Table(p.TableName()).Where("id = ?", id).Where("status = ?", model.PkgNormal).First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) GetById(id int64) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
if err := p.db.Table(p.TableName()).Where("id = ?", id).First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) GetByPkgName(name string) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
tx := p.db.Table(p.TableName()).Where("status = ?", model.PkgNormal)
|
||
if name != "" {
|
||
tx = tx.Where("name = ?", name)
|
||
}
|
||
tx = tx.Order("id desc")
|
||
if err := tx.First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
return &res, nil
|
||
}
|
||
|
||
// GetAvailableByName 按 id 倒序取最新的、未达人数上限的可用包。
|
||
// name 为空则不限包名;limit <= 0 表示不做人数限制(等价于 GetByPkgName)。
|
||
func (p *Pkg) GetAvailableByName(name string, limit int64) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
tx := p.db.Table(p.TableName()).Where("status = ?", model.PkgNormal)
|
||
if name != "" {
|
||
tx = tx.Where("name = ?", name)
|
||
}
|
||
if limit > 0 {
|
||
// 排除已达人数上限的包(小版本)
|
||
sub := fmt.Sprintf("(SELECT COUNT(*) FROM %s WHERE package_id = %s.id) < ?", NewUserPkg().TableName(), p.TableName())
|
||
tx = tx.Where(sub, limit)
|
||
}
|
||
tx = tx.Order("id desc")
|
||
if err := tx.First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) GetLatestByName(name string) (*model.Pkg, error) {
|
||
var list []*model.Pkg
|
||
if err := p.db.Table(p.TableName()).Where("name = ? AND status = ?", name, model.PkgNormal).Find(&list).Error; err != nil {
|
||
return nil, err
|
||
}
|
||
if len(list) == 0 {
|
||
return nil, nil
|
||
}
|
||
latest := list[0]
|
||
latestVal := utils.VersionToInt(latest.Version)
|
||
for _, item := range list[1:] {
|
||
if v := utils.VersionToInt(item.Version); v > latestVal {
|
||
latest = item
|
||
latestVal = v
|
||
}
|
||
}
|
||
return latest, nil
|
||
}
|
||
|
||
func (p *Pkg) GetByNameVersion(name, version string) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
if err := p.db.Table(p.TableName()).Where("name = ? AND version = ?", name, version).First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) GetOne(name, version string) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
tx := p.db.Table(p.TableName()).Where("status = ?", model.PkgNormal)
|
||
if name != "" {
|
||
tx = tx.Where("name = ? AND version = ?", name, version)
|
||
}
|
||
|
||
tx = tx.Order("id desc")
|
||
if err := tx.First(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
return nil, err
|
||
}
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) GetUserPkg(userId int64, pkg, version string) (*model.Pkg, error) {
|
||
var res model.Pkg
|
||
tx := p.db.Table(p.TableName() + " p ")
|
||
tx = tx.Joins(fmt.Sprintf(" JOIN %s u ON u.package_id = p.id", NewUserPkg().TableName()))
|
||
tx = tx.Where("u.user_id = ?", userId)
|
||
tx = tx.Where("p.name = ? ", pkg)
|
||
tx = tx.Where("p.version = ?", version)
|
||
tx = tx.Where("p.status = ?", model.PkgNormal)
|
||
if err := tx.Select("u.*,p.*").Find(&res).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
return nil, nil
|
||
}
|
||
|
||
return nil, err
|
||
}
|
||
if res.Id == 0 {
|
||
return nil, nil
|
||
}
|
||
|
||
return &res, nil
|
||
}
|
||
|
||
func (p *Pkg) Query(pkgName, version string, status, page, size int, sort string) ([]*model.Pkg, int64, error) {
|
||
var res []*model.Pkg
|
||
var count int64
|
||
tx := p.db.Table(p.TableName())
|
||
if pkgName != "" {
|
||
tx = tx.Where("name = ?", pkgName)
|
||
}
|
||
if version != "" {
|
||
tx = tx.Where("version = ?", version)
|
||
}
|
||
if status != 0 {
|
||
tx = tx.Where("status = ?", status)
|
||
}
|
||
if err := tx.Count(&count).Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
if sort != "" {
|
||
tx = tx.Order(sort)
|
||
} else {
|
||
tx = tx.Order("id desc")
|
||
}
|
||
|
||
if err := tx.Limit(size).Offset((page - 1) * size).Find(&res).Error; err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
return res, count, nil
|
||
}
|