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. 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"])) } }, }) }