fully Decentralized functionnal OC-PEER
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user