2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 13:47:15 +08:00

feat: 应用商店版本机制重构

This commit is contained in:
耗子
2024-10-09 22:22:10 +08:00
parent 6892cff96f
commit f77e4d17fc
6 changed files with 137 additions and 58 deletions

View File

@@ -7,12 +7,14 @@ import (
"slices"
"github.com/expr-lang/expr"
"github.com/hashicorp/go-version"
"github.com/spf13/cast"
"github.com/TheTNB/panel/internal/app"
"github.com/TheTNB/panel/internal/biz"
"github.com/TheTNB/panel/pkg/api"
"github.com/TheTNB/panel/pkg/apploader"
"github.com/TheTNB/panel/pkg/str"
)
type appRepo struct {
@@ -42,14 +44,36 @@ func (r *appRepo) All() api.Apps {
}
func (r *appRepo) Get(slug string) (*api.App, error) {
for app := range slices.Values(r.All()) {
if app.Slug == slug {
return app, nil
for item := range slices.Values(r.All()) {
if item.Slug == slug {
return item, nil
}
}
return nil, errors.New("应用不存在")
}
func (r *appRepo) UpdateExist(slug string) bool {
item, err := r.Get(slug)
if err != nil {
return false
}
installed, err := r.GetInstalled(slug)
if err != nil {
return false
}
for v := range slices.Values(item.Versions) {
if v.Slug == installed.VersionSlug {
current := str.FirstElement(v.Subs)
if current != nil && current.Version != installed.Version {
return true
}
}
}
return false
}
func (r *appRepo) Installed() ([]*biz.App, error) {
var apps []*biz.App
if err := app.Orm.Find(&apps).Error; err != nil {
@@ -117,20 +141,31 @@ func (r *appRepo) IsInstalled(query string, cond ...string) (bool, error) {
return count > 0, nil
}
func (r *appRepo) Install(slug string) error {
func (r *appRepo) Install(slug, versionSlug string) error {
item, err := r.Get(slug)
if err != nil {
return err
}
panel, err := version.NewVersion(app.Version)
if err != nil {
return err
}
if installed, _ := r.IsInstalled(slug); installed {
return errors.New("应用已安装")
}
var shellUrl string
for version := range slices.Values(item.Versions) {
if version.PanelVersion == app.Version {
shellUrl = version.Install
for v := range slices.Values(item.Versions) {
vs, err := version.NewVersion(v.Panel)
if err != nil {
continue
}
if v.Slug == versionSlug {
if vs.GreaterThan(panel) {
return fmt.Errorf("应用 %s 需要面板版本 %s当前版本 %s", item.Name, v.Panel, app.Version)
}
shellUrl = v.Install
break
}
}
@@ -154,26 +189,34 @@ func (r *appRepo) Install(slug string) error {
return err
}
func (r *appRepo) Uninstall(slug string) error {
func (r *appRepo) Uninstall(slug, versionSlug string) error {
item, err := r.Get(slug)
if err != nil {
return err
}
panel, err := version.NewVersion(app.Version)
if err != nil {
return err
}
if installed, _ := r.IsInstalled(slug); !installed {
return errors.New("应用未安装")
}
var shellUrl string
for version := range slices.Values(item.Versions) {
if version.PanelVersion == app.Version {
shellUrl = version.Uninstall
for v := range slices.Values(item.Versions) {
vs, err := version.NewVersion(v.Panel)
if err != nil {
continue
}
if v.Slug == versionSlug {
if vs.GreaterThan(panel) {
return fmt.Errorf("应用 %s 需要面板版本 %s当前版本 %s", item.Name, v.Panel, app.Version)
}
shellUrl = v.Uninstall
break
}
}
if shellUrl == "" && len(item.Versions) > 0 {
shellUrl = item.Versions[0].Uninstall
}
if shellUrl == "" {
return fmt.Errorf("无法获取应用 %s 的卸载脚本", item.Name)
}
@@ -194,20 +237,31 @@ func (r *appRepo) Uninstall(slug string) error {
return err
}
func (r *appRepo) Update(slug string) error {
func (r *appRepo) Update(slug, versionSlug string) error {
item, err := r.Get(slug)
if err != nil {
return err
}
panel, err := version.NewVersion(app.Version)
if err != nil {
return err
}
if installed, _ := r.IsInstalled(slug); !installed {
return errors.New("应用未安装")
}
var shellUrl string
for version := range slices.Values(item.Versions) {
if version.PanelVersion == app.Version {
shellUrl = version.Update
for v := range slices.Values(item.Versions) {
vs, err := version.NewVersion(v.Panel)
if err != nil {
continue
}
if v.Slug == versionSlug {
if vs.GreaterThan(panel) {
return fmt.Errorf("应用 %s 需要面板版本 %s当前版本 %s", item.Name, v.Panel, app.Version)
}
shellUrl = v.Update
break
}
}