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 { 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.Debug(). Select(q.Proxy.ALL, q.Edge.ALL.Count().As("count")). LeftJoin(q.Edge, q.Edge.ProxyID.EqCol(q.Proxy.ID)). Where(q.Proxy.Type.Eq(int32(proxy2.TypeSelfHosted))). Group(q.Proxy.ID). Order(field.NewField("", "count").Desc()). First() if err != nil { return err } // 保存节点信息 err = q.Edge.Clauses(clause.OnConflict{ UpdateAll: true, Columns: []clause.Column{{Name: "name"}}, }).Create(&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, }) if err != nil { return err } // 返回服务地址 return c.JSON(RegisterEdgeResp{ Host: fwd.Host, }) }