notifiable-rails 0.7.2 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b9758bcbfa68e1152383edd4993b474339b9c32
4
- data.tar.gz: 3fce69e3fb495368fe940af16d66868eccfbe5b3
3
+ metadata.gz: 8bb9073ea05a2f8fc69c60f6f6cfbf0dfe7fe777
4
+ data.tar.gz: 0eb9ab880e47f9f1c5821fa5c71c1113e6fcbb79
5
5
  SHA512:
6
- metadata.gz: 5f9677fca0b6053c6519a11092cb55cdd9a5b51f5964542a4909fb62d2404c3b458479723e20816809c30360844c19d7af665a45cac70f29407e8f21aefa9d95
7
- data.tar.gz: 68b4ad53c80151e34483083756c273da2b9a01d46ab52d600e284ff89aedeb6f4899a260a92fada36a3079b74a6a10cc308d8cbe70aa2a5aede377b3f7689b24
6
+ metadata.gz: 63de150bca8c6845719a322493b3470b2381cb5cff93be4690dcbd92924475a6501e2e12745634cf0a8b423119f07192a18615c4f2e41924237edfa5c1c0f221
7
+ data.tar.gz: cb2f7131af80e79151cd0b3ff50357be1c9f4b903a4f7d4d441dc5e6fe6c0871e4d63fd7b89d0a6995829cc48a23f76a1f1e63b234a89d9517bb21ed3c0f4238
@@ -21,6 +21,7 @@ module Notifiable
21
21
  end
22
22
 
23
23
  def copy_migrations
24
+ migration_template "create_notifiable_apps.rb", "db/migrate/create_notifiable_apps.rb"
24
25
  migration_template "create_notifiable_device_tokens.rb", "db/migrate/create_notifiable_device_tokens.rb"
25
26
  migration_template "create_notifiable_notifications.rb", "db/migrate/create_notifiable_notifications.rb"
26
27
  migration_template "create_notifiable_notification_device_tokens.rb", "db/migrate/create_notifiable_notification_device_tokens.rb"
@@ -0,0 +1,10 @@
1
+ class CreateNotifiableApps < ActiveRecord::Migration
2
+ def change
3
+ create_table :notifiable_apps do |t|
4
+ t.string :name
5
+ t.text :configuration
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -7,6 +7,7 @@ class CreateNotifiableDeviceTokens < ActiveRecord::Migration
7
7
  t.string :device_id
8
8
  t.boolean :is_valid, :default => true
9
9
  t.integer :user_id
10
+ t.references :app
10
11
 
11
12
  t.timestamps
12
13
  end
@@ -4,6 +4,11 @@ class CreateNotifiableNotifications < ActiveRecord::Migration
4
4
  create_table :notifiable_notifications do |t|
5
5
  t.text :message
6
6
  t.text :params
7
+ t.references :app
8
+
9
+ #stats
10
+ t.integer :sent_count
11
+ t.integer :gateway_accepted_count
7
12
 
8
13
  # APNS - Optional
9
14
  #t.integer :badge
@@ -1,4 +1,5 @@
1
1
  require 'notifiable/active_record'
2
+ require 'notifiable/app'
2
3
  require 'notifiable/notifiable_concern'
3
4
  require 'notifiable/railtie' if defined?(Rails)
4
5
  require 'notifiable/engine'
@@ -13,7 +14,7 @@ module Notifiable
13
14
  mattr_accessor :api_controller_class
14
15
 
15
16
  mattr_accessor :api_device_token_params
16
- @@api_device_token_params = [:device_id, :token, :provider]
17
+ @@api_device_token_params = [:device_id, :token, :provider, :app_id]
17
18
 
18
19
  mattr_accessor :user_class
19
20
 
@@ -27,8 +28,8 @@ module Notifiable
27
28
  yield self
28
29
  end
29
30
 
30
- def self.batch(config = {})
31
- b = Batch.new(config)
31
+ def self.batch(app = Notifiable::App.first)
32
+ b = Batch.new(app)
32
33
  yield(b)
