From 50660d54e8cabd08fee649a6abc26f35a8d7a82c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Feb 2017 17:09:36 +0100 Subject: [PATCH] Fix semantics of follow requests another slaps --- app/helpers/atom_builder_helper.rb | 1 + app/models/block.rb | 4 ---- app/models/favourite.rb | 2 -- app/models/follow.rb | 4 ---- app/models/follow_request.rb | 17 ++++++++++------- app/models/stream_entry.rb | 13 +++++++------ docs/Extensions.md | 4 ++-- spec/models/favourite_spec.rb | 9 ++------- spec/models/follow_spec.rb | 4 ++-- 9 files changed, 24 insertions(+), 34 deletions(-) diff --git a/app/helpers/atom_builder_helper.rb b/app/helpers/atom_builder_helper.rb index 5d20f8c2..08d70b7a 100644 --- a/app/helpers/atom_builder_helper.rb +++ b/app/helpers/atom_builder_helper.rb @@ -191,6 +191,7 @@ module AtomBuilderHelper include_author xml, stream_entry.target else object_type xml, stream_entry.target.object_type + verb xml, stream_entry.target.verb title xml, stream_entry.target.title link_alternate xml, TagManager.instance.url_for(stream_entry.target) end diff --git a/app/models/block.rb b/app/models/block.rb index c2067c5b..d0662b68 100644 --- a/app/models/block.rb +++ b/app/models/block.rb @@ -18,10 +18,6 @@ class Block < ApplicationRecord target_account end - def object_type - :person - end - def hidden? true end diff --git a/app/models/favourite.rb b/app/models/favourite.rb index cd8e2098..82f8c525 100644 --- a/app/models/favourite.rb +++ b/app/models/favourite.rb @@ -19,8 +19,6 @@ class Favourite < ApplicationRecord destroyed? ? "#{account.acct} no longer favourites a status by #{status.account.acct}" : "#{account.acct} favourited a status by #{status.account.acct}" end - delegate :object_type, to: :target - def thread status end diff --git a/app/models/follow.rb b/app/models/follow.rb index f83490ca..e25c2bc9 100644 --- a/app/models/follow.rb +++ b/app/models/follow.rb @@ -20,10 +20,6 @@ class Follow < ApplicationRecord target_account end - def object_type - :person - end - def title destroyed? ? "#{account.acct} is no longer following #{target_account.acct}" : "#{account.acct} started following #{target_account.acct}" end diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index 989c2c2a..080c686e 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -13,7 +13,8 @@ class FollowRequest < ApplicationRecord validates :account_id, uniqueness: { scope: :target_account_id } def authorize! - @verb = :authorize + @verb = :authorize + @target = clone.freeze account.follow!(target_account) MergeWorker.perform_async(target_account.id, account.id) @@ -22,7 +23,9 @@ class FollowRequest < ApplicationRecord end def reject! - @verb = :reject + @verb = :reject + @target = clone.freeze + destroy! end @@ -31,11 +34,11 @@ class FollowRequest < ApplicationRecord end def target - target_account - end - - def object_type - :person + if destroyed? && @verb + @target + else + target_account + end end def hidden? diff --git a/app/models/stream_entry.rb b/app/models/stream_entry.rb index e0b85be1..bb68b1e1 100644 --- a/app/models/stream_entry.rb +++ b/app/models/stream_entry.rb @@ -6,10 +6,11 @@ class StreamEntry < ApplicationRecord belongs_to :account, inverse_of: :stream_entries belongs_to :activity, polymorphic: true - belongs_to :status, foreign_type: 'Status', foreign_key: 'activity_id' - belongs_to :follow, foreign_type: 'Follow', foreign_key: 'activity_id' - belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id' - belongs_to :block, foreign_type: 'Block', foreign_key: 'activity_id' + belongs_to :status, foreign_type: 'Status', foreign_key: 'activity_id' + belongs_to :follow, foreign_type: 'Follow', foreign_key: 'activity_id' + belongs_to :favourite, foreign_type: 'Favourite', foreign_key: 'activity_id' + belongs_to :block, foreign_type: 'Block', foreign_key: 'activity_id' + belongs_to :follow_request, foreign_type: 'FollowRequest', foreign_key: 'activity_id' validates :account, :activity, presence: true @@ -30,7 +31,7 @@ class StreamEntry < ApplicationRecord end def targeted? - [:follow, :request_friend, :authorize, :unfollow, :block, :unblock, :share, :favorite].include? verb + [:follow, :request_friend, :authorize, :reject, :unfollow, :block, :unblock, :share, :favorite].include? verb end def target @@ -58,7 +59,7 @@ class StreamEntry < ApplicationRecord end def activity - !new_record? ? send(activity_type.downcase) : super + !new_record? ? send(activity_type.underscore) : super end private diff --git a/docs/Extensions.md b/docs/Extensions.md index b56b5b85..6a940eeb 100644 --- a/docs/Extensions.md +++ b/docs/Extensions.md @@ -23,7 +23,7 @@ Accounts and statuses have an access "scope": Accounts can be "private" or "public". The former requires a follow request to be approved before a follow relationship can be established, the latter can be followed directly. -Statuses can be "private", "unlisted" or "public". Private must only be shown to the followers of the account, public can be displayed publicly. Unlisted statuses may be displayed publicly but preferably outside of any spotlights e.g. "whole known network" or "public" timelines. +Statuses can be "private", "unlisted" or "public". Private must only be shown to the followers of the account or people mentioned in the status; public can be displayed publicly. Unlisted statuses may be displayed publicly but preferably outside of any spotlights e.g. "whole known network" or "public" timelines. Namespace of the scope element is `http://mastodon.social/schema/1.0`. Example: @@ -47,7 +47,7 @@ Mastodon uses the following Salmon slaps to signal a follow request, a follow re - `http://activitystrea.ms/schema/1.0/authorize` - `http://activitystrea.ms/schema/1.0/reject` -The activity object of the slaps is the account in question. Request-friend slap is sent to that account, when the end-user of that account decides, the authorize/reject decision slap is sent back to the requester. +The activity object of the request-friend slap is the account in question. The activity object of the authorize and reject slaps is the original request-friend activity. Request-friend slap is sent to the locked account, when the end-user of that account decides, the authorize/reject decision slap is sent back to the requester. #### PuSH amendment diff --git a/spec/models/favourite_spec.rb b/spec/models/favourite_spec.rb index 6cf3af46..cc3d604d 100644 --- a/spec/models/favourite_spec.rb +++ b/spec/models/favourite_spec.rb @@ -26,13 +26,8 @@ RSpec.describe Favourite, type: :model do end describe '#object_type' do - it 'is a note when the target is a note' do - expect(subject.object_type).to be :note - end - - it 'is a comment when the target is a comment' do - status.in_reply_to_id = 2 - expect(subject.object_type).to be :comment + it 'is an activity' do + expect(subject.object_type).to be :activity end end diff --git a/spec/models/follow_spec.rb b/spec/models/follow_spec.rb index c9d02ab1..bc887b60 100644 --- a/spec/models/follow_spec.rb +++ b/spec/models/follow_spec.rb @@ -25,8 +25,8 @@ RSpec.describe Follow, type: :model do end describe '#object_type' do - it 'is a person' do - expect(subject.object_type).to be :person + it 'is an activity' do + expect(subject.object_type).to be :activity end end