amorail 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +3 -0
- data/lib/amorail/entities/contact.rb +1 -0
- data/lib/amorail/entities/lead.rb +1 -0
- data/lib/amorail/entities/leadable.rb +1 -0
- data/lib/amorail/entities/webhook.rb +42 -0
- data/lib/amorail/entity.rb +4 -1
- data/lib/amorail/entity/finders.rb +3 -2
- data/lib/amorail/entity/persistence.rb +3 -0
- data/lib/amorail/property.rb +2 -0
- data/lib/amorail/railtie.rb +1 -1
- data/lib/amorail/version.rb +1 -1
- data/spec/fixtures/webhooks/list.json +24 -0
- data/spec/fixtures/webhooks/subscribe.json +17 -0
- data/spec/fixtures/webhooks/unsubscribe.json +17 -0
- data/spec/helpers/webmock_helpers.rb +30 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/webhook_spec.rb +59 -0
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f65fb80eb5f426c50e32fa474252e764e42e3887cddbf7f735ad217ad98560cf
|
4
|
+
data.tar.gz: 5f44b5e558be01b346ad68d4d84c903deec88e05514430531b6aa0b6e02c3e73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14958c70d64dda63dd82c334d08b2c63cbe8183fbffc8b5c5a63893e42280b0439e8eef4411b9b222c52e54d7dfa0949e82061de6feb4b3814ad169d5ab37cc6
|
7
|
+
data.tar.gz: a370262be82cdde926d639976fea7e23833a6f999cff3100c2a5df57e9962c8ea05b5e6b682e4d2738b4f322a3cba73d81195e721eefe017e8717c103a665f2e
|
data/.rubocop.yml
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
module Amorail
|
2
|
+
# AmoCRM webhook entity
|
3
|
+
class Webhook < Entity
|
4
|
+
amo_names 'webhooks'
|
5
|
+
|
6
|
+
amo_field :id, :url, :events, :disabled
|
7
|
+
|
8
|
+
def self.list
|
9
|
+
response = client.safe_request(:get, remote_url('list'))
|
10
|
+
|
11
|
+
return [] if response.body.blank?
|
12
|
+
|
13
|
+
response.body['response'].fetch(amo_response_name, []).map do |attributes|
|
14
|
+
new.reload_model(attributes)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.subscribe(webhooks)
|
19
|
+
perform_webhooks_request('subscribe', webhooks) do |data|
|
20
|
+
data.map { |attrs| new.reload_model(attrs) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.unsubscribe(webhooks)
|
25
|
+
perform_webhooks_request('unsubscribe', webhooks)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.perform_webhooks_request(action, webhooks, &block)
|
29
|
+
response = client.safe_request(
|
30
|
+
:post,
|
31
|
+
remote_url(action),
|
32
|
+
request: { webhooks: { action => webhooks } }
|
33
|
+
)
|
34
|
+
|
35
|
+
return response unless block
|
36
|
+
|
37
|
+
block.call(response.body['response'].dig(amo_response_name, 'subscribe'))
|
38
|
+
end
|
39
|
+
|
40
|
+
private_class_method :perform_webhooks_request
|
41
|
+
end
|
42
|
+
end
|
data/lib/amorail/entity.rb
CHANGED
@@ -77,6 +77,7 @@ module Amorail
|
|
77
77
|
attrs.each do |k, v|
|
78
78
|
action = "#{k}="
|
79
79
|
next unless respond_to?(action)
|
80
|
+
|
80
81
|
send(action, v)
|
81
82
|
end
|
82
83
|
self
|
@@ -84,9 +85,11 @@ module Amorail
|
|
84
85
|
|
85
86
|
def merge_custom_fields(fields)
|
86
87
|
return if fields.nil?
|
88
|
+
|
87
89
|
fields.each do |f|
|
88
90
|
fname = f['code'] || f['name']
|
89
91
|
next if fname.nil?
|
92
|
+
|
90
93
|
fname = "#{fname.downcase}="
|
91
94
|
fval = f.fetch('values').first.fetch('value')
|
92
95
|
send(fname, fval) if respond_to?(fname)
|
@@ -119,7 +122,7 @@ module Amorail
|
|
119
122
|
)
|
120
123
|
reload_model(data)
|
121
124
|
rescue InvalidRecord
|
122
|
-
|
125
|
+
false
|
123
126
|
end
|
124
127
|
end
|
125
128
|
end
|
@@ -11,6 +11,7 @@ module Amorail # :nodoc: all
|
|
11
11
|
def find!(id)
|
12
12
|
rec = find(id)
|
13
13
|
fail RecordNotFound unless rec
|
14
|
+
|
14
15
|
rec
|
15
16
|
end
|
16
17
|
|
@@ -32,8 +33,8 @@ module Amorail # :nodoc: all
|
|
32
33
|
|
33
34
|
# Find AMO entities by query
|
34
35
|
# Returns array of matching entities.
|
35
|
-
def find_by_query(
|
36
|
-
where(query:
|
36
|
+
def find_by_query(query)
|
37
|
+
where(query: query)
|
37
38
|
end
|
38
39
|
|
39
40
|
private
|
@@ -13,6 +13,7 @@ module Amorail # :nodoc: all
|
|
13
13
|
|
14
14
|
def save
|
15
15
|
return false unless valid?
|
16
|
+
|
16
17
|
new_record? ? push('add') : push('update')
|
17
18
|
end
|
18
19
|
|
@@ -22,6 +23,7 @@ module Amorail # :nodoc: all
|
|
22
23
|
|
23
24
|
def update(attrs = {})
|
24
25
|
return false if new_record?
|
26
|
+
|
25
27
|
merge_params(attrs)
|
26
28
|
push('update')
|
27
29
|
end
|
@@ -32,6 +34,7 @@ module Amorail # :nodoc: all
|
|
32
34
|
|
33
35
|
def reload
|
34
36
|
fail NotPersisted if id.nil?
|
37
|
+
|
35
38
|
load_record(id)
|
36
39
|
end
|
37
40
|
|
data/lib/amorail/property.rb
CHANGED
@@ -26,6 +26,7 @@ module Amorail
|
|
26
26
|
data['custom_fields'].fetch(source_name, []).each do |contact|
|
27
27
|
identifier = contact['code'].presence || contact['name'].presence
|
28
28
|
next if identifier.nil?
|
29
|
+
|
29
30
|
hash[identifier.downcase] = PropertyItem.new(contact)
|
30
31
|
end
|
31
32
|
new hash
|
@@ -118,6 +119,7 @@ module Amorail
|
|
118
119
|
prop_item = PropertyItem.new(tt)
|
119
120
|
identifier = tt['code'].presence || tt['name'].presence
|
120
121
|
next if identifier.nil?
|
122
|
+
|
121
123
|
hash[identifier.downcase] = prop_item
|
122
124
|
hash[identifier] = prop_item
|
123
125
|
end
|
data/lib/amorail/railtie.rb
CHANGED
data/lib/amorail/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"response": {
|
3
|
+
"webhooks": [
|
4
|
+
{
|
5
|
+
"id": "1",
|
6
|
+
"url": "http://example.org",
|
7
|
+
"events": [
|
8
|
+
"add_contact"
|
9
|
+
],
|
10
|
+
"disabled": false
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"id": "2",
|
14
|
+
"url": "http://example.com",
|
15
|
+
"events": [
|
16
|
+
"add_contact",
|
17
|
+
"add_company"
|
18
|
+
],
|
19
|
+
"disabled": true
|
20
|
+
}
|
21
|
+
],
|
22
|
+
"server_time": 1539938502
|
23
|
+
}
|
24
|
+
}
|
@@ -246,4 +246,34 @@ module AmoWebMock
|
|
246
246
|
.to_return(status: 204)
|
247
247
|
end
|
248
248
|
end
|
249
|
+
|
250
|
+
def webhooks_list_stub(endpoint, empty: false)
|
251
|
+
body = empty ? '' : File.read('./spec/fixtures/webhooks/list.json')
|
252
|
+
stub_request(:get, "#{endpoint}/private/api/v2/json/webhooks/list")
|
253
|
+
.to_return(
|
254
|
+
body: body,
|
255
|
+
headers: { 'Content-Type' => 'application/json' },
|
256
|
+
status: 200
|
257
|
+
)
|
258
|
+
end
|
259
|
+
|
260
|
+
def webhooks_subscribe_stub(endpoint, webhooks)
|
261
|
+
stub_request(:post, "#{endpoint}/private/api/v2/json/webhooks/subscribe")
|
262
|
+
.with(body: { request: { webhooks: { subscribe: webhooks } } }.to_json)
|
263
|
+
.to_return(
|
264
|
+
body: File.read('./spec/fixtures/webhooks/subscribe.json'),
|
265
|
+
headers: { 'Content-Type' => 'application/json' },
|
266
|
+
status: 200
|
267
|
+
)
|
268
|
+
end
|
269
|
+
|
270
|
+
def webhooks_unsubscribe_stub(endpoint, webhooks)
|
271
|
+
stub_request(:post, "#{endpoint}/private/api/v2/json/webhooks/unsubscribe")
|
272
|
+
.with(body: { request: { webhooks: { unsubscribe: webhooks } } }.to_json)
|
273
|
+
.to_return(
|
274
|
+
body: File.read('./spec/fixtures/webhooks/unsubscribe.json'),
|
275
|
+
headers: { 'Content-Type' => 'application/json' },
|
276
|
+
status: 200
|
277
|
+
)
|
278
|
+
end
|
249
279
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,9 +10,9 @@ require 'helpers/webmock_helpers'
|
|
10
10
|
|
11
11
|
# Cleanup Amorail env
|
12
12
|
ENV.delete_if { |k, _| k =~ /amorail/i }
|
13
|
-
ENV["AMORAIL_CONF"] = File.expand_path("
|
13
|
+
ENV["AMORAIL_CONF"] = File.expand_path("fixtures/amorail_test.yml", __dir__)
|
14
14
|
|
15
|
-
Dir[File.expand_path("
|
15
|
+
Dir[File.expand_path("support/**/*.rb", __dir__)].each { |f| require f }
|
16
16
|
|
17
17
|
RSpec.configure do |config|
|
18
18
|
config.mock_with :rspec
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Amorail::Webhook do
|
4
|
+
before { mock_api }
|
5
|
+
|
6
|
+
describe '.list' do
|
7
|
+
context 'there are some webhooks' do
|
8
|
+
before { webhooks_list_stub(Amorail.config.api_endpoint) }
|
9
|
+
|
10
|
+
it 'loads webhooks' do
|
11
|
+
res = described_class.list
|
12
|
+
expect(res.size).to eq 2
|
13
|
+
expect(res.first.id).to eq '1'
|
14
|
+
expect(res.first.url).to eq 'http://example.org'
|
15
|
+
expect(res.first.events).to eq ['add_contact']
|
16
|
+
expect(res.first.disabled).to eq false
|
17
|
+
expect(res.last.id).to eq '2'
|
18
|
+
expect(res.last.url).to eq 'http://example.com'
|
19
|
+
expect(res.last.events).to eq ['add_contact', 'add_company']
|
20
|
+
expect(res.last.disabled).to eq true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'there are not any webhooks' do
|
25
|
+
before { webhooks_list_stub(Amorail.config.api_endpoint, empty: true) }
|
26
|
+
|
27
|
+
it 'returns an empty array' do
|
28
|
+
res = described_class.list
|
29
|
+
expect(res).to eq []
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '.subscribe' do
|
35
|
+
it 'creates webhooks' do
|
36
|
+
webhooks = [
|
37
|
+
{ url: 'http://example.org', events: ['add_contact'] },
|
38
|
+
{ url: 'http://example.com', events: ['add_contact', 'add_company'] }
|
39
|
+
]
|
40
|
+
stub = webhooks_subscribe_stub(Amorail.config.api_endpoint, webhooks)
|
41
|
+
res = described_class.subscribe(webhooks)
|
42
|
+
expect(stub).to have_been_requested
|
43
|
+
expect(res.first.url).to eq 'http://example.org'
|
44
|
+
expect(res.last.url).to eq 'http://example.com'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '.unsubscribe' do
|
49
|
+
it 'removes webhooks' do
|
50
|
+
webhooks = [
|
51
|
+
{ url: 'http://example.org', events: ['add_contact'] },
|
52
|
+
{ url: 'http://example.com', events: ['add_contact', 'add_company'] }
|
53
|
+
]
|
54
|
+
stub = webhooks_unsubscribe_stub(Amorail.config.api_endpoint, webhooks)
|
55
|
+
described_class.unsubscribe(webhooks)
|
56
|
+
expect(stub).to have_been_requested
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amorail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alekseenkoss
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -212,6 +212,7 @@ files:
|
|
212
212
|
- lib/amorail/entities/leadable.rb
|
213
213
|
- lib/amorail/entities/note.rb
|
214
214
|
- lib/amorail/entities/task.rb
|
215
|
+
- lib/amorail/entities/webhook.rb
|
215
216
|
- lib/amorail/entity.rb
|
216
217
|
- lib/amorail/entity/finders.rb
|
217
218
|
- lib/amorail/entity/params.rb
|
@@ -240,6 +241,9 @@ files:
|
|
240
241
|
- spec/fixtures/leads/links.json
|
241
242
|
- spec/fixtures/leads/update.json
|
242
243
|
- spec/fixtures/leads/update_errors.json
|
244
|
+
- spec/fixtures/webhooks/list.json
|
245
|
+
- spec/fixtures/webhooks/subscribe.json
|
246
|
+
- spec/fixtures/webhooks/unsubscribe.json
|
243
247
|
- spec/helpers/webmock_helpers.rb
|
244
248
|
- spec/lead_spec.rb
|
245
249
|
- spec/my_contact_spec.rb
|
@@ -252,6 +256,7 @@ files:
|
|
252
256
|
- spec/support/my_contact.rb
|
253
257
|
- spec/support/my_entity.rb
|
254
258
|
- spec/task_spec.rb
|
259
|
+
- spec/webhook_spec.rb
|
255
260
|
homepage: ''
|
256
261
|
licenses:
|
257
262
|
- MIT
|
@@ -272,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
277
|
version: '0'
|
273
278
|
requirements: []
|
274
279
|
rubyforge_project:
|
275
|
-
rubygems_version: 2.
|
280
|
+
rubygems_version: 2.7.7
|
276
281
|
signing_key:
|
277
282
|
specification_version: 4
|
278
283
|
summary: Ruby API client for AmoCRM
|
@@ -296,6 +301,9 @@ test_files:
|
|
296
301
|
- spec/fixtures/leads/links.json
|
297
302
|
- spec/fixtures/leads/update.json
|
298
303
|
- spec/fixtures/leads/update_errors.json
|
304
|
+
- spec/fixtures/webhooks/list.json
|
305
|
+
- spec/fixtures/webhooks/subscribe.json
|
306
|
+
- spec/fixtures/webhooks/unsubscribe.json
|
299
307
|
- spec/helpers/webmock_helpers.rb
|
300
308
|
- spec/lead_spec.rb
|
301
309
|
- spec/my_contact_spec.rb
|
@@ -308,3 +316,4 @@ test_files:
|
|
308
316
|
- spec/support/my_contact.rb
|
309
317
|
- spec/support/my_entity.rb
|
310
318
|
- spec/task_spec.rb
|
319
|
+
- spec/webhook_spec.rb
|