33
34
  b.close
34
35
  end
@@ -0,0 +1,8 @@
1
+ module Notifiable
2
+ class App < ActiveRecord::Base
3
+ has_many :device_tokens, :class_name => 'Notifiable::DeviceToken', :dependent => :destroy
4
+ has_many :notifications, :class_name => 'Notifiable::App', :dependent => :destroy
5
+
6
+ serialize :configuration
7
+ end
8
+ end
@@ -1,10 +1,11 @@
1
1
  module Notifiable
2
2
  class Batch
3
- attr_accessor :notifiers
4
3
 
5
- def initialize(config = {})
4
+ def initialize(app)
5
+ raise "Must specify Notifiable::App" unless app
6
+ @app = app
6
7
  @notifiers = {}
7
- @config = config
8
+ @notification_ids = []
8
9
  end
9
10
 
10
11
  def add_notifiable(notification, notifiable)
@@ -15,24 +16,39 @@ module Notifiable
15
16
 
16
17
  def add_device_token(notification, d)
17
18
  provider = d.provider.to_sym
18
-
19
+
19
20
  unless @notifiers[provider]
20
21
  clazz = Notifiable.notifier_classes[provider]
21
22
  raise "Notifier #{provider} not configured" unless clazz
22
23
  @notifiers[provider] = clazz.new
23
24
  @notifiers[provider].env = Rails.env
24
- @config[provider].each_pair {|key, value| @notifiers[provider].send("#{key}=", value) if @notifiers[provider].methods.include?("#{key}=".to_sym) } if @config[provider]
25
+
26
+ if @app.configuration && @app.configuration[provider]
27
+ @app.configuration[provider].each_pair {|key, value| @notifiers[provider].send("#{key}=", value) if @notifiers[provider].methods.include?("#{key}=".to_sym) }
28
+ end
25
29
  end
26
30
 
27
31
  notifier = @notifiers[provider]
28
32
  if d.is_valid? && !notifier.nil?
29
- notifier.send_notification(notification, d)
33
+ notifier.send_notification(notification, d)
34
+ @notification_ids << notification.id
30
35
  end
31
36
  end
32
37
 
33
38
  def close
34
39
  @notifiers.each_value {|n| n.close}
35
40
  @notifiers = nil
41
+ summarise
36
42
  end
43
+
44
+ private
45
+ def summarise
46
+ notifications = Notification.where(:id => @notification_ids)
47
+ notifications.each do |n|
48
+ n.sent_count = n.notification_statuses.count
49
+ n.gateway_accepted_count = n.notification_statuses.where(:status => 0).count
50
+ n.save
51
+ end
52
+ end
37
53
  end
38
54
  end
@@ -1,11 +1,9 @@
1
1
  module Notifiable
2
-
3
2
  class DeviceToken < ActiveRecord::Base
3
+ belongs_to :app, :class_name => "Notifiable::App"
4
4
 
5
+ validates_presence_of :token, :provider, :app
5
6
  validates_uniqueness_of :token
6
- validates_presence_of :token
7
- validates_presence_of :provider
8
-
9
7
 
10
8
  def user
11
9
  user_id.blank? ? nil : Notifiable.user_class.find(user_id)
@@ -4,5 +4,8 @@ module Notifiable
4
4
  serialize :params
5
5
 
6
6
  has_many :notification_statuses, :class_name => 'Notifiable::NotificationStatus', :dependent => :destroy
7
+ belongs_to :app, :class_name => 'Notifiable::App'
8
+
9
+ validates_presence_of :app
7
10
  end
8
11
  end
@@ -1,3 +1,3 @@
1
1
  module Notifiable
2
- VERSION = "0.7.2"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -2,32 +2,39 @@ require 'spec_helper'
2
2
 
3
3
  describe Notifiable::Batch do
4
4
  let(:user1) { FactoryGirl.create(:user) }
