Module: ManageIQ::API::Common::ApplicationControllerMixins::Parameters

Defined in:
lib/manageiq/api/common/application_controller_mixins/parameters.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(other) ⇒ Object



7
8
9
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 7

def self.included(other)
  other.include(OpenapiEnabled)
end

Instance Method Details

#all_attributes_for_indexObject



83
84
85
86
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 83

def all_attributes_for_index
  check_if_openapi_enabled
  api_doc_definition.all_attributes + [subcollection_foreign_key_using_through_relation]
end

#check_if_openapi_enabledObject

Raises:

  • (ArgumentError)


110
111
112
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 110

def check_if_openapi_enabled
  raise ArgumentError, "Openapi not enabled" unless self.class.openapi_enabled
end

#filteredObject



88
89
90
91
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 88

def filtered
  check_if_openapi_enabled
  ManageIQ::API::Common::Filter.new(model, safe_params_for_list[:filter], api_doc_definition).apply
end

#pagination_limitObject



93
94
95
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 93

def pagination_limit
  safe_params_for_list[:limit]
end

#pagination_offsetObject



97
98
99
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 97

def pagination_offset
  safe_params_for_list[:offset]
end

#params_for_createObject



11
12
13
14
15
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 11

def params_for_create
  check_if_openapi_enabled
  # We already validate this with OpenAPI validator, that validates every request, so we shouldn't do it again here.
  body_params.permit!
end

#params_for_listObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 43

def params_for_list
  check_if_openapi_enabled
  safe_params = safe_params_for_list.slice(*all_attributes_for_index)
  if safe_params[subcollection_foreign_key_using_through_relation]
    # If this is a through relation, we need to replace the :foreign_key by the foreign key with right table
    # information. So e.g. :container_images with :tags subcollection will have {:container_image_id => ID} and we need
    # to replace it with {:container_images_tags => {:container_image_id => ID}}, where :container_images_tags is the
    # name of the mapping table.
    safe_params[through_relation_klass.table_name.to_sym] = {
      subcollection_foreign_key_using_through_relation => safe_params.delete(subcollection_foreign_key_using_through_relation)
    }
  end

  safe_params
end

#params_for_polymorphic_subcollectionObject



32
33
34
35
36
37
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 32

def params_for_polymorphic_subcollection
  return {} unless subcollection?
  return {} unless reflection = primary_collection_model&.reflect_on_association(request_path_parts["subcollection_name"])
  return {} unless as = reflection.options[:as]
  {"#{as}_type" => primary_collection_model.name, "#{as}_id" => request_path_parts["primary_collection_id"]}
end

#params_for_updateObject



105
106
107
108
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 105

def params_for_update
  check_if_openapi_enabled
  body_params.permit(*api_doc_definition.all_attributes - api_doc_definition.read_only_attributes)
end

#permitted_paramsObject



23
24
25
26
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 23

def permitted_params
  check_if_openapi_enabled
  api_doc_definition.all_attributes + [:limit, :offset, :sort_by] + [subcollection_foreign_key]
end

#primary_collection_modelObject



39
40
41
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 39

def primary_collection_model
  @primary_collection_model ||= request_path_parts["primary_collection_name"].singularize.classify.safe_constantize
end

#query_sort_byObject



101
102
103
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 101

def query_sort_by
  safe_params_for_list[:sort_by]
end

#safe_params_for_listObject



17
18
19
20
21
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 17

def safe_params_for_list
  check_if_openapi_enabled
  # :limit & :offset can be passed in for pagination purposes, but shouldn't show up as params for filtering purposes
  @safe_params_for_list ||= params.merge(params_for_polymorphic_subcollection).permit(*permitted_params, :filter => {}, :sort_by => [])
end

#subcollection_foreign_keyObject



28
29
30
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 28

def subcollection_foreign_key
  "#{request_path_parts["primary_collection_name"].singularize}_id"
end

#subcollection_foreign_key_using_through_relationObject



77
78
79
80
81
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 77

def subcollection_foreign_key_using_through_relation
  return unless through_relation_klass

  subcollection_foreign_key
end

#through_relation_klassObject



59
60
61
62
63
64
65
66
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 59

def through_relation_klass
  check_if_openapi_enabled
  return unless subcollection?
  return unless reflection = primary_collection_model&.reflect_on_association(request_path_parts["subcollection_name"])
  return unless through = reflection.options[:through]

  primary_collection_model&.reflect_on_association(through).klass
end

#through_relation_nameObject



68
69
70
71
72
73
74
75
# File 'lib/manageiq/api/common/application_controller_mixins/parameters.rb', line 68

def through_relation_name
  check_if_openapi_enabled
  # Through relation name taken from the subcollection model side, so we can use this for table join.
  return unless through_relation_klass
  return unless through_relation_association = model.reflect_on_all_associations.detect { |x| !x.polymorphic? && x.klass == through_relation_klass }

  through_relation_association.name
end