diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2018-08-09 09:56:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-09 09:56:53 +0200 |
commit | f2404de871f0bdfda5c9aeeeb4c6c4d10a8da8ab (patch) | |
tree | f45577d1fe26ea56f7323b940f506f8875d7344e /app/models | |
parent | 80176a3814abad7f5c9023f97b5d4d82b73c089d (diff) |
Public profile endorsements (accounts picked by profile owner) (#8146)
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/account.rb | 4 | ||||
-rw-r--r-- | app/models/account_pin.rb | 26 | ||||
-rw-r--r-- | app/models/concerns/account_interactions.rb | 8 |
3 files changed, 38 insertions, 0 deletions
diff --git a/app/models/account.rb b/app/models/account.rb index 0272b4615..c33ec4bd5 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -89,6 +89,10 @@ class Account < ApplicationRecord has_many :status_pins, inverse_of: :account, dependent: :destroy has_many :pinned_statuses, -> { reorder('status_pins.created_at DESC') }, through: :status_pins, class_name: 'Status', source: :status + # Endorsements + has_many :account_pins, inverse_of: :account, dependent: :destroy + has_many :endorsed_accounts, through: :account_pins, class_name: 'Account', source: :target_account + # Media has_many :media_attachments, dependent: :destroy diff --git a/app/models/account_pin.rb b/app/models/account_pin.rb new file mode 100644 index 000000000..9a21c3405 --- /dev/null +++ b/app/models/account_pin.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true +# == Schema Information +# +# Table name: account_pins +# +# id :bigint(8) not null, primary key +# account_id :bigint(8) +# target_account_id :bigint(8) +# created_at :datetime not null +# updated_at :datetime not null +# + +class AccountPin < ApplicationRecord + include RelationshipCacheable + + belongs_to :account + belongs_to :target_account, class_name: 'Account' + + validate :validate_follow_relationship + + private + + def validate_follow_relationship + errors.add(:base, I18n.t('accounts.pin_errors.following')) unless account.following?(target_account) + end +end diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb index e14e041f6..f5f833446 100644 --- a/app/models/concerns/account_interactions.rb +++ b/app/models/concerns/account_interactions.rb @@ -40,6 +40,10 @@ module AccountInteractions end end + def endorsed_map(target_account_ids, account_id) + follow_mapping(AccountPin.where(account_id: account_id, target_account_id: target_account_ids), :target_account_id) + end + def domain_blocking_map(target_account_ids, account_id) accounts_map = Account.where(id: target_account_ids).select('id, domain').map { |a| [a.id, a.domain] }.to_h blocked_domains = domain_blocking_map_by_domain(accounts_map.values.compact, account_id) @@ -190,6 +194,10 @@ module AccountInteractions status_pins.where(status: status).exists? end + def endorsed?(account) + account_pins.where(target_account: account).exists? + end + def followers_for_local_distribution followers.local .joins(:user) |