mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 13:47:15 +08:00
feat: 应用商店版本机制重构
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user