diff --git a/pkg/plugins/loader.go b/pkg/plugins/loader.go index 51096701..204e4e7c 100644 --- a/pkg/plugins/loader.go +++ b/pkg/plugins/loader.go @@ -1,32 +1,34 @@ package plugins import ( - "context" + "errors" "runtime" "strings" "sync" - "github.com/goravel/framework/contracts/foundation" + "github.com/goravel/framework/contracts/route" "github.com/goravel/framework/facades" + + "github.com/TheTNB/panel/v2/app/http/middleware" ) var plugins sync.Map -type Meta[ctx any] struct { - Name string // 插件名称 - Description string // 插件描述 - Slug string // 插件标识 - Version string // 插件版本 - Requires []string // 依赖插件 - Excludes []string // 排除插件 - Install string // 安装命令 - Uninstall string // 卸载命令 - Update string // 更新命令 - OnEnable func(ctx) // 启用插件后执行的命令 - OnDisable func(ctx) // 禁用插件后执行的命令 +type Plugin struct { + Name string // 插件名称 + Description string // 插件描述 + Slug string // 插件标识 + Version string // 插件版本 + Requires []string // 依赖插件 + Excludes []string // 排除插件 + Install string // 安装命令 + Uninstall string // 卸载命令 + Update string // 更新命令 + OnEnable func() error // 启用插件后执行的命令 + OnDisable func() error // 禁用插件后执行的命令 } -func AutoRegister(o *Meta[*context.Context]) foundation.Application { +func NewPlugin() (*Plugin, error) { pc, _, _, ok := runtime.Caller(1) if !ok { panic("unable to get caller") @@ -41,12 +43,21 @@ func AutoRegister(o *Meta[*context.Context]) foundation.Application { if b < 0 { panic("invalid package name: " + name) } - name = name[:b] - return Register(name, o) + slug := name[:b] + + if _, ok = plugins.Load(slug); ok { + return nil, errors.New("plugin already exists") + } + + instance := &Plugin{ + Slug: slug, + } + plugins.Store(slug, instance) + + return instance, instance.OnEnable() } -// Register 注册插件控制器 -func Register(service string, o *Meta[*context.Context]) foundation.Application { - plugins.Store(service, o) - return facades.App() +// Route 注册路由 +func (r *Plugin) Route(group func(router route.Router)) { + facades.Route().Prefix("api/plugins/"+r.Slug).Middleware(middleware.Session(), middleware.MustInstall()).Group(group) }