package pubsub import ( "context" "encoding/json" "errors" "oc-discovery/daemons" "oc-discovery/daemons/dht" "oc-discovery/models" "cloud.o-forge.io/core/oc-lib/models/peer" "cloud.o-forge.io/core/oc-lib/models/resources" "cloud.o-forge.io/core/oc-lib/tools" ) func (ps *PubSubService) handleEvent(ctx context.Context, topicName string, evt models.Event) error { action := ps.getTopicName(topicName) if err := ps.handleEventFromPartner(evt, action); err != nil { return err } if err := ps.handleEventSearch(ctx, evt, action); err != nil { return err } return nil } func (ps *PubSubService) handleEventFromPartner(evt models.Event, action tools.PubSubAction) error { if !(action == tools.PB_CREATE || action == tools.PB_UPDATE || action == tools.PB_DELETE) { return nil } resource, err := resources.ToResource(int(evt.DataType), evt.Payload) if err != nil { return err } b, err := json.Marshal(resource) if err != nil { return err } switch action { case tools.PB_CREATE: case tools.PB_UPDATE: tools.NewNATSCaller().SetNATSPub(tools.CREATE_RESOURCE, tools.NATSResponse{ FromApp: "oc-discovery", Datatype: tools.DataType(evt.DataType), Method: int(tools.CREATE_RESOURCE), Payload: b, }) case tools.PB_DELETE: tools.NewNATSCaller().SetNATSPub(tools.REMOVE_RESOURCE, tools.NATSResponse{ FromApp: "oc-discovery", Datatype: tools.DataType(evt.DataType), Method: int(tools.REMOVE_RESOURCE), Payload: b, }) default: return errors.New("no action authorized available : " + action.String()) } return nil } func (ps *PubSubService) handleEventSearch( // only : on partner followings. 3 canals for every partner. ctx context.Context, evt models.Event, action tools.PubSubAction, ) error { if !(action == tools.PB_SEARCH_RESPONSE || action == tools.PB_SEARCH) { return nil } if p, err := dht.GetDHTService().GetPeer(ctx, evt.From); err == nil { if err := daemons.VerifyPeer([]*peer.Peer{p}, evt); err != nil { return err } switch action { case tools.PB_SEARCH_RESPONSE: if err := ps.retrieveResponse(ctx, p, evt); err != nil { return err } case tools.PB_SEARCH: // when someone ask for search. if p, err := dht.GetDHTService().GetPeer(ctx, evt.From); err == nil { if err := ps.sendResponse(ctx, p, evt); err != nil { return err } } default: return nil } } return nil }