package infrastructure import ( "encoding/json" "fmt" "slices" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/config" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/tools" ) var ressourceCols = []oclib.LibDataEnum{ oclib.LibDataEnum(oclib.PEER), } var SearchStream = map[string]chan *peer.Peer{} func EmitNATS(user string, message tools.PropalgationMessage) { b, _ := json.Marshal(message) if message.Action == tools.PB_SEARCH { SearchStream[user] = make(chan *peer.Peer, 128) } fmt.Println("qkjbndkqkjdnqksm") tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{ FromApp: "oc-peer", Datatype: -1, Method: int(tools.PROPALGATION_EVENT), Payload: b, }) } // un ressource quand on l'ajoute à notre catalogue elle nous est étrangère. // pour se la réaffecté à soit, on peut alors changer le créator ID. // pour protéger une ressource l'idée serait de la signée. // si on la stocke en base, elle va se dépréciée plus encore si le user n'est pas un partenaire. // elle ne sera pas maintenue à jour. Si c'est une ressource publique et qu'elle change // l'offre peut disparaitre mais subsisté chez nous. // alors si on en dispose et qu'on souhaite l'exploité. On doit en vérifier la validité... ou... // la mettre à jour. Le problème de la mise à jour c'est qu'on peut facilement // overflow.... de stream pour avoir à jour sa ressource. // donc l'idée est que la vérification soit manuelle... ou lors d'une vérification de dernière instance. // si une ressource est exploitée dans un workflow ou un shared workspace. // elle doit être vérifié par les pairs engagés. // si la donnée est déclaré comme donnée de l'emmetteur alors on vérifie que la signature est bien émise, par // l'emmetteur. Sinon... on doit interrogé le pair qui a émit la donnée. Est ce que la donnée est à jour. // 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. func ListenNATS() { tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { if resp.FromApp == config.GetAppName() || resp.Datatype != tools.PEER { return } m := map[string]interface{}{ "verify": true, "relation": peer.PENDING_PARTNER, } p := &peer.Peer{} if err := json.Unmarshal(resp.Payload, &p); err == nil { /*if err := verify(resp.Payload); err != nil { return // don't trust anyone... only friends and foes are privilege }*/ fmt.Println("CREATE_RESOURCE", p.GetID()) access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) if data := access.LoadOne(p.GetID()); data.Data != nil { if !data.ToPeer().Verify && data.ToPeer().Relation == peer.PENDING_PARTNER { access.UpdateOne(map[string]interface{}{ "verify": false, "relation": peer.PARTNER, }, p.GetID()) } else if data.ToPeer().Relation != peer.BLACKLIST && data.ToPeer().Relation != peer.SELF { if p.Relation == peer.NONE { access.UpdateOne(map[string]interface{}{ "relation": peer.NONE, }, p.GetID()) } else { access.UpdateOne(m, p.GetID()) } } } else if err := json.Unmarshal(resp.Payload, &m); err == nil { access.StoreOne(m) } } }, tools.SEARCH_EVENT: func(resp tools.NATSResponse) { if !slices.Contains(ressourceCols, oclib.LibDataEnum(resp.Datatype)) { return } p := &peer.Peer{} err := json.Unmarshal(resp.Payload, p) if err == nil { fmt.Println("ADD in SEARCH STREAM") SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? } }, }) }