5
- let(:notification) { Notifiable::Notification.new(:message => "Test message")}
5
+ let(:notification) { FactoryGirl.create(:notification, :app => app) }
6
+ let(:app) { FactoryGirl.create(:app, :configuration => {:configurable_mock => {:use_sandbox => true}}) }
6
7
 
7
8
  it "adds a notifiable object" do
8
- FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id)
9
+ FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id, :app => app)
9
10
 
10
- b = Notifiable::Batch.new
11
+ b = Notifiable::Batch.new(app)
11
12
  b.add_notifiable(notification, user1)
13
+ b.close
12
14
 
13
- Notifiable::NotificationStatus.count == 1
15
+ Notifiable::NotificationStatus.count.should == 1
16
+ saved_notification = Notifiable::Notification.first
17
+ saved_notification.sent_count.should == 1
18
+ saved_notification.gateway_accepted_count.should == 1
14
19
  end
15
20
 
16
21
  it "adds a device token" do
17
- FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id)
22
+ token = FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id, :app => app)
18
23
 
19
- b = Notifiable::Batch.new
20
- b.add_device_token(notification, user1.device_tokens.first)
24
+ b = Notifiable::Batch.new(app)
25
+ b.add_device_token(notification, token)
26
+ b.close
21
27
 
22
- Notifiable::NotificationStatus.count == 1
28
+ Notifiable::NotificationStatus.count.should == 1
29
+ saved_notification = Notifiable::Notification.first
30
+ saved_notification.sent_count.should == 1
31
+ saved_notification.gateway_accepted_count.should == 1
23
32
  end
24
33
 
25
- it "configures the provider" do
26
- FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id)
27
-
28
- config = {:configurable_mock => {:use_sandbox => true}}
34
+ it "configures the provider via an App" do
35
+ FactoryGirl.create(:mock_token, :provider => :configurable_mock, :user_id => user1.id, :app => app)
29
36
 
30
- b = Notifiable::Batch.new(config)
37
+ b = Notifiable::Batch.new(app)
31
38
  b.add_notifiable(notification, user1)
32
39
 
33
40
  b.notifiers[:configurable_mock].env.should eql Rails.env
@@ -36,11 +43,17 @@ describe Notifiable::Batch do
36
43
 
37
44
  end
38
45
 
46
+ module Notifiable
47
+ class Batch
48
+ attr_accessor :notifiers
49
+ end
50
+ end
51
+
39
52
  class ConfigurableMockNotifier < Notifiable::NotifierBase
40
53
  attr_accessor :use_sandbox
41
54
 
42
55
  def enqueue(notification, device_token)
43
- processed(notification, device_token, 200)
56
+ processed(notification, device_token, 0)
44
57
  end
45
58
  end
46
59
 
@@ -5,6 +5,7 @@ describe Notifiable::DeviceTokensController do
5
5
  let(:user1) { FactoryGirl.create(:user) }
6
6
  let(:user2) { FactoryGirl.create(:user_with_mock_token) }
7
7
  let(:user2_device_token) { user2.device_tokens.first }
8
+ let(:app) { FactoryGirl.create(:app) }
8
9
 
9
10
  before(:each) do
10
11
  @request.env["HTTP_ACCEPT"] = "application/json"
@@ -12,29 +13,33 @@ describe Notifiable::DeviceTokensController do
12
13
  end
13
14
 
14
15
  it "creates a new device token for an existing user" do
15
- post :create, :token => "ABC123", :user_email => user1.email, :provider => :apns
16
+ post :create, :token => "ABC123", :user_email => user1.email, :provider => :apns, :app_id => app.id
16
17
 
17
18
  expect(response).to be_success
18
19
 
19
20
  Notifiable::DeviceToken.count.should == 1
20
21
  user1.device_tokens.count.should == 1
21
- user1.device_tokens.first.token.should.eql? "ABC123"
22
- user1.device_tokens.first.provider.should.eql? :apns
22
+ dt = user1.device_tokens.first
23
+ dt.token.should.eql? "ABC123"
24
+ dt.provider.should.eql? :apns
25
+ dt.app.should.eql? app
23
26
  end
