mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-11-11 03:33:53 +08:00
发布v2.2.10版本,更新内容请查看:https://github.com/bufanyun/hotgo/tree/v2.0/docs/guide-zh-CN/addon-version-upgrade.md
This commit is contained in:
142
server/internal/library/addons/install.go
Normal file
142
server/internal/library/addons/install.go
Normal file
@@ -0,0 +1,142 @@
|
||||
// Package addons
|
||||
// @Link https://github.com/bufanyun/hotgo
|
||||
// @Copyright Copyright (c) 2023 HotGo CLI
|
||||
// @Author Ms <133814250@qq.com>
|
||||
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
|
||||
package addons
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"hotgo/internal/consts"
|
||||
)
|
||||
|
||||
// InstallRecord 安装记录
|
||||
type InstallRecord struct {
|
||||
Id int64 `json:"id" description:"安装ID"`
|
||||
Version string `json:"version" description:"安装版本"`
|
||||
Status int `json:"status" description:"安装状态"`
|
||||
CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"`
|
||||
UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"`
|
||||
}
|
||||
|
||||
func ScanInstall(m Module) (record *InstallRecord, err error) {
|
||||
err = g.Model("sys_addons_install").
|
||||
Ctx(m.Ctx()).
|
||||
Where("name", m.GetSkeleton().Name).
|
||||
Scan(&record)
|
||||
return
|
||||
}
|
||||
|
||||
// IsInstall 模块是否已安装
|
||||
func IsInstall(m Module) bool {
|
||||
record, err := ScanInstall(m)
|
||||
if err != nil {
|
||||
g.Log().Debugf(m.Ctx(), err.Error())
|
||||
return false
|
||||
}
|
||||
if record == nil {
|
||||
return false
|
||||
}
|
||||
return record.Status == consts.AddonsInstallStatusOk
|
||||
}
|
||||
|
||||
// Install 安装模块
|
||||
func Install(m Module) (err error) {
|
||||
record, err := ScanInstall(m)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if record != nil && record.Status == consts.AddonsInstallStatusOk {
|
||||
return gerror.New("插件已安装,无需重复操作!")
|
||||
}
|
||||
|
||||
data := g.Map{
|
||||
"name": m.GetSkeleton().Name,
|
||||
"version": m.GetSkeleton().Version,
|
||||
"status": consts.AddonsInstallStatusOk,
|
||||
}
|
||||
|
||||
return g.DB().Transaction(m.Ctx(), func(ctx context.Context, tx gdb.TX) error {
|
||||
if record != nil {
|
||||
_, err = g.Model("sys_addons_install").
|
||||
Ctx(m.Ctx()).
|
||||
Where("id", record.Id).
|
||||
Delete()
|
||||
}
|
||||
_, err = g.Model("sys_addons_install").
|
||||
Ctx(m.Ctx()).
|
||||
Data(data).
|
||||
Insert()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.Install(ctx)
|
||||
})
|
||||
}
|
||||
|
||||
// Upgrade 更新模块
|
||||
func Upgrade(m Module) (err error) {
|
||||
record, err := ScanInstall(m)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if record == nil || record.Status != consts.AddonsInstallStatusOk {
|
||||
return gerror.New("插件未安装,请安装后操作!")
|
||||
}
|
||||
|
||||
data := g.Map{
|
||||
"version": m.GetSkeleton().Version,
|
||||
}
|
||||
|
||||
return g.DB().Transaction(m.Ctx(), func(ctx context.Context, tx gdb.TX) error {
|
||||
_, err = g.Model("sys_addons_install").
|
||||
Ctx(m.Ctx()).
|
||||
Where("id", record.Id).
|
||||
Data(data).
|
||||
Update()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.Upgrade(ctx)
|
||||
})
|
||||
}
|
||||
|
||||
// UnInstall 卸载模块
|
||||
func UnInstall(m Module) (err error) {
|
||||
record, err := ScanInstall(m)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if record == nil || record.Status != consts.AddonsInstallStatusOk {
|
||||
return gerror.New("插件未安装,请安装后操作!")
|
||||
}
|
||||
|
||||
data := g.Map{
|
||||
"version": m.GetSkeleton().Version,
|
||||
"status": consts.AddonsInstallStatusUn,
|
||||
}
|
||||
|
||||
return g.DB().Transaction(m.Ctx(), func(ctx context.Context, tx gdb.TX) error {
|
||||
_, err = g.Model("sys_addons_install").
|
||||
Ctx(m.Ctx()).
|
||||
Where("id", record.Id).
|
||||
Data(data).
|
||||
Update()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.UnInstall(ctx)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user