Class: Graphiti::Sideload::BelongsTo

Inherits:
Graphiti::Sideload show all
Defined in:
lib/graphiti/sideload/belongs_to.rb

Constant Summary

Constants inherited from Graphiti::Sideload

HOOK_ACTIONS, TYPES

Instance Attribute Summary

Attributes inherited from Graphiti::Sideload

#group_name, #link, #name, #parent, #parent_resource_class, #polymorphic_as

Instance Method Summary collapse

Methods inherited from Graphiti::Sideload

after_save, #assign, assign, #assign_each, assign_each, assigned?, assigning_node, #associate, #associate_all, #association_name, #base_scope, #build_resource_proxy, #clear_resources, #create_remote_resource, current_assigning_query, #customized_base_scope?, #default_link_mode, #description, #disassociate, #errors, #fire_hooks!, #foreign_key, #future_resolve, #guarded?, hooks, #initialize, link, #link?, #link_extra_fields, #link_filter, #link_mode, #load, #non_default_options, params, #parent_resource, #performant_assign?, #polymorphic_child?, #polymorphic_has_many?, #polymorphic_has_one?, #polymorphic_parent?, pre_load, #primary_key, #readable?, #readable_guard_name, #readable_guarded?, #remote?, #render_resource_ids?, #requested_link_mode, #resolve, #resource, #resource_class, #resource_class_loaded?, #resource_ids_from_foreign_key?, #scope, scope, #shared_remote?, #single?, #sync_load, #sync_resolve, #writable?

Constructor Details

This class inherits a constructor from Graphiti::Sideload

Instance Method Details

#base_filter(parents) ⇒ Object



38
39
40
41
42
43
# File 'lib/graphiti/sideload/belongs_to.rb', line 38

def base_filter(parents)
  parent_ids = ids_for_parents(parents)
  return {primary_key_filter => Graphiti::Util::InternalParam.new(parent_ids)} if primary_key_filter == :_primary_key

  {primary_key_filter => parent_ids.join(",")}
end

#collect_foreign_keys(parents, query) ⇒ Object

The serializer reports a foreign key the record cannot answer with a better error.



67
68
69
70
71
72
# File 'lib/graphiti/sideload/belongs_to.rb', line 67

def collect_foreign_keys(parents, query)
  return unless resource_class_loaded? && resolves_public_ids?
  return unless parents.first.respond_to?(foreign_key)

  public_id_map(query).add(ids_for_parents(parents))
end

#default_render_resource_ids? ⇒ Boolean

Returns:

  • (Boolean)


6
7
8
9
10
11
12
# File 'lib/graphiti/sideload/belongs_to.rb', line 6

def default_render_resource_ids?
  case parent_resource_class&.belongs_to_resource_ids_by_default
  when :always then renderable_at_all?
  when :never then false
  else resource_ids_from_foreign_key?
  end
end

Returns:

  • (Boolean)


81
82
83
# File 'lib/graphiti/sideload/belongs_to.rb', line 81

def foreign_key_is_related_id?
  primary_key_filter == :id
end

#ids_for_parents(parents) ⇒ Object



85
86
87
88
89
90
# File 'lib/graphiti/sideload/belongs_to.rb', line 85

def ids_for_parents(parents)
  parent_ids = parents.map(&foreign_key)
  parent_ids.compact!
  parent_ids.uniq!
  parent_ids
end

#infer_foreign_key ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/graphiti/sideload/belongs_to.rb', line 92

def infer_foreign_key
  return parent.foreign_key if polymorphic_child?

  if resource.remote?
    namespace = namespace_for(resource.class)
    resource_name = resource.class.name
      .gsub("#{namespace}::", "")
      .gsub("Resource", "")
    if resource_name.include?(".remote")
      resource_name = resource_name.split(".remote")[0].split(".")[1]
    end
    :"#{resource_name.singularize.underscore}_id"
  else
    model = resource.model
    namespace = namespace_for(model)
    model_name = model.name.gsub("#{namespace}::", "")
    :"#{model_name.underscore}_id"
  end
end

Returns:

  • (Boolean)


49
50
51
# File 'lib/graphiti/sideload/belongs_to.rb', line 49

def link_hides_primary_key?
  !target_publishes_id? || resolves_public_ids?
end

#load_params(parents, query) ⇒ Object



31
32
33
34
35
36
# File 'lib/graphiti/sideload/belongs_to.rb', line 31

def load_params(parents, query)
  query.hash.tap do |hash|
    hash[:filter] ||= {}
    hash[:filter].merge!(base_filter(parents))
  end
end

#primary_key_filter ⇒ Object



74
75
76
77
78
79
# File 'lib/graphiti/sideload/belongs_to.rb', line 74

def primary_key_filter
  return primary_key unless target_publishes_id?
  return :_primary_key if primary_key == :id || primary_key.to_s == resource_class.model_primary_key.to_s

  primary_key
end

#register_public_id_source ⇒ Object



53
54
55
56
57
# File 'lib/graphiti/sideload/belongs_to.rb', line 53

def register_public_id_source
  return unless target_publishes_id? && resource_class_loaded? && parent_resource_class.model_declared?

  parent_resource_class.guard_public_id_leak!(foreign_key)
end

#renderable_at_all? ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
# File 'lib/graphiti/sideload/belongs_to.rb', line 14

def renderable_at_all?
  readable_guarded? || readable?
end

#rendered_id_for(foreign_key, query) ⇒ Object



59
60
61
62
63
64
# File 'lib/graphiti/sideload/belongs_to.rb', line 59

def rendered_id_for(foreign_key, query)
  return foreign_key unless target_publishes_id?
  return unless resolves_public_ids?

  public_id_map(query)[foreign_key]
end

#resolves_public_ids? ⇒ Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/graphiti/sideload/belongs_to.rb', line 45

def resolves_public_ids?
  @resolves_public_ids ||= target_publishes_id? && resource_class.filters.key?(primary_key_filter)
end

#resource_ids_blocker ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/graphiti/sideload/belongs_to.rb', line 18

def resource_ids_blocker
  return :unreadable unless renderable_at_all?
  return :custom_primary_key unless foreign_key_is_related_id? || resolves_public_ids?
  return :polymorphic_child if polymorphic_child?
  return :scope_block if self.class.scope_proc
  return :params_block if self.class.params_proc
  return :base_scope if @base_scope
  return :remote if remote?
  return :polymorphic_resource if resource.class.polymorphic.present?

  nil
end

#type ⇒ Object



2
3
4
# File 'lib/graphiti/sideload/belongs_to.rb', line 2

def type
  :belongs_to
end