graphqr 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b962a2340faac84b6f9369947841074c52c34afa
4
- data.tar.gz: 36fdff3a030711d367bd9d585228bf6f40755053
2
+ SHA256:
3
+ metadata.gz: 56b827169ae4fc8970f688a1405c1cfce763fdb7619e2b5d64af996ae983de74
4
+ data.tar.gz: 5c6b08ea0a203fb0a3e65c7ccef3cdcf511355715fd38315ae50f536d0dcee83
5
5
  SHA512:
6
- metadata.gz: 5c68aeedd464b35f796312a9be00e7a909f3d99dea883637affde7a6ff349e44483326d5d6f5a5461ba7d5a191b2813f24403eebb7840b80e3b12e7b4d1d3509
7
- data.tar.gz: 77739403805caf9a8974f16248a1da4bf392d08044e3a682fccb38e7e29697c1cf22d78fb6fd17a43242c359f8811c0a41739b82063896ffbe5a80d2fa7f3f75
6
+ metadata.gz: 6abd868b81b35aaae90b89544e66f0a8a33e75f468ed9004e0a102d331be8e7ebead88092db3dbb6bb17edc1d1b8e1de282fa64d1e597a96af069e57379a6ffe
7
+ data.tar.gz: 5c52447a2c4df95b8a14f3caed8b84170667302381ee0e3b8d071f4aa38b06a3d2dd5446a2c7a3be07ceaeeab04d08a49984033d4dd85e0f6bec04784d5f7029
data/lib/graphqr.rb CHANGED
@@ -37,6 +37,7 @@ end
37
37
  require 'graphqr/hooks'
38
38
 
39
39
  require 'graphqr/fields/base_field'
40
+ require 'graphqr/pagination/resolvers/record_page_number_resolver'
40
41
  require 'graphqr/pagination/types/pagination_page_info_type'
41
42
  require 'graphqr/pagination/pagination_extension'
42
43
 
@@ -2,10 +2,9 @@
2
2
 
3
3
  module GraphQR
4
4
  ##
5
- # @TODO doc
5
+ # This is the base class for all resolvers defined by the `GraphQR` gem.
6
+ # It includes authorization and scoping extensions defined by the gem.
6
7
  class BaseResolver < GraphQL::Schema::Resolver
7
- ##
8
- # @TODO doc
9
8
  include GraphQR::ApplyScopes
10
9
  include GraphQR::Policies::AuthorizeGraphQL
11
10
  end
@@ -2,10 +2,34 @@
2
2
 
3
3
  module GraphQR
4
4
  ##
5
- # @TODO doc
5
+ # The `BaseResolvers` module defines methods used by other extensions to define resolver classes.
6
+ # All resolvers defined by this module's methods inherit from `GraphQR::BaseResolver`.
6
7
  module BaseResolvers
7
8
  ##
8
- # @TODO doc
9
+ # The method defines and returns a resolver class meant for resolving a paginated ActiveRecordRelation.
10
+ # The returned class implements authorization, running the `PolicyProvider`'s' `index?` action
11
+ # and `authorized_records` scope.
12
+ #
13
+ # The defined resolver does not implement `#unscoped_collection`. Define it before adding the query to the schema**
14
+ #
15
+ # ### Params:
16
+ #
17
+ # +type_class+: the `GraphQL::Schema::Object` of the ActiveRecordRelation
18
+ #
19
+ # +scope_class+: a `GraphQL::Schema::InputObject` which defines arguments to be used by `ApplyScopes`
20
+ # #### Example:
21
+ # ```
22
+ # class ObjectScope < GraphQL::Schema::InputObject
23
+ # argument :with_relation_id, ID, required: false
24
+ # ...
25
+ # end
26
+ # ```
27
+ #
28
+ # ### Example:
29
+ #
30
+ # ```
31
+ # base_collection_resolver(ObjectType, ObjectScope)
32
+ # ```
9
33
  def base_collection_resolver(type_class, scope_class)
10
34
  Class.new(GraphQR::BaseResolver) do
11
35
  type type_class.pagination_type, null: false
@@ -25,6 +49,21 @@ module GraphQR
25
49
  end
26
50
  end
27
51
 
52
+ ##
53
+ # The method defines and returns a resolver class meant for resolving a single ActiveRecord
54
+ # The returned class implements authorization, running the `PolicyProvider`'s' `show`
55
+ #
56
+ # The defined resolver does not implement `#record`. Define it before adding the query to the schema**
57
+ #
58
+ # ### Params:
59
+ #
60
+ # +type_class+: the `GraphQL::Schema::Object` of the ActiveRecord
61
+ #
62
+ # ### Example:
63
+ #
64
+ # ```
65
+ # base_resource_resolver(ObjectType)
66
+ # ```
28
67
  def base_resource_resolver(type_class)
29
68
  Class.new(GraphQR::BaseResolver) do
30
69
  type type_class, null: false
@@ -33,7 +33,10 @@ module GraphQR
33
33
  end
34
34
 
35
35
  def page_info
36
- @pagy
36
+ @pagy.tap do |pagy|
37
+ pagy.class_eval { attr_accessor :ordered_record_ids }
38
+ pagy.ordered_record_ids = @records&.all? { |r| r&.respond_to?(:id) } ? @records.map(&:id) : []
39
+ end
37
40
  end
38
41
  end
39
42
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQR
4
+ module Pagination
5
+ module Resolvers
6
+ ##
7
+ # This is a resolver that receives the id of an object and returns the page number
8
+ # in which the object is located.
9
+ class RecordPageNumberResolver < ::GraphQL::Schema::Resolver
10
+ INDEX_OFFSET = 1
11
+
12
+ type Int, null: true
13
+
14
+ argument :record_id, ID, required: true
15
+
16
+ def resolve(record_id:)
17
+ per_page = object.vars[:items]
18
+ records_ids = object.ordered_record_ids
19
+ record_index = records_ids.find_index(record_id.to_i)
20
+
21
+ return if per_page.zero? || records_ids.blank? || record_index.blank?
22
+
23
+ record_position = (record_index + INDEX_OFFSET).to_f
24
+ (record_position / per_page).ceil
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -25,6 +25,7 @@ module GraphQR
25
25
  field :next_page, Int, null: true,
26
26
  method: :next,
27
27
  description: 'The previous page number or nil if there is no previous page'
28
+ field :record_page_number, resolver: GraphQR::Pagination::Resolvers::RecordPageNumberResolver
28
29
  end
29
30
  end
30
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GraphQR
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.7'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphqr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Puyol
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-07-18 00:00:00.000000000 Z
13
+ date: 2020-02-04 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: graphql
@@ -152,6 +152,7 @@ files:
152
152
  - lib/graphqr/pagination.rb
153
153
  - lib/graphqr/pagination/pagination_extension.rb
154
154
  - lib/graphqr/pagination/resolvers/pagy_resolver.rb
155
+ - lib/graphqr/pagination/resolvers/record_page_number_resolver.rb
155
156
  - lib/graphqr/pagination/types/pagination_page_info_type.rb
156
157
  - lib/graphqr/permitted_fields_extension.rb
157
158
  - lib/graphqr/policies/authorize_graphql.rb
@@ -181,8 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
181
182
  - !ruby/object:Gem::Version
182
183
  version: '0'
183
184
  requirements: []
184
- rubyforge_project:
185
- rubygems_version: 2.6.14
185
+ rubygems_version: 3.0.6
186
186
  signing_key:
187
187
  specification_version: 4
188
188
  summary: Extensions and helpers for graphql-ruby