class Lurch::Store

Public Class Methods

new(url, options = {}) click to toggle source
# File lib/lurch/store.rb, line 3
def initialize(url, options = {})
  @config = StoreConfiguration.new(options)
  @client = Client.new(url, @config)
  @store = Hash.new { |hash, key| hash[key] = {} }
end

Public Instance Methods

delete(resource, query = {}) click to toggle source
# File lib/lurch/store.rb, line 42
def delete(resource, query = {})
  url = uri_builder.resource_uri(resource.type, resource.id, query)
  @client.delete(url)

  remove(resource)
  true
end
from(type) click to toggle source
# File lib/lurch/store.rb, line 9
def from(type)
  query.type(type)
end
Also aliased as: to
insert(changeset, query = {}) click to toggle source
# File lib/lurch/store.rb, line 31
def insert(changeset, query = {})
  return save(changeset) unless changeset.id.nil?
  url = uri_builder.resources_uri(changeset.type, query)

  document = @client.post(url, payload_builder.build(changeset))
  process_document(document)
rescue Errors::JSONApiError => err
  changeset.errors = err.errors
  raise err
end
load_from_url(url) click to toggle source

@private

# File lib/lurch/store.rb, line 66
def load_from_url(url)
  document = @client.get(url)
  process_document(document)
end
peek(type, id) click to toggle source
# File lib/lurch/store.rb, line 14
def peek(type, id)
  stored_resource = resource_from_store(type, id.to_s)
  return nil if stored_resource.nil?
  Resource.new(self, stored_resource.type, stored_resource.id)
end
query() click to toggle source

@private

# File lib/lurch/store.rb, line 78
def query
  Query.new(self, inflector)
end
resource_from_store(type, id) click to toggle source

@private

# File lib/lurch/store.rb, line 72
def resource_from_store(type, id)
  normalized_type = Inflector.decode_type(type)
  @store[normalized_type][id]
end
save(changeset, query = {}) click to toggle source
# File lib/lurch/store.rb, line 20
def save(changeset, query = {})
  return insert(changeset) if changeset.id.nil?
  url = uri_builder.resource_uri(changeset.type, changeset.id, query)

  document = @client.patch(url, payload_builder.build(changeset))
  process_document(document)
rescue Errors::JSONApiError => err
  changeset.errors = err.errors
  raise err
end
to(type)
Alias for: from

Private Instance Methods

inflector() click to toggle source
# File lib/lurch/store.rb, line 84
def inflector
  @inflector ||= Inflector.new(@config.inflection_mode, @config.types_mode)
end
modify_relationship(method, resource, relationship_key, related_resources) click to toggle source
# File lib/lurch/store.rb, line 132
def modify_relationship(method, resource, relationship_key, related_resources)
  url = uri_builder.relationship_uri(resource.type, resource.id, relationship_key)
  payload = payload_builder.build(related_resources, true)
  @client.send(method, url, payload)
  true
end
payload_builder() click to toggle source
# File lib/lurch/store.rb, line 92
def payload_builder
  @payload_builder ||= PayloadBuilder.new(inflector)
end
process_document(document) click to toggle source
# File lib/lurch/store.rb, line 96
def process_document(document)
  stored_resources = store_resources(document)
  resources = stored_resources.map do |stored_resource|
    Resource.new(self, stored_resource.type, stored_resource.id)
  end

  if document["data"].is_a?(Array)
    paginator = pagination_links?(document) ? Paginator.new(self, document, inflector, @config) : nil
    Collection.new(resources, paginator)
  else
    resources.first
  end
end
push(stored_resource) click to toggle source
# File lib/lurch/store.rb, line 110
def push(stored_resource)
  @store[stored_resource.type][stored_resource.id] = stored_resource
end
remove(resource) click to toggle source
# File lib/lurch/store.rb, line 114
def remove(resource)
  @store[resource.type].delete(resource.id)
end
store_resources(document) click to toggle source
# File lib/lurch/store.rb, line 118
def store_resources(document)
  primary_data = Lurch.to_a(document["data"])

  primary_stored_resources = primary_data.map do |resource_object|
    push(StoredResource.new(self, resource_object))
  end

  Lurch.to_a(document["included"]).each do |resource_object|
    push(StoredResource.new(self, resource_object))
  end

  primary_stored_resources
end
uri_builder() click to toggle source
# File lib/lurch/store.rb, line 88
def uri_builder
  @uri_builder ||= URIBuilder.new(inflector)
end