comment votes: fix error handling.

Return the comment itself and a standard error response on failure.
This commit is contained in:
evazion
2019-08-19 16:57:38 -05:00
parent b8450671f2
commit 782d9f3d61
8 changed files with 19 additions and 48 deletions

View File

@@ -2,20 +2,17 @@ class CommentVotesController < ApplicationController
respond_to :js, :json, :xml
before_action :member_only
skip_before_action :api_check
rescue_with CommentVote::Error, ActiveRecord::RecordInvalid, status: 422
def create
@comment = Comment.find(params[:comment_id])
@comment_vote = @comment.vote!(params[:score])
rescue CommentVote::Error, ActiveRecord::RecordInvalid => x
@error = x
render status: 422
respond_with(@comment)
end
def destroy
@comment = Comment.find(params[:comment_id])
@comment.unvote!
rescue CommentVote::Error => x
@error = x
render status: 422
respond_with(@comment)
end
end

View File

@@ -1,8 +1,4 @@
<% if @error %>
Danbooru.error("<%= j @error.to_s %>");
<% elsif @comment_vote.errors.any? %>
Danbooru.error("<%= j @comment_vote.errors.full_messages.join('; ') %>");
<% elsif @comment_vote.is_negative? %>
<% if @comment_vote.is_negative? %>
$(".comment[data-comment-id=<%= @comment.id %>]").remove();
<% end %>

View File

@@ -1,7 +0,0 @@
<% if @error %>
{"success": false, "errors": <%= @error.to_s.to_json.html_safe %>}
<% elsif @comment_vote.errors.any? %>
{"success": false, "errors": <%= @comment_vote.errors.full_messages.to_json.html_safe %>}
<% else %>
{"success": true}
<% end %>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<% if @comment_vote.errors.any? %>
<response success="false"><%= @comment_vote.errors.full_messages.to_json.html_safe %></response>
<% else %>
<response success="true"/>
<% end %>

View File

@@ -1,7 +1,3 @@
<% if @error %>
Danbooru.error("<%= j @error.to_s %>");
<% else %>
$("#comment-vote-up-link-for-<%= @comment.id %>").show();
$("#comment-vote-down-link-for-<%= @comment.id %>").show();
$("#comment-unvote-link-for-<%= @comment.id %>").hide();
<% end %>
$("#comment-vote-up-link-for-<%= @comment.id %>").show();
$("#comment-vote-down-link-for-<%= @comment.id %>").show();
$("#comment-unvote-link-for-<%= @comment.id %>").hide();

View File

@@ -1,5 +0,0 @@
<% if @error %>
{"success": false, "reason": <%= @error.to_s.to_json.html_safe %>}
<% else %>
{"success": true}
<% end %>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<% if @error %>
<response success="false"><%= @error.to_s %></response>
<% else %>
<response success="true"/>
<% end %>

View File

@@ -17,18 +17,24 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
context "#create.json" do
should "create a vote" do
assert_difference("CommentVote.count", 1) do
post_auth comment_votes_path(comment_id: @comment.id, format: "json"), @user
post_auth comment_votes_path(comment_id: @comment.id, score: "down", format: "json"), @user
assert_response :success
assert_equal("{\"success\": true}", @response.body.strip)
comment = JSON.parse(@response.body)
assert_equal(@comment.id, comment["id"])
assert_equal(-1, comment["score"])
end
end
should "fail silently on errors" do
create(:comment_vote, comment: @comment, score: -1)
assert_difference("CommentVote.count", 0) do
post_auth comment_votes_path(comment_id: @comment.id, score: "-1", format: "json"), @user
post_auth comment_votes_path(comment_id: @comment.id, score: "down", format: "json"), @user
assert_response 422
assert_equal("{\"success\": false, \"errors\": \"Validation failed: You have already voted for this comment\"}", @response.body.strip)
comment = JSON.parse(@response.body)
assert_equal(false, comment["success"])
assert_equal("Validation failed: You have already voted for this comment", comment["message"])
end
end
end
@@ -36,7 +42,7 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
context "#create.js" do
should "create a vote" do
assert_difference("CommentVote.count", 1) do
post_auth comment_votes_path(comment_id: @comment.id, format: "json", score: 1), @user
post_auth comment_votes_path(comment_id: @comment.id, format: "json", score: "down"), @user
assert_response :success
end
end
@@ -44,7 +50,7 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest
should "fail on errors" do
create(:comment_vote, :comment => @comment, :score => -1)
assert_difference("CommentVote.count", 0) do
post_auth comment_votes_path(comment_id: @comment.id, :score => -1, format: "js"), @user
post_auth comment_votes_path(comment_id: @comment.id, :score => "down", format: "js"), @user
assert_response 422
end
end