package handlers import ( edge2 "platform/web/domains/edge" proxy2 "platform/web/domains/proxy" g "platform/web/globals" m "platform/web/models" q "platform/web/queries" "github.com/gofiber/fiber/v2" "gorm.io/gen/field" "gorm.io/gorm/clause" ) type RegisterEdgeReq struct { Name string `json:"name" validate:"required"` Version int `json:"version" validate:"required"` ISP edge2.ISP `json:"isp"` Prov string `json:"prov"` City string `json:"city"` } type RegisterEdgeResp struct { Id int32 `json:"id"` Host string `json:"host"` } func OnlineEdge(c *fiber.Ctx) (err error) { // 验证请求参数 var req = new(RegisterEdgeReq) err = g.Validator.Validate(c, req) if err != nil { return err } // 挑选合适的转发服务 var fwd *m.Proxy fwd, err = q.Proxy. LeftJoin(q.Edge, q.Edge.ProxyID.EqCol(q.Proxy.ID), q.Edge.Status.Eq(1)). Select(q.Proxy.ALL, q.Edge.ALL.Count().As("count")). Where(q.Proxy.Type.Eq(int32(proxy2.TypeSelfHosted))). Group(q.Proxy.ID). Order(field.NewField("", "count").Desc()). First() if err != nil { return err } // 保存节点信息 var edge = &m.Edge{ Name: req.Name, Version: int32(req.Version), Host: c.Context().RemoteIP().String(), Isp: int32(req.ISP), Prov: req.Prov, City: req.City, ProxyID: fwd.ID, Type: int32(edge2.TypeSelfHosted), Status: 1, } err = q.Edge.Clauses(clause.OnConflict{ UpdateAll: true, Columns: []clause.Column{{Name: "name"}}, }).Create(edge) if err != nil { return err } // 返回服务地址 return c.JSON(RegisterEdgeResp{ Id: edge.ID, Host: fwd.Host, }) } type OfflineEdgeReq struct { Name string `json:"name" validate:"required"` } func OfflineEdge(c *fiber.Ctx) (err error) { // 验证请求参数 var req = new(OfflineEdgeReq) err = g.Validator.Validate(c, req) if err != nil { return err } // 下线转发服务 _, err = q.Edge. Where(q.Edge.Name.Eq(req.Name)). UpdateSimple(q.Edge.Status.Value(0)) if err != nil { return err } return c.SendStatus(fiber.StatusOK) }