AjuntamentdeBarcelona/decidim-barcelona

View on GitHub
decidim-ephemeral_participation/app/forms/decidim/ephemeral_participation/permissions_form_override.rb

Summary

Maintainability
A
55 mins
Test Coverage
# frozen_string_literal: true

module Decidim
  module EphemeralParticipation
    module PermissionsFormOverride
      extend ActiveSupport::Concern

      included do
        attribute :component_id, String
        attribute :resource_id, String

        validate :validate_ephemeral_participation_permissions_settings

        private

        def validate_ephemeral_participation_permissions_settings
          return if resource_permissions?
          return unless ephemeral_participation_enabled?

          permissions.values.each do |permission_form|
            next if valid_permission_form?(permission_form)

            permission_form.errors.add(:base, :invalid_ephemeral_participation_permissions, i18n_options)
          end
        end

        def resource_permissions?
          resource_id.present?
        end

        def ephemeral_participation_enabled?
          return unless component

          component.ephemeral_participation_enabled?
        end

        def valid_permission_form?(permission_form)
          handler_names = permission_form.authorization_handlers.keys & component.organization.available_authorizations

          handler_names.exclude?(component.organization.ephemeral_participation_authorization) || handler_names.size == 1
        end

        def component
          @component ||= Decidim::Component.find_by(id: component_id)
        end

        def i18n_options
          {
            ephemeral_participation_authorization: I18n.t("decidim.authorization_handlers.#{component.organization.ephemeral_participation_authorization}.name"),
            ephemeral_participation_enabled: I18n.t("decidim.components.#{component.manifest_name}.settings.global.ephemeral_participation_enabled")
          }
        end
      end
    end
  end
end