From 758cdaf8d7ebfa78232496beb66cae03e1b49769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sun, 13 Jun 2021 20:38:42 +0200 Subject: [PATCH] Extract controllers to support investments Since we're going to add an action to remove supports, having a separate controller makes things easier. Note there was a strange piece of code which assumed users were not verified if they couldn't vote investments. Now the code is also strange, since it assumes users are not verified if they can't create votes. We might need to revisit these conditions if our logic changes in the future. --- .../budgets/investments/votes_component.rb | 4 ++-- .../budgets/investments/votes_controller.rb | 21 +++++++++++++++++++ .../budgets/investments_controller.rb | 13 ------------ .../budgets/investments/votes_controller.rb | 17 +++++++++++++++ .../budgets/investments_controller.rb | 13 ------------ app/models/abilities/common.rb | 5 ++++- app/models/budget/investment.rb | 2 +- .../{vote.js.erb => votes/create.js.erb} | 0 .../{vote.js.erb => votes/create.js.erb} | 0 config/routes/budget.rb | 3 ++- config/routes/management.rb | 3 ++- spec/models/abilities/common_spec.rb | 6 +++--- 12 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 app/controllers/budgets/investments/votes_controller.rb create mode 100644 app/controllers/management/budgets/investments/votes_controller.rb rename app/views/budgets/investments/{vote.js.erb => votes/create.js.erb} (100%) rename app/views/management/budgets/investments/{vote.js.erb => votes/create.js.erb} (100%) diff --git a/app/components/budgets/investments/votes_component.rb b/app/components/budgets/investments/votes_component.rb index e7e601c18..1ab12de59 100644 --- a/app/components/budgets/investments/votes_component.rb +++ b/app/components/budgets/investments/votes_component.rb @@ -10,9 +10,9 @@ class Budgets::Investments::VotesComponent < ApplicationComponent def vote_path case namespace when "management" - vote_management_budget_investment_path(investment.budget, investment, value: "yes") + management_budget_investment_votes_path(investment.budget, investment) else - vote_budget_investment_path(investment.budget, investment, value: "yes") + budget_investment_votes_path(investment.budget, investment) end end diff --git a/app/controllers/budgets/investments/votes_controller.rb b/app/controllers/budgets/investments/votes_controller.rb new file mode 100644 index 000000000..26921d437 --- /dev/null +++ b/app/controllers/budgets/investments/votes_controller.rb @@ -0,0 +1,21 @@ +module Budgets + module Investments + class VotesController < ApplicationController + load_and_authorize_resource :budget + load_and_authorize_resource :investment, through: :budget, class: "Budget::Investment" + + def create + @investment.register_selection(current_user) + + respond_to do |format| + format.html do + redirect_to budget_investments_path(heading_id: @investment.heading.id), + notice: t("flash.actions.create.support") + end + + format.js + end + end + end + end +end diff --git a/app/controllers/budgets/investments_controller.rb b/app/controllers/budgets/investments_controller.rb index b07d25b24..6286fe13b 100644 --- a/app/controllers/budgets/investments_controller.rb +++ b/app/controllers/budgets/investments_controller.rb @@ -90,19 +90,6 @@ module Budgets redirect_to user_path(current_user, filter: "budget_investments"), notice: t("flash.actions.destroy.budget_investment") end - def vote - @investment.register_selection(current_user) - - respond_to do |format| - format.html do - redirect_to budget_investments_path(heading_id: @investment.heading.id), - notice: t("flash.actions.create.support") - end - - format.js - end - end - def suggest @resource_path_method = :namespaced_budget_investment_path @resource_relation = resource_model.where(budget: @budget).apply_filters_and_search(@budget, params, @current_filter) diff --git a/app/controllers/management/budgets/investments/votes_controller.rb b/app/controllers/management/budgets/investments/votes_controller.rb new file mode 100644 index 000000000..f96ec1ed6 --- /dev/null +++ b/app/controllers/management/budgets/investments/votes_controller.rb @@ -0,0 +1,17 @@ +class Management::Budgets::Investments::VotesController < Management::BaseController + load_resource :budget, find_by: :slug_or_id + load_resource :investment, through: :budget, class: "Budget::Investment" + + def create + @investment.register_selection(managed_user) + + respond_to do |format| + format.html do + redirect_to management_budget_investments_path(heading_id: @investment.heading.id), + notice: t("flash.actions.create.support") + end + + format.js + end + end +end diff --git a/app/controllers/management/budgets/investments_controller.rb b/app/controllers/management/budgets/investments_controller.rb index 68abcbb84..627964a69 100644 --- a/app/controllers/management/budgets/investments_controller.rb +++ b/app/controllers/management/budgets/investments_controller.rb @@ -38,19 +38,6 @@ class Management::Budgets::InvestmentsController < Management::BaseController def show end - def vote - @investment.register_selection(managed_user) - - respond_to do |format| - format.html do - redirect_to management_budget_investments_path(heading_id: @investment.heading.id), - notice: t("flash.actions.create.support") - end - - format.js - end - end - def print @investments = @investments.apply_filters_and_search(@budget, params).order(cached_votes_up: :desc).for_render.limit(15) end diff --git a/app/models/abilities/common.rb b/app/models/abilities/common.rb index dc2563492..24f86638f 100644 --- a/app/models/abilities/common.rb +++ b/app/models/abilities/common.rb @@ -99,7 +99,10 @@ module Abilities can :update, Budget::Investment, budget: { phase: "accepting" }, author_id: user.id can :suggest, Budget::Investment, budget: { phase: "accepting" } can :destroy, Budget::Investment, budget: { phase: ["accepting", "reviewing"] }, author_id: user.id - can :vote, Budget::Investment, budget: { phase: "selecting" } + can :create, ActsAsVotable::Vote, + voter_id: user.id, + votable_type: "Budget::Investment", + votable: { budget: { phase: "selecting" }} can [:show, :create], Budget::Ballot, budget: { phase: "balloting" } can [:create, :destroy], Budget::Ballot::Line, budget: { phase: "balloting" } diff --git a/app/models/budget/investment.rb b/app/models/budget/investment.rb index 75e83f5ff..79f0e6cde 100644 --- a/app/models/budget/investment.rb +++ b/app/models/budget/investment.rb @@ -277,7 +277,7 @@ class Budget def permission_problem(user) return :not_logged_in unless user return :organization if user.organization? - return :not_verified unless user.can?(:vote, Budget::Investment) + return :not_verified unless user.can?(:create, ActsAsVotable::Vote) nil end diff --git a/app/views/budgets/investments/vote.js.erb b/app/views/budgets/investments/votes/create.js.erb similarity index 100% rename from app/views/budgets/investments/vote.js.erb rename to app/views/budgets/investments/votes/create.js.erb diff --git a/app/views/management/budgets/investments/vote.js.erb b/app/views/management/budgets/investments/votes/create.js.erb similarity index 100% rename from app/views/management/budgets/investments/vote.js.erb rename to app/views/management/budgets/investments/votes/create.js.erb diff --git a/config/routes/budget.rb b/config/routes/budget.rb index bed9b7324..82794855f 100644 --- a/config/routes/budget.rb +++ b/config/routes/budget.rb @@ -2,12 +2,13 @@ resources :budgets, only: [:show, :index] do resources :groups, controller: "budgets/groups", only: [:show] resources :investments, controller: "budgets/investments" do member do - post :vote put :flag put :unflag end collection { get :suggest } + + resources :votes, controller: "budgets/investments/votes", only: :create end resource :ballot, only: :show, controller: "budgets/ballots" do diff --git a/config/routes/management.rb b/config/routes/management.rb index 7b35850b9..77afca888 100644 --- a/config/routes/management.rb +++ b/config/routes/management.rb @@ -39,8 +39,9 @@ namespace :management do end resources :investments, only: [:index, :new, :create, :show, :destroy], controller: "budgets/investments" do - post :vote, on: :member get :print, on: :collection + + resources :votes, controller: "budgets/investments/votes", only: :create end end end diff --git a/spec/models/abilities/common_spec.rb b/spec/models/abilities/common_spec.rb index 2cd3815f4..fc1bd62eb 100644 --- a/spec/models/abilities/common_spec.rb +++ b/spec/models/abilities/common_spec.rb @@ -248,9 +248,9 @@ describe Abilities::Common do it { should_not be_able_to(:create, investment_in_selecting_budget) } it { should_not be_able_to(:create, investment_in_balloting_budget) } - it { should be_able_to(:vote, investment_in_selecting_budget) } - it { should_not be_able_to(:vote, investment_in_accepting_budget) } - it { should_not be_able_to(:vote, investment_in_balloting_budget) } + it { should be_able_to(:create, user.votes.build(votable: investment_in_selecting_budget)) } + it { should_not be_able_to(:create, user.votes.build(votable: investment_in_accepting_budget)) } + it { should_not be_able_to(:create, user.votes.build(votable: investment_in_balloting_budget)) } it { should_not be_able_to(:destroy, investment_in_accepting_budget) } it { should_not be_able_to(:destroy, investment_in_reviewing_budget) }