| package eventhandler |
|
|
| import ( |
| "slices" |
|
|
| "github.com/samber/lo" |
|
|
| "github.com/openmeterio/openmeter/openmeter/notification" |
| ) |
|
|
| func filterActiveDeliveryStatusesByChannelType(event *notification.Event, channelType notification.ChannelType) []notification.EventDeliveryStatus { |
| if event == nil { |
| return nil |
| } |
|
|
| channelIDByType := func() map[string]notification.ChannelType { |
| if event.Rule.Channels == nil { |
| return nil |
| } |
|
|
| m := make(map[string]notification.ChannelType) |
|
|
| for _, channel := range event.Rule.Channels { |
| m[channel.ID] = channel.Type |
| } |
|
|
| return m |
| }() |
|
|
| var result []notification.EventDeliveryStatus |
|
|
| for _, deliveryStatus := range event.DeliveryStatus { |
| if lo.Contains([]notification.EventDeliveryStatusState{ |
| notification.EventDeliveryStatusStateFailed, |
| notification.EventDeliveryStatusStateSuccess, |
| }, deliveryStatus.State) { |
| continue |
| } |
|
|
| if deliveryStatus.ChannelID == "" { |
| continue |
| } |
|
|
| chType, ok := channelIDByType[deliveryStatus.ChannelID] |
| if !ok || chType != channelType { |
| continue |
| } |
|
|
| result = append(result, deliveryStatus) |
| } |
|
|
| return result |
| } |
|
|
| func sortDeliveryStatusStateByPriority(states []notification.EventDeliveryStatus) []notification.EventDeliveryStatus { |
| if len(states) == 0 { |
| return nil |
| } |
|
|
| priority := map[notification.EventDeliveryStatusState]int8{ |
| notification.EventDeliveryStatusStatePending: 0, |
| notification.EventDeliveryStatusStateResending: 1, |
| notification.EventDeliveryStatusStateSending: 2, |
| notification.EventDeliveryStatusStateFailed: 3, |
| notification.EventDeliveryStatusStateSuccess: 3, |
| } |
|
|
| slices.SortFunc(states, func(a, b notification.EventDeliveryStatus) int { |
| if a.State == b.State { |
| return 0 |
| } |
|
|
| if priority[a.State] < priority[b.State] { |
| return -1 |
| } |
|
|
| return 1 |
| }) |
|
|
| return states |
| } |
|
|