closeio-rails 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|