99 lines
2.0 KiB
Go
99 lines
2.0 KiB
Go
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.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
|
|
}
|
|
|
|
// 保存节点信息
|
|
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)
|
|
}
|