Add apiId filtering for eventservice
Issue-ID: NONRTRIC-814
Signed-off-by: elinuxhenrik <henrik.b.andersson@est.tech>
Change-Id: Ie49fae90fef8fe41ac15e2fd481bdbfc23c917b4
diff --git a/capifcore/internal/eventservice/eventservice.go b/capifcore/internal/eventservice/eventservice.go
index d82b63d..1bc910b 100644
--- a/capifcore/internal/eventservice/eventservice.go
+++ b/capifcore/internal/eventservice/eventservice.go
@@ -124,9 +124,26 @@
}
func (es *EventService) getMatchingSubs(event eventsapi.EventNotification) []string {
- matchingSubs := []string{}
es.lock.Lock()
defer es.lock.Unlock()
+ matchingTypeSubs := es.filterOnEventType(event)
+ matchingSubs := []string{}
+ for _, subId := range matchingTypeSubs {
+ subscription := es.subscriptions[subId]
+ if subscription.EventFilters == nil || event.EventDetail == nil {
+ matchingSubs = append(matchingSubs, subId)
+ break
+ }
+ if matchesApiIds(*event.EventDetail.ApiIds, *subscription.EventFilters) {
+ matchingSubs = append(matchingSubs, subId)
+ }
+ }
+
+ return matchingSubs
+}
+
+func (es *EventService) filterOnEventType(event eventsapi.EventNotification) []string {
+ matchingSubs := []string{}
for subId, subInfo := range es.subscriptions {
if slices.Contains(asStrings(subInfo.Events), string(event.Events)) {
matchingSubs = append(matchingSubs, subId)
@@ -135,6 +152,20 @@
return matchingSubs
}
+func matchesApiIds(eventIds []string, filters []eventsapi.CAPIFEventFilter) bool {
+ if len(filters) == 0 {
+ return true
+ }
+ for _, apiId := range eventIds {
+ filter := filters[0]
+ if filter.ApiIds == nil {
+ return true && matchesApiIds(eventIds, filters[1:])
+ }
+ return slices.Contains(*filter.ApiIds, apiId) && matchesApiIds(eventIds, filters[1:])
+ }
+ return true
+}
+
func asStrings(events []eventsapi.CAPIFEvent) []string {
asStrings := make([]string, len(events))
for i, event := range events {
diff --git a/capifcore/internal/eventservice/eventservice_test.go b/capifcore/internal/eventservice/eventservice_test.go
index cd03ba7..f2acb9c 100644
--- a/capifcore/internal/eventservice/eventservice_test.go
+++ b/capifcore/internal/eventservice/eventservice_test.go
@@ -122,13 +122,12 @@
})
serviceUnderTest, _ := getEcho(clientMock)
- subscription := eventsapi.EventSubscription{
+ serviceUnderTest.addSubscription(subId, eventsapi.EventSubscription{
Events: []eventsapi.CAPIFEvent{
eventsapi.CAPIFEventSERVICEAPIAVAILABLE,
},
NotificationDestination: common29122.Uri(notificationUrl),
- }
- serviceUnderTest.addSubscription(subId, subscription)
+ })
sub2 := eventsapi.EventSubscription{
Events: []eventsapi.CAPIFEvent{
eventsapi.CAPIFEventACCESSCONTROLPOLICYUNAVAILABLE,
@@ -152,20 +151,19 @@
notificationUrl := "url"
subId := "sub1"
serviceUnderTest := NewEventService(nil)
- subscription := eventsapi.EventSubscription{
+ serviceUnderTest.addSubscription(subId, eventsapi.EventSubscription{
Events: []eventsapi.CAPIFEvent{
eventsapi.CAPIFEventSERVICEAPIAVAILABLE,
},
NotificationDestination: common29122.Uri(notificationUrl),
- }
- serviceUnderTest.addSubscription(subId, subscription)
- sub2 := eventsapi.EventSubscription{
+ EventFilters: &[]eventsapi.CAPIFEventFilter{},
+ })
+ serviceUnderTest.addSubscription("other", eventsapi.EventSubscription{
Events: []eventsapi.CAPIFEvent{
eventsapi.CAPIFEventACCESSCONTROLPOLICYUNAVAILABLE,
},
NotificationDestination: common29122.Uri(notificationUrl),
- }
- serviceUnderTest.addSubscription("other", sub2)
+ })
event := eventsapi.EventNotification{
SubscriptionId: subId,
@@ -177,6 +175,30 @@
assert.Equal(t, subId, matchingSubs[0])
}
+func TestMatchesApiIds(t *testing.T) {
+ apiId := "apiId"
+ apiIds := []string{apiId, "otherApiId"}
+ eventFilters := []eventsapi.CAPIFEventFilter{
+ {},
+ {
+ ApiIds: &apiIds,
+ },
+ }
+
+ eventApiIds := []string{apiId}
+ assert.True(t, matchesApiIds(eventApiIds, eventFilters))
+ assert.True(t, matchesApiIds(nil, eventFilters))
+
+ altApiIds := []string{"anotherApiId"}
+ unMatchingFilterAdded := append(eventFilters, eventsapi.CAPIFEventFilter{
+ ApiIds: &altApiIds,
+ })
+ assert.False(t, matchesApiIds(eventApiIds, unMatchingFilterAdded))
+
+ apiIds[0] = "anotherId"
+ assert.False(t, matchesApiIds(eventApiIds, eventFilters))
+}
+
func getEcho(client restclient.HTTPClient) (*EventService, *echo.Echo) {
swagger, err := eventsapi.GetSwagger()
if err != nil {