amorail 0.4.0 → 0.5.0
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 +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
|