24
27
 
25
28
  it "creates a new device token for an anonymous user" do
26
- post :create, :token => "ABC123", :provider => :apns
29
+ post :create, :token => "ABC123", :provider => :apns, :app_id => app.id
27
30
 
28
31
  expect(response).to be_success
29
32
 
30
33
  Notifiable::DeviceToken.count.should == 1
31
- Notifiable::DeviceToken.first.token.should.eql? "ABC123"
32
- Notifiable::DeviceToken.first.provider.should.eql? :apns
34
+ dt = Notifiable::DeviceToken.first
35
+ dt.token.should.eql? "ABC123"
36
+ dt.provider.should.eql? :apns
37
+ dt.app.should.eql? app
33
38
  User.count.should == 0
34
39
  end
35
40
 
36
41
  it "creates a new device token with a device_id" do
37
- post :create, :token => "ABC123", :device_id => "DEF456", :user_email => user1.email, :provider => :mpns
42
+ post :create, :token => "ABC123", :device_id => "DEF456", :user_email => user1.email, :provider => :mpns, :app_id => app.id
38
43
 
39
44
  expect(response).to be_success
40
45
 
@@ -43,6 +48,7 @@ describe Notifiable::DeviceTokensController do
43
48
  dt = user1.device_tokens.first
44
49
  dt.token.should eql 'ABC123'
45
50
  dt.provider.should eql 'mpns'
51
+ dt.app.should.eql? app
46
52
  dt.device_id.should eql "DEF456"
47
53
  end
48
54
 
@@ -58,6 +64,7 @@ describe Notifiable::DeviceTokensController do
58
64
  dt = user1.device_tokens.first
59
65
  dt.token.should eql 'ABC123'
60
66
  dt.provider.should eql 'mpns'
67
+ dt.app.should.eql? app
61
68
  dt.device_id.should eql "DEF456"
62
69
  end
63
70
 
@@ -82,6 +89,13 @@ describe Notifiable::DeviceTokensController do
82
89
  Notifiable::DeviceToken.where(:token => user2_device_token.token).count.should == 1
83
90
  end
84
91
 
92
+ it "doesn't create a token if no app is specified" do
93
+ post :create, :token => "ABC123", :device_id => "DEF456", :user_email => user1.email, :provider => :mpns
94
+
95
+ expect(response.status).to eq(422)
96
+ Notifiable::DeviceToken.count.should == 0
97
+ end
98
+
85
99
  it "returns not found if the token doesnt exist" do
86
100
  delete :destroy, :token => "ZXY987", :user_email => user1.email
87
101
 
@@ -3,8 +3,10 @@ require 'spec_helper'
3
3
  describe Notifiable do
4
4
  let(:user1) { FactoryGirl.create(:user_with_mock_token) }
5
5
  let(:user2) { FactoryGirl.create(:user_with_mock_token) }
6
- let(:notification1) { Notifiable::Notification.create(:message => "First test message")}
7
- let(:notification2) { Notifiable::Notification.create(:message => "Second test message")}
6
+ let(:notification1) { FactoryGirl.create(:notification, :message => "First test message")}
7
+ let(:notification2) { FactoryGirl.create(:notification, :message => "Second test message")}
8
+
9
+ before(:each) { FactoryGirl.create(:app) }
8
10
 
9
11
  it "sends two identical push notifications" do
10
12
  Notifiable.batch do |b|
@@ -46,7 +48,7 @@ describe Notifiable do
46
48
 
47
49
  it "raises an error if it can't find the notification provider" do
48
50
  user = FactoryGirl.create(:user)
49
- Notifiable::DeviceToken.create :user_id => user.id, :token => "DEF567", :provider => :gcm
51
+ device_token = FactoryGirl.create(:mock_token, :provider => :sms, :user_id => user.id)
50
52
 
51
53
  expect { user.send_notification(notification1) }.to raise_error
52
54
  end
