diff --git a/controllers/peer.go b/controllers/peer.go index 3705cfa..c640ff6 100644 --- a/controllers/peer.go +++ b/controllers/peer.go @@ -3,16 +3,15 @@ package controllers import ( ctx "context" "encoding/json" + "fmt" "net/http" "oc-peer/infrastructure" 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" beego "github.com/beego/beego/v2/server/web" - "github.com/beego/beego/v2/server/web/context" "golang.org/x/net/websocket" ) @@ -69,55 +68,56 @@ func (o *PeerController) Get() { o.ServeJSON() } -// @Title Link +// @Title Valid // @Description find peer by peerid // @Param id path string true "the peer id you want to get" // @Success 200 {peer} models.peer -// @router /peer/:from/link/:relation [get] -func (o *PeerController) Link() { - _, peerID, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - id := o.Ctx.Input.Param(":from") - if ok, _ := oclib.IsMySelf(peerID); ok { +// @router /peer/:id/valid [get] +func (o *PeerController) Valid() { + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) + 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 link relation by ourself", + "error": "can't validate a link relation", + } + o.ServeJSON() + return + }*/ + if ok, _ := oclib.IsMySelf(id); ok { + o.Data["json"] = map[string]interface{}{ + "data": nil, + "code": 400, + "error": "can't validate a link relation for ourself", } o.ServeJSON() return } - if ok, _ := oclib.IsMySelf(id); !ok { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": "can't link relation to an other peer", - } - o.ServeJSON() - return - } - relation := o.Ctx.Input.Param(":relation") // as partner, blacklist, unknown req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) l := req.LoadOne(id) - if p := l.ToPeer(); p != nil { - if peer.GetRelationPath(relation) != -1 { - o.Data["json"] = req.UpdateOne(map[string]interface{}{ - "relation": peer.GetRelationPath(relation), - "verify": !(p.Relation == peer.PENDING_PARTNER || relation == peer.NONE.Path()), - }, p.GetID()) - return - } - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": "relation unavailable", + if l.Data != nil && l.ToPeer().Verify && (l.ToPeer().Relation == peer.PARTNER || l.ToPeer().Relation == peer.PENDING_PARTNER) { + data := req.UpdateOne(map[string]interface{}{ + "verify": false, + "relation": peer.PARTNER, + }, l.ToPeer().GetID()) + fmt.Println(l.Data, data.Data) + if data.Data != nil { + b, _ := json.Marshal(data.Data) + go infrastructure.EmitNATS(user, tools.PropalgationMessage{ + DataType: tools.PEER.EnumIndex(), + Action: tools.PB_CREATE, + Payload: b, + }) } + o.Data["json"] = data o.ServeJSON() return } o.Data["json"] = map[string]interface{}{ "data": nil, "code": 404, - "error": "peer not found", + "error": "peer to verify not found", } o.ServeJSON() } @@ -128,11 +128,11 @@ func (o *PeerController) Link() { // @Success 200 {peer} models.peer // @router /peer/:id/unknown [post] func (o *PeerController) Unknown() { - //user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) data := req.LoadOne(id) - o.changeRelation(data.ToPeer(), peer.NONE, req) + o.changeRelation(data.ToPeer(), user, peer.NONE, req) } // @Title Partner @@ -141,11 +141,11 @@ func (o *PeerController) Unknown() { // @Success 200 {peer} models.peer // @router /peer/:id/partner [post] func (o *PeerController) Partner() { - // user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) data := req.LoadOne(id) - o.changeRelation(data.ToPeer(), peer.PARTNER, req) + o.changeRelation(data.ToPeer(), user, peer.PARTNER, req) } // @Title Blacklist @@ -154,24 +154,24 @@ func (o *PeerController) Partner() { // @Success 200 {peer} models.peer // @router /peer/:id/blacklist [post] func (o *PeerController) Blacklist() { - // user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) + user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) data := req.LoadOne(id) - o.changeRelation(data.ToPeer(), peer.BLACKLIST, req) + o.changeRelation(data.ToPeer(), user, peer.BLACKLIST, req) } // used from : peer ask, or response, only from peer origin is authorized to change... -func (o *PeerController) changeRelation(dest *peer.Peer, relation peer.PeerRelation, request *oclib.Request) { - if ok, _ := oclib.IsMySelf(request.PeerID); !ok { +func (o *PeerController) changeRelation(dest *peer.Peer, user string, relation peer.PeerRelation, request *oclib.Request) { + /*if ok, _ := oclib.IsMySelf(request.PeerID); !ok { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, - "error": "can't change relation", + "error": "can't change relation if not ourself", } o.ServeJSON() return - } + }*/ if ok, _ := oclib.IsMySelf(dest.GetID()); ok { o.Data["json"] = map[string]interface{}{ "data": nil, @@ -190,15 +190,6 @@ func (o *PeerController) changeRelation(dest *peer.Peer, relation peer.PeerRelat case peer.BLACKLIST: relation = peer.NONE } - if _, err := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{}).CallGet( - dest.APIUrl, "/"+request.PeerID+"/link/"+relation.Path()); err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err.Error(), - } - o.ServeJSON() - } } if dest.Verify && relation == peer.PENDING_PARTNER { relation = peer.PARTNER @@ -207,17 +198,15 @@ func (o *PeerController) changeRelation(dest *peer.Peer, relation peer.PeerRelat "relation": relation, }, dest.GetID()) - if data.Err != "" && data.Data != nil { + fmt.Println(data.Err, data.Data) + if data.Err == "" && data.Data != nil { b, _ := json.Marshal(data.Data) - go tools.NewNATSCaller().SetNATSPub(tools.CREATE_RESOURCE, tools.NATSResponse{ - FromApp: config.GetAppName(), - Datatype: tools.DataType(tools.PEER), - Method: int(tools.CREATE_RESOURCE), - SearchAttr: "peer_id", - Payload: b, + go infrastructure.EmitNATS(user, tools.PropalgationMessage{ + DataType: tools.PEER.EnumIndex(), + Action: tools.PB_CREATE, + Payload: b, }) } - o.Data["json"] = data o.ServeJSON() return @@ -246,40 +235,11 @@ func (o *PeerController) DeleteState() { o.ServeJSON() } -// @Title Search Decentralized -// @Description find workflow by key word -// @Param search path string true "the search you want to get" -// @Param is_draft query string false "draft wished" -// @Success 200 {workflow} models.workflow -// @router /decentralized/search/:search[get] -func (o *PeerController) SearchDecentralized() { - user, _, _ := oclib.ExtractTokenInfo(*o.Ctx.Request) - search := o.Ctx.Input.Param(":search") - b, err := json.Marshal(map[string]string{ - "search": search, - }) - infrastructure.EmitNATS(user, tools.PropalgationMessage{ - Action: tools.PB_SEARCH, - DataType: tools.PEER.EnumIndex(), - Payload: b, - }) - if err != nil { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 400, - "error": err, - } - o.ServeJSON() - return - } - Websocket(o.Ctx.Request.Context(), user, o.Ctx.ResponseWriter, o.Ctx.Request) -} - -func Websocket(ctx ctx.Context, user string, r *context.Response, w *http.Request) { +func Websocket(ctx ctx.Context, user string, r http.ResponseWriter, w *http.Request) { websocket.Handler(func(ws *websocket.Conn) { defer ws.Close() - for { - if msg, ok := <-infrastructure.SearchStream[user]; !ok || websocket.Message.Send(ws, msg) != nil { + for msg := range infrastructure.SearchStream[user] { + if websocket.JSON.Send(ws, msg) != nil { return } } diff --git a/go.mod b/go.mod index 8618b68..3f1b88b 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,46 @@ module oc-peer -go 1.24.6 - -toolchain go1.24.11 +go 1.25.0 require ( - cloud.o-forge.io/core/oc-lib v0.0.0-20260223145640-e039fa56b64c + cloud.o-forge.io/core/oc-lib v0.0.0-20260302152414-542b0b73aba5 github.com/beego/beego/v2 v2.3.8 github.com/smartystreets/goconvey v1.7.2 ) require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/google/gnostic-models v0.7.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/libp2p/go-libp2p/core v0.43.0-rc2 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/x448/float16 v0.8.4 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/time v0.9.0 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.2.8 // indirect + k8s.io/api v0.35.1 // indirect + k8s.io/apimachinery v0.35.1 // indirect + k8s.io/client-go v0.35.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) require ( diff --git a/go.sum b/go.sum index 4303b26..80647a5 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,10 @@ cloud.o-forge.io/core/oc-lib v0.0.0-20260218132556-0b41e2505e2f h1:OFuJhi23D/UNw cloud.o-forge.io/core/oc-lib v0.0.0-20260218132556-0b41e2505e2f/go.mod h1:jmyBwmsac/4V7XPL347qawF60JsBCDmNAMfn/ySXKYo= cloud.o-forge.io/core/oc-lib v0.0.0-20260223145640-e039fa56b64c h1:3PRvQdSSGjmw+Txkf0zWs3F+V9URq22zQCLR3o7bNBY= cloud.o-forge.io/core/oc-lib v0.0.0-20260223145640-e039fa56b64c/go.mod h1:jmyBwmsac/4V7XPL347qawF60JsBCDmNAMfn/ySXKYo= +cloud.o-forge.io/core/oc-lib v0.0.0-20260302144605-44812309db51 h1:YTZg78dWfigoV6/IT4iBtqGXP+wwkTvyp56UzYWmXfk= +cloud.o-forge.io/core/oc-lib v0.0.0-20260302144605-44812309db51/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= +cloud.o-forge.io/core/oc-lib v0.0.0-20260302152414-542b0b73aba5 h1:h+Fkyj6cfwAirc0QGCBEkZSSrgcyThXswg7ytOLm948= +cloud.o-forge.io/core/oc-lib v0.0.0-20260302152414-542b0b73aba5/go.mod h1:+ENuvBfZdESSvecoqGY/wSvRlT3vinEolxKgwbOhUpA= 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/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -69,8 +73,12 @@ github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw= github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/etcd-io/etcd v3.3.17+incompatible/go.mod h1:cdZ77EstHBwVtD6iTgzgvogwcjo9m4iOqoijouPJ4bs= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw= @@ -78,6 +86,16 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -104,6 +122,8 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -122,9 +142,13 @@ github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iP github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -133,6 +157,7 @@ github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYW github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -148,6 +173,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/libp2p/go-libp2p/core v0.43.0-rc2 h1:1X1aDJNWhMfodJ/ynbaGLkgnC8f+hfBIqQDrzxFZOqI= github.com/libp2p/go-libp2p/core v0.43.0-rc2/go.mod h1:NYeJ9lvyBv9nbDk2IuGb8gFKEOkIv/W5YRIy1pAJB2Q= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= @@ -161,9 +188,13 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -231,14 +262,21 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -255,6 +293,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -273,6 +313,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -304,12 +346,16 @@ golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -330,7 +376,11 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -339,5 +389,26 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= +k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= +k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= +k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM= +k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/infrastructure/nats.go b/infrastructure/nats.go index d8b062c..d1d3de4 100644 --- a/infrastructure/nats.go +++ b/infrastructure/nats.go @@ -2,9 +2,11 @@ package infrastructure import ( "encoding/json" + "fmt" "slices" oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/config" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/tools" ) @@ -20,6 +22,7 @@ func EmitNATS(user string, message tools.PropalgationMessage) { if message.Action == tools.PB_SEARCH { SearchStream[user] = make(chan *peer.Peer, 128) } + fmt.Println("qkjbndkqkjdnqksm") tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{ FromApp: "oc-peer", Datatype: -1, @@ -48,6 +51,43 @@ func EmitNATS(user string, message tools.PropalgationMessage) { func ListenNATS() { tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ + tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { + if resp.FromApp == config.GetAppName() || resp.Datatype != tools.PEER { + return + } + m := map[string]interface{}{ + "verify": true, + "relation": peer.PENDING_PARTNER, + } + p := &peer.Peer{} + if err := json.Unmarshal(resp.Payload, &p); err == nil { + /*if err := verify(resp.Payload); err != nil { + return // don't trust anyone... only friends and foes are privilege + }*/ + fmt.Println("CREATE_RESOURCE", p.GetID()) + + access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) + if data := access.LoadOne(p.GetID()); data.Data != nil { + if !data.ToPeer().Verify && data.ToPeer().Relation == peer.PENDING_PARTNER { + access.UpdateOne(map[string]interface{}{ + "verify": false, + "relation": peer.PARTNER, + }, p.GetID()) + } else if data.ToPeer().Relation != peer.BLACKLIST && data.ToPeer().Relation != peer.SELF { + if p.Relation == peer.NONE { + access.UpdateOne(map[string]interface{}{ + "relation": peer.NONE, + }, p.GetID()) + } else { + access.UpdateOne(m, p.GetID()) + } + } + } else if err := json.Unmarshal(resp.Payload, &m); err == nil { + access.StoreOne(m) + } + + } + }, tools.SEARCH_EVENT: func(resp tools.NATSResponse) { if !slices.Contains(ressourceCols, oclib.LibDataEnum(resp.Datatype)) { return @@ -55,6 +95,7 @@ func ListenNATS() { p := &peer.Peer{} err := json.Unmarshal(resp.Payload, p) if err == nil { + fmt.Println("ADD in SEARCH STREAM") SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? } }, diff --git a/main.go b/main.go index feccdb5..254e8a8 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( _ "oc-peer/routers" oclib "cloud.o-forge.io/core/oc-lib" - "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" ) @@ -13,7 +12,6 @@ const appname = "oc-peer" func main() { oclib.InitAPI(appname) - go oclib.InitNATSDecentralizedEmitter(tools.PEER) go infrastructure.ListenNATS() beego.Run() } diff --git a/oc-peer b/oc-peer index f66460f..fb53c92 100755 Binary files a/oc-peer and b/oc-peer differ diff --git a/routers/commentsRouter.go b/routers/commentsRouter.go index 1190997..f4baf26 100644 --- a/routers/commentsRouter.go +++ b/routers/commentsRouter.go @@ -16,15 +16,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], - beego.ControllerComments{ - Method: "Link", - Router: `/peer/:from/link/:relation`, - 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: "Get", @@ -70,6 +61,15 @@ func init() { 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.ControllerComments{ Method: "Search", diff --git a/routers/router.go b/routers/router.go index 23a78ac..788bd28 100644 --- a/routers/router.go +++ b/routers/router.go @@ -8,8 +8,14 @@ package routers import ( + "encoding/json" + "net/http" "oc-peer/controllers" + "oc-peer/infrastructure" + "strings" + oclib "cloud.o-forge.io/core/oc-lib" + "cloud.o-forge.io/core/oc-lib/tools" beego "github.com/beego/beego/v2/server/web" ) @@ -30,4 +36,20 @@ func init() { ), ) beego.AddNamespace(ns) + + // WebSocket route enregistrée en dehors du pipeline Beego + // 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) { + parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/") + search := parts[len(parts)-1] + + user, _, _ := oclib.ExtractTokenInfo(*r) + b, _ := json.Marshal(map[string]string{"search": search}) + infrastructure.EmitNATS(user, tools.PropalgationMessage{ + Action: tools.PB_SEARCH, + DataType: tools.PEER.EnumIndex(), + Payload: b, + }) + controllers.Websocket(r.Context(), user, w, r) + })) } diff --git a/swagger/swagger.json b/swagger/swagger.json index ad7aca0..0299c02 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -15,6 +15,35 @@ }, "basePath": "/oc/", "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": { "tags": [ @@ -66,29 +95,6 @@ } } }, - "/peer/{from}/link/{relation}": { - "get": { - "tags": [ - "oc-peer/controllersPeerController" - ], - "description": "find peer by peerid\n\u003cbr\u003e", - "operationId": "PeerController.Link", - "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}": { "get": { "tags": [ @@ -204,6 +210,29 @@ } } }, + "/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/": { "post": { "tags": [ diff --git a/swagger/swagger.yml b/swagger/swagger.yml index ef55e18..eb84d67 100644 --- a/swagger/swagger.yml +++ b/swagger/swagger.yml @@ -12,6 +12,27 @@ info: url: https://www.gnu.org/licenses/agpl-3.0.html basePath: /oc/ paths: + /decentralized/search/{search}: + get: + tags: + - oc-peer/controllersPeerController + description: |- + find workflow by key word +
+ 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: tags: @@ -28,23 +49,6 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{from}/link/{relation}: - get: - tags: - - oc-peer/controllersPeerController - description: |- - find peer by peerid -
- operationId: PeerController.Link - 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}: get: tags: @@ -130,6 +134,23 @@ paths: responses: "200": description: '{peer} models.peer' + /peer/{id}/valid: + get: + tags: + - oc-peer/controllersPeerController + description: |- + find peer by peerid +
+ 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: tags: diff --git a/ws.go b/ws.go new file mode 100644 index 0000000..5defcc5 --- /dev/null +++ b/ws.go @@ -0,0 +1,102 @@ +//go:build ignore + +package main + +import ( + "encoding/json" + "flag" + "fmt" + "log" + "os" + "os/signal" + "time" + + "golang.org/x/net/websocket" +) + +func main() { + timeout := flag.Int("timeout", 10, "secondes sans message avant de quitter") + flag.Parse() + + args := flag.Args() + url := "ws://localhost:8093/oc/decentralized/search/test" + token := "" + + if len(args) >= 1 { + url = args[0] + } + if len(args) >= 2 { + token = args[1] + } + + // websocket.Dial attend une "origin" (peut être n'importe quelle URL) + origin := "http://localhost/" + config, err := websocket.NewConfig(url, origin) + if err != nil { + log.Fatalf("Config invalide : %v", err) + } + if token != "" { + config.Header.Set("Authorization", "Bearer "+token) + fmt.Printf("Token : %s...\n", token[:min(20, len(token))]) + } + + fmt.Printf("Connexion à : %s\n", url) + ws, err := websocket.DialConfig(config) + if err != nil { + log.Fatalf("Impossible de se connecter : %v", err) + } + defer ws.Close() + fmt.Println("Connecté — en attente de messages...\n") + + // Gestion Ctrl+C + stop := make(chan os.Signal, 1) + signal.Notify(stop, os.Interrupt) + + msgs := make(chan string) + errs := make(chan error, 1) + + go func() { + for { + var raw string + if err := websocket.Message.Receive(ws, &raw); err != nil { + errs <- err + return + } + msgs <- raw + } + }() + + idleTimer := time.NewTimer(time.Duration(*timeout) * time.Second) + defer idleTimer.Stop() + + for { + select { + case <-stop: + fmt.Println("\nInterruption — fermeture.") + return + case err := <-errs: + fmt.Printf("Connexion fermée : %v\n", err) + return + case <-idleTimer.C: + fmt.Printf("Timeout (%ds) — aucun message reçu, fermeture.\n", *timeout) + return + case raw := <-msgs: + idleTimer.Reset(time.Duration(*timeout) * time.Second) + // Tente d'afficher en JSON formaté + var data any + if err := json.Unmarshal([]byte(raw), &data); err == nil { + b, _ := json.MarshalIndent(data, "", " ") + fmt.Println(string(b)) + } else { + fmt.Printf("Message brut : %s\n", raw) + } + } + } +} + +func min(a, b int) int { + if a < b { + return a + } + return b +}