Use PostgreSQL inheritance for blocks and mutes (#2520)
This commit is contained in:
		
							parent
							
								
									54450f75d3
								
							
						
					
					
						commit
						7cd8e61b5a
					
				
					 7 changed files with 43 additions and 12 deletions
				
			
		|  | @ -87,11 +87,11 @@ class Account < ApplicationRecord | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def block!(other_account) |   def block!(other_account) | ||||||
|     block_relationships.where(target_account: other_account).first_or_create!(target_account: other_account) |     block_relationships.where(target_account: other_account).first_or_create!(target_account: other_account, block: true) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def mute!(other_account) |   def mute!(other_account) | ||||||
|     mute_relationships.where(target_account: other_account).first_or_create!(target_account: other_account) |     mute_relationships.where(target_account: other_account).first_or_create!(target_account: other_account, block: false) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def unfollow!(other_account) |   def unfollow!(other_account) | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								db/migrate/20180428000000_create_block_mutes.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								db/migrate/20180428000000_create_block_mutes.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | class CreateBlockMutes < ActiveRecord::Migration[5.0] | ||||||
|  |   def change | ||||||
|  |     create_table "block_mutes", force: :casecade do |t| | ||||||
|  |       t.integer  "account_id",        null: false | ||||||
|  |       t.integer  "target_account_id", null: false | ||||||
|  |       t.boolean  "block",             null: false | ||||||
|  |       t.datetime "created_at",        null: false | ||||||
|  |       t.datetime "updated_at",        null: false | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     add_column       :blocks, :block, :boolean, null: false | ||||||
|  |     execute          "ALTER TABLE blocks ADD CONSTRAINT check_mutes_on_block CHECK(block = TRUE), INHERIT block_mutes" | ||||||
|  |     Block.update_all block: true | ||||||
|  | 
 | ||||||
|  |     add_column       :mutes, :block, :boolean, null: false | ||||||
|  |     execute          "ALTER TABLE mutes ADD CONSTRAINT check_mutes_on_block CHECK(block = FALSE), INHERIT block_mutes" | ||||||
|  |     Mute.update_all block: false | ||||||
|  |   end | ||||||
|  | end | ||||||
							
								
								
									
										14
									
								
								db/schema.rb
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								db/schema.rb
									
									
									
									
									
								
							|  | @ -10,7 +10,7 @@ | ||||||
| # | # | ||||||
| # It's strongly recommended that you check this file into your version control system. | # It's strongly recommended that you check this file into your version control system. | ||||||
| 
 | 
 | ||||||
| ActiveRecord::Schema.define(version: 20170425202925) do | ActiveRecord::Schema.define(version: 20180428000000) do | ||||||
| 
 | 
 | ||||||
|   # These are extensions that must be enabled in order to support this database |   # These are extensions that must be enabled in order to support this database | ||||||
|   enable_extension "plpgsql" |   enable_extension "plpgsql" | ||||||
|  | @ -54,13 +54,23 @@ ActiveRecord::Schema.define(version: 20170425202925) do | ||||||
|     t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree |     t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   create_table "block_mutes", force: :cascade, id: false do |t| | ||||||
|  |     t.integer  "account_id",        null: false | ||||||
|  |     t.integer  "target_account_id", null: false | ||||||
|  |     t.boolean  "block",             null: false | ||||||
|  |     t.datetime "created_at",        null: false | ||||||
|  |     t.datetime "updated_at",        null: false | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   create_table "blocks", force: :cascade do |t| |   create_table "blocks", force: :cascade do |t| | ||||||
|     t.integer  "account_id",        null: false |     t.integer  "account_id",        null: false | ||||||
|     t.integer  "target_account_id", null: false |     t.integer  "target_account_id", null: false | ||||||
|  |     t.boolean  "block",             null: false | ||||||
|     t.datetime "created_at",        null: false |     t.datetime "created_at",        null: false | ||||||
|     t.datetime "updated_at",        null: false |     t.datetime "updated_at",        null: false | ||||||
|     t.index ["account_id", "target_account_id"], name: "index_blocks_on_account_id_and_target_account_id", unique: true, using: :btree |     t.index ["account_id", "target_account_id"], name: "index_blocks_on_account_id_and_target_account_id", unique: true, using: :btree | ||||||
|   end |   end | ||||||
|  |   execute   "ALTER TABLE blocks ADD CONSTRAINT check_blocks_on_block CHECK(block = TRUE), INHERIT block_mutes" | ||||||
| 
 | 
 | ||||||
|   create_table "domain_blocks", force: :cascade do |t| |   create_table "domain_blocks", force: :cascade do |t| | ||||||
|     t.string   "domain",       default: "", null: false |     t.string   "domain",       default: "", null: false | ||||||
|  | @ -137,10 +147,12 @@ ActiveRecord::Schema.define(version: 20170425202925) do | ||||||
|   create_table "mutes", force: :cascade do |t| |   create_table "mutes", force: :cascade do |t| | ||||||
|     t.integer  "account_id",        null: false |     t.integer  "account_id",        null: false | ||||||
|     t.integer  "target_account_id", null: false |     t.integer  "target_account_id", null: false | ||||||
|  |     t.boolean  "block",             null: false | ||||||
|     t.datetime "created_at",        null: false |     t.datetime "created_at",        null: false | ||||||
|     t.datetime "updated_at",        null: false |     t.datetime "updated_at",        null: false | ||||||
|     t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true, using: :btree |     t.index ["account_id", "target_account_id"], name: "index_mutes_on_account_id_and_target_account_id", unique: true, using: :btree | ||||||
|   end |   end | ||||||
|  |   execute   "ALTER TABLE mutes ADD CONSTRAINT check_mutes_on_block CHECK(block = FALSE), INHERIT block_mutes" | ||||||
| 
 | 
 | ||||||
|   create_table "notifications", force: :cascade do |t| |   create_table "notifications", force: :cascade do |t| | ||||||
|     t.integer  "account_id" |     t.integer  "account_id" | ||||||
|  |  | ||||||
|  | @ -152,7 +152,7 @@ RSpec.describe AtomSerializer do | ||||||
| 
 | 
 | ||||||
|   describe '#block_salmon' do |   describe '#block_salmon' do | ||||||
|     let(:xml) do |     let(:xml) do | ||||||
|       block = Fabricate(:block, account: author, target_account: receiver) |       block = Fabricate(:block, account: author, target_account: receiver, block: true) | ||||||
|       xml   = AtomSerializer.render(AtomSerializer.new.block_salmon(block)) |       xml   = AtomSerializer.render(AtomSerializer.new.block_salmon(block)) | ||||||
|       block.destroy |       block.destroy | ||||||
|       xml |       xml | ||||||
|  | @ -171,7 +171,7 @@ RSpec.describe AtomSerializer do | ||||||
| 
 | 
 | ||||||
|   describe '#unblock_salmon' do |   describe '#unblock_salmon' do | ||||||
|     let(:xml) do |     let(:xml) do | ||||||
|       block = Fabricate(:block, account: author, target_account: receiver) |       block = Fabricate(:block, account: author, target_account: receiver, block: true) | ||||||
|       block.destroy |       block.destroy | ||||||
|       xml = AtomSerializer.render(AtomSerializer.new.unblock_salmon(block)) |       xml = AtomSerializer.render(AtomSerializer.new.unblock_salmon(block)) | ||||||
|       author.block!(receiver) |       author.block!(receiver) | ||||||
|  |  | ||||||
|  | @ -193,9 +193,9 @@ RSpec.describe Account, type: :model do | ||||||
|   describe '#excluded_from_timeline_account_ids' do |   describe '#excluded_from_timeline_account_ids' do | ||||||
|     it 'includes account ids of blockings, blocked_bys and mutes' do |     it 'includes account ids of blockings, blocked_bys and mutes' do | ||||||
|       account = Fabricate(:account) |       account = Fabricate(:account) | ||||||
|       block = Fabricate(:block, account: account) |       block = Fabricate(:block, account: account, block: true) | ||||||
|       mute = Fabricate(:mute, account: account) |       mute = Fabricate(:mute, account: account, block: false) | ||||||
|       block_by = Fabricate(:block, target_account: account) |       block_by = Fabricate(:block, target_account: account, block: true) | ||||||
| 
 | 
 | ||||||
|       results = account.excluded_from_timeline_account_ids |       results = account.excluded_from_timeline_account_ids | ||||||
|       expect(results.size).to eq 3 |       expect(results.size).to eq 3 | ||||||
|  |  | ||||||
|  | @ -226,7 +226,7 @@ RSpec.describe Status, type: :model do | ||||||
| 
 | 
 | ||||||
|       it 'excludes statuses from accounts blocked by the account' do |       it 'excludes statuses from accounts blocked by the account' do | ||||||
|         blocked = Fabricate(:account) |         blocked = Fabricate(:account) | ||||||
|         Fabricate(:block, account: @account, target_account: blocked) |         Fabricate(:block, account: @account, target_account: blocked, block: true) | ||||||
|         blocked_status = Fabricate(:status, account: blocked) |         blocked_status = Fabricate(:status, account: blocked) | ||||||
| 
 | 
 | ||||||
|         results = Status.as_public_timeline(@account) |         results = Status.as_public_timeline(@account) | ||||||
|  | @ -235,7 +235,7 @@ RSpec.describe Status, type: :model do | ||||||
| 
 | 
 | ||||||
|       it 'excludes statuses from accounts who have blocked the account' do |       it 'excludes statuses from accounts who have blocked the account' do | ||||||
|         blocked = Fabricate(:account) |         blocked = Fabricate(:account) | ||||||
|         Fabricate(:block, account: blocked, target_account: @account) |         Fabricate(:block, account: blocked, target_account: @account, block: true) | ||||||
|         blocked_status = Fabricate(:status, account: blocked) |         blocked_status = Fabricate(:status, account: blocked) | ||||||
| 
 | 
 | ||||||
|         results = Status.as_public_timeline(@account) |         results = Status.as_public_timeline(@account) | ||||||
|  | @ -244,7 +244,7 @@ RSpec.describe Status, type: :model do | ||||||
| 
 | 
 | ||||||
|       it 'excludes statuses from accounts muted by the account' do |       it 'excludes statuses from accounts muted by the account' do | ||||||
|         muted = Fabricate(:account) |         muted = Fabricate(:account) | ||||||
|         Fabricate(:mute, account: @account, target_account: muted) |         Fabricate(:mute, account: @account, target_account: muted, block: false) | ||||||
|         muted_status = Fabricate(:status, account: muted) |         muted_status = Fabricate(:status, account: muted) | ||||||
| 
 | 
 | ||||||
|         results = Status.as_public_timeline(@account) |         results = Status.as_public_timeline(@account) | ||||||
|  |  | ||||||
|  | @ -188,7 +188,7 @@ if (cluster.isMaster) { | ||||||
|           const unpackedPayload  = JSON.parse(payload) |           const unpackedPayload  = JSON.parse(payload) | ||||||
|           const targetAccountIds = [unpackedPayload.account.id].concat(unpackedPayload.mentions.map(item => item.id)).concat(unpackedPayload.reblog ? [unpackedPayload.reblog.account.id] : []) |           const targetAccountIds = [unpackedPayload.account.id].concat(unpackedPayload.mentions.map(item => item.id)).concat(unpackedPayload.reblog ? [unpackedPayload.reblog.account.id] : []) | ||||||
| 
 | 
 | ||||||
|           client.query(`SELECT target_account_id FROM blocks WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 1)}) UNION SELECT target_account_id FROM mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 1)})`, [req.accountId].concat(targetAccountIds), (err, result) => { |           client.query(`SELECT target_account_id FROM block_mutes WHERE account_id = $1 AND target_account_id IN (${placeholders(targetAccountIds, 1)})`, [req.accountId].concat(targetAccountIds), (err, result) => { | ||||||
|             done() |             done() | ||||||
| 
 | 
 | ||||||
|             if (err) { |             if (err) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue