insights-api-common 3.6.0 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4403934725fa19d242e7ff6b13e2a527d3bd900b9313f78d1d796fff8e6505ba
4
- data.tar.gz: 619b1d292841e9f43423acf51875c6ef44772966138bdf853a914738b9ddd2ad
3
+ metadata.gz: 81867b9d7ef11af5730e42563f88c156e7f51c2ef9e474990942f68535483fee
4
+ data.tar.gz: bba675752b9788c7fff6e4375b2301217a063f291713d32694a49227c8bed981
5
5
  SHA512:
6
- metadata.gz: efd17459f9aa21d14764f007e1dd037f3fe3880ac26c27c0b57c9d78a366e17fef334f544e8620545417928e70e680a736af8e5811ea4151cc46210ace82805d
7
- data.tar.gz: e152265a66258e585d625ea5cd32ff86b602af983dabaa44e0535ee9dbb55799b311ca6a3b43e605d32d5e9f9a6c9efd0e2157c514e94448c5e1d6a72c0eac46
6
+ metadata.gz: 40c3eab1a34663c42f8d85416d5b30d32d2066235dbe7bf86992860aa6a8ebd551b0c800ec80b0d8b82ef69e17707a79e2eeed4737205f678fe0c35fe41489ee
7
+ data.tar.gz: fc3a7e98ca9a116e94347ba8a09892628299c37571fa940063f5ddd95915ffc633b76170c4b738943c0ab3c4f4484f45f790e68a19494339b0876a3426232202
@@ -16,7 +16,10 @@ module Insights
16
16
  def safe_params_for_list
17
17
  check_if_openapi_enabled
18
18
  # :limit & :offset can be passed in for pagination purposes, but shouldn't show up as params for filtering purposes
19
- @safe_params_for_list ||= params.merge(params_for_polymorphic_subcollection).permit(*permitted_params, :filter => {}, :sort_by => [])
19
+ @safe_params_for_list ||= begin
20
+ sort_by_default = (params[:sort_by].kind_of?(String) || params[:sort_by].kind_of?(Array)) ? [] : {}
21
+ params.merge(params_for_polymorphic_subcollection).permit(*permitted_params, :filter => {}, :sort_by => sort_by_default)
22
+ end
20
23
  end
21
24
 
22
25
  def permitted_params
@@ -5,22 +5,6 @@ module Insights
5
5
  module RequestParameterValidation
6
6
  def self.included(other)
7
7
  other.include(OpenapiEnabled)
8
-
9
- other.before_action(:validate_request_parameters)
10
- end
11
-
12
- private
13
-
14
- def validate_request_parameters
15
- api_version = self.class.send(:api_version)[1..-1].sub(/x/, ".")
16
-
17
- api_doc.try(
18
- :validate_parameters!,
19
- request.method,
20
- request.path,
21
- api_version,
22
- params.slice(:sort_by)
23
- )
24
8
  end
25
9
  end
26
10
  end
@@ -3,12 +3,13 @@ module Insights
3
3
  module Common
4
4
  module GraphQL
5
5
  class AssociationLoader < ::GraphQL::Batch::Loader
6
- attr_reader :args, :association_name, :model
6
+ attr_reader :args, :association_name, :graphql_options, :model
7
7
 
8
- def initialize(model, association_name, args = {})
8
+ def initialize(model, association_name, args = {}, graphql_options = {})
9
9
  @model = model
10
10
  @association_name = association_name
11
11
  @args = args
12
+ @graphql_options = graphql_options
12
13
  end
13
14
 
14
15
  def cache_key(record)
@@ -24,9 +25,15 @@ module Insights
24
25
  def read_association(record)
25
26
  recs = GraphQL::AssociatedRecords.new(record.public_send(association_name))
26
27
  recs = GraphQL.search_options(recs, args)
27
- PaginatedResponse.new(
28
- :base_query => recs, :request => nil, :limit => args[:limit], :offset => args[:offset]
29
- ).records
28
+ if graphql_options[:use_pagination_v2] == true
29
+ PaginatedResponseV2.new(
30
+ :base_query => recs, :request => nil, :limit => args[:limit], :offset => args[:offset]
31
+ ).records
32
+ else
33
+ PaginatedResponse.new(
34
+ :base_query => recs, :request => nil, :limit => args[:limit], :offset => args[:offset]
35
+ ).records
36
+ end
30
37
  end
31
38
  end
32
39
  end
@@ -79,6 +79,14 @@ module Insights
79
79
  end
80
80
 
81
81
  def self.init_schema(request, schema_overlay = {})
82
+ base_init_schema(request, { :use_pagination_v2 => false }, schema_overlay)
83
+ end
84
+
85
+ def self.init_schema_v2(request, schema_overlay = {})
86
+ base_init_schema(request, { :use_pagination_v2 => true }, schema_overlay)
87
+ end
88
+
89
+ def self.base_init_schema(request, graphql_options, schema_overlay = {})
82
90
  api_version = ::Insights::API::Common::GraphQL.version(request)
83
91
  version_namespace = "V#{api_version.tr('.', 'x')}"
84
92
  openapi_doc = ::Insights::API::Common::OpenApi::Docs.instance[api_version]
@@ -27,7 +27,7 @@
27
27
  preload :<%= associations %>
28
28
 
29
29
  resolve lambda { |obj, args, _ctx|
30
- ::Insights::API::Common::GraphQL::AssociationLoader.new(<%= klass_name.constantize %>, "<%= associations %>", args).load(obj)
30
+ ::Insights::API::Common::GraphQL::AssociationLoader.new(<%= klass_name.constantize %>, "<%= associations %>", args, graphql_options).load(obj)
31
31
  }
32
32
  end
33
33
  <% end %>
@@ -40,9 +40,15 @@ QueryType = ::GraphQL::ObjectType.define do
40
40
  openapi_doc.definitions[openapi_schema_name]).apply
41
41
  end
42
42
  scope = ::Insights::API::Common::GraphQL.search_options(scope, args)
43
- ::Insights::API::Common::PaginatedResponse.new(
44
- base_query: scope, request: nil, limit: args[:limit], offset: args[:offset], sort_by: args[:sort_by]
45
- ).records
43
+ if <%= graphql_options[:use_pagination_v2] %> == true
44
+ ::Insights::API::Common::PaginatedResponseV2.new(
45
+ base_query: scope, request: nil, limit: args[:limit], offset: args[:offset], sort_by: args[:sort_by]
46
+ ).records
47
+ else
48
+ ::Insights::API::Common::PaginatedResponse.new(
49
+ base_query: scope, request: nil, limit: args[:limit], offset: args[:offset], sort_by: args[:sort_by]
50
+ ).records
51
+ end
46
52
  }
47
53
  end
48
54
  end
@@ -10,6 +10,7 @@ module Insights
10
10
  @limit = (limit || 100).to_i.clamp(1, 1000)
11
11
  @offset = (offset || 0).to_i.clamp(0, Float::INFINITY)
12
12
  @sort_by = sort_by
13
+ validate_sort_by
13
14
  end
14
15
 
15
16
  def records
@@ -96,12 +97,20 @@ module Insights
96
97
  sort_attr, sort_order = selection.split(':')
97
98
  sort_order ||= "asc"
98
99
  arel = model.arel_attribute(sort_attr)
99
- arel = arel.asc if sort_order == "asc"
100
- arel = arel.desc if sort_order == "desc"
101
- arel
100
+ (sort_order == "desc") ? arel.desc : arel.asc
102
101
  end
103
102
  end
104
103
  end
104
+
105
+ def validate_sort_by
106
+ return unless sort_by.present?
107
+ raise ArgumentError, "Invalid sort_by parameter specified \"#{sort_by}\"" unless sort_by.kind_of?(String) || sort_by.kind_of?(Array)
108
+ Array(sort_by).each { |key| validate_sort_by_directive(key) }
109
+ end
110
+
111
+ def validate_sort_by_directive(key)
112
+ raise ArgumentError, "Invalid sort_by directive specified \"#{key}\"" unless key.match?(/^[a-z\\-_]+(:asc|:desc)?$/)
113
+ end
105
114
  end
