/
subscription.go
125 lines (112 loc) · 3.91 KB
/
subscription.go
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package controller
import (
"fmt"
"time"
"github.com/go-graphite/carbonapi/date"
"github.com/gofrs/uuid"
"github.com/moira-alert/moira"
"github.com/moira-alert/moira/api"
"github.com/moira-alert/moira/api/dto"
"github.com/moira-alert/moira/database"
)
// GetUserSubscriptions get all user subscriptions
func GetUserSubscriptions(database moira.Database, userLogin string) (*dto.SubscriptionList, *api.ErrorResponse) {
subscriptionIDs, err := database.GetUserSubscriptionIDs(userLogin)
if err != nil {
return nil, api.ErrorInternalServer(err)
}
subscriptions, err := database.GetSubscriptions(subscriptionIDs)
if err != nil {
return nil, api.ErrorInternalServer(err)
}
subscriptionsList := &dto.SubscriptionList{
List: make([]moira.SubscriptionData, 0),
}
for _, subscription := range subscriptions {
if subscription != nil {
subscriptionsList.List = append(subscriptionsList.List, *subscription)
}
}
return subscriptionsList, nil
}
// CreateSubscription create or update subscription
func CreateSubscription(dataBase moira.Database, userLogin string, subscription *dto.Subscription) *api.ErrorResponse {
if subscription.ID == "" {
uuid4, err := uuid.NewV4()
if err != nil {
return api.ErrorInternalServer(err)
}
subscription.ID = uuid4.String()
} else {
exists, err := isSubscriptionExists(dataBase, subscription.ID)
if err != nil {
return api.ErrorInternalServer(err)
}
if exists {
return api.ErrorInvalidRequest(fmt.Errorf("subscription with this ID already exists"))
}
}
subscription.User = userLogin
data := moira.SubscriptionData(*subscription)
if err := dataBase.SaveSubscription(&data); err != nil {
return api.ErrorInternalServer(err)
}
return nil
}
// UpdateSubscription updates existing subscription
func UpdateSubscription(dataBase moira.Database, subscriptionID string, userLogin string, subscription *dto.Subscription) *api.ErrorResponse {
subscription.ID = subscriptionID
subscription.User = userLogin
data := moira.SubscriptionData(*subscription)
if err := dataBase.SaveSubscription(&data); err != nil {
return api.ErrorInternalServer(err)
}
return nil
}
// RemoveSubscription deletes subscription
func RemoveSubscription(database moira.Database, subscriptionID string) *api.ErrorResponse {
if err := database.RemoveSubscription(subscriptionID); err != nil {
return api.ErrorInternalServer(err)
}
return nil
}
// SendTestNotification push test notification to verify the correct notification settings
func SendTestNotification(database moira.Database, subscriptionID string) *api.ErrorResponse {
var value float64 = 1
eventData := &moira.NotificationEvent{
SubscriptionID: &subscriptionID,
Metric: "Test.metric.value",
Value: &value,
OldState: moira.StateTEST,
State: moira.StateTEST,
Timestamp: date.DateParamToEpoch("now", "", time.Now().Add(-24*time.Hour).Unix(), time.UTC),
}
if err := database.PushNotificationEvent(eventData, false); err != nil {
return api.ErrorInternalServer(err)
}
return nil
}
// CheckUserPermissionsForSubscription checks subscription for existence and permissions for given user
func CheckUserPermissionsForSubscription(dataBase moira.Database, subscriptionID string, userLogin string) (moira.SubscriptionData, *api.ErrorResponse) {
subscription, err := dataBase.GetSubscription(subscriptionID)
if err != nil {
if err == database.ErrNil {
return subscription, api.ErrorNotFound(fmt.Sprintf("subscription with ID '%s' does not exists", subscriptionID))
}
return subscription, api.ErrorInternalServer(err)
}
if subscription.User != userLogin {
return subscription, api.ErrorForbidden("you are not permitted")
}
return subscription, nil
}
func isSubscriptionExists(dataBase moira.Database, subscriptionID string) (bool, error) {
_, err := dataBase.GetSubscription(subscriptionID)
if err == database.ErrNil {
return false, nil
}
if err != nil {
return false, err
}
return true, nil
}