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
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
pagination_links?(document)
click to toggle source
# File lib/lurch/store.rb, line 139 def pagination_links?(document) links = document["links"] links && ( links["first"] || links["last"] || links["next"] || links["prev"] ) 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