-
Notifications
You must be signed in to change notification settings - Fork 24
/
update_preferences_handler.go
77 lines (63 loc) · 2.04 KB
/
update_preferences_handler.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
package preferences
import (
"errors"
"net/http"
"github.com/cloudfoundry-incubator/notifications/v1/models"
"github.com/cloudfoundry-incubator/notifications/v1/services"
"github.com/cloudfoundry-incubator/notifications/v1/web/webutil"
"github.com/cloudfoundry-incubator/notifications/valiant"
"github.com/golang-jwt/jwt/v5"
"github.com/ryanmoran/stack"
)
type UpdatePreferencesHandler struct {
preferences preferenceUpdater
errorWriter errorWriter
}
func NewUpdatePreferencesHandler(preferences preferenceUpdater, errWriter errorWriter) UpdatePreferencesHandler {
return UpdatePreferencesHandler{
preferences: preferences,
errorWriter: errWriter,
}
}
func (h UpdatePreferencesHandler) ServeHTTP(w http.ResponseWriter, req *http.Request, context stack.Context) {
database := context.Get("database").(DatabaseInterface)
connection := database.Connection()
token := context.Get("token").(*jwt.Token)
claims := token.Claims.(jwt.MapClaims)
if _, ok := claims["user_id"]; !ok {
h.errorWriter.Write(w, webutil.MissingUserTokenError{Err: errors.New("Missing user_id from token claims.")})
return
}
userID := claims["user_id"].(string)
builder := services.NewPreferencesBuilder()
validator := valiant.NewValidator(req.Body)
err := validator.Validate(&builder)
if err != nil {
h.errorWriter.Write(w, webutil.ValidationError{Err: err})
return
}
preferences, err := builder.ToPreferences()
if err != nil {
h.errorWriter.Write(w, webutil.ValidationError{Err: err})
return
}
transaction := connection.Transaction()
transaction.Begin()
err = h.preferences.Update(transaction, preferences, builder.GlobalUnsubscribe, userID)
if err != nil {
transaction.Rollback()
switch err.(type) {
case services.MissingKindOrClientError, services.CriticalKindError:
h.errorWriter.Write(w, webutil.ValidationError{Err: err})
default:
h.errorWriter.Write(w, err)
}
return
}
err = transaction.Commit()
if err != nil {
h.errorWriter.Write(w, models.TransactionCommitError{Err: err})
return
}
w.WriteHeader(http.StatusNoContent)
}