Module: Shutl::Resource::RestClassMethods
- Defined in:
- lib/shutl/resource/rest_class_methods.rb
Defined Under Namespace
Classes: RestCollection
Class Method Summary collapse
Instance Method Summary collapse
- #add_resource_id_to(args = {}) ⇒ Object
- #all(args = {}) ⇒ Object
- #base_uri(uri) ⇒ Object
- #collection_url(url) ⇒ Object
- #connection ⇒ Object
- #convert_new_id(attributes) ⇒ Object
- #create(attributes = {}, options = {}) ⇒ Object
- #destroy(instance, options = {}) ⇒ Object
- #find(args = {}, params = {}) ⇒ Object
- #generate_collection_url(*args) ⇒ Object
- #member_url(*args) ⇒ Object
- #order_collection_by(field) ⇒ Object
- #remote_collection_url ⇒ Object
- #remote_resource_url ⇒ Object
- #resource_id(variable_name) ⇒ Object
- #resource_id_name ⇒ Object
- #resource_name(name) ⇒ Object
- #resource_url(url) ⇒ Object
- #save(instance, options = {}) ⇒ Object
- #set_proxy(uri) ⇒ Object
- #singular_member_url(params) ⇒ Object
- #singular_resource ⇒ Object
- #split_hash(h) ⇒ Object
- #split_header_args(args) ⇒ Object
- #split_url_args(args) ⇒ Object
- #update(args, options = {}) ⇒ Object
Class Method Details
.from_user=(email) ⇒ Object
243 244 245 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 243 def self.from_user= email Thread.current[:user_email] = email end |
Instance Method Details
#add_resource_id_to(args = {}) ⇒ Object
214 215 216 217 218 219 220 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 214 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
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 117 def all(args = {}) header_args, non_header_args = split_header_args args url_args, params = split_url_args non_header_args url = generate_collection_url url_args, params response = connection.get(url) do |req| req.headers = generate_request_header((header_args)) end check_fail response, "Failed to find all #{name.downcase.pluralize}" response_object = response.body[@resource_name.pluralize].map do |h| new_object(non_header_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
6 7 8 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 6 def base_uri(uri) @base_uri = uri end |
#collection_url(url) ⇒ Object
194 195 196 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 194 def collection_url(url) @remote_collection_url = url end |
#connection ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 14 def connection @connection ||= Faraday.new(url: target_url, proxy: proxy_url) 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 :httpclient do |client| # yields HTTPClient client.keep_alive_timeout = 600 client.ssl_config.timeout = 600 end end end |
#convert_new_id(attributes) ⇒ Object
206 207 208 209 210 211 212 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 206 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
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 53 def create attributes = {}, = {} url = generate_collection_url attributes attributes.delete "response" response = connection.post(url) do |req| req.headers = generate_request_header(()) 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
70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 70 def destroy instance, = {} = "Failed to destroy #{name.downcase.pluralize}" perform_action( instance, :delete, {}.to_json, generate_request_header(()), ).success? end |
#find(args = {}, params = {}) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 31 def find(args = {}, params = {}) if @singular_resource params = args 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((params)) end check_fail response, "Failed to find #{name}! args: #{args}, params: #{params}" parent_attributes = response.body[@resource_name] || {} including_parent_attributes = parent_attributes.merge args new_object including_parent_attributes, response.body end |
#generate_collection_url(*args) ⇒ Object
238 239 240 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 238 def generate_collection_url *args generate_url! remote_collection_url, *args end |
#member_url(*args) ⇒ Object
226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 226 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
202 203 204 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 202 def order_collection_by(field) @order_collection_by = field end |
#remote_collection_url ⇒ Object
186 187 188 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 186 def remote_collection_url @remote_collection_url ||= "/#{@resource_name.pluralize}" end |
#remote_resource_url ⇒ Object
190 191 192 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 190 def remote_resource_url @remote_resource_url ||= "#{remote_collection_url}/:#{resource_id_name}" end |
#resource_id(variable_name) ⇒ Object
178 179 180 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 178 def resource_id(variable_name) instance_variable_set :@resource_id, variable_name end |
#resource_id_name ⇒ Object
182 183 184 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 182 def resource_id_name instance_variable_get(:@resource_id).to_sym end |
#resource_name(name) ⇒ Object
174 175 176 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 174 def resource_name(name) instance_variable_set :@resource_name, name end |
#resource_url(url) ⇒ Object
198 199 200 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 198 def resource_url(url) @remote_resource_url = url end |
#save(instance, options = {}) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 82 def save instance, = {} attributes = instance.attributes rescue instance body = { @resource_name => convert_new_id(attributes) }.to_json response = perform_action(instance, .fetch("method", :put), body, generate_request_header(()), "Save failed") response.success? end |
#set_proxy(uri) ⇒ Object
10 11 12 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 10 def set_proxy(uri) @proxy_uri = uri end |
#singular_member_url(params) ⇒ Object
222 223 224 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 222 def singular_member_url params generate_url! "/#{@resource_name}", {}, params end |
#singular_resource ⇒ Object
170 171 172 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 170 def singular_resource @singular_resource = true end |
#split_hash(h) ⇒ Object
100 101 102 103 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 100 def split_hash h partitions = h.partition { |key, value| yield key, value } [Hash[partitions.first].with_indifferent_access, Hash[partitions.last].with_indifferent_access] end |
#split_header_args(args) ⇒ Object
111 112 113 114 115 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 111 def split_header_args args split_hash(args) do |key, value| %(auth headers from).include?(key.to_s) end end |
#split_url_args(args) ⇒ Object
105 106 107 108 109 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 105 def split_url_args args split_hash(args) do |key, value| !remote_collection_url.index(":#{key}").nil? end end |
#update(args, options = {}) ⇒ Object
96 97 98 |
# File 'lib/shutl/resource/rest_class_methods.rb', line 96 def update args, = {} save args, end |