Module: Insights::API::Common::ApplicationControllerMixins::Parameters
- Defined in:
- lib/insights/api/common/application_controller_mixins/parameters.rb
Class Method Summary collapse
Instance Method Summary collapse
- #all_attributes_for_index ⇒ Object
- #check_if_openapi_enabled ⇒ Object
- #filtered ⇒ Object
- #pagination_limit ⇒ Object
- #pagination_offset ⇒ Object
- #params_for_create ⇒ Object
- #params_for_list ⇒ Object
- #params_for_polymorphic_subcollection ⇒ Object
- #params_for_update ⇒ Object
- #permitted_params ⇒ Object
- #primary_collection_model ⇒ Object
- #query_sort_by ⇒ Object
- #safe_params_for_list ⇒ Object
- #sanctified_permit_param(api_doc_definition, attributes) ⇒ Object
- #subcollection_foreign_key ⇒ Object
- #subcollection_foreign_key_using_through_relation ⇒ Object
- #through_relation_klass ⇒ Object
- #through_relation_name ⇒ Object
Class Method Details
.included(other) ⇒ Object
6 7 8 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 6 def self.included(other) other.include(OpenapiEnabled) end |
Instance Method Details
#all_attributes_for_index ⇒ Object
83 84 85 86 |
# File 'lib/insights/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_enabled ⇒ Object
127 128 129 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 127 def check_if_openapi_enabled raise ArgumentError, "Openapi not enabled" unless self.class.openapi_enabled end |
#filtered ⇒ Object
88 89 90 91 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 88 def filtered check_if_openapi_enabled Insights::API::Common::Filter.new(model, safe_params_for_list[:filter], api_doc_definition).apply end |
#pagination_limit ⇒ Object
93 94 95 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 93 def pagination_limit safe_params_for_list[:limit] end |
#pagination_offset ⇒ Object
97 98 99 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 97 def pagination_offset safe_params_for_list[:offset] end |
#params_for_create ⇒ Object
10 11 12 13 14 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 10 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_list ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/insights/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_subcollection ⇒ Object
31 32 33 34 35 36 37 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 31 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.[:as] {"#{as}_type" => primary_collection_model.name, "#{as}_id" => request_path_parts["primary_collection_id"]} end |
#params_for_update ⇒ Object
105 106 107 108 109 110 111 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 105 def params_for_update check_if_openapi_enabled # We already validate this with OpenAPI validator, here only to satisfy the strong parameters check attr_list = *api_doc_definition.all_attributes - api_doc_definition.read_only_attributes strong_params_hash = sanctified_permit_param(api_doc_definition, attr_list) body_params.permit(strong_params_hash) end |
#permitted_params ⇒ Object
22 23 24 25 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 22 def permitted_params check_if_openapi_enabled api_doc_definition.all_attributes + [:limit, :offset, :sort_by] + [subcollection_foreign_key] end |
#primary_collection_model ⇒ Object
39 40 41 |
# File 'lib/insights/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_by ⇒ Object
101 102 103 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 101 def query_sort_by safe_params_for_list[:sort_by] end |
#safe_params_for_list ⇒ Object
16 17 18 19 20 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 16 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 |
#sanctified_permit_param(api_doc_definition, attributes) ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 113 def sanctified_permit_param(api_doc_definition, attributes) api_doc_definition['properties'].each_with_object([]) do |(k, v), memo| next unless attributes.each { |attr| attr.include?(k) } memo << if v['type'] == 'array' { k => [] } elsif v['type'] == 'object' { k => {} } else k end end end |
#subcollection_foreign_key ⇒ Object
27 28 29 |
# File 'lib/insights/api/common/application_controller_mixins/parameters.rb', line 27 def subcollection_foreign_key "#{request_path_parts["primary_collection_name"].singularize}_id" end |
#subcollection_foreign_key_using_through_relation ⇒ Object
77 78 79 80 81 |
# File 'lib/insights/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_klass ⇒ Object
59 60 61 62 63 64 65 66 |
# File 'lib/insights/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.[:through] primary_collection_model&.reflect_on_association(through).klass end |
#through_relation_name ⇒ Object
68 69 70 71 72 73 74 75 |
# File 'lib/insights/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 |