Some checks failed
Build Multi-Platform Binaries / build-frontend (push) Successful in 30s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m4s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 45s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m29s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 45s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 1m27s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 50s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m42s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Has been cancelled
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Has been cancelled
213 lines
5.1 KiB
Go
213 lines
5.1 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gotunnel/internal/server/db"
|
|
// removed router import
|
|
"github.com/gotunnel/internal/server/router/dto"
|
|
)
|
|
|
|
// JSPluginHandler JS 插件处理器
|
|
type JSPluginHandler struct {
|
|
app AppInterface
|
|
}
|
|
|
|
// NewJSPluginHandler 创建 JS 插件处理器
|
|
func NewJSPluginHandler(app AppInterface) *JSPluginHandler {
|
|
return &JSPluginHandler{app: app}
|
|
}
|
|
|
|
// List 获取 JS 插件列表
|
|
// @Summary 获取所有 JS 插件
|
|
// @Description 返回所有注册的 JS 插件
|
|
// @Tags JS插件
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Success 200 {object} Response{data=[]db.JSPlugin}
|
|
// @Router /api/js-plugins [get]
|
|
func (h *JSPluginHandler) List(c *gin.Context) {
|
|
plugins, err := h.app.GetJSPluginStore().GetAllJSPlugins()
|
|
if err != nil {
|
|
InternalError(c, err.Error())
|
|
return
|
|
}
|
|
if plugins == nil {
|
|
plugins = []db.JSPlugin{}
|
|
}
|
|
Success(c, plugins)
|
|
}
|
|
|
|
// Create 创建 JS 插件
|
|
// @Summary 创建 JS 插件
|
|
// @Description 创建新的 JS 插件
|
|
// @Tags JS插件
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Param request body dto.JSPluginCreateRequest true "插件信息"
|
|
// @Success 200 {object} Response
|
|
// @Failure 400 {object} Response
|
|
// @Router /api/js-plugins [post]
|
|
func (h *JSPluginHandler) Create(c *gin.Context) {
|
|
var req dto.JSPluginCreateRequest
|
|
if !BindJSON(c, &req) {
|
|
return
|
|
}
|
|
|
|
plugin := &db.JSPlugin{
|
|
Name: req.Name,
|
|
Source: req.Source,
|
|
Signature: req.Signature,
|
|
Description: req.Description,
|
|
Author: req.Author,
|
|
Config: req.Config,
|
|
AutoStart: req.AutoStart,
|
|
Enabled: true,
|
|
}
|
|
|
|
if err := h.app.GetJSPluginStore().SaveJSPlugin(plugin); err != nil {
|
|
InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
Success(c, gin.H{"status": "ok"})
|
|
}
|
|
|
|
// Get 获取单个 JS 插件
|
|
// @Summary 获取 JS 插件详情
|
|
// @Description 获取指定 JS 插件的详细信息
|
|
// @Tags JS插件
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Param name path string true "插件名称"
|
|
// @Success 200 {object} Response{data=db.JSPlugin}
|
|
// @Failure 404 {object} Response
|
|
// @Router /api/js-plugin/{name} [get]
|
|
func (h *JSPluginHandler) Get(c *gin.Context) {
|
|
name := c.Param("name")
|
|
|
|
plugin, err := h.app.GetJSPluginStore().GetJSPlugin(name)
|
|
if err != nil {
|
|
NotFound(c, "plugin not found")
|
|
return
|
|
}
|
|
|
|
Success(c, plugin)
|
|
}
|
|
|
|
// Update 更新 JS 插件
|
|
// @Summary 更新 JS 插件
|
|
// @Description 更新指定 JS 插件的信息
|
|
// @Tags JS插件
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Param name path string true "插件名称"
|
|
// @Param request body dto.JSPluginUpdateRequest true "更新内容"
|
|
// @Success 200 {object} Response
|
|
// @Failure 400 {object} Response
|
|
// @Router /api/js-plugin/{name} [put]
|
|
func (h *JSPluginHandler) Update(c *gin.Context) {
|
|
name := c.Param("name")
|
|
|
|
var req dto.JSPluginUpdateRequest
|
|
if !BindJSON(c, &req) {
|
|
return
|
|
}
|
|
|
|
plugin := &db.JSPlugin{
|
|
Name: name,
|
|
Source: req.Source,
|
|
Signature: req.Signature,
|
|
Description: req.Description,
|
|
Author: req.Author,
|
|
Config: req.Config,
|
|
AutoStart: req.AutoStart,
|
|
Enabled: req.Enabled,
|
|
}
|
|
|
|
if err := h.app.GetJSPluginStore().SaveJSPlugin(plugin); err != nil {
|
|
InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
Success(c, gin.H{"status": "ok"})
|
|
}
|
|
|
|
// Delete 删除 JS 插件
|
|
// @Summary 删除 JS 插件
|
|
// @Description 删除指定的 JS 插件
|
|
// @Tags JS插件
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Param name path string true "插件名称"
|
|
// @Success 200 {object} Response
|
|
// @Router /api/js-plugin/{name} [delete]
|
|
func (h *JSPluginHandler) Delete(c *gin.Context) {
|
|
name := c.Param("name")
|
|
|
|
if err := h.app.GetJSPluginStore().DeleteJSPlugin(name); err != nil {
|
|
InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
Success(c, gin.H{"status": "ok"})
|
|
}
|
|
|
|
// PushToClient 推送 JS 插件到客户端
|
|
// @Summary 推送插件到客户端
|
|
// @Description 将 JS 插件推送到指定客户端
|
|
// @Tags JS插件
|
|
// @Produce json
|
|
// @Security Bearer
|
|
// @Param name path string true "插件名称"
|
|
// @Param clientID path string true "客户端ID"
|
|
// @Success 200 {object} Response
|
|
// @Failure 400 {object} Response
|
|
// @Failure 404 {object} Response
|
|
// @Router /api/js-plugin/{name}/push/{clientID} [post]
|
|
func (h *JSPluginHandler) PushToClient(c *gin.Context) {
|
|
pluginName := c.Param("name")
|
|
clientID := c.Param("clientID")
|
|
|
|
// 检查客户端是否在线
|
|
online, _, _ := h.app.GetServer().GetClientStatus(clientID)
|
|
if !online {
|
|
ClientNotOnline(c)
|
|
return
|
|
}
|
|
|
|
// 获取插件
|
|
plugin, err := h.app.GetJSPluginStore().GetJSPlugin(pluginName)
|
|
if err != nil {
|
|
NotFound(c, "plugin not found")
|
|
return
|
|
}
|
|
|
|
if !plugin.Enabled {
|
|
Error(c, 400, CodePluginDisabled, "plugin is disabled")
|
|
return
|
|
}
|
|
|
|
// 推送到客户端
|
|
req := JSPluginInstallRequest{
|
|
PluginName: plugin.Name,
|
|
Source: plugin.Source,
|
|
Signature: plugin.Signature,
|
|
RuleName: plugin.Name,
|
|
Config: plugin.Config,
|
|
AutoStart: plugin.AutoStart,
|
|
}
|
|
|
|
if err := h.app.GetServer().InstallJSPluginToClient(clientID, req); err != nil {
|
|
InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
Success(c, gin.H{
|
|
"status": "ok",
|
|
"plugin": pluginName,
|
|
"client": clientID,
|
|
})
|
|
}
|