添加代理与节点的注册与端口分配接口功能
This commit is contained in:
@@ -160,7 +160,7 @@ func CreateChannel(c *fiber.Ctx) error {
|
||||
req.Protocol,
|
||||
req.AuthType,
|
||||
req.Count,
|
||||
s.NodeFilterConfig{
|
||||
s.EdgeFilterConfig{
|
||||
Isp: isp,
|
||||
Prov: req.Prov,
|
||||
City: req.City,
|
||||
|
||||
63
web/handlers/edge.go
Normal file
63
web/handlers/edge.go
Normal file
@@ -0,0 +1,63 @@
|
||||
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,
|
||||
})
|
||||
}
|
||||
54
web/handlers/proxy.go
Normal file
54
web/handlers/proxy.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"gorm.io/gorm/clause"
|
||||
auth2 "platform/web/auth"
|
||||
proxy2 "platform/web/domains/proxy"
|
||||
g "platform/web/globals"
|
||||
m "platform/web/models"
|
||||
q "platform/web/queries"
|
||||
)
|
||||
|
||||
type RegisterProxyReq struct {
|
||||
Name string `json:"name" validate:"required"`
|
||||
Version int `json:"version" validate:"required"`
|
||||
}
|
||||
|
||||
func OnlineProxy(c *fiber.Ctx) (err error) {
|
||||
|
||||
// 检查接口权限
|
||||
_, err = auth2.NewProtect(c).Payload(
|
||||
auth2.PayloadInternalServer,
|
||||
).Do()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 验证请求参数
|
||||
var req = new(RegisterProxyReq)
|
||||
err = g.Validator.Validate(c, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建代理
|
||||
err = q.Proxy.
|
||||
Clauses(clause.OnConflict{
|
||||
UpdateAll: true,
|
||||
Columns: []clause.Column{
|
||||
{Name: q.Proxy.Name.ColumnName().String()},
|
||||
},
|
||||
}).
|
||||
Create(&m.Proxy{
|
||||
Name: req.Name,
|
||||
Version: int32(req.Version),
|
||||
Host: c.IP(),
|
||||
Type: int32(proxy2.TypeSelfHosted),
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user