Module: Grape::Roar::Extensions::Relations::DSLMethods

Defined in:
lib/grape/roar/extensions/relations/dsl_methods.rb

Instance Method Summary collapse

Instance Method Details



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 8

def link_relation(relation, is_collection = false, dsl = self)
  send(is_collection ? :links : :link, relation) do |opts|
    data = represented.send(relation)

    mapped = Array.wrap(data).map do |object|
      href = [dsl.map_base_url.call(opts),
              dsl.map_resource_path.call(opts, object, relation)].join('/')

      is_collection ? { href: href } : href
    end

    is_collection ? mapped : mapped.first
  end
end


23
24
25
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 23

def link_self
  relational_mapper[:self] = { relation_kind: :self }
end

#map_base_url(&block) ⇒ Object



27
28
29
30
31
32
33
34
35
36
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 27

def map_base_url(&block)
  @map_base_url ||= if block.nil?
                      proc do |opts|
                        request = Grape::Request.new(opts[:env])
                        "#{request.base_url}#{request.script_name}"
                      end
                    else
                      block
                    end
end

#map_resource_path(&block) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 46

def map_resource_path(&block)
  @map_resource_path ||= if block.nil?
                           proc do |_opts, object, relation_name|
                             "#{relation_name}/#{object.id}"
                           end
                         else
                           block
                         end
end

#map_self_url(dsl = self) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 38

def map_self_url(dsl = self)
  link :self do |opts|
    resource_path = dsl.name_for_represented(represented)
    [dsl.map_base_url.call(opts),
     "#{resource_path}/#{represented.try(:id)}"].join('/')
  end
end

#name_for_represented(represented) ⇒ Object



56
57
58
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 56

def name_for_represented(represented)
  relational_mapper.adapter.name_for_represented(represented)
end

#relation(relation_kind, rname, opts = {}) ⇒ Object



60
61
62
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 60

def relation(relation_kind, rname, opts = {})
  relational_mapper[rname] = opts.merge(relation_kind: relation_kind)
end

#represent(object, _options) ⇒ Object



64
65
66
67
68
# File 'lib/grape/roar/extensions/relations/dsl_methods.rb', line 64

def represent(object, _options)
  object.extend(self) unless is_a?(Class)
  map_relations(object) unless relations_mapped
  is_a?(Class) ? super : object
end