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
This commit is contained in:
		
							parent
							
								
									7e84e1a956
								
							
						
					
					
						commit
						7da087dabe
					
				
					 6 changed files with 33 additions and 3 deletions
				
			
		|  | @ -241,7 +241,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity | ||||||
| 
 | 
 | ||||||
|   def poll_vote? |   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']) |     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 |   end | ||||||
| 
 | 
 | ||||||
|   def resolve_thread(status) |   def resolve_thread(status) | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
| #  choice     :integer          default(0), not null | #  choice     :integer          default(0), not null | ||||||
| #  created_at :datetime         not null | #  created_at :datetime         not null | ||||||
| #  updated_at :datetime         not null | #  updated_at :datetime         not null | ||||||
|  | #  uri        :string | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| class PollVote < ApplicationRecord | class PollVote < ApplicationRecord | ||||||
|  | @ -20,6 +21,8 @@ class PollVote < ApplicationRecord | ||||||
| 
 | 
 | ||||||
|   after_create_commit :increment_counter_cache |   after_create_commit :increment_counter_cache | ||||||
| 
 | 
 | ||||||
|  |   delegate :local?, to: :account | ||||||
|  | 
 | ||||||
|   private |   private | ||||||
| 
 | 
 | ||||||
|   def increment_counter_cache |   def increment_counter_cache | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ class ActivityPub::VoteSerializer < ActiveModel::Serializer | ||||||
|                :in_reply_to, :to |                :in_reply_to, :to | ||||||
| 
 | 
 | ||||||
|     def id |     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 |     end | ||||||
| 
 | 
 | ||||||
|     def type |     def type | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								db/migrate/20190304152020_add_uri_to_poll_votes.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								db/migrate/20190304152020_add_uri_to_poll_votes.rb
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | class AddUriToPollVotes < ActiveRecord::Migration[5.2] | ||||||
|  |   def change | ||||||
|  |     add_column :poll_votes, :uri, :string | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
| # | # | ||||||
| # It's strongly recommended that you check this file into your version control system. | # 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 |   # These are extensions that must be enabled in order to support this database | ||||||
|   enable_extension "plpgsql" |   enable_extension "plpgsql" | ||||||
|  | @ -447,6 +447,7 @@ ActiveRecord::Schema.define(version: 2019_02_26_003449) do | ||||||
|     t.integer "choice", default: 0, null: false |     t.integer "choice", default: 0, null: false | ||||||
|     t.datetime "created_at", null: false |     t.datetime "created_at", null: false | ||||||
|     t.datetime "updated_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 ["account_id"], name: "index_poll_votes_on_account_id" | ||||||
|     t.index ["poll_id"], name: "index_poll_votes_on_poll_id" |     t.index ["poll_id"], name: "index_poll_votes_on_poll_id" | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  | @ -447,6 +447,27 @@ RSpec.describe ActivityPub::Activity::Create do | ||||||
|           expect(poll.cached_tallies).to eq [10, 3] |           expect(poll.cached_tallies).to eq [10, 3] | ||||||
|         end |         end | ||||||
|       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 |     end | ||||||
| 
 | 
 | ||||||
|     context 'when sender is followed by local users' do |     context 'when sender is followed by local users' do | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue