Module: JSONAPIonify::Api::Base::ClassMethods

Included in:
JSONAPIonify::Api::Base
Defined in:
lib/jsonapionify/api/base/class_methods.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



6
7
8
# File 'lib/jsonapionify/api/base/class_methods.rb', line 6

def self.extended(klass)
  klass.class_attribute :load_path, :load_file
end

Instance Method Details

#cache(store, *args) ⇒ Object



74
75
76
# File 'lib/jsonapionify/api/base/class_methods.rb', line 74

def cache(store, *args)
  self.cache_store = ActiveSupport::Cache.lookup_store(store, *args)
end

#cache_storeObject



86
87
88
# File 'lib/jsonapionify/api/base/class_methods.rb', line 86

def cache_store
  @cache_store ||= JSONAPIonify.cache_store
end

#cache_store=(store) ⇒ Object



78
79
80
# File 'lib/jsonapionify/api/base/class_methods.rb', line 78

def cache_store=(store)
  @cache_store = store
end

#eager_loadObject



82
83
84
# File 'lib/jsonapionify/api/base/class_methods.rb', line 82

def eager_load
  resources.each(&:eager_load)
end

#fieldsObject



68
69
70
71
72
# File 'lib/jsonapionify/api/base/class_methods.rb', line 68

def fields
  resources.each_with_object({}) do |resource, fields|
    fields[resource.type.to_sym] = resource.fields
  end
end

#http_error(error, request, &block) ⇒ Object



38
39
40
# File 'lib/jsonapionify/api/base/class_methods.rb', line 38

def http_error(error, request, &block)
  Action.error(error, &block).call(resource_class, request)
end

#load_resourcesObject



23
24
25
26
27
28
29
30
31
32
# File 'lib/jsonapionify/api/base/class_methods.rb', line 23

def load_resources
  return if !load_path || resources_loaded?
  superclass.load_resources if superclass.respond_to? :load_resources
  @documentation_output = nil
  @last_signature       = resource_signature
  $".delete_if { |s| s.start_with? load_path }
  resource_files.each do |file|
    require file
  end
end

#process_index(request) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/jsonapionify/api/base/class_methods.rb', line 49

def process_index(request)
  headers                    = resource_class.new(request: request).exec { |c| c.response_headers }
  obj                        = JSONAPIonify.new_object
  obj[:meta]                 = { resources: {} }
  obj[:links]                = { self: request.url }
  obj[:meta][:documentation] = File.join(request.root_url, 'docs')
  obj[:meta][:resources]     = resources.each_with_object({}) do |resource, hash|
    if resource.actions.any? { |action| action.name == :list }
      hash[resource.type] = resource.get_url(root_url(request))
    end
  end
  Rack::Response.new.tap do |response|
    response.status = 200
    headers.each { |k, v| response[k] = v }
    response['content-type'] = 'application/vnd.api+json'
    response.write obj.to_json
  end.finish
end

#resource_filesObject



10
11
12
13
# File 'lib/jsonapionify/api/base/class_methods.rb', line 10

def resource_files
  files = Dir.glob(File.join(load_path, '**/*.rb'))
  files.concat(superclass < JSONAPIonify::Api::Base ? superclass.resource_files : []).sort
end

#resource_signatureObject



15
16
17
# File 'lib/jsonapionify/api/base/class_methods.rb', line 15

def resource_signature
  Digest::SHA2.hexdigest [*resource_files, load_file].map { |file| File.read file }.join
end

#resources_loaded?Boolean

Returns:



34
35
36
# File 'lib/jsonapionify/api/base/class_methods.rb', line 34

def resources_loaded?
  @last_signature == resource_signature
end

#root_url(request) ⇒ Object



42
43
44
45
46
47
# File 'lib/jsonapionify/api/base/class_methods.rb', line 42

def root_url(request)
  URI.parse(request.root_url).tap do |uri|
    sticky_params = sticky_params(request.params)
    uri.query     = sticky_params.to_param if sticky_params.present?
  end.to_s
end

#signatureObject



19
20
21
# File 'lib/jsonapionify/api/base/class_methods.rb', line 19

def signature
  [name, resource_signature].join('@')
end