feat: admin pkg service

This commit is contained in:
wangfuduo 2026-07-08 18:04:17 +08:00
parent 0addc0a94a
commit fe0c4ae276
1 changed files with 170 additions and 0 deletions

170
app/admin/service/pkg.go Normal file
View File

@ -0,0 +1,170 @@
package service
import (
"strings"
"time"
"twin-api/app/admin/request"
"twin-api/app/common/dao"
"twin-api/app/common/model"
"twin-api/base/config"
gsUtils "git.u8t.cn/open/go-server/utils"
"github.com/spf13/cast"
)
type Pkg struct{}
func NewPkg() *Pkg {
return &Pkg{}
}
func (s *Pkg) Query(req *request.PkgGet) (int64, []any, error) {
req.Default()
list, count, err := dao.NewPackage().Query(
strings.TrimSpace(req.Name),
strings.TrimSpace(req.Version),
cast.ToInt(req.Status),
req.PageInt(),
req.SizeInt(),
req.Sort,
)
if err != nil {
return 0, nil, config.ErrDb.New().Append(err)
}
packageIds := make([]int64, 0, len(list))
for _, item := range list {
packageIds = append(packageIds, item.Id)
}
userCounts, err := dao.NewUserPkg().CountByPackageIds(packageIds)
if err != nil {
return 0, nil, config.ErrDb.New().Append(err)
}
res := make([]any, 0, len(list))
for _, item := range list {
res = append(res, item.FormatAdmin(userCounts[item.Id]))
}
return count, res, nil
}
func (s *Pkg) Create(req *request.PkgCreate) error {
name := strings.TrimSpace(req.Name)
version := strings.TrimSpace(req.Version)
expire := strings.TrimSpace(req.Expire)
if name == "" || version == "" || expire == "" {
return config.ErrParam.New().Append("package_name, version and expire are required")
}
expireTime, err := model.ParseExpire(expire)
if err != nil {
return config.ErrParam.New().Append(err)
}
if expireTime <= time.Now().Unix() {
return config.ErrParam.New().Append("expire time must be greater than current time")
}
if gsUtils.VersionToInt(version) < 0 {
return config.ErrParam.New().Append("invalid version format")
}
pkgDao := dao.NewPackage()
exist, err := pkgDao.GetByNameVersion(name, version)
if err != nil {
return config.ErrDb.New().Append(err)
}
if exist != nil {
return config.ErrExist.New().Append("package name and version already exist")
}
latest, err := pkgDao.GetLatestByName(name)
if err != nil {
return config.ErrDb.New().Append(err)
}
if latest != nil && gsUtils.VersionToInt(version) <= gsUtils.VersionToInt(latest.Version) {
return config.ErrParam.New().Append("version must be greater than the latest version")
}
now := time.Now().Unix()
m := &model.Pkg{
Name: name,
Version: version,
Link: strings.TrimSpace(req.Link),
ExpireTime: expireTime,
Status: model.PkgNormal,
CreateTime: now,
UpdateTime: now,
}
if err = pkgDao.Create(m); err != nil {
return config.ErrDb.New().Append(err)
}
return nil
}
func (s *Pkg) Update(req *request.PkgPut) error {
id := cast.ToInt64(strings.TrimSpace(req.Id))
if id <= 0 {
return config.ErrParam.New().Append("id is required")
}
expire := strings.TrimSpace(req.Expire)
status := strings.TrimSpace(req.Status)
if expire == "" && status == "" {
return config.ErrParam.New().Append("at least one of expire or status is required")
}
pkgDao := dao.NewPackage()
m, err := pkgDao.GetById(id)
if err != nil {
return config.ErrDb.New().Append(err)
}
if m == nil {
return config.ErrNoData.New()
}
cols := []string{"update_time"}
if expire != "" {
expireTime, err := model.ParseExpire(expire)
if err != nil {
return config.ErrParam.New().Append(err)
}
if expireTime <= time.Now().Unix() {
return config.ErrParam.New().Append("expire time must be greater than current time")
}
m.ExpireTime = expireTime
cols = append(cols, "expire_time")
}
if status != "" {
statusVal := cast.ToInt64(status)
if statusVal != model.PkgNormal && statusVal != model.PkgDelete {
return config.ErrParam.New().Append("invalid status value")
}
m.Status = statusVal
cols = append(cols, "status")
}
m.UpdateTime = time.Now().Unix()
if err = pkgDao.UpdateCols(m, cols...); err != nil {
return config.ErrDb.New().Append(err)
}
return nil
}
func (s *Pkg) Delete(id int64) error {
if id <= 0 {
return config.ErrParam.New().Append("id is required")
}
pkgDao := dao.NewPackage()
m, err := pkgDao.GetById(id)
if err != nil {
return config.ErrDb.New().Append(err)
}
if m == nil {
return config.ErrNoData.New()
}
if m.Status == model.PkgDelete {
return nil
}
if err = pkgDao.Delete(m); err != nil {
return config.ErrDb.New().Append(err)
}
return nil
}