Adding a block model and filter mentions from blocked users (fix #60)
This commit is contained in:
		
							parent
							
								
									a488b05726
								
							
						
					
					
						commit
						9d59d7b463
					
				| @ -10,7 +10,7 @@ class ApplicationController < ActionController::Base | |||||||
|   rescue_from ActionController::RoutingError, with: :not_found |   rescue_from ActionController::RoutingError, with: :not_found | ||||||
|   rescue_from ActiveRecord::RecordNotFound, 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 |   def raise_not_found | ||||||
|     raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}" |     raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}" | ||||||
|  | |||||||
| @ -40,13 +40,13 @@ class FeedManager | |||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   # Filter status out of the home feed if it is a reply to someone the user doesn't follow |   # 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 |     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 |   end | ||||||
| 
 | 
 | ||||||
|   def filter_from_mentions?(status, follower) |   def filter_from_mentions?(status, receiver) | ||||||
|     false |     receiver.blocking?(status.account) || (status.reblog? && receiver.blocking?(status.reblog.account)) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def inline_render(target_account, status) |   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 :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 :passive_relationships, class_name: 'Follow', foreign_key: 'target_account_id', dependent: :destroy | ||||||
| 
 | 
 | ||||||
|   has_many :following, through: :active_relationships,  source: :target_account |   has_many :following, -> { order('follows.created_at desc') }, through: :active_relationships,  source: :target_account | ||||||
|   has_many :followers, through: :passive_relationships, source: :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 |   has_many :media_attachments, dependent: :destroy | ||||||
| 
 | 
 | ||||||
| @ -57,6 +61,10 @@ class Account < ApplicationRecord | |||||||
|     following.include?(other_account) |     following.include?(other_account) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def blocking?(other_account) | ||||||
|  |     blocking.include?(other_account) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   def local? |   def local? | ||||||
|     domain.nil? |     domain.nil? | ||||||
|   end |   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 |   end | ||||||
| 
 | 
 | ||||||
|   def mentions |   def mentions | ||||||
|     activity.respond_to?(:mentions) ? activity.mentions.map { |x| x.account } : [] |     activity.respond_to?(:mentions) ? activity.mentions.map(&:account) : [] | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|   def activity |   def activity | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ class PrecomputeFeedService < BaseService | |||||||
|     instant_return = [] |     instant_return = [] | ||||||
| 
 | 
 | ||||||
|     Status.send("as_#{type}_timeline", account).order('created_at desc').limit(FeedManager::MAX_ITEMS).find_each do |status| |     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) |       redis.zadd(FeedManager.instance.key(type, account.id), status.id, status.id) | ||||||
|       instant_return << status unless instant_return.size > limit |       instant_return << status unless instant_return.size > limit | ||||||
|     end |     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. | # 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 |   # These are extensions that must be enabled in order to support this database | ||||||
|   enable_extension "plpgsql" |   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 |     t.index ["username", "domain"], name: "index_accounts_on_username_and_domain", unique: true, using: :btree | ||||||
|   end |   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| |   create_table "favourites", force: :cascade do |t| | ||||||
|     t.integer  "account_id", null: false |     t.integer  "account_id", null: false | ||||||
|     t.integer  "status_id",  null: false |     t.integer  "status_id",  null: false | ||||||
|  | |||||||
| @ -2,8 +2,8 @@ require 'rails_helper' | |||||||
| 
 | 
 | ||||||
| RSpec.describe AboutController, type: :controller do | RSpec.describe AboutController, type: :controller do | ||||||
| 
 | 
 | ||||||
|   describe "GET #index" do |   describe 'GET #index' do | ||||||
|     it "returns http success" do |     it 'returns http success' do | ||||||
|       get :index |       get :index | ||||||
|       expect(response).to have_http_status(:success) |       expect(response).to have_http_status(:success) | ||||||
|     end |     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 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user