Module: NoyoFulfillment::Mixins::NestedUnder::ClassMethods

Defined in:
lib/noyo_fulfillment/models/mixins/nested_under.rb

Instance Method Summary collapse

Instance Method Details

#nested_under(resource_klass, required: true) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/noyo_fulfillment/models/mixins/nested_under.rb', line 9

def nested_under(resource_klass, required: true)
  class_name = resource_klass.class_name
  parent_resource = class_name.underscore.downcase

  singleton_class.send(:define_method, :parent_path) do |parent_resource_id|
    resource_klass.single_resource_url(parent_resource_id)
  end

  define_method :create_url do
    parent_path = self.class.parent_path(send("#{parent_resource}_id"))
    [ parent_path, self.class.resource_path_name ].join('/')
  end

  define_method :single_resource_url do
    option_value = send("#{parent_resource}_id")
    options = { "#{parent_resource}_id".to_sym => option_value }
    self.class.single_resource_url(id, options)
  end

  singleton_class.send(:define_method, :single_resource_url) do |id, **args|
    parent_resource_id = args["#{parent_resource}_id".to_sym]
    if parent_resource_id.nil? && required
      raise "Need an #{parent_resource} ID passed in the arguments."
    end

    if !parent_resource_id.nil? || required
      [ parent_path(parent_resource_id), resource_path_name, id ].join('/')
    else
      [ resource_url, id ].join('/')
    end
  end

  define_method :resource_url do
    option_value = send("#{parent_resource}_id")
    options = { "#{parent_resource}_id".to_sym => option_value }

    self.class.resource_url(options)
  end

  singleton_class.send(:define_method, :resource_url) do |**args|
    parent_resource_id = args["#{parent_resource}_id".to_sym]
    if parent_resource_id.nil? && required
      raise "Need an #{parent_resource} ID passed in the arguments."
    end

    if !parent_resource_id.nil? || required
      [ parent_path(parent_resource_id), resource_path_name ].join('/')
    else
      "/api/v1/#{resource_path_name}"
    end
  end
end