// CreateDishRatingHandler inserts a new rating into the datastore. // dish_id parameter must be set to a dish which exists in the datastore and // rating must be between 1 and 10. User must be logged in. func CreateDishRatingHandler(w util.ResponseWriter, r *http.Request) { c := appengine.NewContext(r) dishID, err := util.GetIntParam(r, "dish_id", 0) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } if !DishExists(c, dishID) { http.Error(w, "provided dish_id does not exist", http.StatusBadRequest) return } // Check that no rating already exists for this dish if GetDishRating(c, dishID) != -1 { http.Error(w, "dish already has a rating from this user", http.StatusBadRequest) return } var ratingData Rating if err := json.NewDecoder(r.Body).Decode(&ratingData); err != nil { log.Println("unable to decode create rating data:", err.Error()) http.Error(w, "Unable to decode JSON request body", http.StatusBadRequest) return } if ratingData.Rating > 10 || ratingData.Rating < 1 { http.Error(w, "rating must be between 1 and 10", http.StatusBadRequest) return } ratingData.DishID = dishID ratingData.UserID = GetCurrentUserID(c) ratingData.Timestamp = time.Now() key := datastore.NewIncompleteKey(c, "Ratings", nil) newKey, err := datastore.Put(c, key, &ratingData) if err != nil { w.WriteJSON(nil, err) return } w.WriteCreated("/api/rating/" + strconv.FormatInt(newKey.IntID(), 10)) }