class FunWithJsonApi::SchemaValidators::CheckCollectionHasAllMembers

Attributes

collection[R]
deserializer[R]
document_ids[R]
prefix[R]

Public Class Methods

call(...) click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 6
def self.call(...)
  new(...).call
end
new(collection, document_ids, deserializer, prefix: '/data') click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 17
def initialize(collection, document_ids, deserializer, prefix: '/data')
  @collection = collection
  @document_ids = document_ids
  @deserializer = deserializer
  @prefix = prefix
end

Public Instance Methods

call() click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 24
def call
  if collection.size != document_ids.size
    collection_ids = deserializer.format_collection_ids(collection)
    raise build_missing_resources_error(collection_ids)
  end
end
resource_type() click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 31
def resource_type
  deserializer.type
end

Private Instance Methods

build_missing_resource_payload(collection_ids, resource_id, index) click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 48
def build_missing_resource_payload(collection_ids, resource_id, index)
  unless collection_ids.include?(resource_id)
    ExceptionPayload.new(
      pointer: "#{prefix}/#{index}",
      detail: missing_resource_message(resource_id)
    )
  end
end
build_missing_resources_error(collection_ids) click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 37
def build_missing_resources_error(collection_ids)
  payload = document_ids.each_with_index.map do |resource_id, index|
    build_missing_resource_payload(collection_ids, resource_id, index)
  end.reject(&:nil?)

  missing_values = document_ids.reject { |value| collection_ids.include?(value.to_s) }
  message = "Couldn't find #{resource_class} items with "\
            "#{id_param} in #{missing_values.inspect}"
  Exceptions::MissingResource.new(message, payload)
end
missing_resource_message(resource_id) click to toggle source
# File lib/fun_with_json_api/schema_validators/check_collection_has_all_members.rb, line 57
def missing_resource_message(resource_id)
  I18n.t(
    :missing_resource,
    resource: resource_type,
    resource_id: resource_id,
    scope: 'fun_with_json_api.find_collection_from_document'
  )
end