about summary refs log tree commit diff
diff options
context:
space:
mode:
authorThibG <thib@sitedethib.com>2019-03-04 22:51:23 +0100
committerEugen Rochko <eugen@zeonfederated.com>2019-03-04 22:51:23 +0100
commit833ffce2df68ae3b673e230fcb273da5d8c4681f (patch)
treef06854fd6b50c62897d9c25a9b50c21d93c894dd
parent7a25bb858a2a7f3662d2ad2a8cba9ac7ea141aca (diff)
Store remote votes URI (#10158)
* Store remote votes URI

* Add spec for accepting remote votes

* Make poll vote id generation work the same way as follows
-rw-r--r--app/lib/activitypub/activity/create.rb2
-rw-r--r--app/models/poll_vote.rb3
-rw-r--r--app/serializers/activitypub/vote_serializer.rb2
-rw-r--r--db/migrate/20190304152020_add_uri_to_poll_votes.rb5
-rw-r--r--db/schema.rb3
-rw-r--r--spec/lib/activitypub/activity/create_spec.rb21
6 files changed, 33 insertions, 3 deletions
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index fc4c45692..07ef16bf3 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -241,7 +241,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   def poll_vote?
     return false if replied_to_status.nil? || replied_to_status.poll.nil? || !replied_to_status.local? || !replied_to_status.poll.options.include?(@object['name'])
-    replied_to_status.poll.votes.create!(account: @account, choice: replied_to_status.poll.options.index(@object['name']))
+    replied_to_status.poll.votes.create!(account: @account, choice: replied_to_status.poll.options.index(@object['name']), uri: @object['id'])
   end
 
   def resolve_thread(status)
diff --git a/app/models/poll_vote.rb b/app/models/poll_vote.rb
index 57781d616..aec678968 100644
--- a/app/models/poll_vote.rb
+++ b/app/models/poll_vote.rb
@@ -9,6 +9,7 @@
 #  choice     :integer          default(0), not null
 #  created_at :datetime         not null
 #  updated_at :datetime         not null
+#  uri        :string
 #
 
 class PollVote < ApplicationRecord
@@ -20,6 +21,8 @@ class PollVote < ApplicationRecord
 
   after_create_commit :increment_counter_cache
 
+  delegate :local?, to: :account
+
   private
 
   def increment_counter_cache
diff --git a/app/serializers/activitypub/vote_serializer.rb b/app/serializers/activitypub/vote_serializer.rb
index 655d04d22..248190404 100644
--- a/app/serializers/activitypub/vote_serializer.rb
+++ b/app/serializers/activitypub/vote_serializer.rb
@@ -6,7 +6,7 @@ class ActivityPub::VoteSerializer < ActiveModel::Serializer
                :in_reply_to, :to
 
     def id
-      [ActivityPub::TagManager.instance.uri_for(object.account), '#votes/', object.id].join
+      ActivityPub::TagManager.instance.uri_for(object) || [ActivityPub::TagManager.instance.uri_for(object.account), '#votes/', object.id].join
     end
 
     def type
diff --git a/db/migrate/20190304152020_add_uri_to_poll_votes.rb b/db/migrate/20190304152020_add_uri_to_poll_votes.rb
new file mode 100644
index 000000000..f6b81f1ba
--- /dev/null
+++ b/db/migrate/20190304152020_add_uri_to_poll_votes.rb
@@ -0,0 +1,5 @@
+class AddUriToPollVotes < ActiveRecord::Migration[5.2]
+  def change
+    add_column :poll_votes, :uri, :string
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index d5d516e06..161619dcf 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2019_02_26_003449) do
+ActiveRecord::Schema.define(version: 2019_03_04_152020) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -447,6 +447,7 @@ ActiveRecord::Schema.define(version: 2019_02_26_003449) do
     t.integer "choice", default: 0, null: false
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
+    t.string "uri"
     t.index ["account_id"], name: "index_poll_votes_on_account_id"
     t.index ["poll_id"], name: "index_poll_votes_on_poll_id"
   end
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index ac6237c86..4780c29c8 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -447,6 +447,27 @@ RSpec.describe ActivityPub::Activity::Create do
           expect(poll.cached_tallies).to eq [10, 3]
         end
       end
+
+      context 'when a vote to a local poll' do
+        let(:poll) { Fabricate(:poll, options: %w(Yellow Blue)) }
+        let!(:local_status) { Fabricate(:status, owned_poll: poll) }
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            name: 'Yellow',
+            inReplyTo: ActivityPub::TagManager.instance.uri_for(local_status)
+          }
+        end
+
+        it 'adds a vote to the poll with correct uri' do
+          vote = poll.votes.first
+          expect(vote).to_not be_nil
+          expect(vote.uri).to eq object_json[:id]
+          expect(poll.reload.cached_tallies).to eq [1, 0]
+        end
+      end
     end
 
     context 'when sender is followed by local users' do