diff --git a/controllers/peer.go b/controllers/peer.go index 015bbce..4b2cd12 100644 --- a/controllers/peer.go +++ b/controllers/peer.go @@ -4,7 +4,6 @@ import ( ctx "context" "encoding/json" "fmt" - "net/http" "oc-peer/infrastructure" 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/tools" beego "github.com/beego/beego/v2/server/web" - "golang.org/x/net/websocket" + "github.com/gorilla/websocket" ) // Operations about workflow @@ -25,7 +24,7 @@ type PeerController struct { // @Param search path string true "the word search you want to get" // @Param is_draft query string false // @Success 200 {workspace} models.workspace -// @router /peer/search/:search [get] +// @router /search/:search [get] func (o *PeerController) Search() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) // store and return Id or post with UUIDLibDataEnum @@ -39,7 +38,7 @@ func (o *PeerController) Search() { // @Description find all peer // @Param is_draft query string false // @Success 200 {peer} models.peer -// @router /peer [get] +// @router / [get] func (o *PeerController) GetAll() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) isDraft := o.Ctx.Input.Query("is_draft") @@ -60,7 +59,7 @@ func (o *PeerController) GetAll() { // @Description find peer by peerid // @Param id path string true "the peer id you want to get" // @Success 200 {peer} models.peer -// @router /peer/:id [get] +// @router /:id [get] func (o *PeerController) Get() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") @@ -72,19 +71,10 @@ func (o *PeerController) Get() { // @Description find peer by peerid // @Param id path string true "the peer id you want to get" // @Success 200 {peer} models.peer -// @router /peer/:id/valid [get] +// @router /valid/:id [get] func (o *PeerController) Valid() { user, _, groups := 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 validate a link relation", - } - o.ServeJSON() - return - }*/ if ok, _ := oclib.IsMySelf(id); ok { o.Data["json"] = map[string]interface{}{ "data": nil, @@ -94,6 +84,7 @@ func (o *PeerController) Valid() { o.ServeJSON() return } + fmt.Println(id) req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) l := req.LoadOne(id) 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() } -// @Title unknown -// @Description add unknown peer by peerid +// @Title known +// @Description add kwown peer by peerid // @Param id path string true "the peer id you want to blacklist" // @Success 200 {peer} models.peer -// @router /peer/:id/unknown [post] -func (o *PeerController) Unknown() { +// @router /:id/known [post] +func (o *PeerController) Known() { 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) - o.changeRelation(data.ToPeer(), user, groups, peer.NONE, req) + + o.changeRelation(id, data.ToPeer(), user, groups, peer.NONE, req) } // @Title Partner // @Description add partner peer by peerid // @Param id path string true "the peer id you want to blacklist" // @Success 200 {peer} models.peer -// @router /peer/:id/partner [post] +// @router /:id/partner [post] func (o *PeerController) Partner() { 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) - o.changeRelation(data.ToPeer(), user, groups, peer.PARTNER, req) + o.changeRelation(id, data.ToPeer(), user, groups, peer.PARTNER, req) } // @Title Blacklist // @Description add blacklist peer by peerid // @Param id path string true "the peer id you want to blacklist" // @Success 200 {peer} models.peer -// @router /peer/:id/blacklist [post] +// @router /:id/blacklist [post] func (o *PeerController) Blacklist() { 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) - 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... -func (o *PeerController) changeRelation(dest *peer.Peer, user string, groups []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 if not ourself", +func (o *PeerController) changeRelation(id string, dest *peer.Peer, user string, groups []string, relation peer.PeerRelation, request *oclib.Request) { + infrastructure.SearchMu.Lock() + if dest == nil && infrastructure.SearchStreamAction[user] != nil { // add auto in base if not existing + req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), nil) + for _, pp := range infrastructure.SearchStreamAction[user] { + 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 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 { switch relation { 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 { relation = peer.PARTNER } + fmt.Println("CHANGE REL", dest.GetID()) data := request.UpdateOne(map[string]interface{}{ "relation": relation, }, dest.GetID()) @@ -225,7 +221,7 @@ func (o *PeerController) changeRelation(dest *peer.Peer, user string, groups []s // @Description delete state peer by peerid // @Param id path string true "the peer id you want to delete state" // @Success 200 {peer} models.peer -// @router /peer/:id/undo_state [post] +// @router /:id/undo_state [post] func (o *PeerController) DeleteState() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") @@ -235,48 +231,52 @@ func (o *PeerController) DeleteState() { o.ServeJSON() } -func Websocket(ctx ctx.Context, user string, r http.ResponseWriter, w *http.Request) { - websocket.Handler(func(ws *websocket.Conn) { - done := make(chan struct{}) - go func() { - var discard interface{} - for { - 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(), - }) - }() +func Websocket(ctx ctx.Context, user string, conn *websocket.Conn) { + defer conn.Close() + + done := make(chan struct{}) + go func() { + var discard interface{} for { - select { - case msg, ok := <-infrastructure.SearchStream[user]: - if !ok { - continue - } - if websocket.JSON.Send(ws, msg) != nil { - continue - } - case <-done: - return - case <-ctx.Done(): + if conn.ReadJSON(&discard) != nil { + close(done) 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 + } + } } /* diff --git a/go.mod b/go.mod index 08edcb7..85f371b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module oc-peer go 1.25.0 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/smartystreets/goconvey v1.7.2 ) @@ -57,6 +57,7 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c // 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/jtolds/gls v4.20.0+incompatible // indirect github.com/klauspost/compress v1.18.0 // indirect diff --git a/go.sum b/go.sum index 03df4d1..a399d32 100644 --- a/go.sum +++ b/go.sum @@ -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-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-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/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= 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/goraz/onion v0.1.3 h1:KhyvbDA2b70gcz/d5izfwTiOH8SmrvV43AsVzpng3n0= 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 v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= diff --git a/infrastructure/nats.go b/infrastructure/nats.go index 1204665..a0b9f63 100644 --- a/infrastructure/nats.go +++ b/infrastructure/nats.go @@ -18,6 +18,7 @@ var ressourceCols = []oclib.LibDataEnum{ } var SearchMu sync.RWMutex +var SearchStreamAction = map[string][]*peer.Peer{} var SearchStream = map[string]chan *peer.Peer{} 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 { SearchMu.Lock() SearchStream[user] = make(chan *peer.Peer, 128) + SearchStreamAction[user] = []*peer.Peer{} SearchMu.Unlock() } 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, // on met à jour mais on pète une erreur. +var self *peer.Peer + func ListenNATS() { tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { @@ -66,12 +70,19 @@ func ListenNATS() { /*if err := verify(resp.Payload); err != nil { return // don't trust anyone... only friends and foes are privilege }*/ + 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) 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 { + fmt.Println("UPDATE 2", p.GetID()) access.UpdateOne(map[string]interface{}{ "verify": false, "relation": peer.PARTNER, @@ -82,26 +93,19 @@ func ListenNATS() { "relation": peer.PENDING_PARTNER, }, 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{}{ + "verify": false, "relation": p.Relation, }, p.GetID()) } - } else if p.Relation != peer.SELF { - if p.Relation != peer.SELF { - access.StoreOne(p.Serialize(p)) - } else if data := access.Search(&dbs.Filters{ - 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)) + } else if p.Relation != peer.SELF && p.Relation != peer.BLACKLIST { + if p.Relation == peer.PARTNER || p.Relation == peer.PENDING_PARTNER { + p.Verify = true + p.Relation = peer.PENDING_PARTNER } + access.StoreOne(p.Serialize(p)) } - } }, tools.SEARCH_EVENT: func(resp tools.NATSResponse) { @@ -111,7 +115,17 @@ func ListenNATS() { p := &peer.Peer{} err := json.Unmarshal(resp.Payload, p) 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() SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? SearchMu.Unlock() diff --git a/main.go b/main.go index 254e8a8..98d599b 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "oc-peer/infrastructure" _ "oc-peer/routers" @@ -11,7 +12,12 @@ import ( const appname = "oc-peer" 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() beego.Run() } diff --git a/oc-peer b/oc-peer index fb53c92..36d9c83 100755 Binary files a/oc-peer and b/oc-peer differ diff --git a/routers/commentsRouter.go b/routers/commentsRouter.go index f4baf26..45b9fb5 100644 --- a/routers/commentsRouter.go +++ b/routers/commentsRouter.go @@ -10,7 +10,7 @@ func init() { beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.ControllerComments{ Method: "GetAll", - Router: `/peer`, + Router: `/`, AllowHTTPMethods: []string{"get"}, MethodParams: param.Make(), Filters: nil, @@ -19,7 +19,7 @@ func init() { beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.ControllerComments{ Method: "Get", - Router: `/peer/:id`, + Router: `/:id`, AllowHTTPMethods: []string{"get"}, MethodParams: param.Make(), Filters: nil, @@ -28,7 +28,16 @@ func init() { beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.ControllerComments{ 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"}, MethodParams: param.Make(), Filters: nil, @@ -37,7 +46,7 @@ func init() { beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.ControllerComments{ Method: "Partner", - Router: `/peer/:id/partner`, + Router: `/:id/partner`, AllowHTTPMethods: []string{"post"}, MethodParams: param.Make(), Filters: nil, @@ -46,34 +55,25 @@ func init() { beego.GlobalControllerRouter["oc-peer/controllers:PeerController"] = append(beego.GlobalControllerRouter["oc-peer/controllers:PeerController"], beego.ControllerComments{ Method: "DeleteState", - Router: `/peer/:id/undo_state`, + Router: `/:id/undo_state`, 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: "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.ControllerComments{ 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"}, MethodParams: param.Make(), Filters: nil, diff --git a/routers/router.go b/routers/router.go index 6e9c61b..66203a7 100644 --- a/routers/router.go +++ b/routers/router.go @@ -17,10 +17,17 @@ import ( oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/tools" 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() { - ns := beego.NewNamespace("/oc/", + ns := beego.NewNamespace("/oc", beego.NSNamespace("/status", beego.NSInclude( &controllers.StatusController{}, @@ -40,6 +47,11 @@ func init() { // 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) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return + } + defer conn.Close() parts := strings.Split(strings.TrimSuffix(r.URL.Path, "/"), "/") search := parts[len(parts)-1] @@ -50,6 +62,6 @@ func init() { DataType: tools.PEER.EnumIndex(), Payload: b, }) - controllers.Websocket(r.Context(), user, w, r) + controllers.Websocket(r.Context(), user, conn) })) } diff --git a/swagger/swagger.json b/swagger/swagger.json index 0299c02..c21a485 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -13,38 +13,9 @@ "url": "https://www.gnu.org/licenses/agpl-3.0.html" } }, - "basePath": "/oc/", + "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": [ "oc-peer/controllersPeerController" @@ -66,7 +37,7 @@ } } }, - "/peer/search/{search}": { + "/search/{search}": { "get": { "tags": [ "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/": { "post": { "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/": { "get": { "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": { diff --git a/swagger/swagger.yml b/swagger/swagger.yml index eb84d67..d819807 100644 --- a/swagger/swagger.yml +++ b/swagger/swagger.yml @@ -10,30 +10,9 @@ info: license: name: AGPL url: https://www.gnu.org/licenses/agpl-3.0.html -basePath: /oc/ +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: - oc-peer/controllersPeerController @@ -49,7 +28,7 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{id}: + /{id}: get: tags: - oc-peer/controllersPeerController @@ -66,7 +45,7 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{id}/blacklist: + /{id}/blacklist: post: tags: - oc-peer/controllersPeerController @@ -83,7 +62,24 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{id}/partner: + /{id}/known: + post: + tags: + - oc-peer/controllersPeerController + description: |- + add kwown peer by peerid +
+ 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 @@ -100,7 +96,7 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{id}/undo_state: + /{id}/undo_state: post: tags: - oc-peer/controllersPeerController @@ -117,41 +113,7 @@ paths: responses: "200": description: '{peer} models.peer' - /peer/{id}/unknown: - post: - tags: - - oc-peer/controllersPeerController - description: |- - add unknown peer by peerid -
- 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 -
- 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}: + /search/{search}: get: tags: - oc-peer/controllersPeerController @@ -189,6 +151,23 @@ paths: responses: "200": description: '{status} models.status' + /valid/{id}: + 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' /version/: get: tags: