Files
platform/web/handlers/edge.go

64 lines
1.3 KiB
Go

package handlers
import (
"github.com/gofiber/fiber/v2"
"gorm.io/gen/field"
proxy2 "platform/web/domains/proxy"
g "platform/web/globals"
m "platform/web/models"
q "platform/web/queries"
)
type RegisterEdgeReq struct {
Name int `json:"name" validate:"required"`
Version int `json:"version" validate:"required"`
ISP int `json:"isp" validate:"required"`
Prov string `json:"prov" validate:"required"`
City string `json:"city" validate:"required"`
}
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.Save(&m.Edge{
Version: int32(req.Version),
Host: c.IP(),
Isp: int32(req.ISP),
Prov: req.Prov,
City: req.City,
ProxyID: fwd.ID,
})
if err != nil {
return err
}
// 返回服务地址
return c.JSON(RegisterEdgeResp{
Host: fwd.Host,
})
}