Fully Working Network Peers

This commit is contained in:
mr
2026-04-01 11:27:05 +02:00
parent 8c6b047ab6
commit bc7b1a2f29
10 changed files with 345 additions and 356 deletions

View File

@@ -4,7 +4,6 @@ import (
ctx "context" ctx "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http"
"oc-peer/infrastructure" "oc-peer/infrastructure"
oclib "cloud.o-forge.io/core/oc-lib" oclib "cloud.o-forge.io/core/oc-lib"
@@ -12,7 +11,7 @@ import (
"cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/peer"
"cloud.o-forge.io/core/oc-lib/tools" "cloud.o-forge.io/core/oc-lib/tools"
beego "github.com/beego/beego/v2/server/web" beego "github.com/beego/beego/v2/server/web"
"golang.org/x/net/websocket" "github.com/gorilla/websocket"
) )
// Operations about workflow // Operations about workflow
@@ -25,7 +24,7 @@ type PeerController struct {
// @Param search path string true "the word search you want to get" // @Param search path string true "the word search you want to get"
// @Param is_draft query string false // @Param is_draft query string false
// @Success 200 {workspace} models.workspace // @Success 200 {workspace} models.workspace
// @router /peer/search/:search [get] // @router /search/:search [get]
func (o *PeerController) Search() { func (o *PeerController) Search() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
// store and return Id or post with UUIDLibDataEnum // store and return Id or post with UUIDLibDataEnum
@@ -39,7 +38,7 @@ func (o *PeerController) Search() {
// @Description find all peer // @Description find all peer
// @Param is_draft query string false // @Param is_draft query string false
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer [get] // @router / [get]
func (o *PeerController) GetAll() { func (o *PeerController) GetAll() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
isDraft := o.Ctx.Input.Query("is_draft") isDraft := o.Ctx.Input.Query("is_draft")
@@ -60,7 +59,7 @@ func (o *PeerController) GetAll() {
// @Description find peer by peerid // @Description find peer by peerid
// @Param id path string true "the peer id you want to get" // @Param id path string true "the peer id you want to get"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id [get] // @router /:id [get]
func (o *PeerController) Get() { func (o *PeerController) Get() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
@@ -72,19 +71,10 @@ func (o *PeerController) Get() {
// @Description find peer by peerid // @Description find peer by peerid
// @Param id path string true "the peer id you want to get" // @Param id path string true "the peer id you want to get"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id/valid [get] // @router /valid/:id [get]
func (o *PeerController) Valid() { func (o *PeerController) Valid() {
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
/*if ok, _ := oclib.IsMySelf(peerID); !ok {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 400,
"error": "can't validate a link relation",
}
o.ServeJSON()
return
}*/
if ok, _ := oclib.IsMySelf(id); ok { if ok, _ := oclib.IsMySelf(id); ok {
o.Data["json"] = map[string]interface{}{ o.Data["json"] = map[string]interface{}{
"data": nil, "data": nil,
@@ -94,6 +84,7 @@ func (o *PeerController) Valid() {
o.ServeJSON() o.ServeJSON()
return return
} }
fmt.Println(id)
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
l := req.LoadOne(id) l := req.LoadOne(id)
if l.Data != nil && l.ToPeer().Verify && (l.ToPeer().Relation == peer.PARTNER || l.ToPeer().Relation == peer.PENDING_PARTNER) { if l.Data != nil && l.ToPeer().Verify && (l.ToPeer().Relation == peer.PARTNER || l.ToPeer().Relation == peer.PENDING_PARTNER) {
@@ -122,67 +113,71 @@ func (o *PeerController) Valid() {
o.ServeJSON() o.ServeJSON()
} }
// @Title unknown // @Title known
// @Description add unknown peer by peerid // @Description add kwown peer by peerid
// @Param id path string true "the peer id you want to blacklist" // @Param id path string true "the peer id you want to blacklist"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id/unknown [post] // @router /:id/known [post]
func (o *PeerController) Unknown() { func (o *PeerController) Known() {
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
data := req.LoadOne(id) data := req.LoadOne(id)
o.changeRelation(data.ToPeer(), user, groups, peer.NONE, req)
o.changeRelation(id, data.ToPeer(), user, groups, peer.NONE, req)
} }
// @Title Partner // @Title Partner
// @Description add partner peer by peerid // @Description add partner peer by peerid
// @Param id path string true "the peer id you want to blacklist" // @Param id path string true "the peer id you want to blacklist"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id/partner [post] // @router /:id/partner [post]
func (o *PeerController) Partner() { func (o *PeerController) Partner() {
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
data := req.LoadOne(id) data := req.LoadOne(id)
o.changeRelation(data.ToPeer(), user, groups, peer.PARTNER, req) o.changeRelation(id, data.ToPeer(), user, groups, peer.PARTNER, req)
} }
// @Title Blacklist // @Title Blacklist
// @Description add blacklist peer by peerid // @Description add blacklist peer by peerid
// @Param id path string true "the peer id you want to blacklist" // @Param id path string true "the peer id you want to blacklist"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id/blacklist [post] // @router /:id/blacklist [post]
func (o *PeerController) Blacklist() { func (o *PeerController) Blacklist() {
user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, _, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
data := req.LoadOne(id) data := req.LoadOne(id)
o.changeRelation(data.ToPeer(), user, groups, peer.BLACKLIST, req) o.changeRelation(id, data.ToPeer(), user, groups, peer.BLACKLIST, req)
} }
// used from : peer ask, or response, only from peer origin is authorized to change... // used from : peer ask, or response, only from peer origin is authorized to change...
func (o *PeerController) changeRelation(dest *peer.Peer, user string, groups []string, relation peer.PeerRelation, request *oclib.Request) { func (o *PeerController) changeRelation(id string, dest *peer.Peer, user string, groups []string, relation peer.PeerRelation, request *oclib.Request) {
/*if ok, _ := oclib.IsMySelf(request.PeerID); !ok { infrastructure.SearchMu.Lock()
o.Data["json"] = map[string]interface{}{ if dest == nil && infrastructure.SearchStreamAction[user] != nil { // add auto in base if not existing
"data": nil, req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
"code": 400, for _, pp := range infrastructure.SearchStreamAction[user] {
"error": "can't change relation if not ourself", if pp.GetID() == id {
data := req.StoreOne(pp.Serialize(pp))
dest = data.ToPeer()
break
}
} }
o.ServeJSON()
return
}*/
if ok, _ := oclib.IsMySelf(dest.GetID()); ok {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 400,
"error": "can't change ourself",
}
o.ServeJSON()
return
} }
infrastructure.SearchMu.Unlock()
// store and return Id or post with UUID // store and return Id or post with UUID
if dest != nil { if dest != nil {
if ok, _ := oclib.IsMySelf(dest.GetID()); ok {
o.Data["json"] = map[string]interface{}{
"data": nil,
"code": 400,
"error": "can't change ourself",
}
o.ServeJSON()
return
}
if !dest.Verify { if !dest.Verify {
switch relation { switch relation {
case peer.PARTNER: case peer.PARTNER:
@@ -194,6 +189,7 @@ func (o *PeerController) changeRelation(dest *peer.Peer, user string, groups []s
if dest.Verify && relation == peer.PENDING_PARTNER { if dest.Verify && relation == peer.PENDING_PARTNER {
relation = peer.PARTNER relation = peer.PARTNER
} }
fmt.Println("CHANGE REL", dest.GetID())
data := request.UpdateOne(map[string]interface{}{ data := request.UpdateOne(map[string]interface{}{
"relation": relation, "relation": relation,
}, dest.GetID()) }, dest.GetID())
@@ -225,7 +221,7 @@ func (o *PeerController) changeRelation(dest *peer.Peer, user string, groups []s
// @Description delete state peer by peerid // @Description delete state peer by peerid
// @Param id path string true "the peer id you want to delete state" // @Param id path string true "the peer id you want to delete state"
// @Success 200 {peer} models.peer // @Success 200 {peer} models.peer
// @router /peer/:id/undo_state [post] // @router /:id/undo_state [post]
func (o *PeerController) DeleteState() { func (o *PeerController) DeleteState() {
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
id := o.Ctx.Input.Param(":id") id := o.Ctx.Input.Param(":id")
@@ -235,48 +231,52 @@ func (o *PeerController) DeleteState() {
o.ServeJSON() o.ServeJSON()
} }
func Websocket(ctx ctx.Context, user string, r http.ResponseWriter, w *http.Request) { func Websocket(ctx ctx.Context, user string, conn *websocket.Conn) {
websocket.Handler(func(ws *websocket.Conn) { defer conn.Close()
done := make(chan struct{})
go func() { done := make(chan struct{})
var discard interface{} go func() {
for { var discard interface{}
if websocket.JSON.Receive(ws, &discard) != nil {
close(done)
return
}
}
}()
defer func() {
ws.Close()
if ch, ok := infrastructure.SearchStream[user]; ok {
close(ch)
infrastructure.SearchMu.Lock()
delete(infrastructure.SearchStream, user)
infrastructure.SearchMu.Unlock()
}
fmt.Println("CLOSE !")
infrastructure.EmitNATS(user, nil, tools.PropalgationMessage{
Action: tools.PB_CLOSE_SEARCH,
DataType: tools.PEER.EnumIndex(),
})
}()
for { for {
select { if conn.ReadJSON(&discard) != nil {
case msg, ok := <-infrastructure.SearchStream[user]: close(done)
if !ok {
continue
}
if websocket.JSON.Send(ws, msg) != nil {
continue
}
case <-done:
return
case <-ctx.Done():
return return
} }
} }
}).ServeHTTP(r, w) }()
defer func() {
if ch, ok := infrastructure.SearchStream[user]; ok {
close(ch)
infrastructure.SearchMu.Lock()
delete(infrastructure.SearchStream, user)
delete(infrastructure.SearchStreamAction, user)
infrastructure.SearchMu.Unlock()
}
fmt.Println("CLOSE !")
infrastructure.EmitNATS(user, nil, tools.PropalgationMessage{
Action: tools.PB_CLOSE_SEARCH,
DataType: tools.PEER.EnumIndex(),
})
}()
for {
select {
case msg, ok := <-infrastructure.SearchStream[user]:
if !ok {
continue
}
infrastructure.SearchMu.Lock()
infrastructure.SearchStreamAction[user] = append(infrastructure.SearchStreamAction[user], msg)
infrastructure.SearchMu.Unlock()
if conn.WriteJSON(msg) != nil {
continue
}
case <-done:
return
case <-ctx.Done():
return
}
}
} }
/* /*

3
go.mod
View File

@@ -3,7 +3,7 @@ module oc-peer
go 1.25.0 go 1.25.0
require ( require (
cloud.o-forge.io/core/oc-lib v0.0.0-20260312141150-a335c905b3a2 cloud.o-forge.io/core/oc-lib v0.0.0-20260331144112-c0722483b86c
github.com/beego/beego/v2 v2.3.8 github.com/beego/beego/v2 v2.3.8
github.com/smartystreets/goconvey v1.7.2 github.com/smartystreets/goconvey v1.7.2
) )
@@ -57,6 +57,7 @@ require (
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // indirect
github.com/goraz/onion v0.1.3 // indirect github.com/goraz/onion v0.1.3 // indirect
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674
github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect
github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect
github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/compress v1.18.0 // indirect

6
go.sum
View File

@@ -34,6 +34,10 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20260312104524-e28b79ac0d62 h1:sHzacZxPIKHyj
cloud.o-forge.io/core/oc-lib v0.0.0-20260312104524-e28b79ac0d62/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= cloud.o-forge.io/core/oc-lib v0.0.0-20260312104524-e28b79ac0d62/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA=
cloud.o-forge.io/core/oc-lib v0.0.0-20260312141150-a335c905b3a2 h1:DuB6SDThFVJVQ0iI0pZnBqtCE0uW+SNI7R7ndKixu2k= cloud.o-forge.io/core/oc-lib v0.0.0-20260312141150-a335c905b3a2 h1:DuB6SDThFVJVQ0iI0pZnBqtCE0uW+SNI7R7ndKixu2k=
cloud.o-forge.io/core/oc-lib v0.0.0-20260312141150-a335c905b3a2/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= cloud.o-forge.io/core/oc-lib v0.0.0-20260312141150-a335c905b3a2/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA=
cloud.o-forge.io/core/oc-lib v0.0.0-20260327114131-45f2351b2f1f h1:lY+EJlJazoDBoM25E0vCOjIh8OdFuyPppWsNERDNkMo=
cloud.o-forge.io/core/oc-lib v0.0.0-20260327114131-45f2351b2f1f/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA=
cloud.o-forge.io/core/oc-lib v0.0.0-20260331144112-c0722483b86c h1:wTIridvhud8zwMsMkwxgrQ+j+6UAo2IHDr3N80AA6zc=
cloud.o-forge.io/core/oc-lib v0.0.0-20260331144112-c0722483b86c/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -143,6 +147,8 @@ github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRid
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/goraz/onion v0.1.3 h1:KhyvbDA2b70gcz/d5izfwTiOH8SmrvV43AsVzpng3n0= github.com/goraz/onion v0.1.3 h1:KhyvbDA2b70gcz/d5izfwTiOH8SmrvV43AsVzpng3n0=
github.com/goraz/onion v0.1.3/go.mod h1:XEmz1XoBz+wxTgWB8NwuvRm4RAu3vKxvrmYtzK+XCuQ= github.com/goraz/onion v0.1.3/go.mod h1:XEmz1XoBz+wxTgWB8NwuvRm4RAu3vKxvrmYtzK+XCuQ=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=

View File

@@ -18,6 +18,7 @@ var ressourceCols = []oclib.LibDataEnum{
} }
var SearchMu sync.RWMutex var SearchMu sync.RWMutex
var SearchStreamAction = map[string][]*peer.Peer{}
var SearchStream = map[string]chan *peer.Peer{} var SearchStream = map[string]chan *peer.Peer{}
func EmitNATS(user string, groups []string, message tools.PropalgationMessage) { func EmitNATS(user string, groups []string, message tools.PropalgationMessage) {
@@ -25,6 +26,7 @@ func EmitNATS(user string, groups []string, message tools.PropalgationMessage) {
if message.Action == tools.PB_SEARCH { if message.Action == tools.PB_SEARCH {
SearchMu.Lock() SearchMu.Lock()
SearchStream[user] = make(chan *peer.Peer, 128) SearchStream[user] = make(chan *peer.Peer, 128)
SearchStreamAction[user] = []*peer.Peer{}
SearchMu.Unlock() SearchMu.Unlock()
} }
tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{ tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{
@@ -55,6 +57,8 @@ func EmitNATS(user string, groups []string, message tools.PropalgationMessage) {
// lui va vérifier la signature de la ressource qu'il possède correspondante si elle existe, si non. AIE, // lui va vérifier la signature de la ressource qu'il possède correspondante si elle existe, si non. AIE,
// on met à jour mais on pète une erreur. // on met à jour mais on pète une erreur.
var self *peer.Peer
func ListenNATS() { func ListenNATS() {
tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){
tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { tools.CREATE_RESOURCE: func(resp tools.NATSResponse) {
@@ -66,12 +70,19 @@ func ListenNATS() {
/*if err := verify(resp.Payload); err != nil { /*if err := verify(resp.Payload); err != nil {
return // don't trust anyone... only friends and foes are privilege return // don't trust anyone... only friends and foes are privilege
}*/ }*/
fmt.Println("CREATE_RESOURCE", p.GetID()) fmt.Println("CREATE_RESOURCE", p.GetID())
if ok, _ := oclib.IsMySelf(p.GetID()); ok {
fmt.Println("it's ourselve !")
return
}
access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil)
if data := access.LoadOne(p.GetID()); data.Data != nil { if data := access.LoadOne(p.GetID()); data.Data != nil {
if p.Relation == peer.PENDING_PARTNER { if p.Relation == peer.PENDING_PARTNER || p.Relation == peer.PARTNER {
if data.ToPeer().Verify { if data.ToPeer().Verify {
fmt.Println("UPDATE 2", p.GetID())
access.UpdateOne(map[string]interface{}{ access.UpdateOne(map[string]interface{}{
"verify": false, "verify": false,
"relation": peer.PARTNER, "relation": peer.PARTNER,
@@ -82,26 +93,19 @@ func ListenNATS() {
"relation": peer.PENDING_PARTNER, "relation": peer.PENDING_PARTNER,
}, p.GetID()) }, p.GetID())
} }
} else if data.ToPeer().Relation != peer.BLACKLIST && data.ToPeer().Relation != peer.SELF { } else if data.ToPeer().Relation == peer.NONE {
access.UpdateOne(map[string]interface{}{ access.UpdateOne(map[string]interface{}{
"verify": false,
"relation": p.Relation, "relation": p.Relation,
}, p.GetID()) }, p.GetID())
} }
} else if p.Relation != peer.SELF { } else if p.Relation != peer.SELF && p.Relation != peer.BLACKLIST {
if p.Relation != peer.SELF { if p.Relation == peer.PARTNER || p.Relation == peer.PENDING_PARTNER {
access.StoreOne(p.Serialize(p)) p.Verify = true
} else if data := access.Search(&dbs.Filters{ p.Relation = peer.PENDING_PARTNER
And: map[string][]dbs.Filter{
"relation": {{Operator: dbs.EQUAL.String(), Value: peer.SELF.EnumIndex()}},
},
}, "", false); len(data.Data) == 0 {
access.StoreOne(p.Serialize(p))
} else if len(data.Data) == 1 && data.Data[0].GetID() != p.GetID() {
access.DeleteOne(data.Data[0].GetID())
access.StoreOne(p.Serialize(p))
} }
access.StoreOne(p.Serialize(p))
} }
} }
}, },
tools.SEARCH_EVENT: func(resp tools.NATSResponse) { tools.SEARCH_EVENT: func(resp tools.NATSResponse) {
@@ -111,7 +115,17 @@ func ListenNATS() {
p := &peer.Peer{} p := &peer.Peer{}
err := json.Unmarshal(resp.Payload, p) err := json.Unmarshal(resp.Payload, p)
if err == nil { if err == nil {
fmt.Println("ADD in SEARCH STREAM") access := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil)
fmt.Println("ADD in SEARCH STREAM", p.GetID())
if s := access.Search(&dbs.Filters{
And: map[string][]dbs.Filter{
"peer_id": {{Operator: dbs.EQUAL.String(), Value: p.PeerID}},
},
}, "", false); len(s.Data) > 0 {
p.Relation = s.Data[0].(*peer.Peer).Relation
} else {
p.NotInCatalog = true
}
SearchMu.Lock() SearchMu.Lock()
SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? SearchStream[resp.User] <- p // TODO when do we update it in our catalog ?
SearchMu.Unlock() SearchMu.Unlock()

View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
"fmt"
"oc-peer/infrastructure" "oc-peer/infrastructure"
_ "oc-peer/routers" _ "oc-peer/routers"
@@ -11,7 +12,12 @@ import (
const appname = "oc-peer" const appname = "oc-peer"
func main() { func main() {
oclib.InitAPI(appname) for _, info := range beego.BeeApp.Handlers.GetAllControllerInfo() {
fmt.Println(info.GetPattern())
}
oclib.InitAPI(appname, map[string][]string{
"/oc/decentralized/search/:search": {"GET"},
})
go infrastructure.ListenNATS() go infrastructure.ListenNATS()
beego.Run() beego.Run()
} }

BIN
oc-peer

Binary file not shown.

View File

@@ -10,7 +10,7 @@ func init() {
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "GetAll", Method: "GetAll",
Router: `/peer`, Router: `/`,
AllowHTTPMethods: []string{"get"}, AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
@@ -19,7 +19,7 @@ func init() {
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "Get", Method: "Get",
Router: `/peer/:id`, Router: `/:id`,
AllowHTTPMethods: []string{"get"}, AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
@@ -28,7 +28,16 @@ func init() {
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "Blacklist", Method: "Blacklist",
Router: `/peer/:id/blacklist`, Router: `/:id/blacklist`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{
Method: "Known",
Router: `/:id/known`,
AllowHTTPMethods: []string{"post"}, AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
@@ -37,7 +46,7 @@ func init() {
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "Partner", Method: "Partner",
Router: `/peer/:id/partner`, Router: `/:id/partner`,
AllowHTTPMethods: []string{"post"}, AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
@@ -46,34 +55,25 @@ func init() {
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "DeleteState", Method: "DeleteState",
Router: `/peer/:id/undo_state`, Router: `/:id/undo_state`,
AllowHTTPMethods: []string{"post"}, AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{
Method: "Unknown",
Router: `/peer/:id/unknown`,
AllowHTTPMethods: []string{"post"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{
Method: "Valid",
Router: `/peer/:id/valid`,
AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{ beego.ControllerComments{
Method: "Search", Method: "Search",
Router: `/peer/search/:search`, Router: `/search/:search`,
AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(),
Filters: nil,
Params: nil})
beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"],
beego.ControllerComments{
Method: "Valid",
Router: `/valid/:id`,
AllowHTTPMethods: []string{"get"}, AllowHTTPMethods: []string{"get"},
MethodParams: param.Make(), MethodParams: param.Make(),
Filters: nil, Filters: nil,

View File

@@ -17,10 +17,17 @@ import (
oclib "cloud.o-forge.io/core/oc-lib" oclib "cloud.o-forge.io/core/oc-lib"
"cloud.o-forge.io/core/oc-lib/tools" "cloud.o-forge.io/core/oc-lib/tools"
beego "github.com/beego/beego/v2/server/web" beego "github.com/beego/beego/v2/server/web"
"github.com/gorilla/websocket"
) )
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func init() { func init() {
ns := beego.NewNamespace("/oc/", ns := beego.NewNamespace("/oc",
beego.NSNamespace("/status", beego.NSNamespace("/status",
beego.NSInclude( beego.NSInclude(
&controllers.StatusController{}, &controllers.StatusController{},
@@ -40,6 +47,11 @@ func init() {
// WebSocket route enregistrée en dehors du pipeline Beego // WebSocket route enregistrée en dehors du pipeline Beego
// beego.Handler bypasse le controller pipeline (pas de WriteHeader parasite) // beego.Handler bypasse le controller pipeline (pas de WriteHeader parasite)
beego.Handler("/oc/decentralized/search/:search", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { beego.Handler("/oc/decentralized/search/:search", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/") parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/")
search := parts[len(parts)-1] search := parts[len(parts)-1]
@@ -50,6 +62,6 @@ func init() {
DataType: tools.PEER.EnumIndex(), DataType: tools.PEER.EnumIndex(),
Payload: b, Payload: b,
}) })
controllers.Websocket(r.Context(), user, w, r) controllers.Websocket(r.Context(), user, conn)
})) }))
} }

View File

@@ -13,38 +13,9 @@
"url": "https://www.gnu.org/licenses/agpl-3.0.html" "url": "https://www.gnu.org/licenses/agpl-3.0.html"
} }
}, },
"basePath": "/oc/", "basePath": "/oc",
"paths": { "paths": {
"/decentralized/search/{search}": { "/": {
"get": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "find workflow by key word\n\u003cbr\u003e",
"operationId": "PeerController.Search Decentralized",
"parameters": [
{
"in": "path",
"name": "search",
"description": "the search you want to get",
"required": true,
"type": "string"
},
{
"in": "query",
"name": "is_draft",
"description": "draft wished",
"type": "string"
}
],
"responses": {
"200": {
"description": "{workflow} models.workflow"
}
}
}
},
"/peer": {
"get": { "get": {
"tags": [ "tags": [
"oc-peer/controllersPeerController" "oc-peer/controllersPeerController"
@@ -66,7 +37,7 @@
} }
} }
}, },
"/peer/search/{search}": { "/search/{search}": {
"get": { "get": {
"tags": [ "tags": [
"oc-peer/controllersPeerController" "oc-peer/controllersPeerController"
@@ -95,144 +66,6 @@
} }
} }
}, },
"/peer/{id}": {
"get": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "find peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Get",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to get",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/peer/{id}/blacklist": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add blacklist peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Blacklist",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/peer/{id}/partner": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add partner peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Partner",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/peer/{id}/undo_state": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "delete state peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.DeleteState",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to delete state",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/peer/{id}/unknown": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add unknown peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.unknown",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/peer/{id}/valid": {
"get": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "find peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Valid",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to get",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/status/": { "/status/": {
"post": { "post": {
"tags": [ "tags": [
@@ -257,6 +90,29 @@
} }
} }
}, },
"/valid/{id}": {
"get": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "find peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Valid",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to get",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/version/": { "/version/": {
"get": { "get": {
"tags": [ "tags": [
@@ -270,6 +126,121 @@
} }
} }
} }
},
"/{id}": {
"get": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "find peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Get",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to get",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/{id}/blacklist": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add blacklist peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Blacklist",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/{id}/known": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add kwown peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.known",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/{id}/partner": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "add partner peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.Partner",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to blacklist",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
},
"/{id}/undo_state": {
"post": {
"tags": [
"oc-peer/controllersPeerController"
],
"description": "delete state peer by peerid\n\u003cbr\u003e",
"operationId": "PeerController.DeleteState",
"parameters": [
{
"in": "path",
"name": "id",
"description": "the peer id you want to delete state",
"required": true,
"type": "string"
}
],
"responses": {
"200": {
"description": "{peer} models.peer"
}
}
}
} }
}, },
"definitions": { "definitions": {

View File

@@ -10,30 +10,9 @@ info:
license: license:
name: AGPL name: AGPL
url: https://www.gnu.org/licenses/agpl-3.0.html url: https://www.gnu.org/licenses/agpl-3.0.html
basePath: /oc/ basePath: /oc
paths: paths:
/decentralized/search/{search}: /:
get:
tags:
- oc-peer/controllersPeerController
description: |-
find workflow by key word
<br>
operationId: PeerController.Search Decentralized
parameters:
- in: path
name: search
description: the search you want to get
required: true
type: string
- in: query
name: is_draft
description: draft wished
type: string
responses:
"200":
description: '{workflow} models.workflow'
/peer:
get: get:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -49,7 +28,7 @@ paths:
responses: responses:
"200": "200":
description: '{peer} models.peer' description: '{peer} models.peer'
/peer/{id}: /{id}:
get: get:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -66,7 +45,7 @@ paths:
responses: responses:
"200": "200":
description: '{peer} models.peer' description: '{peer} models.peer'
/peer/{id}/blacklist: /{id}/blacklist:
post: post:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -83,7 +62,24 @@ paths:
responses: responses:
"200": "200":
description: '{peer} models.peer' description: '{peer} models.peer'
/peer/{id}/partner: /{id}/known:
post:
tags:
- oc-peer/controllersPeerController
description: |-
add kwown peer by peerid
<br>
operationId: PeerController.known
parameters:
- in: path
name: id
description: the peer id you want to blacklist
required: true
type: string
responses:
"200":
description: '{peer} models.peer'
/{id}/partner:
post: post:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -100,7 +96,7 @@ paths:
responses: responses:
"200": "200":
description: '{peer} models.peer' description: '{peer} models.peer'
/peer/{id}/undo_state: /{id}/undo_state:
post: post:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -117,41 +113,7 @@ paths:
responses: responses:
"200": "200":
description: '{peer} models.peer' description: '{peer} models.peer'
/peer/{id}/unknown: /search/{search}:
post:
tags:
- oc-peer/controllersPeerController
description: |-
add unknown peer by peerid
<br>
operationId: PeerController.unknown
parameters:
- in: path
name: id
description: the peer id you want to blacklist
required: true
type: string
responses:
"200":
description: '{peer} models.peer'
/peer/{id}/valid:
get:
tags:
- oc-peer/controllersPeerController
description: |-
find peer by peerid
<br>
operationId: PeerController.Valid
parameters:
- in: path
name: id
description: the peer id you want to get
required: true
type: string
responses:
"200":
description: '{peer} models.peer'
/peer/search/{search}:
get: get:
tags: tags:
- oc-peer/controllersPeerController - oc-peer/controllersPeerController
@@ -189,6 +151,23 @@ paths:
responses: responses:
"200": "200":
description: '{status} models.status' description: '{status} models.status'
/valid/{id}:
get:
tags:
- oc-peer/controllersPeerController
description: |-
find peer by peerid
<br>
operationId: PeerController.Valid
parameters:
- in: path
name: id
description: the peer id you want to get
required: true
type: string
responses:
"200":
description: '{peer} models.peer'
/version/: /version/:
get: get:
tags: tags: