external_services 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTkwOWFmMmQwMzBhNzRmOWQyYWMwNTIwOTc2YzU2MGRlMDlhOTMzNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTMwMTU4OGNhZWFlYzhmMWQ2ODg1NjFjNjkwMzhkNjdiY2M4NmEwYg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZjEyMWQ2YmY0NzAxNWI5ZDVjYmYwMGM3NTYxOTBjOTc3ZmE2YTYxZjIxM2Zj
|
10
|
+
NjczMjA4MjRiYzkxODYyYTE1MWU2ZDY4OWI0ZTVlMDliNjE2MTAwNjRmNjRi
|
11
|
+
ODE1MjhlYjZkMGY3YzBhYmMxZjY2MTU0NDk1NTNhNjI1NmEzNGM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NzU2OWI1Yzk4ZDBkYjQxMGYzZGE0ZTIzYTBlYzlhZGI3MzQyZDFhMDE2MmEz
|
14
|
+
Mzg2ZmU5YTEyYzQwNjU0ZWUzZDFkNWRiOTU3NmQ0ZWI1MmRkOTRlYTQ3NGRl
|
15
|
+
NTExZGE3M2Y1YjE5OTdlNGVmMzkzMWRiMzVhNDYzN2JhMTAwNzQ=
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ExternalServices
|
2
|
+
module Action
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
scope :processed, -> { where.not(processed_at: nil) }
|
7
|
+
scope :unprocessed, -> { where(processed_at: nil) }
|
8
|
+
|
9
|
+
after_commit :kick_active_job
|
10
|
+
end
|
11
|
+
|
12
|
+
def processed?
|
13
|
+
processed_at.present?
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_processed!
|
17
|
+
update_attributes! processed_at: Time.now
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute!
|
21
|
+
raise NotImplementedError
|
22
|
+
end
|
23
|
+
|
24
|
+
def kick_active_job
|
25
|
+
return if api_disabled?
|
26
|
+
|
27
|
+
job_class.set(queue: queue).perform_later(id)
|
28
|
+
end
|
29
|
+
|
30
|
+
module ClassMethods
|
31
|
+
def perform_unprocessed
|
32
|
+
Rails.logger.info "Running unprocessed #{self.class.name.demodulize} api actions..."
|
33
|
+
|
34
|
+
unprocessed.each(&:kick_active_job)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -1,5 +1,9 @@
|
|
1
1
|
module ExternalServices
|
2
2
|
class ApiAction < ::ActiveRecord::Base
|
3
|
+
include ExternalServices::Action
|
4
|
+
|
5
|
+
attr_accessor :async
|
6
|
+
|
3
7
|
self.table_name = :external_services_api_actions
|
4
8
|
|
5
9
|
belongs_to :initiator, polymorphic: true
|
@@ -19,23 +23,11 @@ module ExternalServices
|
|
19
23
|
|
20
24
|
before_create :calculate_signature
|
21
25
|
|
22
|
-
def processed?
|
23
|
-
processed_at.present?
|
24
|
-
end
|
25
|
-
|
26
|
-
def set_processed!
|
27
|
-
update_attributes! processed_at: Time.now
|
28
|
-
end
|
29
|
-
|
30
26
|
def initiator_class
|
31
27
|
# Need to use initiator object for STI in polymorphic.. But still will be bugs with deleted STI object
|
32
28
|
initiator.try(:class) || initiator_type.constantize
|
33
29
|
end
|
34
30
|
|
35
|
-
def api_disabled?
|
36
|
-
initiator_class.send(:"#{self.class.to_s.demodulize.underscore}_api_disabled")
|
37
|
-
end
|
38
|
-
|
39
31
|
def change_external_id?
|
40
32
|
options['change_external_id']
|
41
33
|
end
|
@@ -44,20 +36,8 @@ module ExternalServices
|
|
44
36
|
"ExternalServices::#{self.class.to_s.demodulize}ApiJob".constantize
|
45
37
|
end
|
46
38
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
job_class.set(queue: queue).perform_later(id)
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.perform_unprocessed
|
54
|
-
Rails.logger.info "Running unprocessed #{self.class.name.demodulize} api actions..."
|
55
|
-
|
56
|
-
unprocessed.each(&:kick_active_job)
|
57
|
-
end
|
58
|
-
|
59
|
-
def execute!
|
60
|
-
raise NotImplementedError
|
39
|
+
def api_disabled?
|
40
|
+
initiator_class.send(:"#{self.class.to_s.demodulize.underscore}_api_disabled")
|
61
41
|
end
|
62
42
|
|
63
43
|
protected
|
@@ -83,5 +63,16 @@ module ExternalServices
|
|
83
63
|
def path_format_correctness
|
84
64
|
errors.add(:path, :invalid) if path =~ %r{//}
|
85
65
|
end
|
66
|
+
|
67
|
+
def async
|
68
|
+
@async.nil? ? true : @async
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def create_or_update(*args)
|
74
|
+
return true unless async
|
75
|
+
super
|
76
|
+
end
|
86
77
|
end
|
87
78
|
end
|
@@ -129,11 +129,6 @@ module ExternalServices
|
|
129
129
|
end
|
130
130
|
protected :"#{name}_on_destroy"
|
131
131
|
|
132
|
-
define_method :"#{name}_on_revive" do
|
133
|
-
public_send(service_assoc).on_subject_revive(self) unless only_api_actions
|
134
|
-
end
|
135
|
-
protected :"#{name}_on_revive"
|
136
|
-
|
137
132
|
protected def halt_on_external_services_syncing
|
138
133
|
if external_services_syncing?
|
139
134
|
errors.add :base, :external_services_sync_in_process
|
@@ -188,10 +183,10 @@ module ExternalServices
|
|
188
183
|
def define_external_service_helper_methods(name, _options = {})
|
189
184
|
## subject class methods
|
190
185
|
helpers_class_module = Module.new do
|
191
|
-
define_method :"with_#{name}_api_for" do |synced: [], for_syncing: [], &b|
|
192
|
-
return if ([synced] + [for_syncing]).flatten.select(&:"#{name}_api_disabled").any?
|
193
186
|
|
187
|
+
define_method :"with_#{name}_api_for" do |synced: [], for_syncing: [], &b|
|
194
188
|
unsynced = [synced].flatten.select { |o| o.send("#{name}_id").nil? }
|
189
|
+
|
195
190
|
if unsynced.any?
|
196
191
|
objects = unsynced.map { |o| "#{o.class.name} (id=#{o.id})" }.join(', ')
|
197
192
|
raise "[#{name}] Trying to work with an unsynced objects: #{objects}"
|
@@ -226,6 +221,19 @@ module ExternalServices
|
|
226
221
|
send :"#{name}_api_disabled=", old
|
227
222
|
end
|
228
223
|
end
|
224
|
+
|
225
|
+
define_method :"find_all_by_#{name}_ids" do |ids|
|
226
|
+
conditions = { external_services: { type: get_service_class(name).name, external_id: ids } }
|
227
|
+
includes(:"#{name}_service").where(conditions)
|
228
|
+
end
|
229
|
+
|
230
|
+
define_method :"#{name}_synced" do
|
231
|
+
includes(:"#{name}_service").where.not(external_services: { external_id: [nil, ''] })
|
232
|
+
end
|
233
|
+
|
234
|
+
define_method :"not_#{name}_synced" do
|
235
|
+
includes(:"#{name}_service").where(external_services: { external_id: [nil, ''] })
|
236
|
+
end
|
229
237
|
end
|
230
238
|
|
231
239
|
## subject methods
|
@@ -253,18 +261,26 @@ module ExternalServices
|
|
253
261
|
path = args[:path] || send(:"#{name}_api_path")
|
254
262
|
data = args[:data] || send(:"#{name}_api_data")
|
255
263
|
options = args[:options] || {}
|
264
|
+
async = args[:async].nil? ? true : args[:async]
|
256
265
|
|
257
266
|
options[:change_external_id] = true if options[:change_external_id].nil?
|
258
267
|
|
259
|
-
"ExternalServices::ApiActions::#{name.to_s.camelize}".constantize.
|
268
|
+
action = "ExternalServices::ApiActions::#{name.to_s.camelize}".constantize.new(
|
260
269
|
initiator: self,
|
261
270
|
name: args[:name] || self.class.send(:"#{name}_api_name"),
|
262
271
|
method: method,
|
263
272
|
path: path,
|
264
273
|
data: data,
|
265
274
|
queue: args[:queue],
|
266
|
-
options: options
|
275
|
+
options: options,
|
276
|
+
async: async
|
267
277
|
)
|
278
|
+
|
279
|
+
if async
|
280
|
+
action.save!
|
281
|
+
else
|
282
|
+
action.execute!
|
283
|
+
end
|
268
284
|
end
|
269
285
|
end
|
270
286
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: external_services
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Gnuskov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- README.md
|
76
76
|
- Rakefile
|
77
77
|
- app/jobs/external_services/api_job.rb
|
78
|
+
- app/models/concerns/external_services/action.rb
|
78
79
|
- app/models/external_services/api_action.rb
|
79
80
|
- app/models/external_services/service.rb
|
80
81
|
- bin/rails
|