diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/account.rb | 14 | ||||
-rw-r--r-- | app/models/block.rb | 10 | ||||
-rw-r--r-- | app/models/favourite.rb | 6 | ||||
-rw-r--r-- | app/models/media_attachment.rb | 1 | ||||
-rw-r--r-- | app/models/mute.rb | 14 | ||||
-rw-r--r-- | app/models/status.rb | 5 | ||||
-rw-r--r-- | app/models/subscription.rb | 2 | ||||
-rw-r--r-- | app/models/user.rb | 4 |
8 files changed, 35 insertions, 21 deletions
diff --git a/app/models/account.rb b/app/models/account.rb index 8ceda7f97..259a87451 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -108,10 +108,6 @@ class Account < ApplicationRecord follow_requests.where(target_account: other_account).exists? end - def followers_domains - followers.reorder('').select('DISTINCT accounts.domain').map(&:domain) - end - def local? domain.nil? end @@ -231,18 +227,20 @@ class Account < ApplicationRecord WITH first_degree AS ( SELECT target_account_id FROM follows - WHERE account_id = ? + WHERE account_id = :account_id ) SELECT accounts.* FROM follows INNER JOIN accounts ON follows.target_account_id = accounts.id - WHERE account_id IN (SELECT * FROM first_degree) AND target_account_id NOT IN (SELECT * FROM first_degree) AND target_account_id <> ? + WHERE account_id IN (SELECT * FROM first_degree) AND target_account_id NOT IN (SELECT * FROM first_degree) AND target_account_id <> :account_id GROUP BY target_account_id, accounts.id ORDER BY count(account_id) DESC - LIMIT ? + LIMIT :limit SQL - Account.find_by_sql([sql, account.id, account.id, limit]) + find_by_sql( + [sql, { account_id: account.id, limit: limit }] + ) end def search_for(terms, limit = 10) diff --git a/app/models/block.rb b/app/models/block.rb index ae456a6b6..c978b2200 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -7,4 +7,14 @@ class Block < ApplicationRecord belongs_to :target_account, class_name: 'Account', required: true validates :account_id, uniqueness: { scope: :target_account_id } + + after_create :remove_blocking_cache + after_destroy :remove_blocking_cache + + private + + def remove_blocking_cache + Rails.cache.delete("exclude_account_ids_for:#{account_id}") + Rails.cache.delete("exclude_account_ids_for:#{target_account_id}") + end end diff --git a/app/models/favourite.rb b/app/models/favourite.rb index 41d06e734..32d54476b 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -3,14 +3,14 @@ class Favourite < ApplicationRecord include Paginable - belongs_to :account, inverse_of: :favourites - belongs_to :status, inverse_of: :favourites, counter_cache: true + belongs_to :account, inverse_of: :favourites, required: true + belongs_to :status, inverse_of: :favourites, counter_cache: true, required: true has_one :notification, as: :activity, dependent: :destroy validates :status_id, uniqueness: { scope: :account_id } before_validation do - self.status = status.reblog if status.reblog? + self.status = status.reblog if status&.reblog? end end diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 818190214..85e82e12b 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -33,6 +33,7 @@ class MediaAttachment < ApplicationRecord validates :account, presence: true + scope :attached, -> { where.not(status_id: nil) } scope :local, -> { where(remote_url: '') } default_scope { order('id asc') } diff --git a/app/models/mute.rb b/app/models/mute.rb index a5b334c85..d0de62ed5 100644 --- a/app/models/mute.rb +++ b/app/models/mute.rb @@ -3,9 +3,17 @@ class Mute < ApplicationRecord include Paginable - belongs_to :account - belongs_to :target_account, class_name: 'Account' + belongs_to :account, required: true + belongs_to :target_account, class_name: 'Account', required: true - validates :account, :target_account, presence: true validates :account_id, uniqueness: { scope: :target_account_id } + + after_create :remove_blocking_cache + after_destroy :remove_blocking_cache + + private + + def remove_blocking_cache + Rails.cache.delete("exclude_account_ids_for:#{account_id}") + end end diff --git a/app/models/status.rb b/app/models/status.rb index c0a5d9d1b..a9b7327c3 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -10,7 +10,7 @@ class Status < ApplicationRecord belongs_to :application, class_name: 'Doorkeeper::Application' - belongs_to :account, inverse_of: :statuses, counter_cache: true + belongs_to :account, inverse_of: :statuses, counter_cache: true, required: true belongs_to :in_reply_to_account, foreign_key: 'in_reply_to_account_id', class_name: 'Account' belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies @@ -26,7 +26,6 @@ class Status < ApplicationRecord has_one :notification, as: :activity, dependent: :destroy has_one :preview_card, dependent: :destroy - validates :account, presence: true validates :uri, uniqueness: true, unless: 'local?' validates :text, presence: true, unless: 'reblog?' validates_with StatusLengthValidator @@ -184,7 +183,7 @@ class Status < ApplicationRecord private def filter_timeline(query, account) - blocked = Block.where(account: account).pluck(:target_account_id) + Block.where(target_account: account).pluck(:account_id) + Mute.where(account: account).pluck(:target_account_id) + blocked = Rails.cache.fetch("exclude_account_ids_for:#{account.id}") { Block.where(account: account).pluck(:target_account_id) + Block.where(target_account: account).pluck(:account_id) + Mute.where(account: account).pluck(:target_account_id) } query = query.where('statuses.account_id NOT IN (?)', blocked) unless blocked.empty? # Only give us statuses from people we haven't blocked, or muted, or that have blocked us query = query.where('accounts.silenced = TRUE') if account.silenced? # and if we're hellbanned, only people who are also hellbanned query diff --git a/app/models/subscription.rb b/app/models/subscription.rb index 497cabb09..63553e9fe 100644 --- a/app/models/subscription.rb +++ b/app/models/subscription.rb @@ -4,7 +4,7 @@ class Subscription < ApplicationRecord MIN_EXPIRATION = 3600 * 24 * 7 MAX_EXPIRATION = 3600 * 24 * 30 - belongs_to :account + belongs_to :account, required: true validates :callback_url, presence: true validates :callback_url, uniqueness: { scope: :account_id } diff --git a/app/models/user.rb b/app/models/user.rb index d50101baf..cd1f816ca 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -9,14 +9,12 @@ class User < ApplicationRecord otp_secret_encryption_key: ENV['OTP_SECRET'], otp_number_of_backup_codes: 10 - belongs_to :account, inverse_of: :user + belongs_to :account, inverse_of: :user, required: true accepts_nested_attributes_for :account - validates :account, presence: true validates :locale, inclusion: I18n.available_locales.map(&:to_s), unless: 'locale.nil?' validates :email, email: true - scope :prolific, -> { joins('inner join statuses on statuses.account_id = users.account_id').select('users.*, count(statuses.id) as statuses_count').group('users.id').order('statuses_count desc') } scope :recent, -> { order('id desc') } scope :admins, -> { where(admin: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } |