Adding a block model and filter mentions from blocked users (fix #60)
This commit is contained in:
		
							parent
							
								
									a488b05726
								
							
						
					
					
						commit
						9d59d7b463
					
				
					 11 changed files with 55 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -10,7 +10,7 @@ class ApplicationController < ActionController::Base
 | 
			
		|||
  rescue_from ActionController::RoutingError, with: :not_found
 | 
			
		||||
  rescue_from ActiveRecord::RecordNotFound, with: :not_found
 | 
			
		||||
 | 
			
		||||
  before_action :store_current_location, :unless => :devise_controller?
 | 
			
		||||
  before_action :store_current_location, unless: :devise_controller?
 | 
			
		||||
 | 
			
		||||
  def raise_not_found
 | 
			
		||||
    raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,13 +40,13 @@ class FeedManager
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  # Filter status out of the home feed if it is a reply to someone the user doesn't follow
 | 
			
		||||
  def filter_from_home?(status, follower)
 | 
			
		||||
  def filter_from_home?(status, receiver)
 | 
			
		||||
    replied_to_user = status.reply? ? status.thread.account : nil
 | 
			
		||||
    (status.reply? && !(follower.id == replied_to_user.id || replied_to_user.id == status.account_id || follower.following?(replied_to_user)))
 | 
			
		||||
    (status.reply? && !(receiver.id == replied_to_user.id || replied_to_user.id == status.account_id || receiver.following?(replied_to_user)))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def filter_from_mentions?(status, follower)
 | 
			
		||||
    false
 | 
			
		||||
  def filter_from_mentions?(status, receiver)
 | 
			
		||||
    receiver.blocking?(status.account) || (status.reblog? && receiver.blocking?(status.reblog.account))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def inline_render(target_account, status)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,8 +33,12 @@ class Account < ApplicationRecord
 | 
			
		|||
  has_many :active_relationships,  class_name: 'Follow', foreign_key: 'account_id',        dependent: :destroy
 | 
			
		||||
  has_many :passive_relationships, class_name: 'Follow', foreign_key: 'target_account_id', dependent: :destroy
 | 
			
		||||
 | 
			
		||||
  has_many :following, through: :active_relationships,  source: :target_account
 | 
			
		||||
  has_many :followers, through: :passive_relationships, source: :account
 | 
			
		||||
  has_many :following, -> { order('follows.created_at desc') }, through: :active_relationships,  source: :target_account
 | 
			
		||||
  has_many :followers, -> { order('follows.created_at desc') }, through: :passive_relationships, source: :account
 | 
			
		||||
 | 
			
		||||
  # Block relationships
 | 
			
		||||
  has_many :block_relationships, class_name: 'Block', foreign_key: 'account_id', dependent: :destroy
 | 
			
		||||
  has_many :blocking, -> { order('blocks.created_at desc') }, through: :block_relationships, source: :target_account
 | 
			
		||||
 | 
			
		||||
  has_many :media_attachments, dependent: :destroy
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +61,10 @@ class Account < ApplicationRecord
 | 
			
		|||
    following.include?(other_account)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def blocking?(other_account)
 | 
			
		||||
    blocking.include?(other_account)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def local?
 | 
			
		||||
    domain.nil?
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										7
									
								
								app/models/block.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/models/block.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
class Block < ApplicationRecord
 | 
			
		||||
  belongs_to :account
 | 
			
		||||
  belongs_to :target_account, class_name: 'Account'
 | 
			
		||||
 | 
			
		||||
  validates :account, :target_account, presence: true
 | 
			
		||||
  validates :account_id, uniqueness: { scope: :target_account_id }
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ class StreamEntry < ApplicationRecord
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def mentions
 | 
			
		||||
    activity.respond_to?(:mentions) ? activity.mentions.map { |x| x.account } : []
 | 
			
		||||
    activity.respond_to?(:mentions) ? activity.mentions.map(&:account) : []
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def activity
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ class PrecomputeFeedService < BaseService
 | 
			
		|||
    instant_return = []
 | 
			
		||||
 | 
			
		||||
    Status.send("as_#{type}_timeline", account).order('created_at desc').limit(FeedManager::MAX_ITEMS).find_each do |status|
 | 
			
		||||
      next FeedManager.instance.filter?(type, status, account)
 | 
			
		||||
      next if FeedManager.instance.filter?(type, status, account)
 | 
			
		||||
      redis.zadd(FeedManager.instance.key(type, account.id), status.id, status.id)
 | 
			
		||||
      instant_return << status unless instant_return.size > limit
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								db/migrate/20161003145426_create_blocks.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								db/migrate/20161003145426_create_blocks.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
class CreateBlocks < ActiveRecord::Migration[5.0]
 | 
			
		||||
  def change
 | 
			
		||||
    create_table :blocks do |t|
 | 
			
		||||
      t.integer :account_id, null: false
 | 
			
		||||
      t.integer :target_account_id, null: false
 | 
			
		||||
 | 
			
		||||
      t.timestamps null: false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    add_index :blocks, [:account_id, :target_account_id], unique: true
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										10
									
								
								db/schema.rb
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								db/schema.rb
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
#
 | 
			
		||||
# It's strongly recommended that you check this file into your version control system.
 | 
			
		||||
 | 
			
		||||
ActiveRecord::Schema.define(version: 20161003142332) do
 | 
			
		||||
ActiveRecord::Schema.define(version: 20161003145426) do
 | 
			
		||||
 | 
			
		||||
  # These are extensions that must be enabled in order to support this database
 | 
			
		||||
  enable_extension "plpgsql"
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +43,14 @@ ActiveRecord::Schema.define(version: 20161003142332) do
 | 
			
		|||
    t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  create_table "blocks", force: :cascade do |t|
 | 
			
		||||
    t.integer  "account_id",        null: false
 | 
			
		||||
    t.integer  "target_account_id", null: false
 | 
			
		||||
    t.datetime "created_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
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  create_table "favourites", force: :cascade do |t|
 | 
			
		||||
    t.integer  "account_id", null: false
 | 
			
		||||
    t.integer  "status_id",  null: false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,8 @@ require 'rails_helper'
 | 
			
		|||
 | 
			
		||||
RSpec.describe AboutController, type: :controller do
 | 
			
		||||
 | 
			
		||||
  describe "GET #index" do
 | 
			
		||||
    it "returns http success" do
 | 
			
		||||
  describe 'GET #index' do
 | 
			
		||||
    it 'returns http success' do
 | 
			
		||||
      get :index
 | 
			
		||||
      expect(response).to have_http_status(:success)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								spec/fabricators/block_fabricator.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								spec/fabricators/block_fabricator.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
Fabricator(:block) do
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										5
									
								
								spec/models/block_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								spec/models/block_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe Block, type: :model do
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
		Reference in a new issue