2024-08-21 16:25:24 +02:00
|
|
|
package controllers
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
oclib "cloud.o-forge.io/core/oc-lib"
|
2026-01-23 08:07:17 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/dbs"
|
2024-10-15 16:55:29 +02:00
|
|
|
"cloud.o-forge.io/core/oc-lib/models/peer"
|
2026-01-23 08:07:17 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
2024-08-21 16:25:24 +02:00
|
|
|
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"
|
2025-01-17 17:22:25 +01:00
|
|
|
// @Param is_draft query string false
|
2024-08-21 16:25:24 +02:00
|
|
|
// @Success 200 {workspace} models.workspace
|
|
|
|
|
// @router /search/:search [get]
|
|
|
|
|
func (o *PeerController) Search() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
2024-11-07 13:39:45 +01:00
|
|
|
// store and return Id or post with UUIDLibDataEnum
|
2024-08-21 16:25:24 +02:00
|
|
|
search := o.Ctx.Input.Param(":search")
|
2025-01-17 17:22:25 +01:00
|
|
|
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")
|
2024-08-21 16:25:24 +02:00
|
|
|
o.ServeJSON()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// @Title GetAll
|
|
|
|
|
// @Description find all peer
|
2025-01-17 17:22:25 +01:00
|
|
|
// @Param is_draft query string false
|
2024-08-21 16:25:24 +02:00
|
|
|
// @Success 200 {peer} models.peer
|
|
|
|
|
// @router / [get]
|
|
|
|
|
func (o *PeerController) GetAll() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
|
|
|
|
isDraft := o.Ctx.Input.Query("is_draft")
|
2026-01-23 08:07:17 +01:00
|
|
|
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")
|
|
|
|
|
}
|
2024-08-21 16:25:24 +02:00
|
|
|
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() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
2024-08-21 16:25:24 +02:00
|
|
|
id := o.Ctx.Input.Param(":id")
|
2025-01-17 17:22:25 +01:00
|
|
|
o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).LoadOne(id)
|
2024-08-21 16:25:24 +02:00
|
|
|
o.ServeJSON()
|
|
|
|
|
}
|
2024-10-15 16:55:29 +02:00
|
|
|
|
2026-01-23 08:07:17 +01:00
|
|
|
// @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)
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-15 16:55:29 +02:00
|
|
|
// @Title Partner
|
|
|
|
|
// @Description add partner peer by peerid
|
2026-01-23 08:07:17 +01:00
|
|
|
// @Param id path string true "the peer id you want to blacklist"
|
2024-10-15 16:55:29 +02:00
|
|
|
// @Success 200 {peer} models.peer
|
|
|
|
|
// @router /:id/partner [post]
|
2026-01-23 08:07:17 +01:00
|
|
|
func (o *PeerController) Partner() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
2024-10-15 16:55:29 +02:00
|
|
|
id := o.Ctx.Input.Param(":id")
|
2026-01-23 08:07:17 +01:00
|
|
|
req := oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil)
|
|
|
|
|
data := req.LoadOne(id)
|
|
|
|
|
o.changeRelation(data.ToPeer(), peer.PARTNER, req)
|
2024-10-15 16:55:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// @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() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
2024-10-15 16:55:29 +02:00
|
|
|
id := o.Ctx.Input.Param(":id")
|
2025-01-17 17:22:25 +01:00
|
|
|
o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).UpdateOne(map[string]interface{}{
|
2026-01-23 08:07:17 +01:00
|
|
|
"relation": peer.BLACKLIST,
|
2024-10-15 16:55:29 +02:00
|
|
|
}, id)
|
2026-01-23 08:07:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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.",
|
|
|
|
|
}
|
2024-10-15 16:55:29 +02:00
|
|
|
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() {
|
2025-01-17 17:22:25 +01:00
|
|
|
user, peerID, groups := oclib.ExtractTokenInfo(*o.Ctx.Request)
|
2024-10-15 16:55:29 +02:00
|
|
|
id := o.Ctx.Input.Param(":id")
|
2025-01-17 17:22:25 +01:00
|
|
|
o.Data["json"] = oclib.NewRequest(oclib.LibDataEnum(oclib.PEER), user, peerID, groups, nil).UpdateOne(map[string]interface{}{
|
2024-10-15 16:55:29 +02:00
|
|
|
"state": peer.NONE,
|
|
|
|
|
}, id)
|
|
|
|
|
o.ServeJSON()
|
|
|
|
|
}
|