twin-api/app/common/dao/pkg.go

206 lines
5.0 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 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
}