From f2404de871f0bdfda5c9aeeeb4c6c4d10a8da8ab Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 9 Aug 2018 09:56:53 +0200 Subject: Public profile endorsements (accounts picked by profile owner) (#8146) --- app/models/account.rb | 4 ++++ app/models/account_pin.rb | 26 ++++++++++++++++++++++++++ app/models/concerns/account_interactions.rb | 8 ++++++++ 3 files changed, 38 insertions(+) create mode 100644 app/models/account_pin.rb (limited to 'app/models') 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) -- cgit From aff6a15061de203842653d680047322277dc7af6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 9 Aug 2018 15:24:29 +0200 Subject: When follow is removed, remove endorsement (#8149) --- app/models/follow.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/models') diff --git a/app/models/follow.rb b/app/models/follow.rb index eaf8445f3..3fce14b9a 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -33,10 +33,15 @@ class Follow < ApplicationRecord end before_validation :set_uri, only: :create + after_destroy :remove_endorsements private def set_uri self.uri = ActivityPub::TagManager.instance.generate_uri_for(self) if uri.nil? end + + def remove_endorsements + AccountPin.where(target_account_id: target_account_id, account_id: account_id).delete_all + end end -- cgit