logical_model 0.4.10 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +17 -2
- data/VERSION +1 -1
- data/client.rb +10 -4
- data/lib/logical_model.rb +23 -481
- data/lib/logical_model/api_key.rb +41 -0
- data/lib/logical_model/attributes.rb +57 -0
- data/lib/logical_model/has_many_keys.rb +53 -47
- data/lib/logical_model/rest_actions.rb +410 -0
- data/lib/logical_model/safe_log.rb +61 -0
- data/lib/logical_model/url_helper.rb +78 -0
- data/logical_model.gemspec +7 -4
- data/spec/client_spec.rb +129 -39
- metadata +8 -5
- data/lib/safe_log.rb +0 -11
- data/lib/ssl_support.rb +0 -39
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= logical_model
|
2
2
|
|
3
|
-
LogicalModel allows to use a
|
3
|
+
LogicalModel allows to use a RESTfull resources as models.
|
4
4
|
|
5
5
|
It was written following this tutorial: http://www.slideshare.net/ihower/serviceoriented-design-and-implement-with-rails3
|
6
6
|
|
@@ -51,6 +51,21 @@ In your Gemfile:
|
|
51
51
|
|
52
52
|
gem "logical_model"
|
53
53
|
|
54
|
+
In a model file:
|
55
|
+
|
56
|
+
class RemoteResource < LogicalModel
|
57
|
+
|
58
|
+
set_resource_host "remote.server"
|
59
|
+
set_resource_path "/api/remote/path"
|
60
|
+
# equivalente: set_resource_url "remote.server", "/api/path"
|
61
|
+
|
62
|
+
attribute :id
|
63
|
+
attribute :attribute_a
|
64
|
+
attribute :attribute_b
|
65
|
+
|
66
|
+
validates_presence_of :id
|
67
|
+
end
|
68
|
+
|
54
69
|
== Testing
|
55
70
|
|
56
71
|
To run spec:
|
@@ -70,7 +85,7 @@ To run spec:
|
|
70
85
|
|
71
86
|
== Copyright
|
72
87
|
|
73
|
-
Copyright (c) 2011,2012 Dwayne Macgowan. See LICENSE.txt for
|
88
|
+
Copyright (c) 2011,2012,2013 Dwayne Macgowan. See LICENSE.txt for
|
74
89
|
further details.
|
75
90
|
|
76
91
|
=== TODO
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/client.rb
CHANGED
@@ -10,13 +10,19 @@ class User < LogicalModel
|
|
10
10
|
self.hydra = Typhoeus::Hydra.new
|
11
11
|
self.use_ssl = false #(Rails.env=="production")
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
set_resource_url("localhost:3000","/api/v1/users")
|
14
|
+
|
15
|
+
attribute :id
|
16
|
+
attribute :name
|
17
|
+
attribute :email
|
18
|
+
attribute :password
|
19
|
+
attribute :bio
|
20
|
+
|
15
21
|
self.use_api_key = false
|
16
22
|
#self.api_key_name = "token"
|
17
23
|
#self.api_key = "8c330b5d70f86ebfa6497c901b299b79afc6d68c60df6df0bda0180d3777eb4a5528924ac96cf58a25e599b4110da3c4b690fa29263714ec6604b6cb2d943656"
|
18
|
-
|
19
|
-
self.log_path = "logs/development.log"
|
24
|
+
|
25
|
+
self.log_path = "logs/development.log"
|
20
26
|
|
21
27
|
TIMEOUT = 5500 # miliseconds
|
22
28
|
PER_PAGE = 9999
|
data/lib/logical_model.rb
CHANGED
@@ -2,11 +2,14 @@ require 'timeout'
|
|
2
2
|
require 'active_model'
|
3
3
|
require 'typhoeus'
|
4
4
|
require 'active_support/all' # todo migrate to yajl
|
5
|
-
require 'logger'
|
6
5
|
require 'kaminari'
|
7
|
-
|
8
|
-
require '
|
6
|
+
|
7
|
+
require 'logical_model/rest_actions'
|
8
|
+
require 'logical_model/url_helper'
|
9
|
+
require 'logical_model/safe_log'
|
9
10
|
require 'logical_model/has_many_keys'
|
11
|
+
require 'logical_model/api_key'
|
12
|
+
require 'logical_model/attributes'
|
10
13
|
|
11
14
|
# Logical Model, not persistant on DB, works through API. (replaces ActiveResource)
|
12
15
|
#
|
@@ -26,9 +29,11 @@ require 'logical_model/has_many_keys'
|
|
26
29
|
#
|
27
30
|
# Usage:
|
28
31
|
# class RemoteResource < LogicalModel
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
+
# set_resource_url "remote.server", "/api/remote/path"
|
33
|
+
#
|
34
|
+
# attribute :id
|
35
|
+
# attribute :attribute_a
|
36
|
+
# attribute :attribute_b
|
32
37
|
#
|
33
38
|
# validates_presence_of :id
|
34
39
|
# end
|
@@ -44,10 +49,12 @@ require 'logical_model/has_many_keys'
|
|
44
49
|
# RemoteResource#destroy
|
45
50
|
class LogicalModel
|
46
51
|
|
47
|
-
include
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
include LogicalModel::Attributes
|
53
|
+
include LogicalModel::RESTActions
|
54
|
+
include LogicalModel::UrlHelper
|
55
|
+
include LogicalModel::ApiKey
|
56
|
+
include LogicalModel::SafeLog
|
57
|
+
include LogicalModel::HasManyKeys
|
51
58
|
|
52
59
|
# include ActiveModel Modules that are usefull
|
53
60
|
extend ActiveModel::Naming
|
@@ -61,32 +68,21 @@ class LogicalModel
|
|
61
68
|
|
62
69
|
self.include_root_in_json = false
|
63
70
|
|
64
|
-
# TODO clean this file refactoring into modules
|
65
|
-
|
66
71
|
attr_accessor :last_response_code
|
67
72
|
|
68
|
-
def self.attribute_keys=(keys)
|
69
|
-
@attribute_keys = keys
|
70
|
-
attr_accessor *keys
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.attribute_keys
|
74
|
-
@attribute_keys
|
75
|
-
end
|
76
|
-
|
77
73
|
DEFAULT_TIMEOUT = 10000
|
78
74
|
DEFAULT_RETRIES = 3
|
79
75
|
|
76
|
+
def initialize(attributes={})
|
77
|
+
self.attributes = attributes
|
78
|
+
end
|
79
|
+
|
80
80
|
class << self
|
81
|
-
attr_accessor :
|
82
|
-
:
|
83
|
-
:use_api_key, :enable_delete_multiple,
|
84
|
-
:json_root, :log_path
|
81
|
+
attr_accessor :timeout, :retries,
|
82
|
+
:json_root
|
85
83
|
|
86
84
|
def timeout; @timeout ||= DEFAULT_TIMEOUT; end
|
87
85
|
def retries; @retries ||= DEFAULT_RETRIES; end
|
88
|
-
def log_path; @log_path ||= "log/logical_model.log"; end
|
89
|
-
def use_api_key; @use_api_key ||= false; end
|
90
86
|
def delete_multiple_enabled?; @enable_delete_multiple ||= false; end
|
91
87
|
|
92
88
|
def hydra
|
@@ -117,464 +113,10 @@ class LogicalModel
|
|
117
113
|
@json_root ||= self.class.to_s.underscore
|
118
114
|
end
|
119
115
|
|
120
|
-
def self.resource_uri(id=nil)
|
121
|
-
sufix = (id.nil?)? "" : "/#{id}"
|
122
|
-
"#{url_protocol_prefix}#{host}#{resource_path}#{sufix}"
|
123
|
-
end
|
124
|
-
|
125
|
-
def initialize(attributes={})
|
126
|
-
self.attributes = attributes
|
127
|
-
end
|
128
|
-
|
129
|
-
def attributes
|
130
|
-
attrs = self.class.attribute_keys.inject(ActiveSupport::HashWithIndifferentAccess.new) do |result,key|
|
131
|
-
result[key] = read_attribute_for_validation(key)
|
132
|
-
result
|
133
|
-
end
|
134
|
-
|
135
|
-
unless self.class.has_many_keys.blank?
|
136
|
-
self.class.has_many_keys.inject(attrs) do |result,key|
|
137
|
-
result["#{key}_attributes"] = send(key).map {|a| a.attributes}
|
138
|
-
result
|
139
|
-
end
|
140
|
-
end
|
141
|
-
attrs.reject {|key, value| key == "_id" && value.blank?}
|
142
|
-
end
|
143
|
-
|
144
|
-
def attributes=(attrs)
|
145
|
-
sanitize_for_mass_assignment(attrs).each{|k,v| send("#{k}=",v) if respond_to?("#{k}=")}
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
def self.from_json(json_string)
|
150
|
-
parsed = ActiveSupport::JSON.decode(json_string)
|
151
|
-
collection = parsed["collection"].map{|i|self.new(i)}
|
152
|
-
return { :collection => collection, :total => parsed["total"].to_i }
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.log_ok(response)
|
156
|
-
self.logger.info("LogicalModel Log: #{response.code} #{mask_api_key(response.effective_url)} in #{response.time}s")
|
157
|
-
self.logger.debug("LogicalModel Log RESPONSE: #{response.body}")
|
158
|
-
end
|
159
|
-
|
160
|
-
def log_ok(response)
|
161
|
-
self.class.log_ok(response)
|
162
|
-
end
|
163
|
-
|
164
|
-
def self.log_failed(response)
|
165
|
-
begin
|
166
|
-
error_message = ActiveSupport::JSON.decode(response.body)["message"]
|
167
|
-
rescue => e
|
168
|
-
error_message = "error"
|
169
|
-
end
|
170
|
-
msg = "LogicalModel Log: #{response.code} #{mask_api_key(response.effective_url)} in #{response.time}s FAILED: #{error_message}"
|
171
|
-
self.logger.warn(msg)
|
172
|
-
self.logger.debug("LogicalModel Log RESPONSE: #{response.body}")
|
173
|
-
end
|
174
|
-
|
175
|
-
def log_failed(response)
|
176
|
-
self.class.log_failed(response)
|
177
|
-
end
|
178
|
-
|
179
|
-
def self.logger
|
180
|
-
Logger.new(self.log_path || "log/logical_model.log")
|
181
|
-
end
|
182
|
-
|
183
|
-
# if needed willmerge api_key into given hash
|
184
|
-
# returns merged hash
|
185
|
-
def self.merge_key(params = {})
|
186
|
-
if self.use_api_key
|
187
|
-
params.merge({self.api_key_name => self.api_key})
|
188
|
-
else
|
189
|
-
params
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def create(params={})
|
194
|
-
run_callbacks :save do
|
195
|
-
run_callbacks :create do
|
196
|
-
_create(params)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
# @param params [Hash] parameters to be sent to service
|
202
|
-
def update(params)
|
203
|
-
run_callbacks :save do
|
204
|
-
run_callbacks :update do
|
205
|
-
_update(params)
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|
210
|
-
|
211
|
-
def save
|
212
|
-
run_callbacks :save do
|
213
|
-
run_callbacks new_record?? :create : :update do
|
214
|
-
_save
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
def destroy(params={})
|
220
|
-
run_callbacks :destroy do
|
221
|
-
_destroy(params)
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
# ============================================================================================================
|
226
|
-
# Following methods are API specific.
|
227
|
-
# They assume we are using a RESTfull API.
|
228
|
-
# for get, put, delete :id is expected
|
229
|
-
# for post, put attributes are excepted under class_name directly. eg. put( {:id => 1, :class_name => {:attr => "new value for attr"}} )
|
230
|
-
#
|
231
|
-
# On error (400) a "errors" is expected.
|
232
|
-
# ============================================================================================================
|
233
|
-
|
234
|
-
# Asynchronic Pagination
|
235
|
-
# This pagination won't block excecution waiting for result, pagination will be enqueued in Objectr#hydra.
|
236
|
-
#
|
237
|
-
# Parameters:
|
238
|
-
# @param options [Hash].
|
239
|
-
# Valid options are:
|
240
|
-
# * :page - indicated what page to return. Defaults to 1.
|
241
|
-
# * :per_page - indicates how many records to be returned per page. Defauls to 20
|
242
|
-
# * all other options will be sent in :params to WebService
|
243
|
-
#
|
244
|
-
# Usage:
|
245
|
-
# Person.async_paginate(:page => params[:page]){|i| result = i}
|
246
|
-
def self.async_paginate(options={})
|
247
|
-
options[:page] ||= 1
|
248
|
-
options[:per_page] ||= 20
|
249
|
-
|
250
|
-
options = self.merge_key(options)
|
251
|
-
|
252
|
-
request = Typhoeus::Request.new(resource_uri, :params => options)
|
253
|
-
request.on_complete do |response|
|
254
|
-
if response.code >= 200 && response.code < 400
|
255
|
-
log_ok(response)
|
256
|
-
|
257
|
-
result_set = self.from_json(response.body)
|
258
|
-
|
259
|
-
# this paginate is will_paginate's Array pagination
|
260
|
-
collection = Kaminari.paginate_array(
|
261
|
-
result_set[:collection],
|
262
|
-
{
|
263
|
-
:total_count=>result_set[:total],
|
264
|
-
:limit => options[:per_page],
|
265
|
-
:offset => options[:per_page] * ([options[:page], 1].max - 1)
|
266
|
-
}
|
267
|
-
)
|
268
|
-
|
269
|
-
yield collection
|
270
|
-
else
|
271
|
-
log_failed(response)
|
272
|
-
end
|
273
|
-
end
|
274
|
-
self.hydra.queue(request)
|
275
|
-
end
|
276
|
-
|
277
|
-
#synchronic pagination
|
278
|
-
def self.paginate(options={})
|
279
|
-
result = nil
|
280
|
-
self.retries.times do
|
281
|
-
begin
|
282
|
-
async_paginate(options){|i| result = i}
|
283
|
-
Timeout::timeout(self.timeout/1000) do
|
284
|
-
self.hydra.run
|
285
|
-
end
|
286
|
-
break unless result.nil?
|
287
|
-
rescue Timeout::Error
|
288
|
-
self.logger.warn("timeout")
|
289
|
-
result = nil
|
290
|
-
end
|
291
|
-
end
|
292
|
-
result
|
293
|
-
end
|
294
|
-
|
295
|
-
# Asynchronic Count
|
296
|
-
# This count won't block excecution waiting for result, count will be enqueued in Objectr#hydra.
|
297
|
-
#
|
298
|
-
# Parameters:
|
299
|
-
# @param options [Hash].
|
300
|
-
# Valid options are:
|
301
|
-
# @option options [Integer] :page - indicated what page to return. Defaults to 1.
|
302
|
-
# @option options [Integer] :per_page - indicates how many records to be returned per page. Defauls to 20
|
303
|
-
# @option options [Hash] all other options will be forwarded in :params to WebService
|
304
|
-
#
|
305
|
-
# @example 'Count bobs'
|
306
|
-
# Person.async_count(:when => {:name => 'bob'}}){|i| result = i}
|
307
|
-
def self.async_count(options={})
|
308
|
-
options[:page] = 1
|
309
|
-
options[:per_page] = 1
|
310
|
-
|
311
|
-
options = self.merge_key(options)
|
312
|
-
|
313
|
-
request = Typhoeus::Request.new(resource_uri, :params => options)
|
314
|
-
request.on_complete do |response|
|
315
|
-
if response.code >= 200 && response.code < 400
|
316
|
-
log_ok(response)
|
317
|
-
|
318
|
-
result_set = self.from_json(response.body)
|
319
|
-
|
320
|
-
yield result_set[:total]
|
321
|
-
else
|
322
|
-
log_failed(response)
|
323
|
-
end
|
324
|
-
end
|
325
|
-
self.hydra.queue(request)
|
326
|
-
end
|
327
|
-
|
328
|
-
# synchronic count
|
329
|
-
def self.count(options={})
|
330
|
-
result = nil
|
331
|
-
async_count(options){|i| result = i}
|
332
|
-
Timeout::timeout(self.timeout/1000) do
|
333
|
-
self.hydra.run
|
334
|
-
end
|
335
|
-
result
|
336
|
-
rescue Timeout::Error
|
337
|
-
self.logger.warn("timeout")
|
338
|
-
return nil
|
339
|
-
end
|
340
|
-
|
341
|
-
# Asynchronic Find
|
342
|
-
# This find won't block excecution waiting for result, excecution will be enqueued in Objectr#hydra.
|
343
|
-
#
|
344
|
-
# Parameters:
|
345
|
-
# - id, id of object to find
|
346
|
-
# @param [String/Integer] id
|
347
|
-
# @param [Hash] params
|
348
|
-
#
|
349
|
-
# Usage:
|
350
|
-
# Person.async_find(params[:id])
|
351
|
-
def self.async_find(id, params = {})
|
352
|
-
params = self.merge_key(params)
|
353
|
-
request = Typhoeus::Request.new( resource_uri(id), :params => params )
|
354
|
-
|
355
|
-
request.on_complete do |response|
|
356
|
-
if response.code >= 200 && response.code < 400
|
357
|
-
log_ok(response)
|
358
|
-
yield self.new.from_json(response.body) # this from_json is defined in ActiveModel::Serializers::JSON
|
359
|
-
else
|
360
|
-
log_failed(response)
|
361
|
-
end
|
362
|
-
end
|
363
|
-
|
364
|
-
self.hydra.queue(request)
|
365
|
-
end
|
366
|
-
|
367
|
-
# synchronic find
|
368
|
-
def self.find(id, params = {})
|
369
|
-
result = nil
|
370
|
-
async_find(id, params){|i| result = i}
|
371
|
-
Timeout::timeout(self.timeout/1000) do
|
372
|
-
self.hydra.run
|
373
|
-
end
|
374
|
-
result
|
375
|
-
rescue Timeout::Error
|
376
|
-
self.logger.warn("timeout")
|
377
|
-
return nil
|
378
|
-
end
|
379
|
-
|
380
|
-
#
|
381
|
-
# creates model.
|
382
|
-
#
|
383
|
-
# returns:
|
384
|
-
# @return false if model invalid
|
385
|
-
# @return nil if there was a connection problem
|
386
|
-
# @return created model ID if successfull
|
387
|
-
#
|
388
|
-
# @example Usage:
|
389
|
-
# @person = Person.new(params[:person])
|
390
|
-
# @person.create( non_attribute_param: "value" )
|
391
|
-
def _create(params = {})
|
392
|
-
return false unless valid?
|
393
|
-
|
394
|
-
params = { self.json_root => self.attributes }.merge(params)
|
395
|
-
params = self.class.merge_key(params)
|
396
|
-
|
397
|
-
response = nil
|
398
|
-
Timeout::timeout(self.class.timeout/1000) do
|
399
|
-
response = Typhoeus::Request.post( self.class.resource_uri, :body => params, :timeout => self.class.timeout )
|
400
|
-
end
|
401
|
-
self.last_response_code = response.code
|
402
|
-
if response.code == 201 || response.code == 202
|
403
|
-
log_ok(response)
|
404
|
-
if self.respond_to?('id=')
|
405
|
-
self.id = ActiveSupport::JSON.decode(response.body)["id"]
|
406
|
-
else
|
407
|
-
true
|
408
|
-
end
|
409
|
-
elsif response.code == 400
|
410
|
-
log_failed(response)
|
411
|
-
ws_errors = ActiveSupport::JSON.decode(response.body)["errors"]
|
412
|
-
ws_errors.each_key do |k|
|
413
|
-
self.errors.add k, ws_errors[k]
|
414
|
-
end
|
415
|
-
return false
|
416
|
-
else
|
417
|
-
log_failed(response)
|
418
|
-
return nil
|
419
|
-
end
|
420
|
-
rescue Timeout::Error
|
421
|
-
self.class.logger.warn "timeout"
|
422
|
-
return nil
|
423
|
-
end
|
424
|
-
|
425
|
-
# Updates Objects attributes, this will only send attributes passed as arguments
|
426
|
-
#
|
427
|
-
#
|
428
|
-
# Returns false if Object#valid? is false.
|
429
|
-
# Returns updated object if successfull.
|
430
|
-
# Returns nil if update failed
|
431
|
-
#
|
432
|
-
# Usage:
|
433
|
-
# @person.update(params[:person])
|
434
|
-
def _update(params)
|
435
|
-
|
436
|
-
self.attributes = params[self.json_root]
|
437
|
-
|
438
|
-
return false unless valid?
|
439
|
-
|
440
|
-
params = self.class.merge_key(params)
|
441
|
-
|
442
|
-
response = nil
|
443
|
-
Timeout::timeout(self.class.timeout/1000) do
|
444
|
-
response = Typhoeus::Request.put( self.class.resource_uri(id),
|
445
|
-
:params => params,
|
446
|
-
:timeout => self.class.timeout )
|
447
|
-
end
|
448
|
-
|
449
|
-
if response.code == 200
|
450
|
-
log_ok(response)
|
451
|
-
return self
|
452
|
-
else
|
453
|
-
log_failed(response)
|
454
|
-
return nil
|
455
|
-
end
|
456
|
-
|
457
|
-
rescue Timeout::Error
|
458
|
-
self.class.logger.warn("request timed out")
|
459
|
-
return nil
|
460
|
-
end
|
461
|
-
|
462
|
-
# Saves Objects attributes
|
463
|
-
#
|
464
|
-
#
|
465
|
-
# Returns false if Object#valid? is false.
|
466
|
-
# Returns updated object if successfull.
|
467
|
-
# Returns nil if update failed
|
468
|
-
#
|
469
|
-
# Usage:
|
470
|
-
# @person.save
|
471
|
-
def _save
|
472
|
-
self.attributes = attributes
|
473
|
-
|
474
|
-
return false unless valid?
|
475
|
-
|
476
|
-
sending_params = self.attributes
|
477
|
-
sending_params.delete(:id)
|
478
|
-
|
479
|
-
params = { self.json_root => sending_params }
|
480
|
-
params = self.class.merge_key(params)
|
481
|
-
response = nil
|
482
|
-
Timeout::timeout(self.class.timeout/1000) do
|
483
|
-
response = Typhoeus::Request.put( self.class.resource_uri(id), :params => params, :timeout => self.class.timeout )
|
484
|
-
end
|
485
|
-
if response.code == 200
|
486
|
-
log_ok(response)
|
487
|
-
return self
|
488
|
-
else
|
489
|
-
log_failed(response)
|
490
|
-
return nil
|
491
|
-
end
|
492
|
-
rescue Timeout::Error
|
493
|
-
self.class.logger.warn "timeout"
|
494
|
-
return nil
|
495
|
-
end
|
496
|
-
|
497
|
-
# Deletes Object#id
|
498
|
-
#
|
499
|
-
# Returns nil if delete failed
|
500
|
-
#
|
501
|
-
# @param [String] id - id of contact to be deleted
|
502
|
-
# @param [Hash] params - other params to be sent to WS on request
|
503
|
-
#
|
504
|
-
# Usage:
|
505
|
-
# Person.delete(params[:id])
|
506
|
-
def self.delete(id, params={})
|
507
|
-
|
508
|
-
params = self.merge_key(params)
|
509
|
-
|
510
|
-
response = nil
|
511
|
-
Timeout::timeout(self.timeout/1000) do
|
512
|
-
response = Typhoeus::Request.delete( self.resource_uri(id),
|
513
|
-
:params => params,
|
514
|
-
:timeout => self.timeout
|
515
|
-
)
|
516
|
-
end
|
517
|
-
if response.code == 200
|
518
|
-
log_ok(response)
|
519
|
-
return self
|
520
|
-
else
|
521
|
-
log_failed(response)
|
522
|
-
return nil
|
523
|
-
end
|
524
|
-
rescue Timeout::Error
|
525
|
-
self.logger.warn "timeout"
|
526
|
-
return nil
|
527
|
-
end
|
528
|
-
|
529
|
-
# Destroy object
|
530
|
-
#
|
531
|
-
# Usage:
|
532
|
-
# @person.destroy
|
533
|
-
def _destroy(params={})
|
534
|
-
self.class.delete(self.id,params)
|
535
|
-
end
|
536
|
-
|
537
|
-
# Deletes all Objects matching given ids
|
538
|
-
#
|
539
|
-
# This method will make a DELETE request to resource_uri/destroy_multiple
|
540
|
-
#
|
541
|
-
# Returns nil if delete failed
|
542
|
-
#
|
543
|
-
# @param [Array] ids - ids of contacts to be deleted
|
544
|
-
# @param [Hash] params - other params to be sent to WS on request
|
545
|
-
#
|
546
|
-
# Usage:
|
547
|
-
# Person.delete_multiple([1,2,4,5,6])
|
548
|
-
def self.delete_multiple(ids, params={})
|
549
|
-
raise "not-enabled" unless self.delete_multiple_enabled?
|
550
|
-
|
551
|
-
params = self.merge_key(params)
|
552
|
-
params = params.merge({:ids => ids})
|
553
|
-
|
554
|
-
response = nil
|
555
|
-
Timeout::timeout(self.timeout/1000) do
|
556
|
-
response = Typhoeus::Request.delete( self.resource_uri+"/destroy_multiple",
|
557
|
-
:params => params,
|
558
|
-
:timeout => self.timeout
|
559
|
-
)
|
560
|
-
end
|
561
|
-
if response.code == 200
|
562
|
-
log_ok(response)
|
563
|
-
return self
|
564
|
-
else
|
565
|
-
log_failed(response)
|
566
|
-
return nil
|
567
|
-
end
|
568
|
-
rescue Timeout::Error
|
569
|
-
self.logger.warn "timeout"
|
570
|
-
return nil
|
571
|
-
end
|
572
|
-
|
573
116
|
def persisted?
|
574
117
|
false
|
575
118
|
end
|
576
119
|
|
577
|
-
|
578
120
|
# Returns true if a record has not been persisted yet.
|
579
121
|
#
|
580
122
|
# Usage:
|