Files
platform/web/handlers/channel.go

121 lines
3.1 KiB
Go

package handlers
import (
"errors"
"platform/web/services"
"strings"
"github.com/gofiber/fiber/v2"
)
// region CreateChannel
type CreateChannelReq struct {
ResourceId int32 `json:"resource_id" validate:"required"`
Protocol services.ChannelProtocol `json:"protocol" validate:"required,oneof=socks5 http https"`
AuthType services.ChannelAuthType `json:"auth_type" validate:"required,oneof=0 1"`
Count int `json:"count" validate:"required"`
Prov string `json:"prov" validate:"required"`
City string `json:"city" validate:"required"`
Isp string `json:"isp" validate:"required"`
ResultType CreateChannelResultType `json:"result_type" validate:"required,oneof=json text"`
ResultSeparator CreateChannelResultSeparator `json:"result_separator" validate:"required,oneof=enter line both tab"`
}
func CreateChannel(c *fiber.Ctx) error {
req := new(CreateChannelReq)
if err := c.BodyParser(req); err != nil {
return err
}
// 建立连接通道
auth, ok := c.Locals("auth").(*services.AuthContext)
if !ok {
return errors.New("user not found")
}
result, err := services.Channel.CreateChannel(
c.Context(),
auth,
req.ResourceId,
req.Protocol,
req.AuthType,
req.Count,
services.NodeFilterConfig{
Isp: req.Isp,
Prov: req.Prov,
City: req.City,
},
)
if err != nil {
return err
}
switch req.ResultType {
case CreateChannelResultTypeJson:
return c.JSON(fiber.Map{
"result": result,
})
case CreateChannelResultTypeText:
switch req.ResultSeparator {
case CreateChannelResultSeparatorEnter:
return c.SendString(strings.Join(result, "\r"))
case CreateChannelResultSeparatorLine:
return c.SendString(strings.Join(result, "\n"))
case CreateChannelResultSeparatorBoth:
return c.SendString(strings.Join(result, "\r\n"))
case CreateChannelResultSeparatorTab:
return c.SendString(strings.Join(result, "\t"))
}
}
return errors.New("无效的返回类型")
}
type CreateChannelResultType string
const (
CreateChannelResultTypeJson CreateChannelResultType = "json"
CreateChannelResultTypeText CreateChannelResultType = "text"
)
type CreateChannelResultSeparator string
const (
CreateChannelResultSeparatorEnter CreateChannelResultSeparator = "enter"
CreateChannelResultSeparatorLine CreateChannelResultSeparator = "line"
CreateChannelResultSeparatorBoth CreateChannelResultSeparator = "both"
CreateChannelResultSeparatorTab CreateChannelResultSeparator = "tab"
)
// endregion
// region RemoveChannels
type RemoveChannelsReq struct {
ByIds []int32 `json:"by_ids" validate:"required"`
}
func RemoveChannels(c *fiber.Ctx) error {
req := new(RemoveChannelsReq)
if err := c.BodyParser(req); err != nil {
return err
}
// 获取用户信息
auth, ok := c.Locals("auth").(*services.AuthContext)
if !ok {
return errors.New("user not found")
}
// 删除通道
err := services.Channel.RemoveChannels(c.Context(), auth, req.ByIds...)
if err != nil {
return err
}
return c.SendStatus(fiber.StatusOK)
}
// endregion