106
115
  end
107
116
  end
@@ -0,0 +1,38 @@
1
+ module Insights
2
+ module API
3
+ module Common
4
+ class PaginatedResponseV2 < PaginatedResponse
5
+ attr_reader :limit, :offset, :sort_by
6
+
7
+ private
8
+
9
+ def sort_by_options(model)
10
+ @sort_by_options ||= begin
11
+ sort_options = []
12
+ return sort_options if sort_by.blank?
13
+
14
+ sort_by.each do |sort_attr, sort_order|
15
+ sort_order = "asc" if sort_order.blank?
16
+ arel = model.arel_attribute(sort_attr)
17
+ arel = (sort_order == "desc") ? arel.desc : arel.asc
18
+ sort_options << arel
19
+ end
20
+ sort_options
21
+ end
22
+ end
23
+
24
+ def validate_sort_by
25
+ return unless sort_by.present?
26
+ raise ArgumentError, "Invalid sort_by parameter specified \"#{sort_by}\"" unless sort_by.kind_of?(ActionController::Parameters) || sort_by.kind_of?(Hash)
27
+
28
+ sort_by.each { |sort_attr, sort_order| validate_sort_by_directive(sort_attr, sort_order) }
29
+ end
30
+
31
+ def validate_sort_by_directive(sort_attr, sort_order)
32
+ order = sort_order.blank? ? "asc" : sort_order
33
+ raise ArgumentError, "Invalid sort_by directive specified \"#{sort_attr}=#{sort_order}\"" unless sort_attr.match?(/^[a-z\\-_]+$/) && order.match?(/^(asc|desc)$/)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,7 +1,7 @@
1
1
  module Insights
2
2
  module API
3
3
  module Common
4
- VERSION = "3.6.0".freeze
4
+ VERSION = "3.7.0".freeze
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insights-api-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.0
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Insights Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-28 00:00:00.000000000 Z
11
+ date: 2020-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acts_as_tenant
@@ -359,12 +359,12 @@ files:
359
359
  - lib/insights/api/common/open_api/serializer.rb
360
360
  - lib/insights/api/common/option_redirect_enhancements.rb
361
361
  - lib/insights/api/common/paginated_response.rb
362
+ - lib/insights/api/common/paginated_response_v2.rb
362
363
  - lib/insights/api/common/rbac/access.rb
363
364
  - lib/insights/api/common/rbac/policies.rb
364
365
  - lib/insights/api/common/rbac/roles.rb
365
366
  - lib/insights/api/common/rbac/seed.rb
366
367
  - lib/insights/api/common/rbac/service.rb
367
- - lib/insights/api/common/rbac/utilities.rb
368
368
  - lib/insights/api/common/rbac/validate_groups.rb
369
369
  - lib/insights/api/common/request.rb
370
370
  - lib/insights/api/common/routing.rb
@@ -1,30 +0,0 @@
1
- module Insights
2
- module API
3
- module Common
4
- module RBAC
5
- module Utilities
6
- def validate_groups
7
- Service.call(RBACApiClient::GroupApi) do |api|
8
- uuids = SortedSet.new
9
- Service.paginate(api, :list_groups, {}).each { |group| uuids << group.uuid }
10
- missing = @group_uuids - uuids
11
- raise Insights::API::Common::InvalidParameter, "The following group uuids are missing #{missing.to_a.join(",")}" unless missing.empty?
12
- end
13
- end
14
-
15
- def unique_name(resource_id, group_id)
16
- "#{@app_name}-#{@resource_name}-#{resource_id}-group-#{group_id}"
17
- end
18
-
19
- def parse_ids_from_name(name)
20
- @regexp ||= Regexp.new("#{@app_name}-#{@resource_name}-(?<resource_id>.*)-group-(?<group_uuid>.*)")
21
- result = @regexp.match(name)
22
- if result
23
- [result[:resource_id], result[:group_uuid]]
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
30
- end