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"
"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
}
}
}
/*

3
go.mod
View File

@@ -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

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-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=

View File

@@ -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()

View File

@@ -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()
}

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.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,

View File

@@ -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)
}))
}

View File

@@ -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": {

View File

@@ -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
<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:
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
<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:
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
<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}:
/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
<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/:
get:
tags: