2026-01-28 17:23:55 +01:00
|
|
|
package infrastructure
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
oclib "cloud.o-forge.io/core/oc-lib"
|
2026-02-06 11:09:46 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/config"
|
2026-02-09 15:47:05 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/models/peer"
|
2026-01-28 17:23:55 +01:00
|
|
|
"cloud.o-forge.io/core/oc-lib/models/resources"
|
|
|
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
|
|
|
|
)
|
|
|
|
|
|
2026-02-09 15:47:05 +01:00
|
|
|
var ressourceCols = []oclib.LibDataEnum{
|
|
|
|
|
oclib.LibDataEnum(oclib.COMPUTE_RESOURCE),
|
|
|
|
|
oclib.LibDataEnum(oclib.DATA_RESOURCE),
|
|
|
|
|
oclib.LibDataEnum(oclib.PROCESSING_RESOURCE),
|
|
|
|
|
oclib.LibDataEnum(oclib.STORAGE_RESOURCE),
|
|
|
|
|
oclib.LibDataEnum(oclib.WORKFLOW_RESOURCE),
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-28 17:23:55 +01:00
|
|
|
var SearchStream = map[string]chan resources.ResourceInterface{}
|
|
|
|
|
|
2026-01-28 17:30:39 +01:00
|
|
|
func EmitNATS(user string, message tools.PropalgationMessage) {
|
2026-01-28 17:23:55 +01:00
|
|
|
b, _ := json.Marshal(message)
|
|
|
|
|
if message.Action == tools.PB_SEARCH {
|
2026-01-28 17:30:39 +01:00
|
|
|
SearchStream[user] = make(chan resources.ResourceInterface, 128)
|
2026-01-28 17:23:55 +01:00
|
|
|
}
|
|
|
|
|
tools.NewNATSCaller().SetNATSPub(tools.PROPALGATION_EVENT, tools.NATSResponse{
|
|
|
|
|
FromApp: "oc-catalog",
|
|
|
|
|
Datatype: -1,
|
|
|
|
|
Method: int(tools.PROPALGATION_EVENT),
|
|
|
|
|
Payload: b,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-09 08:54:06 +01:00
|
|
|
// 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.
|
2026-02-09 09:01:42 +01:00
|
|
|
// 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.
|
2026-02-09 09:44:09 +01:00
|
|
|
// 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.
|
2026-02-09 08:54:06 +01:00
|
|
|
|
2026-01-28 17:23:55 +01:00
|
|
|
func ListenNATS() {
|
|
|
|
|
tools.NewNATSCaller().ListenNats(map[tools.NATSMethod]func(tools.NATSResponse){
|
|
|
|
|
tools.CATALOG_SEARCH_EVENT: func(resp tools.NATSResponse) {
|
2026-01-28 17:30:39 +01:00
|
|
|
p, err := resources.ToResource(int(resp.Datatype), resp.Payload)
|
2026-01-28 17:23:55 +01:00
|
|
|
if err == nil {
|
2026-02-06 11:09:46 +01:00
|
|
|
SearchStream[resp.User] <- p // TODO when do we update it in our catalog ?
|
2026-01-28 17:23:55 +01:00
|
|
|
}
|
|
|
|
|
},
|
2026-02-09 15:47:05 +01:00
|
|
|
tools.CREATE_PEER: func(resp tools.NATSResponse) {
|
|
|
|
|
if resp.FromApp == config.GetAppName() {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
var p peer.Peer
|
|
|
|
|
err := json.Unmarshal(resp.Payload, &p)
|
|
|
|
|
if err == nil && p.Relation == peer.BLACKLIST {
|
|
|
|
|
for _, col := range ressourceCols {
|
|
|
|
|
access := oclib.NewRequestAdmin(col, nil)
|
|
|
|
|
datas := access.Search(nil, p.UUID, false)
|
|
|
|
|
for _, data := range datas.Data {
|
|
|
|
|
access.DeleteOne(data.GetID())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2026-01-28 17:23:55 +01:00
|
|
|
tools.CREATE_RESOURCE: func(resp tools.NATSResponse) {
|
2026-02-06 11:09:46 +01:00
|
|
|
if resp.FromApp == config.GetAppName() {
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-28 17:23:55 +01:00
|
|
|
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 {
|
2026-02-06 11:09:46 +01:00
|
|
|
delete(p, "id")
|
2026-01-28 17:23:55 +01:00
|
|
|
access.UpdateOne(p, fmt.Sprintf("%v", p["id"]))
|
|
|
|
|
} else {
|
|
|
|
|
access.StoreOne(p)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
tools.REMOVE_RESOURCE: func(resp tools.NATSResponse) {
|
2026-02-06 11:09:46 +01:00
|
|
|
if resp.FromApp == config.GetAppName() {
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-28 17:23:55 +01:00
|
|
|
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"]))
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
}
|