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
}