package handlers import ( "crypto/rand" "github.com/gofiber/fiber/v2" "log/slog" auth2 "platform/web/auth" proxy2 "platform/web/domains/proxy" g "platform/web/globals" m "platform/web/models" q "platform/web/queries" "gorm.io/gorm/clause" ) // region OnlineProxy type OnlineProxyReq struct { Name string `json:"name" validate:"required"` Version int `json:"version" validate:"required"` } type OnlineProxyResp struct { Id int32 `json:"id"` Secret string `json:"secret"` } func OnlineProxy(c *fiber.Ctx) (err error) { // 检查接口权限 _, err = auth2.NewProtect(c).Payload( auth2.PayloadInternalServer, ).Do() if err != nil { return err } // 验证请求参数 var req = new(OnlineProxyReq) err = g.Validator.Validate(c, req) if err != nil { return err } // 创建代理 var ip = c.Context().RemoteIP() var secret = rand.Text() var proxy = &m.Proxy{ Name: req.Name, Version: int32(req.Version), Type: int32(proxy2.TypeSelfHosted), Host: ip.String(), Secret: secret, Status: 1, } err = q.Proxy. Clauses(clause.OnConflict{ UpdateAll: true, Columns: []clause.Column{ {Name: q.Proxy.Name.ColumnName().String()}, }, }). Create(proxy) if err != nil { return err } slog.Debug("注册转发服务", "ip", ip, "id", proxy.ID) return c.JSON(&OnlineProxyResp{ Id: proxy.ID, Secret: secret, }) } // endregion // region OfflineProxy type OfflineProxyReq struct { Name string `json:"name" validate:"required"` } func OfflineProxy(c *fiber.Ctx) (err error) { // 检查接口权限 _, err = auth2.NewProtect(c).Payload( auth2.PayloadInternalServer, ).Do() if err != nil { return err } // 验证请求参数 var req = new(OfflineProxyReq) err = g.Validator.Validate(c, req) if err != nil { return err } // 下线转发服务 _, err = q.Proxy. Where(q.Proxy.Name.Eq(req.Name)). UpdateSimple(q.Proxy.Status.Value(0)) if err != nil { return err } return nil } // endregion // region AssignProxyFwdPort type AssignProxyFwdPortReq struct { Proxy int32 `json:"proxy" validate:"required"` Edge int32 `json:"edge" validate:"required"` Port uint16 `json:"port" validate:"required"` } func AssignProxyFwdPort(c *fiber.Ctx) (err error) { // 检查接口权限 _, err = auth2.NewProtect(c).Payload( auth2.PayloadInternalServer, ).Do() if err != nil { return err } // 验证请求参数 var req = new(AssignProxyFwdPortReq) err = g.Validator.Validate(c, req) if err != nil { return err } // 更新边缘节点端口分配状态 _, err = q.Edge. Where(q.Edge.ID.Eq(req.Edge)). UpdateSimple( q.Edge.ProxyID.Value(req.Proxy), q.Edge.ProxyPort.Value(int32(req.Port)), ) if err != nil { return err } return nil } // endregion