new route Nano + Master

This commit is contained in:
mr
2026-06-01 10:30:36 +02:00
parent 94d25501f9
commit cbd2fb1d46
8 changed files with 446 additions and 356 deletions
+125 -5
View File
@@ -8,6 +8,7 @@ import (
"strconv"
oclib "cloud.o-forge.io/core/oc-lib"
"cloud.o-forge.io/core/oc-lib/config"
"cloud.o-forge.io/core/oc-lib/dbs"
"cloud.o-forge.io/core/oc-lib/models/peer"
"cloud.o-forge.io/core/oc-lib/tools"
@@ -22,21 +23,40 @@ type PeerController struct {
// @Title Search
// @Description search workspace
// @Param type path string true "the type you want to get"
// @Param search path string true "the word search you want to get"
// @Param is_draft query string false
// @Param offset query string false
// @Param limit query string false
// @Success 200 {workspace} models.workspace
// @router /search/:search [get]
// @router /:type/search/:search [get]
func (o *PeerController) Search() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
// store and return Id or post with UUIDLibDataEnum
search := o.Ctx.Input.Param(":search")
typ := o.Ctx.Input.Param(":type")
isDraft := o.Ctx.Input.Query("is_draft")
offset, _ := strconv.Atoi(o.Ctx.Input.Query("offset"))
limit, _ := strconv.Atoi(o.Ctx.Input.Query("limit"))
var filter *dbs.Filters
fmt.Println("TYP", typ)
relation := peer.GetRelationPath(typ)
if relation != -1 {
filter = &dbs.Filters{
And: map[string][]dbs.Filter{ // search by name if no filters are provided
"relation": {{Operator: dbs.EQUAL.String(), Value: relation}},
},
Or: map[string][]dbs.Filter{ // search by name if no filters are providedz
"abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}},
"url": {{Operator: dbs.LIKE.String(), Value: search}},
"peer_id": {{Operator: dbs.LIKE.String(), Value: search}},
},
}
search = ""
}
fmt.Println(filter, relation, "<", search, ">")
o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).Search(
nil, search, isDraft == "true", int64(offset), int64(limit))
filter, search, isDraft == "true", int64(offset), int64(limit))
o.ServeJSON()
}
@@ -47,16 +67,19 @@ func (o *PeerController) Search() {
// @Param limit query string false
// @Param data body json true "body for data content (Json format)"
// @Success 200 {workspace} models.workspace
// @router /extended/search [post]
// @router /:type/extended/search [post]
func (o *PeerController) SearchExtended() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
// store and return Id or post with UUIDLibDataEnum
isDraft := o.Ctx.Input.Query("is_draft")
typ := o.Ctx.Input.Param(":type")
offset, _ := strconv.Atoi(o.Ctx.Input.Query("offset"))
limit, _ := strconv.Atoi(o.Ctx.Input.Query("limit"))
var res map[string]interface{}
json.Unmarshal(o.Ctx.Input.CopyBody(100000), &res)
fmt.Println(res, oclib.FiltersFromFlatMap(res, &peer.Peer{}))
relation := peer.GetRelationPath(typ)
res["relation"] = relation
data := oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).Search(
oclib.FiltersFromFlatMap(res, &peer.Peer{}), "", isDraft == "true", int64(offset), int64(limit))
o.Data["json"] = data
@@ -144,6 +167,7 @@ func (o *PeerController) Valid() {
"relation": peer.MASTER,
}, l.ToPeer().GetID())
fmt.Println(l.Data, data.Data)
data.Data.(*peer.Peer).MasterID = masterPeerID
data.Data.(*peer.Peer).Relation = peer.NANO // dest is a nano
if data.Data != nil {
b, _ := json.Marshal(data.Data)
@@ -162,6 +186,34 @@ func (o *PeerController) Valid() {
o.Data["json"] = data
o.ServeJSON()
return
} else if l.Data != nil && l.ToPeer().Verify && (l.ToPeer().Relation == peer.NANO || l.ToPeer().Relation == peer.PENDING_NANO) {
masterPeerID, err := oclib.GetMySelf()
if err == nil {
data := req.UpdateOne(map[string]interface{}{
"verify": false,
"relation": peer.NANO,
}, l.ToPeer().GetID())
fmt.Println(l.Data, data.Data)
data.Data.(*peer.Peer).MasterID = masterPeerID.GetID()
data.Data.(*peer.Peer).Relation = peer.MASTER // dest is a nano
if data.Data != nil {
b, _ := json.Marshal(data.Data)
go infrastructure.EmitNATS(user, groups, tools.PropalgationMessage{
DataType: tools.PEER.EnumIndex(),
Action: tools.PB_CREATE,
Payload: b,
})
}
// This node is now a NANO of the confirmed master: stamp its libp2p PeerID on self.
if self, serr := oclib.GetMySelf(); serr == nil && self != nil {
oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil).UpdateOne(map[string]interface{}{
"master_id": masterPeerID.GetID(),
}, self.GetID())
}
o.Data["json"] = data
o.ServeJSON()
return
}
}
o.Data["json"] = map[string]interface{}{
"data": nil,
@@ -201,6 +253,62 @@ func (o *PeerController) Add() {
o.ServeJSON()
}
// @Title Master
// @Description add master peer by peerid
// @Param id path string true "the peer id you want to blacklist"
// @Success 200 {peer} models.peer
// @router /master/:id [post]
func (o *PeerController) Master() {
if !config.GetConfig().IsNano {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "not nano built can't ask for master",
}
}
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
data := req.LoadOne(id)
p := data.ToPeer()
if p.IsNano {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "is not Master built can't ask for master",
}
}
o.changeRelation(id, p, user, groups, peer.MASTER, req)
}
// @Title Nano
// @Description add Nano peer by peerid
// @Param id path string true "the peer id you want to blacklist"
// @Success 200 {peer} models.peer
// @router /nano/:id [post]
func (o *PeerController) Nano() {
if config.GetConfig().IsNano {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "nano built can't ask for nano",
}
}
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
data := req.LoadOne(id)
p := data.ToPeer()
if !p.IsNano {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "is not Nano built can't ask for nano",
}
}
o.changeRelation(id, p, user, groups, peer.NANO, req)
}
// @Title known
// @Description add kwown peer by peerid
// @Param id path string true "the peer id you want to blacklist"
@@ -221,6 +329,13 @@ func (o *PeerController) Known() {
// @Success 200 {peer} models.peer
// @router /partner/:id [post]
func (o *PeerController) Partner() {
if config.GetConfig().IsNano {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "nano built can't ask for partner",
}
}
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
@@ -243,8 +358,13 @@ func (o *PeerController) Blacklist() {
// used from : peer ask, or response, only from peer origin is authorized to change...
func (o *PeerController) changeRelation(id string, dest *peer.Peer, user string, groups []string, relation peer.PeerRelation, request *oclib.Request) {
if dest.IsNano {
fmt.Println("can't change relation on nano")
if dest.IsNano && relation != peer.NANO {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 409,
"error": "can't change relation on nano",
}
o.ServeJSON()
return
}
infrastructure.SearchMu.Lock()