mirror of
https://github.com/discourse/discourse.git
synced 2025-01-31 05:49:30 +08:00
FIX: ensure double flagging is impossible due to db constraint
This commit is contained in:
parent
9d75f41172
commit
628a99090c
47
db/migrate/20140904055702_correct_post_action_index.rb
Normal file
47
db/migrate/20140904055702_correct_post_action_index.rb
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
class CorrectPostActionIndex < ActiveRecord::Migration
|
||||||
|
|
||||||
|
def up
|
||||||
|
|
||||||
|
# NOTE: not stored in the table yet, is_flag contains notify_user
|
||||||
|
# hardcoding, long term we can store all metadata and join for index
|
||||||
|
# This means that if we muck with flag types we need to redo this index
|
||||||
|
# flag types have been stable for a while so we should be ok
|
||||||
|
#
|
||||||
|
# Another solution is hoisting an extra boolean into the post action table
|
||||||
|
#
|
||||||
|
# {:off_topic=>3, :inappropriate=>4, :notify_moderators=>7, :spam=>8}
|
||||||
|
flag_ids = "3,4,7,8"
|
||||||
|
|
||||||
|
x = execute "DELETE FROM post_actions pa
|
||||||
|
USING post_actions pa2
|
||||||
|
WHERE pa.post_action_type_id IN (#{flag_ids}) AND
|
||||||
|
pa2.post_action_type_id IN (#{flag_ids}) AND
|
||||||
|
pa.deleted_at IS NULL AND
|
||||||
|
pa2.deleted_at IS NULL AND
|
||||||
|
pa.disagreed_at IS NULL AND
|
||||||
|
pa2.disagreed_at IS NULL AND
|
||||||
|
pa.deferred_at IS NULL AND
|
||||||
|
pa2.deferred_at IS NULL AND
|
||||||
|
pa.id < pa2.id AND
|
||||||
|
pa.user_id = pa2.user_id AND
|
||||||
|
pa.post_id = pa2.post_id AND
|
||||||
|
pa.targets_topic = pa2.targets_topic"
|
||||||
|
|
||||||
|
puts
|
||||||
|
puts ">> DELETED #{x.cmd_tuples} invalid rows from post_actions"
|
||||||
|
puts
|
||||||
|
|
||||||
|
add_index :post_actions,
|
||||||
|
["user_id", "post_id", "targets_topic"],
|
||||||
|
name: "idx_unique_flags",
|
||||||
|
unique: true,
|
||||||
|
where: "deleted_at IS NULL AND
|
||||||
|
disagreed_at IS NULL AND
|
||||||
|
deferred_at IS NULL AND
|
||||||
|
post_action_type_id IN (#{flag_ids})"
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_index "post_actions", name: "idx_unique_flags"
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user