90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
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
|
|
}
|