Class: RestfulResource::Base
- Inherits:
-
OpenObject
- Object
- OpenObject
- RestfulResource::Base
- Extended by:
- Associations
- Defined in:
- lib/restful_resource/base.rb
Constant Summary collapse
- Deprecator =
ActiveSupport::Deprecation.new('soon', 'restful_resource')
Class Method Summary collapse
- .action(action_name) ⇒ Object
- .action_prefix=(action_prefix) ⇒ Object
- .all(**params) ⇒ Object
- .base_url ⇒ Object
- .collection_url(**params) ⇒ Object
- .configure(base_url: nil, username: nil, password: nil, auth_token: nil, logger: nil, cache_store: nil, instrumentation: {}, timeout: nil, open_timeout: nil, faraday_config: nil, faraday_options: {}, default_headers: {}) ⇒ Object
- .delete(id, **params) ⇒ Object
- .fetch_all!(conditions = {}) ⇒ Object
- .find(id, **params) ⇒ Object
- .format_params(**params) ⇒ Object
- .get(**params) ⇒ Object
- .http ⇒ Object
- .member_url(id, **params) ⇒ Object
- .merge_url_paths(uri, *paths) ⇒ Object
- .new_collection(json) ⇒ Object
- .paginate_response(response) ⇒ Object
- .parse_json(json) ⇒ Object
- .patch(id, data: {}, headers: {}, **params) ⇒ Object
- .post(data: {}, headers: {}, **params) ⇒ Object
- .put(id, data: {}, headers: {}, **params) ⇒ Object
- .replace_parameters(url, **params) ⇒ Object
- .resource_path(url) ⇒ Object
- .where(**params) ⇒ Object
Methods included from Associations
Methods inherited from OpenObject
#==, #as_json, #eql?, #equal?, #hash, #initialize, #method_missing, #respond_to?
Constructor Details
This class inherits a constructor from RestfulResource::OpenObject
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class RestfulResource::OpenObject
Class Method Details
.action(action_name) ⇒ Object
104 105 106 107 108 |
# File 'lib/restful_resource/base.rb', line 104 def self.action(action_name) clone = self.clone clone.action_prefix = action_name clone end |
.action_prefix=(action_prefix) ⇒ Object
110 111 112 |
# File 'lib/restful_resource/base.rb', line 110 def self.action_prefix=(action_prefix) @action_prefix = action_prefix.to_s end |
.all(**params) ⇒ Object
100 101 102 |
# File 'lib/restful_resource/base.rb', line 100 def self.all(**params) where(**params) end |
.base_url ⇒ Object
131 132 133 134 135 136 137 |
# File 'lib/restful_resource/base.rb', line 131 def self.base_url result = @base_url result = superclass.base_url if result.nil? && superclass.respond_to?(:base_url) raise 'Base url missing' if result.nil? result end |
.collection_url(**params) ⇒ Object
139 140 141 142 |
# File 'lib/restful_resource/base.rb', line 139 def self.collection_url(**params) url = merge_url_paths(base_url, @resource_path, @action_prefix) replace_parameters(url, **params) end |
.configure(base_url: nil, username: nil, password: nil, auth_token: nil, logger: nil, cache_store: nil, instrumentation: {}, timeout: nil, open_timeout: nil, faraday_config: nil, faraday_options: {}, default_headers: {}) ⇒ Object
7 8 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 |
# File 'lib/restful_resource/base.rb', line 7 def self.configure(base_url: nil, username: nil, password: nil, auth_token: nil, logger: nil, cache_store: nil, instrumentation: {}, timeout: nil, open_timeout: nil, faraday_config: nil, faraday_options: {}, default_headers: {} ) @base_url = URI.parse(base_url) @http = RestfulResource::HttpClient.new(username: username, password: password, auth_token: auth_token, logger: logger, cache_store: cache_store, timeout: timeout, open_timeout: open_timeout, instrumentation: instrumentation, faraday_config: faraday_config, faraday_options: , default_headers: default_headers ) end |
.delete(id, **params) ⇒ Object
63 64 65 66 67 |
# File 'lib/restful_resource/base.rb', line 63 def self.delete(id, **params) , = format_params(**params) response = http.delete(member_url(id, **), **) new(parse_json(response.body)) end |
.fetch_all!(conditions = {}) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/restful_resource/base.rb', line 114 def self.fetch_all!(conditions = {}) Enumerator.new do |y| next_page = 1 begin resources = where(**conditions.merge(page: next_page)) resources.each do |resource| y << resource end next_page = resources.next_page end while !next_page.nil? end end |
.find(id, **params) ⇒ Object
41 42 43 44 45 46 |
# File 'lib/restful_resource/base.rb', line 41 def self.find(id, **params) , = format_params(**params) response = http.get(member_url(id, **), **) new(parse_json(response.body)) end |
.format_params(**params) ⇒ Object
144 145 146 147 148 149 150 151 152 |
# File 'lib/restful_resource/base.rb', line 144 def self.format_params(**params) headers = params.delete(:headers) || {} headers[:cache_control] = 'no-cache' if params.delete(:no_cache) open_timeout = params.delete(:open_timeout) timeout = params.delete(:timeout) [params, { headers: headers, open_timeout: open_timeout, timeout: timeout }] end |
.get(**params) ⇒ Object
56 57 58 59 60 61 |
# File 'lib/restful_resource/base.rb', line 56 def self.get(**params) , = format_params(**params) response = http.get(collection_url(**), **) new(parse_json(response.body)) end |
.http ⇒ Object
127 128 129 |
# File 'lib/restful_resource/base.rb', line 127 def self.http @http || superclass.http end |
.member_url(id, **params) ⇒ Object
158 159 160 161 162 163 |
# File 'lib/restful_resource/base.rb', line 158 def self.member_url(id, **params) raise ResourceIdMissingError if id.blank? url = merge_url_paths(base_url, @resource_path, CGI.escape(id.to_s), @action_prefix) replace_parameters(url, **params) end |
.merge_url_paths(uri, *paths) ⇒ Object
154 155 156 |
# File 'lib/restful_resource/base.rb', line 154 def self.merge_url_paths(uri, *paths) uri.merge(paths.compact.join('/')).to_s end |
.new_collection(json) ⇒ Object
165 166 167 168 169 |
# File 'lib/restful_resource/base.rb', line 165 def self.new_collection(json) json.map do |element| new(element) end end |
.paginate_response(response) ⇒ Object
197 198 199 200 201 202 203 204 205 206 |
# File 'lib/restful_resource/base.rb', line 197 def self.paginate_response(response) links_header = response.headers[:links] links = LinkHeader.parse(links_header) prev_url = links.find_link(%w[rel prev]).try(:href) next_url = links.find_link(%w[rel next]).try(:href) array = parse_json(response.body).map { |attributes| new(attributes) } PaginatedArray.new(array, previous_page_url: prev_url, next_page_url: next_url, total_count: response.headers[:x_total_count]) end |
.parse_json(json) ⇒ Object
171 172 173 174 175 |
# File 'lib/restful_resource/base.rb', line 171 def self.parse_json(json) return nil if json.strip.empty? ActiveSupport::JSON.decode(json) end |
.patch(id, data: {}, headers: {}, **params) ⇒ Object
69 70 71 72 73 74 75 76 77 |
# File 'lib/restful_resource/base.rb', line 69 def self.patch(id, data: {}, headers: {}, **params) , = format_params(**params) .delete(:headers) url = member_url(id, **) response = http.patch(url, data: data, headers: headers, **) new(parse_json(response.body)) end |
.post(data: {}, headers: {}, **params) ⇒ Object
89 90 91 92 93 94 95 96 97 98 |
# File 'lib/restful_resource/base.rb', line 89 def self.post(data: {}, headers: {}, **params) , = format_params(**params) .delete(:headers) url = collection_url(**) response = http.post(url, data: data, headers: headers, **) new(parse_json(response.body)) end |
.put(id, data: {}, headers: {}, **params) ⇒ Object
79 80 81 82 83 84 85 86 87 |
# File 'lib/restful_resource/base.rb', line 79 def self.put(id, data: {}, headers: {}, **params) , = format_params(**params) .delete(:headers) url = member_url(id, **) response = http.put(url, data: data, headers: headers, **) new(parse_json(response.body)) end |
.replace_parameters(url, **params) ⇒ Object
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/restful_resource/base.rb', line 177 def self.replace_parameters(url, **params) missing_params = [] params = params.with_indifferent_access url_params = url.scan(%r{:([A-Za-z][^/]*)}).flatten url_params.each do |key| value = params.delete(key) if value.nil? missing_params << key else url = url.gsub(':' + key, CGI.escape(value.to_s)) end end raise ParameterMissingError, missing_params if missing_params.any? url += "?#{params.to_query}" unless params.empty? url end |
.resource_path(url) ⇒ Object
37 38 39 |
# File 'lib/restful_resource/base.rb', line 37 def self.resource_path(url) @resource_path = url end |
.where(**params) ⇒ Object
48 49 50 51 52 53 54 |
# File 'lib/restful_resource/base.rb', line 48 def self.where(**params) , = format_params(**params) url = collection_url(**) response = http.get(url, **) paginate_response(response) end |