171 lines
4.2 KiB
Go
171 lines
4.2 KiB
Go
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
|
|
}
|