diff --git a/app/admin/service/pkg.go b/app/admin/service/pkg.go new file mode 100644 index 0000000..63517e2 --- /dev/null +++ b/app/admin/service/pkg.go @@ -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 +}