121 lines
3.1 KiB
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
|