93 lines
2.6 KiB
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
|