File size: 1,821 Bytes
d6f631f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 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
}
|