Sha256: dbd48630bbfcea715cfc4cf68f99c5efd09060aeff3a934dc481b64c6a185f5d

Contents?: true

Size: 1.73 KB

Versions: 4

Compression:

Stored size: 1.73 KB

Contents

# frozen_string_literal: true

module GraphQL
  module Groups
    module HasAggregates
      def self.included(base)
        base.extend(ClassMethods)
      end

      module ClassMethods
        def aggregate(name, *_, **options, &block)
          aggregate_type = aggregate_type(name)

          # TODO: Handle method name conflicts, or no query method found error
          resolve_method = "resolve_#{name}".to_sym
          query_method = options[:query_method] || name
          field = aggregate_field name, aggregate_type,
                                  null: false,
                                  query_method: query_method,
                                  resolver_method: resolve_method,
                                  **options, &block
          aggregate_type.add_fields(field.own_attributes)

          # TODO: Avoid overwriting existing method
          define_method query_method do |**kwargs|
            scope = kwargs[:scope]
            attribute = kwargs[:attribute]
            scope.public_send(name, attribute)
          end

          define_method resolve_method do
            group_result[1][name]
          end
        end

        def aggregate_field(*args, **kwargs, &block)
          field_defn = Schema::AggregateField.from_options(*args, owner: self, **kwargs, &block)
          add_field(field_defn)
          field_defn
        end

        private

        def aggregate_type(name)
          # TODO: Handle no aggregate type found
          name = "#{name}AggregateType".upcase_first
          own_aggregate_types[name] ||= Class.new(Schema::AggregateType) do
            graphql_name name
          end
        end

        def own_aggregate_types
          @own_aggregate_types ||= {}
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
graphql-groups-0.1.4 lib/graphql/groups/has_aggregates.rb
graphql-groups-0.1.3 lib/graphql/groups/has_aggregates.rb
graphql-groups-0.1.2 lib/graphql/groups/has_aggregates.rb
graphql-groups-0.1.1 lib/graphql/groups/has_aggregates.rb