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