package infrastructure import ( "encoding/json" "fmt" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/config" "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/tools" ) var SearchStream = map[string]chan resources.ResourceInterface{} func EmitNATS(user string, message tools.PropalgationMessage) { b, _ := json.Marshal(message) if message.Action == tools.PB_SEARCH { SearchStream[user] = make(chan resources.ResourceInterface, 128) } tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{ FromApp: "oc-catalog", 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 demande à nos indexeurs qui eux vont prendre un pool de noeud dont ils disposent et leur posé la question. // est ce que la donnée est valide pour un booking ? là tout le monde va répondre oui ou non. // si non, on refuse func ListenNATS() { tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){ tools.CATALOG_SEARCH_EVENT: func(resp tools.NATSResponse) { p, err := resources.ToResource(int(resp.Datatype), resp.Payload) if err == nil { SearchStream[resp.User] <- p // TODO when do we update it in our catalog ? } }, tools.CREATE_RESOURCE: func(resp tools.NATSResponse) { if resp.FromApp == config.GetAppName() { return } p := map[string]interface{}{} err := json.Unmarshal(resp.Payload, &p) if err == nil { access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) if data := access.LoadOne(fmt.Sprintf("%v", p["id"])); data.Data != nil { delete(p, "id") access.UpdateOne(p, fmt.Sprintf("%v", p["id"])) } else { access.StoreOne(p) } } }, tools.REMOVE_RESOURCE: func(resp tools.NATSResponse) { if resp.FromApp == config.GetAppName() { return } p := map[string]interface{}{} access := oclib.NewRequestAdmin(oclib.LibDataEnum(resp.Datatype), nil) err := json.Unmarshal(resp.Payload, &p) if err == nil { access.DeleteOne(fmt.Sprintf("%v", p["id"])) } }, }) }