1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- # frozen_string_literal: true
- class VoteService < BaseService
- include Authorization
- include Payloadable
- 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)
- Oj.dump(serialize_payload(vote, ActivityPub::VoteSerializer))
- end
- end
|