@@ -4,8 +4,11 @@ describe Notifiable::Concern do
4
4
  let(:user1) { FactoryGirl.create(:user_with_mock_token) }
5
5
  let(:notification) { Notifiable::Notification.new(:message => "Test message")}
6
6
 
7
- it "sends a single push notification" do
8
-
7
+ before(:each) { FactoryGirl.create(:app) }
8
+
9
+ it "sends a single push notification" do
10
+ FactoryGirl.create(:app)
11
+
9
12
  user1.send_notification(notification)
10
13
 
11
14
  Notifiable::NotificationStatus.count.should == 1
@@ -3,19 +3,19 @@ require 'spec_helper'
3
3
  describe Notifiable::Notification do
4
4
 
5
5
  it "stores a message" do
6
- Notifiable::Notification.create(:message => "Test message")
6
+ FactoryGirl.create(:notification, :message => "Test message")
7
7
 
8
8
  Notifiable::Notification.first.message.should eql "Test message"
9
9
  end
10
10
 
11
11
  it "stores params" do
12
- Notifiable::Notification.create :params => {:custom_property => "A different message"}
12
+ FactoryGirl.create(:notification, :params => {:custom_property => "A different message"})
13
13
 
14
14
  Notifiable::Notification.first.params.should == {:custom_property => "A different message"}
15
15
  end
16
16
 
17
17
  it "destroys dependent NotificationStatuses" do
18
- n = Notifiable::Notification.create :params => {:custom_property => "A different message"}
18
+ n = FactoryGirl.create(:notification, :params => {:custom_property => "A different message"})
19
19
  Notifiable::NotificationStatus.create :notification => n
20
20
 
21
21
  n.destroy
@@ -2,11 +2,18 @@ FactoryGirl.define do
2
2
 
3
3
  factory :mock_token, :class => Notifiable::DeviceToken do
4
4
  provider :mock
5
- token
5
+ sequence(:token) {|n| "ABCD#{n}" }
6
+ app
7
+ end
8
+
9
+ factory :app, :class => Notifiable::App do
10
+ end
11
+
12
+ factory :notification, :class => Notifiable::Notification do
13
+ app
6
14
  end
7
15
 
8
16
  sequence(:email) {|n| "person-#{n}@example.com" }
9
- sequence(:token) {|n| "ABCD#{n}" }
10
17
 
11
18
  factory :user do
12
19
  email
@@ -0,0 +1,10 @@
1
+ class CreateNotifiableApps < ActiveRecord::Migration
2
+ def change
3
+ create_table :notifiable_apps do |t|
4
+ t.string :name
5
+ t.text :configuration
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -7,12 +7,13 @@ class CreateNotifiableDeviceTokens < ActiveRecord::Migration
7
7
  t.string :device_id
8
8
  t.boolean :is_valid, :default => true
9
9
  t.integer :user_id
10
+ t.references :app
10
11
 
11
12
  t.timestamps
12
13
  end
13
-
14
+
14
15
  add_index :notifiable_device_tokens, :device_id, :unique => true
15
- add_index :notifiable_device_tokens, :token, :unique => true
16
+ add_index :notifiable_device_tokens, :token, :unique => true
16
17
  add_index :notifiable_device_tokens, :user_id
17
18
  end
18
19
 
@@ -2,12 +2,22 @@ class CreateNotifiableNotifications < ActiveRecord::Migration
2
2
 
3
3
  def change
4
4
  create_table :notifiable_notifications do |t|
5
- t.text :title
6
5
  t.text :message
7
6
  t.text :params
8
- t.integer :badge
9
- t.text :sound
10
- t.datetime :expiry
7
+ t.references :app
8
+
9
+ #stats
10
+ t.integer :sent_count
11
+ t.integer :gateway_accepted_count
12
+
13
+ # APNS - Optional
14
+ #t.integer :badge
15
+ #t.text :sound
16
+ #t.datetime :expiry
17
+
18
+ # MPNS - Optional
19
+ #t.text :title
20
+
11
21
  t.timestamps
12
22
  end
13
23
  end