Class: JSONAPI::ResourceLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/json_api/resources/resource_loader.rb

Defined Under Namespace

Classes: MissingResourceClass

Class Method Summary collapse

Class Method Details

.active_storage_blob?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/json_api/resources/resource_loader.rb', line 90

def self.active_storage_blob?(model_class)
  defined?(::ActiveStorage) && model_class == ::ActiveStorage::Blob
end

.build_resource_class_name(resource_type, namespace) ⇒ Object



59
60
61
62
63
64
# File 'lib/json_api/resources/resource_loader.rb', line 59

def self.build_resource_class_name(resource_type, namespace)
  base = "#{resource_type.singularize.classify}Resource"
  return base unless namespace.present?

  "#{namespace.to_s.camelize}::#{base}"
end

.clear_cache!Object



26
27
28
29
# File 'lib/json_api/resources/resource_loader.rb', line 26

def clear_cache!
  @find_cache = {}
  @model_cache = {}
end

.extract_namespace_from_model(model_class) ⇒ Object



98
99
100
101
# File 'lib/json_api/resources/resource_loader.rb', line 98

def self.extract_namespace_from_model(model_class)
  parts = model_class.name.deconstantize
  parts.presence&.underscore
end

.find(resource_type, namespace: nil) ⇒ Object



32
33
34
35
# File 'lib/json_api/resources/resource_loader.rb', line 32

def self.find(resource_type, namespace: nil)
  cache_key = "#{namespace}::#{resource_type}"
  @find_cache[cache_key] ||= find_uncached(resource_type, namespace:)
end

.find_base_class_resource(model_class, effective_namespace) ⇒ Object



82
83
84
85
86
87
88
# File 'lib/json_api/resources/resource_loader.rb', line 82

def self.find_base_class_resource(model_class, effective_namespace)
  raise MissingResourceClass, model_class.name unless sti_subclass?(model_class)

  base_resource_type = model_class.base_class.name.demodulize.underscore.pluralize
  base_namespace = extract_namespace_from_model(model_class.base_class) || effective_namespace
  find(base_resource_type, namespace: base_namespace)
end

.find_flat(resource_type, namespace) ⇒ Object



52
53
54
55
56
57
# File 'lib/json_api/resources/resource_loader.rb', line 52

def self.find_flat(resource_type, namespace)
  flat_class = build_resource_class_name(resource_type, nil)
  flat_class.constantize
rescue NameError
  raise MissingResourceClass.new(resource_type, namespace:)
end

.find_for_model(model_class, namespace: nil) ⇒ Object



66
67
68
69
70
71
# File 'lib/json_api/resources/resource_loader.rb', line 66

def self.find_for_model(model_class, namespace: nil)
  return ActiveStorageBlobResource if active_storage_blob?(model_class)

  cache_key = "#{namespace}::#{model_class.name}"
  @model_cache[cache_key] ||= find_resource_for_model(model_class, namespace)
end

.find_namespaced(resource_type, namespace) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/json_api/resources/resource_loader.rb', line 43

def self.find_namespaced(resource_type, namespace)
  namespaced_class = build_resource_class_name(resource_type, namespace)
  namespaced_class.constantize
rescue NameError
  raise MissingResourceClass.new(resource_type, namespace:) unless JSONAPI.configuration.namespace_fallback

  find_flat(resource_type, namespace)
end

.find_resource_for_model(model_class, namespace) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/json_api/resources/resource_loader.rb', line 73

def self.find_resource_for_model(model_class, namespace)
  effective_namespace = namespace || extract_namespace_from_model(model_class)
  resource_type = model_class.name.demodulize.underscore.pluralize

  find(resource_type, namespace: effective_namespace)
rescue MissingResourceClass
  find_base_class_resource(model_class, effective_namespace)
end

.find_uncached(resource_type, namespace: nil) ⇒ Object



37
38
39
40
41
# File 'lib/json_api/resources/resource_loader.rb', line 37

def self.find_uncached(resource_type, namespace: nil)
  return find_namespaced(resource_type, namespace) if namespace.present?

  find_flat(resource_type, namespace)
end

.sti_subclass?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/json_api/resources/resource_loader.rb', line 94

def self.sti_subclass?(model_class)
  model_class.respond_to?(:base_class) && model_class.base_class != model_class
end