about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-02-11 17:09:36 +0100
committerEugen Rochko <eugen@zeonfederated.com>2017-02-11 17:13:11 +0100
commit50660d54e8cabd08fee649a6abc26f35a8d7a82c (patch)
tree0124bd26554896a409dc7b7b6bb357fc8be8e2c6
parent0b95eb36128077b3074f661dd451a90a18441ef0 (diff)
Fix semantics of follow requests another slaps
-rw-r--r--app/helpers/atom_builder_helper.rb1
-rw-r--r--app/models/block.rb4
-rw-r--r--app/models/favourite.rb2
-rw-r--r--app/models/follow.rb4
-rw-r--r--app/models/follow_request.rb17
-rw-r--r--app/models/stream_entry.rb13
-rw-r--r--docs/Extensions.md4
-rw-r--r--spec/models/favourite_spec.rb9
-rw-r--r--spec/models/follow_spec.rb4
9 files changed, 24 insertions, 34 deletions
diff --git a/app/helpers/atom_builder_helper.rb b/app/helpers/atom_builder_helper.rb
index 5d20f8c2d..08d70b7ac 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 c2067c5b8..d0662b685 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 cd8e2098c..82f8c5258 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 f83490caa..e25c2bc9f 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 989c2c2a2..080c686e5 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 e0b85be15..bb68b1e14 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 b56b5b85c..6a940eebc 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 6cf3af464..cc3d604d6 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 c9d02ab16..bc887b60d 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