package controllers import ( oclib "cloud.o-forge.io/core/oc-lib" "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" ) // Operations about workflow type PeerController struct { beego.Controller } // @Title Search // @Description search workspace // @Param search path string true "the word search you want to get" // @Param is_draft query string false // @Success 200 {workspace} models.workspace // @router /search/:search [get] func (o *PeerController) Search() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) // store and return Id or post with UUIDLibDataEnum search := o.Ctx.Input.Param(":search") isDraft := o.Ctx.Input.Query("is_draft") o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).Search(nil, search, isDraft == "true") o.ServeJSON() } // @Title GetAll // @Description find all peer // @Param is_draft query string false // @Success 200 {peer} models.peer // @router / [get] func (o *PeerController) GetAll() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) isDraft := o.Ctx.Input.Query("is_draft") verify := o.Ctx.Input.Query("verify") if verify == "true" { o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).Search(&dbs.Filters{ And: map[string][]dbs.Filter{ "verify": {{Operator: dbs.EQUAL.String(), Value: true}}, }, }, "", false) } else { o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).LoadAll(isDraft == "true") } o.ServeJSON() } // @Title Get // @Description find peer by peerid // @Param id path string true "the peer id you want to get" // @Success 200 {peer} models.peer // @router /:id [get] func (o *PeerController) Get() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).LoadOne(id) o.ServeJSON() } // @Title Link // @Description find peer by peerid // @Param id path string true "the peer id you want to get" // @Success 200 {peer} models.peer // @router /:from/link/:relation [get] func (o *PeerController) Link() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":from") if ok, _ := peer.IsMySelf(peerID); ok { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, "error": "can't link relation to ourself", } o.ServeJSON() return } if ok, _ := peer.IsMySelf(id); !ok { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, "error": "can't link relation", } o.ServeJSON() return } relation := o.Ctx.Input.Param(":relation") // as partner, blacklist, unknown req := oclib.NewRequestAdmin(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, 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", } o.ServeJSON() return } o.Data["json"] = map[string]interface{}{ "data": nil, "code": 404, "error": "peer not found", } o.ServeJSON() } // @Title unknown // @Description add unknown peer by peerid // @Param id path string true "the peer id you want to blacklist" // @Success 200 {peer} models.peer // @router /:id/unknown [post] func (o *PeerController) Unknown() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") req := oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil) data := req.LoadOne(id) o.changeRelation(data.ToPeer(), 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 /:id/partner [post] func (o *PeerController) Partner() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") req := oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil) data := req.LoadOne(id) o.changeRelation(data.ToPeer(), 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 /:id/blacklist [post] func (o *PeerController) Blacklist() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).UpdateOne(map[string]interface{}{ "relation": peer.BLACKLIST, }, id) } // 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, _ := peer.IsMySelf(request.PeerID); !ok { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, "error": "can't change relation", } o.ServeJSON() return } if ok, _ := peer.IsMySelf(dest.GetID()); ok { o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, "error": "can't change ourself", } o.ServeJSON() return } // store and return Id or post with UUID if dest != nil { if !dest.Verify && relation == peer.PARTNER { relation = peer.PENDING_PARTNER if _, err := tools.NewHTTPCaller(map[tools.DataType]map[tools.METHOD]string{}).CallGet(dest.Url, "/"+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 } data := request.UpdateOne(map[string]interface{}{ "relation": relation, }, dest.GetID()) o.Data["json"] = data o.ServeJSON() return } o.Data["json"] = map[string]interface{}{ "data": nil, "code": 400, "error": "peer not found.", } o.ServeJSON() } // @Title DeleteState // @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 /:id/undo_state [post] func (o *PeerController) DeleteState() { user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request) id := o.Ctx.Input.Param(":id") o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).UpdateOne(map[string]interface{}{ "state": peer.NONE, }, id) o.ServeJSON() }