75 lines
2.5 KiB
Go
75 lines
2.5 KiB
Go
package pubsub
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"oc-discovery/conf"
|
|
"oc-discovery/daemons/node/common"
|
|
"oc-discovery/daemons/node/stream"
|
|
"oc-discovery/models"
|
|
"time"
|
|
|
|
"cloud.o-forge.io/core/oc-lib/dbs"
|
|
"cloud.o-forge.io/core/oc-lib/models/peer"
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
|
)
|
|
|
|
func (ps *PubSubService) SearchPublishEvent(
|
|
ctx context.Context, dt *tools.DataType, typ string, user string, groups []string, search string) error {
|
|
b, err := json.Marshal(map[string]string{"search": search})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch typ {
|
|
case "known": // define Search Strategy
|
|
return ps.StreamService.PublishesCommon(dt, user, groups, nil, b, stream.ProtocolSearchResource) //if partners focus only them*/
|
|
case "partner": // define Search Strategy
|
|
return ps.StreamService.PublishesCommon(dt, user, groups, &dbs.Filters{ // filter by like name, short_description, description, owner, url if no filters are provided
|
|
And: map[string][]dbs.Filter{
|
|
"relation": {{Operator: dbs.EQUAL.String(), Value: peer.PARTNER}},
|
|
},
|
|
}, b, stream.ProtocolSearchResource)
|
|
case "all": // Gossip PubSub
|
|
b, err := json.Marshal(map[string]string{"search": search})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
idleTimeout := func() time.Duration {
|
|
if t := conf.GetConfig().SearchTimeout; t > 0 {
|
|
return time.Duration(t) * time.Second
|
|
}
|
|
return 5 * time.Second
|
|
}()
|
|
searchCtx, cancel := context.WithCancel(ctx)
|
|
// Register cancels any previous search for this user and starts the idle timer.
|
|
// The returned composite key is used as User in the GossipSub event so that
|
|
// remote peers echo it back unchanged, allowing IsActive to validate results.
|
|
searchKey := ps.StreamService.ResourceSearches.Register(user, cancel, idleTimeout)
|
|
return ps.publishEvent(searchCtx, dt, tools.PB_SEARCH, common.TopicPubSubSearch, searchKey, b)
|
|
default:
|
|
return errors.New("no type of research found")
|
|
}
|
|
}
|
|
|
|
func (ps *PubSubService) publishEvent(
|
|
ctx context.Context, dt *tools.DataType, action tools.PubSubAction, topicName string, user string, payload []byte,
|
|
) error {
|
|
priv, err := tools.LoadKeyFromFilePrivate()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
msg, _ := json.Marshal(models.NewEvent(action.String(), ps.Host.ID().String(), dt, user, payload, priv))
|
|
topic := ps.Node.GetPubSub(topicName)
|
|
if topic == nil {
|
|
topic, err = ps.PS.Join(topicName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return topic.Publish(ctx, msg)
|
|
}
|
|
|
|
// TODO REVIEW PUBLISHING + ADD SEARCH ON PUBLIC : YES
|
|
// TODO : Search should verify DataType
|