Module: Shutl::Resource::RestClassMethods

Defined in:
lib/shutl/resource/rest_class_methods.rb

Defined Under Namespace

Classes: RestCollection

Instance Method Summary collapse

Instance Method Details

#add_resource_id_to(args = {}) ⇒ Object



190
191
192
193
194
195
196
# File 'lib/shutl/resource/rest_class_methods.rb', line 190

def add_resource_id_to args={}
  args = args.dup.with_indifferent_access
  unless args.has_key? "id"
    args.merge!({ "id" => args[resource_id_name] })
  end
  args
end

#all(args = {}) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/shutl/resource/rest_class_methods.rb', line 92

def all(args = {})
  partition    = args.partition { |key, value| !remote_collection_url.index(":#{key}").nil? }

  url_args = partition.first.inject({}) { |h, pair| h[pair.first] = pair.last; h }
  params   = partition.last.inject({}) { |h, pair| h[pair.first] = pair.last; h }

  url      = generate_collection_url url_args, params
  response = connection.get(url) do |req|
    req.headers = generate_request_header(header_options(args))
  end

  check_fail response, "Failed to find all #{name.downcase.pluralize}"

  response_object = response.body[@resource_name.pluralize].map do |h|
    new_object(args.merge(h), response.body)
  end
  if order_collection?
    response_object.sort! do |a,b|
      str_a = a.send(@order_collection_by).to_s
      str_b = b.send(@order_collection_by).to_s
      str_a.casecmp(str_b)
    end
  end

  RestCollection.new(response_object, response.body['pagination'])
end

#base_uri(uri) ⇒ Object



4
5
6
# File 'lib/shutl/resource/rest_class_methods.rb', line 4

def base_uri uri
  @base_uri = uri
end

#collection_url(url) ⇒ Object



170
171
172
# File 'lib/shutl/resource/rest_class_methods.rb', line 170

def collection_url(url)
  @remote_collection_url = url
end

#connectionObject



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/shutl/resource/rest_class_methods.rb', line 8

def connection
  @connection ||= Faraday.new(:url => @base_uri || Shutl::Resource.base_uri) do |faraday|
    faraday.request :url_encoded # form-encode POST params


    if Shutl::Resource.logger
      faraday.use :default_logger, logger: Shutl::Resource.logger
    end

    faraday.response :json
    faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
  end
end

#convert_new_id(attributes) ⇒ Object



182
183
184
185
186
187
188
# File 'lib/shutl/resource/rest_class_methods.rb', line 182

def convert_new_id attributes
  if attributes[:new_id]
    attributes = attributes.clone.tap { |h| h[:id] = h[:new_id]; h.delete(:new_id) }
  end

  attributes
end

#create(attributes = {}, options = {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/shutl/resource/rest_class_methods.rb', line 44

def create attributes = {}, options = {}
  url = generate_collection_url attributes
  attributes.delete "response"

  response = connection.post(url) do |req|
    req.headers = generate_request_header(header_options(options))
    req.body = { @resource_name => attributes }.to_json
  end

  check_fail response, "Create failed"

  body     = response.body || {}
  attributes = body[@resource_name] || {}

  new_object attributes, body
end

#destroy(instance, options = {}) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/shutl/resource/rest_class_methods.rb', line 61

def destroy instance, options = {}
  failure_message = "Failed to destroy #{name.downcase.pluralize}"

  perform_action(
    instance,
    :delete,
    {}.to_json,
    generate_request_header(header_options(options)),
    failure_message
  ).success?
end

#find(args = {}, params = {}) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/shutl/resource/rest_class_methods.rb', line 22

def find(args = {}, params = {})
  params = args if @singular_resource

  if @singular_resource
    url    = singular_member_url params
  elsif !args.kind_of?(Hash)
    id   = args
    args = { resource_id_name => id }
    url  = member_url args.dup, params
  else
    url = member_url args.dup, params
  end
  response     = connection.get(url) do |req|
    req.headers = generate_request_header(header_options(params))
  end

  check_fail response, "Failed to find #{name}! args: #{args}, params: #{params}"

  including_parent_attributes = response.body[@resource_name].merge args
  new_object including_parent_attributes, response.body
end

#generate_collection_url(*args) ⇒ Object



214
215
216
# File 'lib/shutl/resource/rest_class_methods.rb', line 214

def generate_collection_url *args
  generate_url! remote_collection_url, *args
end

#member_url(*args) ⇒ Object



202
203
204
205
206
207
208
209
210
211
212
# File 'lib/shutl/resource/rest_class_methods.rb', line 202

def member_url *args
  attributes = args.first.with_indifferent_access

  unless attributes[resource_id_name] ||= attributes[:id]
    raise ArgumentError, "Missing resource id with name: `#{resource_id_name}' for #{self}"
  end

  args[0] = attributes

  generate_url! remote_resource_url, *(args.dup)
end

#order_collection_by(field) ⇒ Object



178
179
180
# File 'lib/shutl/resource/rest_class_methods.rb', line 178

def order_collection_by(field)
  @order_collection_by = field
end

#remote_collection_urlObject



162
163
164
# File 'lib/shutl/resource/rest_class_methods.rb', line 162

def remote_collection_url
  @remote_collection_url ||= "/#{@resource_name.pluralize}"
end

#remote_resource_urlObject



166
167
168
# File 'lib/shutl/resource/rest_class_methods.rb', line 166

def remote_resource_url
  @remote_resource_url ||= "#{remote_collection_url}/:#{resource_id_name}"
end

#resource_id(variable_name) ⇒ Object



154
155
156
# File 'lib/shutl/resource/rest_class_methods.rb', line 154

def resource_id(variable_name)
  instance_variable_set :@resource_id, variable_name
end

#resource_id_nameObject



158
159
160
# File 'lib/shutl/resource/rest_class_methods.rb', line 158

def resource_id_name
  instance_variable_get(:@resource_id).to_sym
end

#resource_name(name) ⇒ Object



150
151
152
# File 'lib/shutl/resource/rest_class_methods.rb', line 150

def resource_name(name)
  instance_variable_set :@resource_name, name
end

#resource_url(url) ⇒ Object



174
175
176
# File 'lib/shutl/resource/rest_class_methods.rb', line 174

def resource_url(url)
  @remote_resource_url = url
end

#save(instance, options = {}) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/shutl/resource/rest_class_methods.rb', line 73

def save instance, options = {}
  attributes = instance.attributes rescue instance

  body = { @resource_name => convert_new_id(attributes) }.to_json

  response = perform_action(instance,
                            :put,
                            body,
                            generate_request_header(header_options(options)),
                            "Save failed")

  response.success?
end

#singular_member_url(params = {}) ⇒ Object



198
199
200
# File 'lib/shutl/resource/rest_class_methods.rb', line 198

def singular_member_url params={}
  generate_url! "/#{@resource_name}", params
end

#singular_resourceObject



146
147
148
# File 'lib/shutl/resource/rest_class_methods.rb', line 146

def singular_resource
  @singular_resource = true
end

#update(args, options = {}) ⇒ Object



87
88
89
# File 'lib/shutl/resource/rest_class_methods.rb', line 87

def update args, options = {}
  save args, options
end