Files
platform/web/handlers/channel.go

93 lines
2.6 KiB
Go

package handlers
import (
"errors"
"fmt"
"platform/web/services"
"strings"
"github.com/gofiber/fiber/v2"
)
// region CreateChannel
type CreateChannelReq struct {
Region string `json:"region" validate:"required"`
Provider string `json:"provider" validate:"required"`
Protocol services.ChannelProtocol `json:"protocol" validate:"required,oneof=socks5 http https"`
ResourceId int `json:"resource_id" validate:"required"`
Count int `json:"count" validate:"required"`
ResultType CreateChannelResultType `json:"return_type" validate:"required,oneof=json text"`
ResultSeparator CreateChannelResultSeparator `json:"return_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("user").(*services.AuthContext)
if !ok {
return errors.New("user not found")
}
channels, err := services.Channel.CreateChannel(
auth.Payload.Id,
req.Region,
req.Provider,
req.Protocol,
req.ResourceId,
req.Count,
)
if err != nil {
return err
}
// 返回连接通道列表
var result []string
for _, channel := range channels {
url := fmt.Sprintf("%s://%s:%d", channel.Protocol, channel.UserHost, channel.NodePort)
result = append(result, url)
}
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