podemos-info/participa2

View on GitHub
decidim-module-crowdfundings/app/controllers/decidim/crowdfundings/user_profile/contributions_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Decidim
  module Crowdfundings
    module UserProfile
      # Provides methods for the user to manage his recurrent contributions.
      class ContributionsController < Decidim::Crowdfundings::UserProfile::ApplicationController
        helper Decidim::Crowdfundings::ContributionsHelper
        helper_method :contributions, :contribution, :campaign, :contribution_form,
                      :related_active_campaigns, :campaign_path

        def index; end

        def edit
          session[return_back_session_key] = request.referer

          enforce_permission_to :update, :contribution, contribution: contribution
        end

        def update
          enforce_permission_to :update, :contribution, contribution: contribution

          UpdateContribution.call(contribution_form) do
            on(:ok) do
              redirect_to(
                session.delete(return_back_session_key) || contribution_path,
                notice: I18n.t("decidim.crowdfundings.user_profile.contributions.update.success")
              )
            end

            on(:invalid) do
              flash.now.alert = I18n.t("decidim.crowdfundings.user_profile.contributions.update.fail")
              render :edit
            end
          end
        end

        def pause
          enforce_permission_to :pause, :contribution, contribution: contribution

          UpdateContributionState.call(contribution, "paused") do
            on(:ok) do
              redirect_to contributions_path, notice: I18n.t("decidim.crowdfundings.user_profile.contributions.pause.success")
            end

            on(:ko) do
              redirect_to contributions_path, alert: I18n.t("decidim.crowdfundings.user_profile.contributions.pause.fail")
            end
          end
        end

        def resume
          enforce_permission_to :resume, :contribution, contribution: contribution

          UpdateContributionState.call(contribution, "accepted") do
            on(:ok) do
              redirect_to contributions_path, notice: I18n.t("decidim.crowdfundings.user_profile.contributions.resume.success")
            end

            on(:ko) do
              redirect_to contributions_path, alert: I18n.t("decidim.crowdfundings.user_profile.contributions.resume.fail")
            end
          end
        end

        def permission_class_chain
          [
            Decidim::Crowdfundings::Permissions,
            Decidim::Permissions
          ]
        end

        private

        def contributions
          @contributions ||= RecurrentContributions.for_user(current_user)
        end

        def contribution
          @contribution ||= Contribution.includes(:campaign).find(params[:id])
        end

        def campaign
          @campaign ||= contribution.campaign
        end

        def related_active_campaigns
          @related_active_campaigns ||= PersonPrioritizedCampaigns.new(person_participatory_spaces).query
                                                                  .active
                                                                  .where.not(id: contributions.map(&:decidim_crowdfundings_campaign_id))
        end

        def contribution_form
          @contribution_form ||= if params.include?(:contribution)
                                   form(Decidim::Crowdfundings::UserProfile::ContributionForm).from_params(params, **form_context)
                                 else
                                   form(Decidim::Crowdfundings::UserProfile::ContributionForm).from_model(contribution, **form_context)
                                 end
        end

        def form_context
          {
            campaign: campaign,
            contribution: contribution,
            payments_proxy: payments_proxy
          }
        end

        def return_back_session_key
          session[:"#{params[:controller]}_return_after_update"]
        end

        def campaign_path(campaign)
          EngineRouter.main_proxy(campaign.component).campaign_path(campaign)
        end
      end
    end
  end
end