Class: Decidim::Proposals::VoteProposal

Inherits:
Command
  • Object
show all
Defined in:
app/commands/decidim/proposals/vote_proposal.rb

Overview

A command with all the business logic when a user votes a proposal.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(proposal, current_user) ⇒ VoteProposal

Public: Initializes the command.

proposal - A Decidim::Proposals::Proposal object. current_user - The current user.



11
12
13
14
# File 'app/commands/decidim/proposals/vote_proposal.rb', line 11

def initialize(proposal, current_user)
  @proposal = proposal
  @current_user = current_user
end

Instance Attribute Details

#voteObject (readonly)

Returns the value of attribute vote.



40
41
42
# File 'app/commands/decidim/proposals/vote_proposal.rb', line 40

def vote
  @vote
end

Instance Method Details

#callObject

Executes the command. Broadcasts these events:

  • :ok when everything is valid, together with the proposal vote.

  • :invalid if the form was not valid and we could not proceed.

Returns nothing.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'app/commands/decidim/proposals/vote_proposal.rb', line 22

def call
  return broadcast(:invalid) if @proposal.maximum_votes_reached? && !@proposal.can_accumulate_votes_beyond_threshold

  build_proposal_vote
  return broadcast(:invalid) unless vote.valid?

  ActiveRecord::Base.transaction do
    @proposal.with_lock do
      vote.save!
      update_temporary_votes
    end
  end

  Decidim::Gamification.increment_score(@current_user, :proposal_votes)

  broadcast(:ok, vote)
end