package handlers import ( "errors" "fmt" "platform/web/auth" q "platform/web/queries" "platform/web/services" "github.com/gofiber/fiber/v2" ) // region CreateChannel type CreateChannelReq struct { ResourceId int32 `json:"resource_id" validate:"required"` AuthType services.ChannelAuthType `json:"auth_type" validate:"required"` Protocol services.ChannelProtocol `json:"protocol" validate:"required"` Count int `json:"count" validate:"required"` Prov string `json:"prov"` City string `json:"city"` Isp string `json:"isp"` } func CreateChannel(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []services.PayloadType{services.PayloadUser}, []string{}) if err != nil { return err } // 获取用户信息 user, err := q.User. Where(q.User.ID.Eq(authContext.Payload.Id)). Take() if err != nil { return err } if user.IDToken == "" { return fiber.NewError(fiber.StatusForbidden, "账号未实名") } count, err := q.Whitelist.Where( q.Whitelist.UserID.Eq(authContext.Payload.Id), q.Whitelist.Host.Eq(c.IP()), ).Count() if err != nil { return err } if count == 0 { return fiber.NewError(fiber.StatusForbidden, fmt.Sprintf("非白名单IP %s", c.IP())) } req := new(CreateChannelReq) if err := c.BodyParser(req); err != nil { return err } var isp string switch req.Isp { case "1": isp = "电信" case "2": isp = "联通" case "3": isp = "移动" } result, err := services.Channel.CreateChannel( c.Context(), authContext, req.ResourceId, req.Protocol, req.AuthType, req.Count, services.NodeFilterConfig{ Isp: isp, Prov: req.Prov, City: req.City, }, ) if err != nil { return err } return c.JSON(result) } type CreateChannelResultType string const ( CreateChannelResultTypeJson CreateChannelResultType = "json" CreateChannelResultTypeText CreateChannelResultType = "text" ) // 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 } // 获取用户信息 authCtx, ok := c.Locals("auth").(*services.AuthContext) if !ok { return errors.New("user not found") } // 删除通道 err := services.Channel.RemoveChannels(c.Context(), authCtx, req.ByIds...) if err != nil { return err } return c.SendStatus(fiber.StatusOK) } // endregion