module JSONAPI::ActiveStorage::Detection
def attachment?(association_name, model_class)
def attachment?(association_name, model_class) return false unless defined?(::ActiveStorage) model_class.respond_to?(:reflect_on_attachment) && model_class.reflect_on_attachment(association_name.to_sym).present? end
def blob_type?(type)
def blob_type?(type) return false unless defined?(::ActiveStorage) type.to_s == "active_storage_blobs" end
def filter_from_includes(includes_hash, current_model_class)
def filter_from_includes(includes_hash, current_model_class) return {} unless defined?(::ActiveStorage) includes_hash.each_with_object({}) do |(key, value), filtered| process_include_entry(key, value, current_model_class, filtered) end end
def filter_include_value(value, association)
def filter_include_value(value, association) return value unless value.is_a?(Hash) && value.any? return value if association.polymorphic? nested_filtered = filter_from_includes(value, association.klass) nested_filtered.any? ? nested_filtered : nil end
def filter_polymorphic_from_includes(includes_hash, current_model_class)
def filter_polymorphic_from_includes(includes_hash, current_model_class) includes_hash.each_with_object({}) do |(key, value), filtered| process_polymorphic_include(key, value, current_model_class, filtered) end end
def process_include_entry(key, value, current_model_class, filtered)
def process_include_entry(key, value, current_model_class, filtered) return if current_model_class.reflect_on_attachment(key).present? association = current_model_class.reflect_on_association(key) return if association.nil? result = filter_include_value(value, association) filtered[key] = result unless result.nil? end
def process_polymorphic_include(key, value, model_class, filtered)
def process_polymorphic_include(key, value, model_class, filtered) association = model_class.reflect_on_association(key) return unless association && !association.polymorphic? result = resolve_polymorphic_value(value, association) filtered[key] = result if result end
def resolve_polymorphic_value(value, association)
def resolve_polymorphic_value(value, association) return value unless value.is_a?(Hash) && value.any? nested = filter_polymorphic_from_includes(value, association.klass) nested.any? ? nested : nil end