Fix #5146: Adding an existing favorite to favorite groups leads to an error.
Show "Favgroup already contains post XXX" error when trying to add a post to a favgroup that already contains that post.
This commit is contained in:
@@ -55,6 +55,8 @@ class FavoriteGroupsController < ApplicationController
|
|||||||
def add_post
|
def add_post
|
||||||
@favorite_group = authorize FavoriteGroup.find(params[:id])
|
@favorite_group = authorize FavoriteGroup.find(params[:id])
|
||||||
@post = Post.find(params[:post_id])
|
@post = Post.find(params[:post_id])
|
||||||
@favorite_group.add!(@post)
|
@favorite_group.add(@post)
|
||||||
|
|
||||||
|
respond_with(@favorite_group)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -132,15 +132,15 @@ class FavoriteGroup < ApplicationRecord
|
|||||||
Post.joins("JOIN (#{favgroup_posts.to_sql}) favgroup_posts ON favgroup_posts.post_id = posts.id").order("favgroup_posts.favgroup_index ASC")
|
Post.joins("JOIN (#{favgroup_posts.to_sql}) favgroup_posts ON favgroup_posts.post_id = posts.id").order("favgroup_posts.favgroup_index ASC")
|
||||||
end
|
end
|
||||||
|
|
||||||
def add!(post)
|
def add(post)
|
||||||
with_lock do
|
with_lock do
|
||||||
update!(post_ids: post_ids + [post.id])
|
update(post_ids: post_ids + [post.id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove!(post)
|
def remove(post)
|
||||||
with_lock do
|
with_lock do
|
||||||
update!(post_ids: post_ids - [post.id])
|
update(post_ids: post_ids - [post.id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -537,12 +537,12 @@ class Post < ApplicationRecord
|
|||||||
in "-favgroup", name
|
in "-favgroup", name
|
||||||
favgroup = FavoriteGroup.find_by_name_or_id!(name, CurrentUser.user)
|
favgroup = FavoriteGroup.find_by_name_or_id!(name, CurrentUser.user)
|
||||||
raise User::PrivilegeError unless Pundit.policy!(CurrentUser.user, favgroup).update?
|
raise User::PrivilegeError unless Pundit.policy!(CurrentUser.user, favgroup).update?
|
||||||
favgroup&.remove!(self)
|
favgroup&.remove(self)
|
||||||
|
|
||||||
in "favgroup", name
|
in "favgroup", name
|
||||||
favgroup = FavoriteGroup.find_by_name_or_id!(name, CurrentUser.user)
|
favgroup = FavoriteGroup.find_by_name_or_id!(name, CurrentUser.user)
|
||||||
raise User::PrivilegeError unless Pundit.policy!(CurrentUser.user, favgroup).update?
|
raise User::PrivilegeError unless Pundit.policy!(CurrentUser.user, favgroup).update?
|
||||||
favgroup&.add!(self)
|
favgroup&.add(self)
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -632,7 +632,7 @@ class Post < ApplicationRecord
|
|||||||
|
|
||||||
def remove_from_fav_groups
|
def remove_from_fav_groups
|
||||||
FavoriteGroup.for_post(id).find_each do |favgroup|
|
FavoriteGroup.for_post(id).find_each do |favgroup|
|
||||||
favgroup.remove!(self)
|
favgroup.remove(self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,2 +1,7 @@
|
|||||||
Danbooru.notice("Added post to favorite group <%= escape_javascript(@favorite_group.pretty_name) %>");
|
<% if @favorite_group.errors.any? %>
|
||||||
|
Danbooru.notice("<%= j @favorite_group.errors.full_messages.join("; ") %>");
|
||||||
|
<% else %>
|
||||||
|
Danbooru.notice("Added post to favorite group <%= j @favorite_group.pretty_name %>");
|
||||||
|
<% end %>
|
||||||
|
|
||||||
$("#add-to-favgroup-dialog").dialog("close");
|
$("#add-to-favgroup-dialog").dialog("close");
|
||||||
|
|||||||
@@ -534,8 +534,7 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
@pool = create(:pool)
|
@pool = create(:pool)
|
||||||
@pool.add!(@post)
|
@pool.add!(@post)
|
||||||
|
|
||||||
@favgroup = create(:favorite_group)
|
@favgroup = create(:favorite_group, post_ids: [@post.id])
|
||||||
@favgroup.add!(@post)
|
|
||||||
|
|
||||||
@comment = create(:comment, post: @post, creator: @admin)
|
@comment = create(:comment, post: @post, creator: @admin)
|
||||||
create(:comment_vote, comment: @comment, user: @user)
|
create(:comment_vote, comment: @comment, user: @user)
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ class FavoriteTest < ActiveSupport::TestCase
|
|||||||
should "return the fav group" do
|
should "return the fav group" do
|
||||||
posts = create_list(:post, 3)
|
posts = create_list(:post, 3)
|
||||||
|
|
||||||
@fav_group.add!(posts[0])
|
@fav_group.add(posts[0])
|
||||||
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[0].id).first.id)
|
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[0].id).first.id)
|
||||||
|
|
||||||
@fav_group.add!(posts[1])
|
@fav_group.add(posts[1])
|
||||||
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[1].id).first.id)
|
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[1].id).first.id)
|
||||||
|
|
||||||
@fav_group.add!(posts[2])
|
@fav_group.add(posts[2])
|
||||||
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[2].id).first.id)
|
assert_equal(@fav_group.id, FavoriteGroup.for_post(posts[2].id).first.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -24,7 +24,7 @@ class FavoriteTest < ActiveSupport::TestCase
|
|||||||
should "remove it from all favorite groups" do
|
should "remove it from all favorite groups" do
|
||||||
@post = FactoryBot.create(:post)
|
@post = FactoryBot.create(:post)
|
||||||
|
|
||||||
@fav_group.add!(@post)
|
@fav_group.add(@post)
|
||||||
assert_equal([@post.id], @fav_group.post_ids)
|
assert_equal([@post.id], @fav_group.post_ids)
|
||||||
|
|
||||||
@post.expunge!
|
@post.expunge!
|
||||||
@@ -36,11 +36,14 @@ class FavoriteTest < ActiveSupport::TestCase
|
|||||||
should "not allow adding duplicate posts" do
|
should "not allow adding duplicate posts" do
|
||||||
post = create(:post)
|
post = create(:post)
|
||||||
|
|
||||||
@fav_group.add!(post)
|
@fav_group.add(post)
|
||||||
assert(@fav_group.valid?)
|
assert(@fav_group.valid?)
|
||||||
assert_equal([post.id], @fav_group.reload.post_ids)
|
assert_equal([post.id], @fav_group.reload.post_ids)
|
||||||
|
|
||||||
assert_raise(ActiveRecord::RecordInvalid) { @fav_group.add!(post) }
|
@fav_group.add(post)
|
||||||
|
assert_equal(false, @fav_group.valid?)
|
||||||
|
assert_match(/Favgroup already contains post #{post.id}/, @fav_group.errors.full_messages.join)
|
||||||
|
|
||||||
assert_equal([post.id], @fav_group.reload.post_ids)
|
assert_equal([post.id], @fav_group.reload.post_ids)
|
||||||
|
|
||||||
@fav_group.reload.update(post_ids: [post.id, post.id])
|
@fav_group.reload.update(post_ids: [post.id, post.id])
|
||||||
|
|||||||
Reference in New Issue
Block a user