package pubsub import ( "context" "encoding/json" "errors" "oc-discovery/daemons/node/common" "oc-discovery/models" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/dbs" "cloud.o-forge.io/core/oc-lib/tools" ) func (ps *PubSubService) SearchPublishEvent( ctx context.Context, dt *tools.DataType, typ string, user string, search string) error { switch typ { case "known": // define Search Strategy return ps.StreamService.SearchKnownPublishEvent(dt, user, search) //if partners focus only them*/ case "partner": // define Search Strategy return ps.StreamService.SearchPartnersPublishEvent(dt, user, search) //if partners focus only them*/ case "all": // Gossip PubSub b, err := json.Marshal(map[string]string{"search": search}) if err != nil { return err } return ps.searchPublishEvent(ctx, dt, user, b) default: return errors.New("no type of research found") } } func (ps *PubSubService) searchPublishEvent( ctx context.Context, dt *tools.DataType, user string, payload []byte) error { id, err := oclib.GenerateNodeID() if err != nil { return err } if err := ps.subscribeEvents(ctx, dt, tools.PB_SEARCH_RESPONSE, id, 60); err != nil { // TODO Catpure Event ! return err } return ps.publishEvent(ctx, dt, tools.PB_SEARCH, user, "", payload, false) } func (ps *PubSubService) publishEvent( ctx context.Context, dt *tools.DataType, action tools.PubSubAction, user string, peerID string, payload []byte, chanNamedByDt bool, ) error { name := action.String() + "#" + peerID if chanNamedByDt && dt != nil { // if a datatype is precised then : app.action.datatype#peerID name = action.String() + "." + (*dt).String() + "#" + peerID } from, err := oclib.GenerateNodeID() if err != nil { return err } priv, err := common.LoadKeyFromFilePrivate() if err != nil { return err } msg, _ := json.Marshal(models.NewEvent(name, from, dt, user, payload, priv)) topic, err := ps.PS.Join(name) if err != nil { return err } return topic.Publish(ctx, msg) } func (pc *PubSubService) getDefaultFilter(search string) map[string][]dbs.Filter { return map[string][]dbs.Filter{ // filter by like name, short_description, description, owner, url if no filters are provided "abstractintanciatedresource.abstractresource.abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractintanciatedresource.abstractresource.type": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractintanciatedresource.abstractresource.short_description": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractintanciatedresource.abstractresource.description": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractintanciatedresource.abstractresource.owners.name": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractintanciatedresource.abstractresource.abstractobject.creator_id": {{Operator: dbs.EQUAL.String(), Value: search}}, } } // TODO REVIEW PUBLISHING + ADD SEARCH ON PUBLIC : YES // TODO : Search should verify DataType