Class: Graphiti::ActiveGraph::Resource

Inherits:
Resource
  • Object
show all
Includes:
Extensions::Resources::Authorizationable, Extensions::Resources::PayloadCombinable, Extensions::Resources::Preloadable, Extensions::Resources::Rel
Defined in:
lib/graphiti/active_graph/resource.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Extensions::Resources::Rel

#relation_resource?

Class Method Details

.custom_eagerload(sideload_name) ⇒ Object



34
35
36
# File 'lib/graphiti/active_graph/resource.rb', line 34

def self.custom_eagerload(sideload_name)
  sideload_config(sideload_name)&.custom_eagerload
end

.extra_attribute?(name) ⇒ Boolean



22
23
24
# File 'lib/graphiti/active_graph/resource.rb', line 22

def self.extra_attribute?(name)
  extra_attributes.has_key?(name)
end

.guard_nil_id!(params) ⇒ Object



19
20
# File 'lib/graphiti/active_graph/resource.rb', line 19

def self.guard_nil_id!(params)
end

.sideload_config(sideload_name) ⇒ Object



26
27
28
# File 'lib/graphiti/active_graph/resource.rb', line 26

def self.sideload_config(sideload_name)
  config[:sideloads][sideload_name]
end

.sideload_resource_class(sideload_name) ⇒ Object



30
31
32
# File 'lib/graphiti/active_graph/resource.rb', line 30

def self.sideload_resource_class(sideload_name)
  sideload_config(sideload_name)&.resource_class
end

.use_uuidObject



12
13
14
15
16
17
# File 'lib/graphiti/active_graph/resource.rb', line 12

def self.use_uuid
  define_singleton_method(:inherited) do |klass|
    super(klass)
    klass.attribute :id, :uuid
  end
end

Instance Method Details

#all_modelsObject



87
88
89
# File 'lib/graphiti/active_graph/resource.rb', line 87

def all_models
  polymorphic? ? self.class.children.map(&:model) : [model]
end

#authorize_scope_paramsObject



83
84
85
# File 'lib/graphiti/active_graph/resource.rb', line 83

def authorize_scope_params
  {}
end

#build_scope(base, query, opts = {}) ⇒ Object



42
43
44
# File 'lib/graphiti/active_graph/resource.rb', line 42

def build_scope(base, query, opts = {})
  scoping_class.new(base, self, query, opts)
end

#extra_attribute?(name) ⇒ Boolean



38
39
40
# File 'lib/graphiti/active_graph/resource.rb', line 38

def extra_attribute?(name)
  self.class.extra_attribute?(name)
end

#handle_includes(scope, includes, sorts, **opts) ⇒ Object



46
47
48
49
50
# File 'lib/graphiti/active_graph/resource.rb', line 46

def handle_includes(scope, includes, sorts, **opts)
  includes_str = JSONAPI::IncludeDirective.new(includes, retain_rel_limit: true).to_string.split(',')
  options = opts.merge(max_page_size:).merge!(authorize_scope_params)
  scope.with_ordered_associations(includes_str, sorts, options)
end

#resolve(scope) ⇒ Object



56
57
58
# File 'lib/graphiti/active_graph/resource.rb', line 56

def resolve(scope)
  adapter.resolve(scope, relation_resource?)
end

#sideload_name_arr(query) ⇒ Object



52
53
54
# File 'lib/graphiti/active_graph/resource.rb', line 52

def sideload_name_arr(query)
  query.sideloads.keys.map(&:to_sym)
end

#typecast(name, value, flag) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/graphiti/active_graph/resource.rb', line 60

def typecast(name, value, flag)
  att = get_attr!(name, flag, request: true)

  # in case of attribute is not declared on resource
  # do not throw error, return original value without typecast
  return value unless att

  type_name = att[:type]
  if flag == :filterable
    type_name = filters[name][:type]
  end
  type = Graphiti::Types[type_name]
  return if value.nil? && type[:kind] != "array"
  begin
    flag = :read if flag == :readable
    flag = :write if flag == :writable
    flag = :params if [:sortable, :filterable].include?(flag)
    type[flag][value]
  rescue => e
    raise Errors::TypecastFailed.new(self, name, value, e, type_name)
  end
end