60 lines
1.3 KiB
Ruby
60 lines
1.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class VoteService < BaseService
|
||
|
include Authorization
|
||
|
|
||
|
def call(account, poll, choices)
|
||
|
authorize_with account, poll, :vote?
|
||
|
|
||
|
@account = account
|
||
|
@poll = poll
|
||
|
@choices = choices
|
||
|
@votes = []
|
||
|
|
||
|
ApplicationRecord.transaction do
|
||
|
@choices.each do |choice|
|
||
|
@votes << @poll.votes.create!(account: @account, choice: choice)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
ActivityTracker.increment('activity:interactions')
|
||
|
|
||
|
if @poll.account.local?
|
||
|
distribute_poll!
|
||
|
else
|
||
|
deliver_votes!
|
||
|
queue_final_poll_check!
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def distribute_poll!
|
||
|
return if @poll.hide_totals?
|
||
|
ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, @poll.status.id)
|
||
|
end
|
||
|
|
||
|
def queue_final_poll_check!
|
||
|
return unless @poll.expires?
|
||
|
PollExpirationNotifyWorker.perform_at(@poll.expires_at + 5.minutes, @poll.id)
|
||
|
end
|
||
|
|
||
|
def deliver_votes!
|
||
|
@votes.each do |vote|
|
||
|
ActivityPub::DeliveryWorker.perform_async(
|
||
|
build_json(vote),
|
||
|
@account.id,
|
||
|
@poll.account.inbox_url
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def build_json(vote)
|
||
|
ActiveModelSerializers::SerializableResource.new(
|
||
|
vote,
|
||
|
serializer: ActivityPub::VoteSerializer,
|
||
|
adapter: ActivityPub::Adapter
|
||
|
).to_json
|
||
|
end
|
||
|
end
|