sendgrid_events_pbxx 0.1.4
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.
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +154 -0
- data/MIT-LICENSE +20 -0
- data/README.md +37 -0
- data/Rakefile +13 -0
- data/app/controllers/sendgrid_events/sendgrid_events_controller.rb +8 -0
- data/app/models/sendgrid_events/sendgrid_email_record.rb +26 -0
- data/lib/generators/sendgrid_events/install/templates/create_sendgrid_email_records.rb +16 -0
- data/lib/generators/sendgrid_events/install/templates/initializer.rb +8 -0
- data/lib/generators/sendgrid_events/install/templates/routes.rb +2 -0
- data/lib/generators/sendgrid_events/install_generator.rb +55 -0
- data/lib/sendgrid_events/action_mailer_override.rb +29 -0
- data/lib/sendgrid_events/configure.rb +27 -0
- data/lib/sendgrid_events/engine.rb +12 -0
- data/lib/sendgrid_events/handlers/base.rb +50 -0
- data/lib/sendgrid_events/handlers/bounced.rb +7 -0
- data/lib/sendgrid_events/handlers/clicked.rb +7 -0
- data/lib/sendgrid_events/handlers/deferred.rb +7 -0
- data/lib/sendgrid_events/handlers/delivered.rb +10 -0
- data/lib/sendgrid_events/handlers/dispatch.rb +34 -0
- data/lib/sendgrid_events/handlers/dropped.rb +7 -0
- data/lib/sendgrid_events/handlers/opened.rb +7 -0
- data/lib/sendgrid_events/handlers/processed.rb +7 -0
- data/lib/sendgrid_events/handlers/spam_reported.rb +7 -0
- data/lib/sendgrid_events/handlers/unsubscribed.rb +7 -0
- data/lib/sendgrid_events/handlers.rb +3 -0
- data/lib/sendgrid_events/middleware.rb +22 -0
- data/lib/sendgrid_events/receiver.rb +18 -0
- data/lib/sendgrid_events/version.rb +3 -0
- data/lib/sendgrid_events.rb +9 -0
- data/script/rails +8 -0
- data/sendgrid_events.gemspec +28 -0
- data/spec/sendgrid_events/action_mailer_override_spec.rb +42 -0
- data/spec/sendgrid_events/handlers/base_spec.rb +47 -0
- data/spec/sendgrid_events/handlers/bounced_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/clicked_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/deferred_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/delivered_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/dispatch_spec.rb +8 -0
- data/spec/sendgrid_events/handlers/dropped_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/opened_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/processed_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/spam_reported_spec.rb +31 -0
- data/spec/sendgrid_events/handlers/unsubscribed_spec.rb +31 -0
- data/spec/sendgrid_events/receiver_spec.rb +24 -0
- data/spec/spec_helper.rb +42 -0
- metadata +276 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sendgrid_events_pbxx (0.1.4)
|
5
|
+
enumerated_field
|
6
|
+
rails (~> 3.2)
|
7
|
+
sendgrid-rails (~> 2.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actionmailer (3.2.13)
|
13
|
+
actionpack (= 3.2.13)
|
14
|
+
mail (~> 2.5.3)
|
15
|
+
actionpack (3.2.13)
|
16
|
+
activemodel (= 3.2.13)
|
17
|
+
activesupport (= 3.2.13)
|
18
|
+
builder (~> 3.0.0)
|
19
|
+
erubis (~> 2.7.0)
|
20
|
+
journey (~> 1.0.4)
|
21
|
+
rack (~> 1.4.5)
|
22
|
+
rack-cache (~> 1.2)
|
23
|
+
rack-test (~> 0.6.1)
|
24
|
+
sprockets (~> 2.2.1)
|
25
|
+
activemodel (3.2.13)
|
26
|
+
activesupport (= 3.2.13)
|
27
|
+
builder (~> 3.0.0)
|
28
|
+
activerecord (3.2.13)
|
29
|
+
activemodel (= 3.2.13)
|
30
|
+
activesupport (= 3.2.13)
|
31
|
+
arel (~> 3.0.2)
|
32
|
+
tzinfo (~> 0.3.29)
|
33
|
+
activeresource (3.2.13)
|
34
|
+
activemodel (= 3.2.13)
|
35
|
+
activesupport (= 3.2.13)
|
36
|
+
activesupport (3.2.13)
|
37
|
+
i18n (= 0.6.1)
|
38
|
+
multi_json (~> 1.0)
|
39
|
+
arel (3.0.2)
|
40
|
+
awesome_print (1.1.0)
|
41
|
+
builder (3.0.4)
|
42
|
+
capybara (2.0.3)
|
43
|
+
mime-types (>= 1.16)
|
44
|
+
nokogiri (>= 1.3.3)
|
45
|
+
rack (>= 1.0.0)
|
46
|
+
rack-test (>= 0.5.4)
|
47
|
+
selenium-webdriver (~> 2.0)
|
48
|
+
xpath (~> 1.0.0)
|
49
|
+
childprocess (0.3.9)
|
50
|
+
ffi (~> 1.0, >= 1.0.11)
|
51
|
+
diff-lcs (1.2.2)
|
52
|
+
enumerated_field (0.3.0)
|
53
|
+
activemodel
|
54
|
+
activesupport
|
55
|
+
erubis (2.7.0)
|
56
|
+
factory_girl (2.6.4)
|
57
|
+
activesupport (>= 2.3.9)
|
58
|
+
factory_girl_rails (1.7.0)
|
59
|
+
factory_girl (~> 2.6.0)
|
60
|
+
railties (>= 3.0.0)
|
61
|
+
ffi (1.6.0)
|
62
|
+
git (1.2.5)
|
63
|
+
hike (1.2.1)
|
64
|
+
i18n (0.6.1)
|
65
|
+
jeweler (1.8.4)
|
66
|
+
bundler (~> 1.0)
|
67
|
+
git (>= 1.2.5)
|
68
|
+
rake
|
69
|
+
rdoc
|
70
|
+
journey (1.0.4)
|
71
|
+
json (1.7.7)
|
72
|
+
mail (2.5.3)
|
73
|
+
i18n (>= 0.4.0)
|
74
|
+
mime-types (~> 1.16)
|
75
|
+
treetop (~> 1.4.8)
|
76
|
+
mime-types (1.22)
|
77
|
+
multi_json (1.7.2)
|
78
|
+
nokogiri (1.5.9)
|
79
|
+
polyglot (0.3.3)
|
80
|
+
rack (1.4.5)
|
81
|
+
rack-cache (1.2)
|
82
|
+
rack (>= 0.4)
|
83
|
+
rack-ssl (1.3.3)
|
84
|
+
rack
|
85
|
+
rack-test (0.6.2)
|
86
|
+
rack (>= 1.0)
|
87
|
+
rails (3.2.13)
|
88
|
+
actionmailer (= 3.2.13)
|
89
|
+
actionpack (= 3.2.13)
|
90
|
+
activerecord (= 3.2.13)
|
91
|
+
activeresource (= 3.2.13)
|
92
|
+
activesupport (= 3.2.13)
|
93
|
+
bundler (~> 1.0)
|
94
|
+
railties (= 3.2.13)
|
95
|
+
railties (3.2.13)
|
96
|
+
actionpack (= 3.2.13)
|
97
|
+
activesupport (= 3.2.13)
|
98
|
+
rack-ssl (~> 1.3.2)
|
99
|
+
rake (>= 0.8.7)
|
100
|
+
rdoc (~> 3.4)
|
101
|
+
thor (>= 0.14.6, < 2.0)
|
102
|
+
rake (10.0.4)
|
103
|
+
rdoc (3.12.2)
|
104
|
+
json (~> 1.4)
|
105
|
+
rspec-core (2.13.1)
|
106
|
+
rspec-expectations (2.13.0)
|
107
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
108
|
+
rspec-mocks (2.13.0)
|
109
|
+
rspec-rails (2.13.0)
|
110
|
+
actionpack (>= 3.0)
|
111
|
+
activesupport (>= 3.0)
|
112
|
+
railties (>= 3.0)
|
113
|
+
rspec-core (~> 2.13.0)
|
114
|
+
rspec-expectations (~> 2.13.0)
|
115
|
+
rspec-mocks (~> 2.13.0)
|
116
|
+
rubyzip (0.9.9)
|
117
|
+
selenium-webdriver (2.31.0)
|
118
|
+
childprocess (>= 0.2.5)
|
119
|
+
multi_json (~> 1.0)
|
120
|
+
rubyzip
|
121
|
+
websocket (~> 1.0.4)
|
122
|
+
sendgrid-rails (2.0.3)
|
123
|
+
actionmailer (>= 3.0.0)
|
124
|
+
activesupport (>= 2.1.0)
|
125
|
+
sprockets (2.2.2)
|
126
|
+
hike (~> 1.2)
|
127
|
+
multi_json (~> 1.0)
|
128
|
+
rack (~> 1.0)
|
129
|
+
tilt (~> 1.1, != 1.3.0)
|
130
|
+
sqlite3 (1.3.7)
|
131
|
+
thor (0.18.1)
|
132
|
+
tilt (1.3.6)
|
133
|
+
treetop (1.4.12)
|
134
|
+
polyglot
|
135
|
+
polyglot (>= 0.3.1)
|
136
|
+
tzinfo (0.3.37)
|
137
|
+
websocket (1.0.7)
|
138
|
+
xpath (1.0.0)
|
139
|
+
nokogiri (~> 1.3)
|
140
|
+
|
141
|
+
PLATFORMS
|
142
|
+
ruby
|
143
|
+
|
144
|
+
DEPENDENCIES
|
145
|
+
awesome_print
|
146
|
+
capybara
|
147
|
+
enumerated_field
|
148
|
+
factory_girl_rails (~> 1.7)
|
149
|
+
jeweler
|
150
|
+
rails (~> 3.2)
|
151
|
+
rake
|
152
|
+
rspec-rails (~> 2)
|
153
|
+
sendgrid_events_pbxx!
|
154
|
+
sqlite3
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2012 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# SendgridEvents
|
2
|
+
|
3
|
+
[](http://travis-ci.org/jphenow/sendgrid_events "Travis-CI SendgridEvents")
|
4
|
+
[](https://codeclimate.com/github/jphenow/sendgrid_events)
|
5
|
+
[Ruby Gems](https://rubygems.org/gems/sendgrid_events)
|
6
|
+
|
7
|
+
SendgridEvents is a gem designed to give your application [Sendgrid postbacks](http://docs.sendgrid.com/documentation/api/event-api/).
|
8
|
+
With these postbacks you are more able to track the status of your emails programatically.
|
9
|
+
|
10
|
+
This gem creates a `SendgridEmailRecord` table for this tracking and you can attach handlers to specific
|
11
|
+
events.
|
12
|
+
|
13
|
+
# Installation
|
14
|
+
|
15
|
+
add
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'sendgrid_events'
|
19
|
+
```
|
20
|
+
|
21
|
+
to your Gemfile and run
|
22
|
+
|
23
|
+
```
|
24
|
+
bundle install
|
25
|
+
```
|
26
|
+
|
27
|
+
After that you'll want to run:
|
28
|
+
|
29
|
+
```
|
30
|
+
rails g sendgrid_events:install
|
31
|
+
rake db:migrate
|
32
|
+
```
|
33
|
+
|
34
|
+
Finally, you'll want to edit your `config/initializers/sendgrid_events.rb`. Currently
|
35
|
+
you just have the option to include or disclude certain event handlers.
|
36
|
+
|
37
|
+
This project rocks and uses MIT-LICENSE.
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
namespace :spec do
|
8
|
+
RSpec::Core::RakeTask.new(:docs) do |t|
|
9
|
+
t.rspec_opts = ["--format doc"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => :spec
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class SendgridEmailRecord < ActiveRecord::Base
|
3
|
+
#belongs_to :sender, :polymorphic => true # What models can we use here?
|
4
|
+
# Message
|
5
|
+
include ::EnumeratedField
|
6
|
+
enum_field :status, [
|
7
|
+
%w[bounced bounced],
|
8
|
+
%w[clicked clicked],
|
9
|
+
%w[deferred deferred],
|
10
|
+
%w[delivered delivered],
|
11
|
+
%w[dropped dropped],
|
12
|
+
%w[opened opened],
|
13
|
+
%w[processed processed],
|
14
|
+
%w[processing processing],
|
15
|
+
%w[spamreported spamreported],
|
16
|
+
%w[unsubscribed unsubscribed],
|
17
|
+
]
|
18
|
+
|
19
|
+
def self.create_from_headers!(headers, additional_attributes)
|
20
|
+
create!(:to => headers[:to],
|
21
|
+
:from => headers[:from],
|
22
|
+
:subject => headers[:subject],
|
23
|
+
:status => 'processing')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateSendGridEmailRecords < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :sendgrid_email_records do |t|
|
4
|
+
t.string :status
|
5
|
+
t.string :to
|
6
|
+
t.string :from
|
7
|
+
t.string :subject
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
drop_table :sendgrid_email_records
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
SendgridEvents::Configure.config do
|
2
|
+
handle %w[processed deferred delivered open click bounce dropped spamreport unsubscribe]
|
3
|
+
receive true
|
4
|
+
foreign_key 'sengrid_events_id'
|
5
|
+
mount_at "/sendgrid_events/receiver"
|
6
|
+
end
|
7
|
+
|
8
|
+
# ActionMailer::Base.send :include, SendgridEvents::ActionMailerOverride
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module SendgridEvents
|
3
|
+
module Generators
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
include Rails::Generators::Migration
|
6
|
+
source_root File.expand_path "../install/templates", __FILE__
|
7
|
+
|
8
|
+
def self.next_migration_number(path)
|
9
|
+
unless @prev_migration_nr
|
10
|
+
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
|
11
|
+
else
|
12
|
+
@prev_migration_nr += 1
|
13
|
+
end
|
14
|
+
@prev_migration_nr.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def install
|
18
|
+
migrations
|
19
|
+
initializer
|
20
|
+
routes
|
21
|
+
middleware
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def migrations
|
27
|
+
puts "Copying Sengrid Events migrations..."
|
28
|
+
begin
|
29
|
+
migration_template "create_sendgrid_email_records.rb", "db/migrate/create_sendgrid_email_records.rb"
|
30
|
+
rescue
|
31
|
+
puts "Already have that migration"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initializer
|
36
|
+
puts "Copying initializer..."
|
37
|
+
copy_file "initializer.rb", "config/initializers/sendgrid_events.rb"
|
38
|
+
end
|
39
|
+
|
40
|
+
def routes
|
41
|
+
puts "Copying routes..."
|
42
|
+
insert_into_file Rails.root.join('config', 'routes.rb'),
|
43
|
+
File.open(File.join(File.expand_path("../install/templates", __FILE__), 'routes.rb')).read,
|
44
|
+
:after => /Application\.routes\.draw do$/
|
45
|
+
end
|
46
|
+
|
47
|
+
def middleware
|
48
|
+
puts "Copying config..."
|
49
|
+
insert_into_file Rails.root.join('config', 'application.rb'), :after => /class Application.*$/ do
|
50
|
+
"\n config.middleware.insert_before ActiveRecord::ParamsParser, SendgridEvents::Middleware"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
module ActionMailerOverride
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
alias_method_chain :uniq_args, :merge_args
|
6
|
+
alias_method_chain :mail, :record_email
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor :sendgrid_email_record_attributes
|
10
|
+
def sendgrid_email_record_attributes(attrs = nil)
|
11
|
+
@sendgrid_email_record_attributes ||= {}
|
12
|
+
return @sendgrid_email_record_attributes if attrs.nil?
|
13
|
+
self.sendgrid_email_record_attributes = attrs
|
14
|
+
end
|
15
|
+
|
16
|
+
def uniq_args_with_merge_args(args)
|
17
|
+
set_args = send_grid_header.data[:unique_args] ||= {}
|
18
|
+
uniq_args_without_merge_args set_args.merge(args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def mail_with_record_email(headers={}, &block)
|
22
|
+
id = SendgridEmailRecord.create_from_headers!(headers, sendgrid_email_record_attributes).id
|
23
|
+
uniq_args :sendgrid_events_id => id
|
24
|
+
mail_without_record_email headers, &block
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
ActionMailer::Base.send :include, SendgridEvents::ActionMailerOverride
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class Configure
|
3
|
+
def self.mount_at(val = nil)
|
4
|
+
@mount_at ||= val
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.config(&block)
|
8
|
+
class_eval &block
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.handle(list)
|
12
|
+
Handlers::Dispatch.selected_handlers = list
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.receive(boolean)
|
16
|
+
@receive = boolean
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.receive?
|
20
|
+
@receive.nil? ? true : @receive
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.foreign_key(name = nil)
|
24
|
+
@foreign_key ||= name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ::SendgridEvents
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
config.mount_at = '/sendgrid_events/' #TODO Config file
|
4
|
+
class << self
|
5
|
+
attr_accessor :root
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.root
|
9
|
+
@root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
module Handlers
|
3
|
+
class Base
|
4
|
+
def self.registered_handlers
|
5
|
+
Dispatch.registered_handlers
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.selected_handlers
|
9
|
+
Dispatch.selected_handlers
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.acceptable_handlers
|
13
|
+
Dispatch.acceptable_handlers
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.choose_and_handle(event)
|
17
|
+
if registered_handlers[event[:event]] and selected_handlers[event[:event]]
|
18
|
+
registered_handlers[event[:event]].handle(event)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.register_as_handler_for(handlee)
|
23
|
+
if acceptable_handlers[handlee]
|
24
|
+
handlee = handlee.to_s
|
25
|
+
registered_handlers[handlee] = self.name.constantize
|
26
|
+
self.name.constantize.send :define_singleton_method, :handlee do
|
27
|
+
self.name.demodulize.downcase
|
28
|
+
end
|
29
|
+
else
|
30
|
+
raise ArgumentError, "#{handlee.to_s.titleize} is not in the Dispatch's list of acceptable handlers"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.handler(&block)
|
35
|
+
block_given? ? @handler = block : @handler
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.handle(event)
|
39
|
+
found_event = find_and_update_event(event)
|
40
|
+
handler.call(found_event) unless found_event.nil? or handler.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.find_and_update_event(event)
|
44
|
+
SendgridEmailRecord.find_by_id(event[:sendgrid_events_id]).tap do |record|
|
45
|
+
record.update_attributes(:status => handlee) unless record.nil?
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
module Handlers
|
3
|
+
class Dispatch
|
4
|
+
class << self
|
5
|
+
attr_accessor :registered_handlers, :selected_handlers
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.registered_handlers
|
9
|
+
@registered_handlers ||= {}.with_indifferent_access
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.acceptable_handlers
|
13
|
+
@acceptable_handlers ||= begin
|
14
|
+
array = %w[processed
|
15
|
+
deferred
|
16
|
+
delivered
|
17
|
+
open
|
18
|
+
click
|
19
|
+
bounce
|
20
|
+
dropped
|
21
|
+
spamreport
|
22
|
+
unsubscribe
|
23
|
+
]
|
24
|
+
Hash[array.zip([true] * array.size)].with_indifferent_access
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.selected_handlers=(handler_list)
|
29
|
+
raise ArgumentError, "Found an unaccetable handler" unless handler_list.all? { |x| acceptable_handlers[x.to_sym] }
|
30
|
+
@selected_handlers = Hash[handler_list.zip([true] * handler_list.size)].with_indifferent_access
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class Middleware
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
scrub(env) if env and env["REQUEST_URI"] and env["REQUEST_URI"].include? Configure.mount_at
|
9
|
+
@app.call(env)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def scrub(env)
|
14
|
+
rack_input = env["rack.input"].read
|
15
|
+
rack_input ="[#{rack_input.split("\r\n").join(",")}]"
|
16
|
+
env["rack.input"] = StringIO.new(rack_input)
|
17
|
+
rescue
|
18
|
+
ensure
|
19
|
+
env["rack.input"].rewind
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SendgridEvents
|
2
|
+
class Receiver
|
3
|
+
def self.receive(params)
|
4
|
+
if Configure.receive? and params['_json'] and params['_json'].is_a? Array
|
5
|
+
|
6
|
+
SendgridEmailRecord.transaction do
|
7
|
+
params['_json'].each do |event|
|
8
|
+
if event.is_a? Hash and event.has_key? Configure.foreign_key
|
9
|
+
event = event.with_indifferent_access
|
10
|
+
Handlers::Base.choose_and_handle(event)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
require 'sendgrid-rails'
|
3
|
+
require 'sendgrid_events/version'
|
4
|
+
require 'sendgrid_events/engine'
|
5
|
+
require 'sendgrid_events/handlers'
|
6
|
+
require 'sendgrid_events/receiver'
|
7
|
+
require 'sendgrid_events/action_mailer_override'
|
8
|
+
require 'sendgrid_events/configure'
|
9
|
+
require 'sendgrid_events/middleware'
|