func deleteLink(w http.ResponseWriter, r *twocloud.RequestBundle) { username := r.Request.URL.Query().Get(":username") user := r.AuthUser if strings.ToLower(username) != strings.ToLower(r.AuthUser.Username) { if !r.AuthUser.IsAdmin { Respond(w, r, http.StatusUnauthorized, "You don't have access to that user's links.", []interface{}{}) return } id, err := r.GetUserID(username) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } user, err = r.GetUser(id) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } } deviceID, err := strconv.ParseUint(r.Request.URL.Query().Get(":device"), 10, 64) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusBadRequest, "Invalid device ID", []interface{}{}) return } device, err := r.GetDevice(deviceID) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } if device.UserID != user.ID { Respond(w, r, http.StatusBadRequest, "That device ID does not belong to that user.", []interface{}{}) return } linkID, err := strconv.ParseUint(r.Request.URL.Query().Get(":link"), 10, 64) if err != nil { Respond(w, r, http.StatusBadRequest, "Invalid link ID", []interface{}{}) return } link, err := r.GetLink(linkID) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } err = r.DeleteLink(link) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } Respond(w, r, http.StatusOK, "Successfully deleted the link", []interface{}{link}) return }
func updateLink(w http.ResponseWriter, r *twocloud.RequestBundle) { username := r.Request.URL.Query().Get(":username") user := r.AuthUser if strings.ToLower(username) != strings.ToLower(r.AuthUser.Username) { if !r.AuthUser.IsAdmin { Respond(w, r, http.StatusUnauthorized, "You don't have access to that user's links.", []interface{}{}) return } id, err := r.GetUserID(username) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } user, err = r.GetUser(id) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } } deviceID, err := strconv.ParseUint(r.Request.URL.Query().Get(":device"), 10, 64) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusBadRequest, "Invalid device ID", []interface{}{}) return } device, err := r.GetDevice(deviceID) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } if device.UserID != user.ID { Respond(w, r, http.StatusBadRequest, "That device ID does not belong to that user.", []interface{}{}) return } linkID, err := strconv.ParseUint(r.Request.URL.Query().Get(":link"), 10, 64) if err != nil { Respond(w, r, http.StatusBadRequest, "Invalid link ID", []interface{}{}) return } link, err := r.GetLink(linkID) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } var req twocloud.Link body, err := ioutil.ReadAll(r.Request.Body) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusInternalServerError, "Internal server error.", []interface{}{}) return } err = json.Unmarshal(body, &req) if err != nil { r.Log.Error(err.Error()) Respond(w, r, http.StatusBadRequest, "Error decoding request.", []interface{}{}) return } if req.URL != nil { Respond(w, r, http.StatusBadRequest, "URL cannot be modified.", []interface{}{}) return } unread := link.Unread comment := link.Comment if device.ID == link.Sender.ID { comment = req.Comment } else if device.ID == link.Receiver.ID { unread = req.Unread } link, err = r.UpdateLink(link, unread, comment) if err != nil { Respond(w, r, http.StatusInternalServerError, "Internal server error", []interface{}{}) return } Respond(w, r, http.StatusOK, "Successfully retrieved link information", []interface{}{link}) return }