feat(plugins): 插件管理 - 区分系统与官方插件权限 (#329)

This commit is contained in:
MasterChiefCN
2026-08-27 11:22:00 +08:00
committed by GitHub
parent 23b4628c81
commit f111d57fc6
32 changed files with 1137 additions and 143 deletions

View File

@@ -3,6 +3,7 @@ package service
import (
"strings"
"infinite-canvas/backend/internal/model"
"infinite-canvas/backend/internal/protocol"
)
@@ -66,14 +67,34 @@ func workflowPluginIDForInterface(value string) (string, bool) {
func (s *Service) WorkflowPluginStatuses() map[string]string {
statuses := make(map[string]string, 2)
for _, plugin := range s.Plugins() {
if plugin.Manifest.ID == WorkflowPluginRunningHub || plugin.Manifest.ID == WorkflowPluginComfyUI {
statuses[plugin.Manifest.ID] = plugin.Status
for _, pluginID := range []string{WorkflowPluginRunningHub, WorkflowPluginComfyUI} {
state, err := s.pluginStateForUser(nil, pluginID, s.Plugins())
if err == nil && state.PlatformAvailable {
statuses[pluginID] = "enabled"
} else {
statuses[pluginID] = "disabled"
}
}
return statuses
}
func (s *Service) WorkflowPluginStatusesForUser(userID string) (map[string]string, error) {
statuses := make(map[string]string, 2)
actor := &model.User{ID: strings.TrimSpace(userID)}
for _, pluginID := range []string{WorkflowPluginRunningHub, WorkflowPluginComfyUI} {
state, err := s.pluginStateForUser(actor, pluginID, s.Plugins())
if err != nil {
return nil, err
}
if state.EffectiveEnabled {
statuses[pluginID] = "enabled"
} else {
statuses[pluginID] = "disabled"
}
}
return statuses, nil
}
func (s *Service) RequireWorkflowPluginForInterface(interfaceType string) error {
pluginID, ok := workflowPluginIDForInterface(normalizeWorkflowInterfaceType(interfaceType))
if !ok {
@@ -89,6 +110,20 @@ func (s *Service) RequireWorkflowPluginForInterface(interfaceType string) error
return nil
}
func (s *Service) RequireWorkflowPluginForUser(userID string, interfaceType string) error {
pluginID, ok := workflowPluginIDForInterface(normalizeWorkflowInterfaceType(interfaceType))
if !ok {
return Forbidden("未知工作流插件")
}
if err := s.RequirePluginForUser(userID, pluginID); err != nil {
if pluginID == WorkflowPluginRunningHub {
return Forbidden("RunningHub 工作流插件未启用")
}
return Forbidden("ComfyUI Bridge 工作流插件未启用")
}
return nil
}
func normalizeWorkflowInterfaceType(value string) string {
value = strings.ToLower(strings.TrimSpace(value))
return value