closeio-rails 0.1.0 → 0.2.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/README.md +93 -1
- data/app/controllers/closeio/rails/webhooks_controller.rb +1 -2
- data/app/models/closeio/rails/lead.rb +2 -2
- data/app/models/closeio/rails/webhook.rb +34 -0
- data/close-rails.gemspec +1 -1
- data/lib/closeio/rails.rb +1 -0
- data/lib/closeio/rails/version.rb +1 -1
- data/lib/tasks/webhooks.rake +43 -0
- metadata +7 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 0b47e709d54fee2cc7a82b087ec14ac40d5c8365fa8f11d23cc6ec8cb3b553ce
|
|
4
|
+
data.tar.gz: 05e6e984037ae84ce6e406a1aebf518372c1dd03a17c1255b23783a1c6638e50
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2c42f9f9a5d2274a561c8279d3c40cb58f6ac729669fe6b48f8e07d53680aa7008a53e517d136a01c1df4a543c95a6292ff5ab59c95142283aaab9f811638ba8
|
|
7
|
+
data.tar.gz: 905d7004844dc3ee11b8e3c938f9d17de26337f646d2813560f5c033a0f11c6baf1dc9e69895db334681aeac2be55885c6c108e0c64fa389972fd70f85683176
|
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
A handy wrapper around the `closeio` gem to make Rails integration a little easier.
|
|
3
3
|
|
|
4
4
|
## Models
|
|
5
|
-
There are
|
|
5
|
+
There are 5 models defined in this gem. The aim is to have a DSL a little more like the familiar ActiveRecord one.
|
|
6
6
|
|
|
7
7
|
### `Closeio::Rails::Base`
|
|
8
8
|
All the models inherit from `Closeio::Rails::Base`, which has a couple of mixins:
|
|
@@ -25,6 +25,35 @@ It's often useful to create and update custom fields in Close.io programatically
|
|
|
25
25
|
### `Closeio::Rails::Note`
|
|
26
26
|
This is a very lightweight wrapper around Close::Client#create_note.
|
|
27
27
|
|
|
28
|
+
### `Closeio::Rails::Webhook`
|
|
29
|
+
A similarly lightweight wrapper around Closeio::Client#create_webhook
|
|
30
|
+
|
|
31
|
+
## Configuration
|
|
32
|
+
Configure the gem in an initializer like this:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Rails.application.config.to_prepare do
|
|
36
|
+
Closeio::Rails.configure do |config|
|
|
37
|
+
config.api_key = 'your key' #or put in Rails secrets, or somewhere else
|
|
38
|
+
config.verbose = false
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
You can add your own methods into the Closeio::Rails models by including them in your initializer like this:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
# Leadmethods and ContactMethods are modules in your Rails project. Obviously they could be namespaced, etc.
|
|
47
|
+
Closeio::Rails::Lead.send(:include, LeadMethods)
|
|
48
|
+
Closeio::Rails::Contact.send(:prepend, ContactMethods)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
You might want to add actions to the webhooks controller, too. Sometimes we use this on applications with some sort of authentication defined in `ApplicationController`, which needs to be ignored on the webhooks controller:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
Closeio::Rails::WebhooksController.send(:skip_before_action, :authenticate_user!)
|
|
55
|
+
Closeio::Rails::WebhooksController.send(:skip_after_action, :verify_authorized)
|
|
56
|
+
```
|
|
28
57
|
|
|
29
58
|
## Mountable webhooks controller
|
|
30
59
|
It's useful to receive webhooks from Close.io. You have to drop a note to their support team to set it up but it's very quick.
|
|
@@ -44,6 +73,69 @@ webhooks POST /webhooks(.:format) closeio/rails/webhooks#create {:format=>
|
|
|
44
73
|
|
|
45
74
|
The `debug_webhooks_path` only works in development. It just sanity-checks that you've got ot mounted properly :)
|
|
46
75
|
|
|
76
|
+
## Adding webhooks - rake tasks
|
|
77
|
+
There are 3 rake tasks which are available to use in your application:
|
|
78
|
+
|
|
79
|
+
### `rake closeio:rails:list_webhooks`
|
|
80
|
+
Give you a list of webhooks with their ID and endpoint
|
|
81
|
+
|
|
82
|
+
### `rake closeio:rails:create_lead_webhook[endpoint_url]`
|
|
83
|
+
Sets up a webhook to track leads. Pass in an endpoint URL.
|
|
84
|
+
|
|
85
|
+
### `rake closeio:rails:destroy_webhook[id]`
|
|
86
|
+
Pass in the ID you got from `rake closeio:rails:list_webhooks` to destroy a webhook and no longer receive messages to that endpoint.
|
|
87
|
+
|
|
88
|
+
## Adding other webhooks
|
|
89
|
+
You can add other webhooks with different subscriptions by calling `Close::Rails::Webhook.create(params)` where params is a hash which looks like this:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Closeio::Rails::Webhook.create({
|
|
93
|
+
url: url,
|
|
94
|
+
events: [
|
|
95
|
+
{
|
|
96
|
+
object_type: 'lead',
|
|
97
|
+
action: 'created'
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
object_type: 'lead',
|
|
101
|
+
action: 'updated'
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
object_type: 'lead',
|
|
105
|
+
action: 'deleted'
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
object_type: 'lead',
|
|
109
|
+
action: 'merged'
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
})
|
|
113
|
+
end
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
See [the docs](https://developer.close.com/#webhooks) for more details.
|
|
117
|
+
|
|
118
|
+
### Consuming webhooks in your application
|
|
119
|
+
The controller doesn't do anything when it receives a webhook - instead it uses ActiveSupport::Notifications to allow you to subscribe to the raised events to do what you need to. Here's an example:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
ActiveSupport::Notifications.subscribe(/closeio\.(create|update|delete)/) do |name, start, finish, id, payload|
|
|
123
|
+
if payload[:model] == 'lead'
|
|
124
|
+
SomeLeadRelatedJob.perform_later payload[:data][:id]
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Check the Close.io docs to get a sense of what you get in the payload - one important thing to nose is that when you get a 'closeio.merge' notification, you don't get an ID, you'll get a `:source_id` and a `:destination_id`.
|
|
130
|
+
|
|
131
|
+
Importantly, if you're using ActiveJob with the `inline` strategy you'll need to make sure you rescue from any failures, or the controller won't return a 200 OK and Close.io will keep retrying.
|
|
132
|
+
|
|
133
|
+
# Contributing
|
|
134
|
+
Pull requests welcome. The usual drill: fork, commit changes, PR.
|
|
135
|
+
|
|
136
|
+
# Licence
|
|
137
|
+
MIT - see LICENCE.txt.
|
|
138
|
+
|
|
47
139
|
|
|
48
140
|
|
|
49
141
|
|
|
@@ -12,8 +12,7 @@ module Closeio
|
|
|
12
12
|
|
|
13
13
|
def create
|
|
14
14
|
request.format = :json
|
|
15
|
-
|
|
16
|
-
ActiveSupport::Notifications.instrument("closeio.#{event}", params)
|
|
15
|
+
ActiveSupport::Notifications.instrument("closeio.#{params[:action]}", params)
|
|
17
16
|
|
|
18
17
|
#must return an ok - check Rails version to determine whether to return nothing or head response.
|
|
19
18
|
if ::Rails.version =~ /^4/
|
|
@@ -4,13 +4,13 @@ module Closeio
|
|
|
4
4
|
attr_reader :contacts
|
|
5
5
|
|
|
6
6
|
def self.all
|
|
7
|
-
Closeio::Rails.configuration.client.list_leads("*",
|
|
7
|
+
Closeio::Rails.configuration.client.list_leads("*", paginate: true)[:data].collect do |lead|
|
|
8
8
|
self.new(lead.to_hash)
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def self.with_status(status)
|
|
13
|
-
Closeio::Rails.configuration.client.list_leads("lead_status: #{status}",
|
|
13
|
+
Closeio::Rails.configuration.client.list_leads("lead_status: #{status}", paginate: true)[:data].collect do |lead|
|
|
14
14
|
self.new(lead.to_hash)
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Closeio
|
|
2
|
+
module Rails
|
|
3
|
+
class Webhook < Base
|
|
4
|
+
def self.all
|
|
5
|
+
Closeio::Rails.configuration.client.list_webhooks['data'].collect do |webhook|
|
|
6
|
+
self.new(webhook)
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.create(params)
|
|
11
|
+
response = Closeio::Rails.configuration.client.create_webhook(params)
|
|
12
|
+
if response.has_key?('field-errors')
|
|
13
|
+
raise Closeio::Error, "#{response['field-errors']['name']}"
|
|
14
|
+
elsif response.has_key?('error')
|
|
15
|
+
raise Closeio::Error, "#{response['error']}"
|
|
16
|
+
else
|
|
17
|
+
response
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.destroy!(id)
|
|
22
|
+
response = Closeio::Rails.configuration.client.delete_webhook(id)
|
|
23
|
+
if response.has_key?('field-errors')
|
|
24
|
+
raise Closeio::Error, "#{response['field-errors']['name']}"
|
|
25
|
+
elsif response.has_key?('error')
|
|
26
|
+
raise Closeio::Error, "#{response['error']}"
|
|
27
|
+
else
|
|
28
|
+
response
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/close-rails.gemspec
CHANGED
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
|
25
25
|
|
|
26
26
|
spec.add_dependency "require_all", "~> 1.3"
|
|
27
|
-
spec.add_dependency "closeio", "~>
|
|
27
|
+
spec.add_dependency "closeio", "~>3.5"
|
|
28
28
|
spec.add_dependency "rails", ">= 4.2", "< 6.0.0"
|
|
29
29
|
|
|
30
30
|
end
|
data/lib/closeio/rails.rb
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
namespace :closeio do
|
|
2
|
+
namespace :rails do
|
|
3
|
+
desc "List webhooks"
|
|
4
|
+
task list_webhooks: :environment do
|
|
5
|
+
Closeio::Rails::Webhook.all.each do |webhook|
|
|
6
|
+
puts "id:#{webhook.id} endpoint:#{webhook.url}"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
desc "Create webhook with defined endpoints"
|
|
11
|
+
task :create_leads_webhook, [:endpoint] => :environment do |task, args|
|
|
12
|
+
url = args[:endpoint]
|
|
13
|
+
raise Closeio::Rails::Error, "You need to include an endpoint URL or have configured the default URL for your environment" unless url.present?
|
|
14
|
+
Closeio::Rails::Webhook.create({
|
|
15
|
+
url: url,
|
|
16
|
+
events: [
|
|
17
|
+
{
|
|
18
|
+
object_type: 'lead',
|
|
19
|
+
action: 'created'
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
object_type: 'lead',
|
|
23
|
+
action: 'updated'
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
object_type: 'lead',
|
|
27
|
+
action: 'deleted'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
object_type: 'lead',
|
|
31
|
+
action: 'merged'
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
})
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
desc "Remove a webhook by ID"
|
|
38
|
+
task :destroy_webhook, [:id] => :environment do |task, args|
|
|
39
|
+
raise Closeio::Rails::Error, "You need to include a webhook subscription ID to destroy it" unless args[:id].present?
|
|
40
|
+
Closeio::Rails::Webhook.destroy!(args[:id])
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: closeio-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ed Jones
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2019-05-21 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -59,14 +59,14 @@ dependencies:
|
|
|
59
59
|
requirements:
|
|
60
60
|
- - "~>"
|
|
61
61
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: '
|
|
62
|
+
version: '3.5'
|
|
63
63
|
type: :runtime
|
|
64
64
|
prerelease: false
|
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
66
|
requirements:
|
|
67
67
|
- - "~>"
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: '
|
|
69
|
+
version: '3.5'
|
|
70
70
|
- !ruby/object:Gem::Dependency
|
|
71
71
|
name: rails
|
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -109,6 +109,7 @@ files:
|
|
|
109
109
|
- app/models/closeio/rails/custom_field.rb
|
|
110
110
|
- app/models/closeio/rails/lead.rb
|
|
111
111
|
- app/models/closeio/rails/note.rb
|
|
112
|
+
- app/models/closeio/rails/webhook.rb
|
|
112
113
|
- app/models/concerns/closeio/rails/attributes.rb
|
|
113
114
|
- app/models/concerns/closeio/rails/date_coercion.rb
|
|
114
115
|
- bin/console
|
|
@@ -118,6 +119,7 @@ files:
|
|
|
118
119
|
- lib/closeio/rails.rb
|
|
119
120
|
- lib/closeio/rails/engine.rb
|
|
120
121
|
- lib/closeio/rails/version.rb
|
|
122
|
+
- lib/tasks/webhooks.rake
|
|
121
123
|
homepage: https://github.com/errorstudio/close-rails
|
|
122
124
|
licenses:
|
|
123
125
|
- MIT
|
|
@@ -138,7 +140,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
138
140
|
version: '0'
|
|
139
141
|
requirements: []
|
|
140
142
|
rubyforge_project:
|
|
141
|
-
rubygems_version: 2.
|
|
143
|
+
rubygems_version: 2.7.7
|
|
142
144
|
signing_key:
|
|
143
145
|
specification_version: 4
|
|
144
146
|
summary: A wrapper around the closeio gem to provide some useful functionality in
|