-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathedit_subscription.go
More file actions
92 lines (77 loc) · 3.45 KB
/
Copy pathedit_subscription.go
File metadata and controls
92 lines (77 loc) · 3.45 KB
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
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost-plugin-confluence/server/config"
"github.com/mattermost/mattermost-plugin-confluence/server/serializer"
"github.com/mattermost/mattermost-plugin-confluence/server/service"
)
var editChannelSubscription = &Endpoint{
Path: "/{channelID:[A-Za-z0-9]+}/subscription/{type:[A-Za-z_]+}",
Method: http.MethodPut,
Execute: handleEditChannelSubscription,
IsAuthenticated: true,
}
const subscriptionEditSuccess = "Your subscription has been edited successfully."
func handleEditChannelSubscription(w http.ResponseWriter, r *http.Request, p *Plugin) {
params := mux.Vars(r)
channelID := params["channelID"]
subscriptionType := params["type"]
userID := r.Header.Get(config.HeaderMattermostUserID)
var subscription serializer.Subscription
var err error
if access := p.checkSubscriptionAccess(userID); !access.Allowed {
p.client.Log.Error("User does not have access to edit subscription for this channel", "UserID", userID, "ChannelID", channelID, "reason", access.Reason)
http.Error(w, access.Message, access.StatusCode)
return
}
if !p.hasChannelAccess(userID, channelID) {
p.client.Log.Error("User does not have access to edit subscription for this channel", "UserID", userID, "ChannelID", channelID)
http.Error(w, "User does not have access to this channel", http.StatusForbidden)
return
}
var sErr error
switch subscriptionType {
case serializer.SubscriptionTypeSpace:
subscription, sErr = serializer.SpaceSubscriptionFromJSON(r.Body, subscriptionType)
case serializer.SubscriptionTypePage:
subscription, sErr = serializer.PageSubscriptionFromJSON(r.Body, subscriptionType)
default:
p.client.Log.Error("Error updating channel subscription", "Subscription Type", subscriptionType, "error", "Invalid subscription type")
http.Error(w, "Invalid subscription type", http.StatusBadRequest)
return
}
if sErr != nil {
config.Mattermost.LogError("Error decoding request body.", "Error", sErr.Error())
http.Error(w, fmt.Sprintf("Could not decode request body. %s", sErr.Error()), http.StatusBadRequest)
return
}
pluginConfig := config.GetConfig()
if pluginConfig.HasPerUserConfluenceAuth() {
var statusCode int
if statusCode, err = p.validateUserConfluenceAccess(userID, pluginConfig.ConfluenceURL, subscriptionType, subscription); err != nil {
p.client.Log.Error("Error validating the user's Confluence access", "Error", err.Error())
http.Error(w, err.Error(), statusCode) // safe to return the error string directly, as this function ensures all returned errors are user-friendly
return
}
}
if err := serializer.ValidateEventsForServerVersion(subscription, pluginConfig.ServerVersionGreaterthan9); err != nil {
p.client.Log.Error("Invalid events for Confluence Server version", "error", err.Error())
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
if nErr := service.EditSubscription(subscription); nErr != nil {
config.Mattermost.LogError("Error occurred while editing subscription", "Subscription Name", subscription.Name(), "error", nErr.Error())
http.Error(w, "An error occurred attempting to edit a subscription", http.StatusInternalServerError)
return
}
post := &model.Post{
UserId: config.BotUserID,
ChannelId: channelID,
Message: subscriptionEditSuccess,
}
_ = config.Mattermost.SendEphemeralPost(userID, post)
ReturnStatusOK(w)
}