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) if _, ok := token.Claims["user_id"]; !ok { h.errorWriter.Write(w, webutil.MissingUserTokenError("Missing user_id from token claims.")) return } userID := token.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([]string{err.Error()})) return } preferences, err := builder.ToPreferences() if err != nil { h.errorWriter.Write(w, webutil.ValidationError([]string{err.Error()})) 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([]string{err.Error()})) default: h.errorWriter.Write(w, err) } return } err = transaction.Commit() if err != nil { h.errorWriter.Write(w, models.NewTransactionCommitError(err.Error())) return } w.WriteHeader(http.StatusNoContent) }
func (h UpdateUserPreferencesHandler) ServeHTTP(w http.ResponseWriter, req *http.Request, context stack.Context) { database := context.Get("database").(DatabaseInterface) connection := database.Connection() userGUID := regexp.MustCompile(".*/user_preferences/(.*)").FindStringSubmatch(req.URL.Path)[1] builder := services.NewPreferencesBuilder() validator := valiant.NewValidator(req.Body) err := validator.Validate(&builder) if err != nil { h.errorWriter.Write(w, webutil.ValidationError([]string{err.Error()})) return } preferences, err := builder.ToPreferences() if err != nil { h.errorWriter.Write(w, err) return } transaction := connection.Transaction() transaction.Begin() err = h.preferences.Update(transaction, preferences, builder.GlobalUnsubscribe, userGUID) if err != nil { transaction.Rollback() switch err.(type) { case services.MissingKindOrClientError, services.CriticalKindError: h.errorWriter.Write(w, webutil.ValidationError([]string{err.Error()})) default: h.errorWriter.Write(w, err) } return } err = transaction.Commit() if err != nil { h.errorWriter.Write(w, models.NewTransactionCommitError(err.Error())) return } w.WriteHeader(http.StatusNoContent) }
request, err = http.NewRequest("GET", "/user_preferences", bytes.NewBuffer(body)) if err != nil { panic(err) } token, err := jwt.Parse(helpers.BuildToken(tokenHeader, tokenClaims), func(token *jwt.Token) (interface{}, error) { return []byte(application.UAAPublicKey), nil }) database = mocks.NewDatabase() context = stack.NewContext() context.Set("token", token) context.Set("database", database) builder = services.NewPreferencesBuilder() builder.Add(models.Preference{ ClientID: "raptorClient", KindID: "hungry-kind", Email: false, }) builder.Add(models.Preference{ ClientID: "starWarsClient", KindID: "vader-kind", Email: true, }) builder.GlobalUnsubscribe = true preferencesFinder = mocks.NewPreferencesFinder() preferencesFinder.FindCall.Returns.PreferencesBuilder = builder
fakeGlobalUnsubscribesRepo := mocks.NewGlobalUnsubscribesRepo() fakeGlobalUnsubscribesRepo.GetCall.Returns.Unsubscribed = true preferencesRepo = mocks.NewPreferencesRepo() preferencesRepo.FindNonCriticalPreferencesCall.Returns.Preferences = preferences conn = mocks.NewConnection() database = mocks.NewDatabase() database.ConnectionCall.Returns.Connection = conn finder = services.NewPreferencesFinder(preferencesRepo, fakeGlobalUnsubscribesRepo) }) Describe("Find", func() { It("returns the set of notifications that are not critical", func() { expectedResult := services.NewPreferencesBuilder() expectedResult.Add(preferences[0]) expectedResult.Add(preferences[1]) expectedResult.GlobalUnsubscribe = true resultPreferences, err := finder.Find(database, "correct-user") Expect(err).NotTo(HaveOccurred()) Expect(resultPreferences).To(Equal(expectedResult)) Expect(preferencesRepo.FindNonCriticalPreferencesCall.Receives.Connection).To(Equal(conn)) Expect(preferencesRepo.FindNonCriticalPreferencesCall.Receives.UserGUID).To(Equal("correct-user")) }) Context("when the preferences repo returns an error", func() { It("should propagate the error", func() { preferencesRepo.FindNonCriticalPreferencesCall.Returns.Error = errors.New("BOOM!")