Sha256: c694a4f700a159003e32566db7719f688abe1be5437b0f5f9339d237050f275d

Contents?: true

Size: 1.88 KB

Versions: 37

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true

module Decidim
  module Core
    # A very basic resolver for the GraphQL endpoint for listing components
    # Used in the keyword that lists some type of a specific component.
    # For instance, "proposals" if it is a Proposal:
    #
    # participatoryProcesses {
    #   components {
    #   ... on Proposals {
    #        proposals(...)
    #     }
    #   }
    # }
    #
    # Needs to be extended and add arguments
    # Usually something like:
    #
    #   class ProposalListHelper < Decidim::Core::ComponentListBase
    #     argument :order, ProposalInputSort, "Provides several methods to order the results"
    #     argument :filter, ProposalInputFilter, "Provides several methods to filter the results"
    #   end
    #
    # For an example check
    # decidim-proposals/app/types/decidim/proposals/proposals_type.rb
    #
    class ComponentListBase
      include NeedsApiFilterAndOrder
      include NeedsApiDefaultOrder
      attr_reader :model_class

      def initialize(model_class:)
        @model_class = model_class
      end

      def call(component, args, _ctx)
        @query = query_scope.where(component: component)
                            .includes(:component)

        add_filter_keys(args[:filter])
        order = filter_keys_by_settings(args[:order].to_h, component)
        add_order_keys(order)
        add_default_order
        @query
      end

      # By default, any model uses the default scope for queries
      # Particular implementations may restrict this by adding
      # additional constrains
      def query_scope
        model_class
      end

      private

      def filter_keys_by_settings(kwargs, component)
        kwargs.select do |key, _value|
          case key
          when :vote_count
            !component.current_settings.votes_hidden?
          else
            true
          end
        end
      end
    end
  end
end

Version data entries

37 entries across 37 versions & 1 rubygems

Version Path
decidim-core-0.27.9 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.8 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.7 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.6 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.10 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.9 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.5 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.8 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.4 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.3 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.7 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.5 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.2 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.1 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.4 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.0 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.3 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.0.rc2 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.27.0.rc1 lib/decidim/api/functions/component_list_base.rb
decidim-core-0.26.2 lib/decidim/api/functions/component_list_base.rb