rpush 4.0.1 → 5.1.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 +4 -4
- data/CHANGELOG.md +252 -162
- data/README.md +1 -1
- data/lib/generators/rpush_migration_generator.rb +3 -0
- data/lib/generators/templates/rpush_4_1_0_updates.rb +9 -0
- data/lib/generators/templates/rpush_4_1_1_updates.rb +9 -0
- data/lib/generators/templates/rpush_4_2_0_updates.rb +10 -0
- data/lib/rpush/apns_feedback.rb +1 -0
- data/lib/rpush/cli.rb +9 -22
- data/lib/rpush/client/active_model.rb +1 -1
- data/lib/rpush/client/active_model/apns/notification.rb +9 -1
- data/lib/rpush/client/active_model/apns/notification_payload_size_validator.rb +15 -0
- data/lib/rpush/client/active_model/apns2/notification.rb +14 -0
- data/lib/rpush/client/active_model/gcm/notification.rb +6 -3
- data/lib/rpush/client/active_model/wns/notification.rb +8 -0
- data/lib/rpush/client/active_record.rb +1 -0
- data/lib/rpush/client/active_record/apns/active_record_serializable_notification.rb +65 -0
- data/lib/rpush/client/active_record/apns/notification.rb +1 -29
- data/lib/rpush/client/active_record/apns2/notification.rb +4 -1
- data/lib/rpush/client/active_record/app.rb +1 -1
- data/lib/rpush/client/active_record/notification.rb +1 -1
- data/lib/rpush/client/redis/apns2/notification.rb +1 -0
- data/lib/rpush/client/redis/app.rb +2 -1
- data/lib/rpush/client/redis/notification.rb +3 -1
- data/lib/rpush/client/redis/pushy/notification.rb +0 -1
- data/lib/rpush/daemon.rb +2 -2
- data/lib/rpush/daemon/apns/feedback_receiver.rb +2 -1
- data/lib/rpush/daemon/apns2/delivery.rb +6 -1
- data/lib/rpush/daemon/apnsp8/delivery.rb +7 -2
- data/lib/rpush/daemon/app_runner.rb +1 -1
- data/lib/rpush/daemon/dispatcher/apns_http2.rb +4 -2
- data/lib/rpush/daemon/dispatcher/apnsp8_http2.rb +2 -1
- data/lib/rpush/daemon/signal_handler.rb +1 -1
- data/lib/rpush/daemon/store/active_record.rb +1 -1
- data/lib/rpush/daemon/store/active_record/reconnectable.rb +1 -1
- data/lib/rpush/daemon/store/redis.rb +1 -1
- data/lib/rpush/daemon/wns/badge_request.rb +8 -3
- data/lib/rpush/daemon/wns/raw_request.rb +9 -2
- data/lib/rpush/daemon/wns/toast_request.rb +6 -2
- data/lib/rpush/version.rb +3 -3
- data/spec/.rubocop.yml +1 -1
- data/spec/functional/apns2_spec.rb +36 -0
- data/spec/functional/gcm_priority_spec.rb +40 -0
- data/spec/support/active_record_setup.rb +7 -1
- data/spec/support/simplecov_helper.rb +1 -1
- data/spec/unit/apns_feedback_spec.rb +17 -6
- data/spec/unit/client/active_record/adm/app_spec.rb +2 -54
- data/spec/unit/client/active_record/adm/notification_spec.rb +2 -39
- data/spec/unit/client/active_record/apns/app_spec.rb +3 -26
- data/spec/unit/client/active_record/apns/feedback_spec.rb +1 -5
- data/spec/unit/client/active_record/apns/notification_spec.rb +29 -288
- data/spec/unit/client/active_record/apns2/app_spec.rb +4 -0
- data/spec/unit/client/active_record/apns2/notification_spec.rb +65 -0
- data/spec/unit/client/active_record/app_spec.rb +1 -26
- data/spec/unit/client/active_record/gcm/app_spec.rb +3 -1
- data/spec/unit/client/active_record/gcm/notification_spec.rb +7 -60
- data/spec/unit/client/active_record/notification_spec.rb +10 -11
- data/spec/unit/client/active_record/pushy/app_spec.rb +2 -13
- data/spec/unit/client/active_record/pushy/notification_spec.rb +2 -55
- data/spec/unit/client/active_record/shared/app.rb +14 -0
- data/spec/unit/{notification_shared.rb → client/active_record/shared/notification.rb} +12 -7
- data/spec/unit/client/active_record/wns/badge_notification_spec.rb +1 -11
- data/spec/unit/client/active_record/wns/raw_notification_spec.rb +3 -12
- data/spec/unit/client/active_record/wpns/app_spec.rb +3 -1
- data/spec/unit/client/active_record/wpns/notification_spec.rb +2 -17
- data/spec/unit/client/redis/adm/app_spec.rb +5 -0
- data/spec/unit/client/redis/adm/notification_spec.rb +5 -0
- data/spec/unit/client/redis/apns/app_spec.rb +5 -0
- data/spec/unit/client/redis/apns/feedback_spec.rb +5 -0
- data/spec/unit/client/redis/apns/notification_spec.rb +50 -0
- data/spec/unit/client/redis/apns2/app_spec.rb +4 -0
- data/spec/unit/client/redis/apns2/notification_spec.rb +50 -0
- data/spec/unit/client/redis/app_spec.rb +5 -0
- data/spec/unit/client/redis/gcm/app_spec.rb +5 -0
- data/spec/unit/client/redis/gcm/notification_spec.rb +5 -0
- data/spec/unit/client/redis/notification_spec.rb +5 -0
- data/spec/unit/client/redis/pushy/app_spec.rb +5 -0
- data/spec/unit/client/redis/pushy/notification_spec.rb +5 -0
- data/spec/unit/client/redis/wns/badge_notification_spec.rb +5 -0
- data/spec/unit/client/redis/wns/raw_notification_spec.rb +22 -0
- data/spec/unit/client/redis/wpns/app_spec.rb +5 -0
- data/spec/unit/client/redis/wpns/notification_spec.rb +5 -0
- data/spec/unit/client/shared/adm/app.rb +51 -0
- data/spec/unit/client/shared/adm/notification.rb +39 -0
- data/spec/unit/client/shared/apns/app.rb +29 -0
- data/spec/unit/client/shared/apns/feedback.rb +9 -0
- data/spec/unit/client/shared/apns/notification.rb +262 -0
- data/spec/unit/client/shared/app.rb +17 -0
- data/spec/unit/client/shared/gcm/app.rb +4 -0
- data/spec/unit/client/shared/gcm/notification.rb +77 -0
- data/spec/unit/client/shared/notification.rb +10 -0
- data/spec/unit/client/shared/pushy/app.rb +17 -0
- data/spec/unit/client/shared/pushy/notification.rb +55 -0
- data/spec/unit/client/shared/wns/badge_notification.rb +15 -0
- data/spec/unit/client/shared/wns/raw_notification.rb +21 -0
- data/spec/unit/client/shared/wpns/app.rb +4 -0
- data/spec/unit/client/shared/wpns/notification.rb +18 -0
- data/spec/unit/daemon/apns/feedback_receiver_spec.rb +19 -1
- data/spec/unit/daemon/gcm/delivery_spec.rb +1 -1
- data/spec/unit/daemon/shared/store.rb +312 -0
- data/spec/unit/daemon/store/active_record/reconnectable_spec.rb +7 -7
- data/spec/unit/daemon/store/active_record_spec.rb +7 -295
- data/spec/unit/daemon/store/redis_spec.rb +4 -293
- data/spec/unit/daemon/wns/post_request_spec.rb +64 -0
- data/spec/unit_spec_helper.rb +3 -0
- metadata +120 -15
- data/lib/rpush/client/active_model/apns/binary_notification_validator.rb +0 -16
data/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Rpush aims to be the *de facto* gem for sending push notifications in Ruby. Its
|
|
|
21
21
|
|
|
22
22
|
#### Feature Highlights
|
|
23
23
|
|
|
24
|
-
* Use [**ActiveRecord**](https://github.com/rpush/rpush/wiki/Using-ActiveRecord) or [**Redis**](https://github.com/rpush/rpush/wiki/Using-Redis) for storage.
|
|
24
|
+
* Use [**ActiveRecord**](https://github.com/rpush/rpush/wiki/Using-ActiveRecord) or [**Redis**](https://github.com/rpush/rpush/wiki/Using-Redis) for storage.
|
|
25
25
|
* Plugins for [**Bugsnag**](https://github.com/rpush/rpush-plugin-bugsnag),
|
|
26
26
|
[**Sentry**](https://github.com/rpush/rpush-plugin-sentry), [**StatsD**](https://github.com/rpush/rpush-plugin-statsd) or [write your own](https://github.com/rpush/rpush/wiki/Writing-a-Plugin).
|
|
27
27
|
* Seamless integration with your projects, including **Rails**.
|
|
@@ -50,6 +50,9 @@ class RpushMigrationGenerator < Rails::Generators::Base
|
|
|
50
50
|
add_rpush_migration('rpush_3_2_4_updates')
|
|
51
51
|
add_rpush_migration('rpush_3_3_0_updates')
|
|
52
52
|
add_rpush_migration('rpush_3_3_1_updates')
|
|
53
|
+
add_rpush_migration('rpush_4_1_0_updates')
|
|
54
|
+
add_rpush_migration('rpush_4_1_1_updates')
|
|
55
|
+
add_rpush_migration('rpush_4_2_0_updates')
|
|
53
56
|
end
|
|
54
57
|
|
|
55
58
|
protected
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class Rpush410Updates < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration["#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"] : ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
add_column :rpush_notifications, :dry_run, :boolean, null: false, default: false
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
remove_column :rpush_notifications, :dry_run
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class Rpush411Updates < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration["#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"] : ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
add_column :rpush_apps, :feedback_enabled, :boolean, default: true
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
remove_column :rpush_apps, :feedback_enabled
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class Rpush420Updates < ActiveRecord::VERSION::MAJOR >= 5 ? ActiveRecord::Migration["#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}"] : ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
add_column :rpush_notifications, :sound_is_json, :boolean, null: true, default: false
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.down
|
|
7
|
+
remove_column :rpush_notifications, :sound_is_json
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
data/lib/rpush/apns_feedback.rb
CHANGED
|
@@ -7,6 +7,7 @@ module Rpush
|
|
|
7
7
|
# Redis stores every App type on the same namespace, hence the
|
|
8
8
|
# additional filtering
|
|
9
9
|
next unless app.service_name == 'apns'
|
|
10
|
+
next unless app.feedback_enabled
|
|
10
11
|
|
|
11
12
|
receiver = Rpush::Daemon::Apns::FeedbackReceiver.new(app)
|
|
12
13
|
receiver.check_for_feedback
|
data/lib/rpush/cli.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
3
|
require 'thor'
|
|
4
|
-
require '
|
|
4
|
+
require 'rainbow'
|
|
5
5
|
|
|
6
6
|
module Rpush
|
|
7
7
|
class CLI < Thor
|
|
@@ -14,7 +14,7 @@ module Rpush
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
class_option :config, type: :string, aliases: '-c', default: default_config_path
|
|
17
|
-
class_option 'rails-env', type: :string, aliases: '-e', default: 'development'
|
|
17
|
+
class_option 'rails-env', type: :string, aliases: '-e', default: ENV.fetch('RAILS_ENV', 'development')
|
|
18
18
|
|
|
19
19
|
option :foreground, type: :boolean, aliases: '-f', default: false
|
|
20
20
|
option 'pid-file', type: :string, aliases: '-p'
|
|
@@ -46,37 +46,29 @@ module Rpush
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
puts
|
|
49
|
+
puts Rainbow('✔').green
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
desc 'init', 'Initialize Rpush into the current directory'
|
|
53
53
|
option 'active-record', type: :boolean, desc: 'Install ActiveRecord migrations'
|
|
54
54
|
def init
|
|
55
55
|
underscore_option_names
|
|
56
|
-
check_ruby_version
|
|
57
56
|
require 'rails/generators'
|
|
58
57
|
|
|
59
|
-
puts "* " +
|
|
58
|
+
puts "* " + Rainbow('Installing config...').green
|
|
60
59
|
$RPUSH_CONFIG_PATH = default_config_path # rubocop:disable Style/GlobalVars
|
|
61
60
|
Rails::Generators.invoke('rpush_config')
|
|
62
61
|
|
|
63
62
|
install_migrations = options['active_record']
|
|
64
63
|
|
|
65
64
|
unless options.key?('active_record')
|
|
66
|
-
|
|
67
|
-
until has_answer
|
|
68
|
-
STDOUT.write "\n* #{ANSI.green { 'Install ActiveRecord migrations?' }} [y/n]: "
|
|
69
|
-
STDOUT.flush
|
|
70
|
-
answer = STDIN.gets.chomp.downcase
|
|
71
|
-
has_answer = %w(y n).include?(answer)
|
|
72
|
-
end
|
|
73
|
-
|
|
65
|
+
answer = ask("\n* #{Rainbow('Install ActiveRecord migrations?').green}", limited_to: %w[y n])
|
|
74
66
|
install_migrations = answer == 'y'
|
|
75
67
|
end
|
|
76
68
|
|
|
77
69
|
Rails::Generators.invoke('rpush_migration', ['--force']) if install_migrations
|
|
78
70
|
|
|
79
|
-
puts "\n* #{
|
|
71
|
+
puts "\n* #{Rainbow('Next steps:').green}"
|
|
80
72
|
puts " - Run 'bundle exec rake db:migrate'." if install_migrations
|
|
81
73
|
puts " - Review and update your configuration in #{default_config_path}."
|
|
82
74
|
puts " - Create your first app, see https://github.com/rpush/rpush for examples."
|
|
@@ -111,7 +103,6 @@ module Rpush
|
|
|
111
103
|
|
|
112
104
|
def config_setup
|
|
113
105
|
underscore_option_names
|
|
114
|
-
check_ruby_version
|
|
115
106
|
configure_rpush
|
|
116
107
|
end
|
|
117
108
|
|
|
@@ -126,7 +117,7 @@ module Rpush
|
|
|
126
117
|
ENV['RAILS_ENV'] = options['rails_env']
|
|
127
118
|
load 'config/environment.rb'
|
|
128
119
|
Rpush.config.update(options)
|
|
129
|
-
puts
|
|
120
|
+
puts Rainbow('✔').green
|
|
130
121
|
|
|
131
122
|
return true
|
|
132
123
|
end
|
|
@@ -136,7 +127,7 @@ module Rpush
|
|
|
136
127
|
|
|
137
128
|
def load_standalone
|
|
138
129
|
if !File.exist?(options[:config])
|
|
139
|
-
STDERR.puts(
|
|
130
|
+
STDERR.puts(Rainbow('ERROR: ').red + "#{options[:config]} does not exist. Please run 'rpush init' to generate it or specify the --config option.")
|
|
140
131
|
exit 1
|
|
141
132
|
else
|
|
142
133
|
load options[:config]
|
|
@@ -152,10 +143,6 @@ module Rpush
|
|
|
152
143
|
self.class.default_config_path
|
|
153
144
|
end
|
|
154
145
|
|
|
155
|
-
def check_ruby_version
|
|
156
|
-
STDERR.puts(ANSI.yellow { 'WARNING: ' } + "You are using an old and unsupported version of Ruby.") if RUBY_VERSION < '2.3.0' && RUBY_ENGINE == 'ruby'
|
|
157
|
-
end
|
|
158
|
-
|
|
159
146
|
def underscore_option_names
|
|
160
147
|
# Underscore option names so that they map directly to Configuration options.
|
|
161
148
|
new_options = options.dup
|
|
@@ -175,7 +162,7 @@ module Rpush
|
|
|
175
162
|
|
|
176
163
|
def rpush_process_pid
|
|
177
164
|
if Rpush.config.pid_file.blank?
|
|
178
|
-
STDERR.puts(
|
|
165
|
+
STDERR.puts(Rainbow('ERROR: ').red + 'config.pid_file is not set.')
|
|
179
166
|
exit 1
|
|
180
167
|
end
|
|
181
168
|
|
|
@@ -4,10 +4,10 @@ require 'rpush/client/active_model/notification'
|
|
|
4
4
|
require 'rpush/client/active_model/payload_data_size_validator'
|
|
5
5
|
require 'rpush/client/active_model/registration_ids_count_validator'
|
|
6
6
|
|
|
7
|
-
require 'rpush/client/active_model/apns/binary_notification_validator'
|
|
8
7
|
require 'rpush/client/active_model/apns/device_token_format_validator'
|
|
9
8
|
require 'rpush/client/active_model/apns/app'
|
|
10
9
|
require 'rpush/client/active_model/apns/notification'
|
|
10
|
+
require 'rpush/client/active_model/apns/notification_payload_size_validator'
|
|
11
11
|
|
|
12
12
|
require 'rpush/client/active_model/apns2/app'
|
|
13
13
|
require 'rpush/client/active_model/apns2/notification'
|
|
@@ -7,15 +7,23 @@ module Rpush
|
|
|
7
7
|
APNS_PRIORITY_IMMEDIATE = 10
|
|
8
8
|
APNS_PRIORITY_CONSERVE_POWER = 5
|
|
9
9
|
APNS_PRIORITIES = [APNS_PRIORITY_IMMEDIATE, APNS_PRIORITY_CONSERVE_POWER]
|
|
10
|
+
MAX_PAYLOAD_BYTESIZE = 2048
|
|
11
|
+
|
|
12
|
+
module ClassMethods
|
|
13
|
+
def max_payload_bytesize
|
|
14
|
+
MAX_PAYLOAD_BYTESIZE
|
|
15
|
+
end
|
|
16
|
+
end
|
|
10
17
|
|
|
11
18
|
def self.included(base)
|
|
19
|
+
base.extend ClassMethods
|
|
12
20
|
base.instance_eval do
|
|
13
21
|
validates :device_token, presence: true
|
|
14
22
|
validates :badge, numericality: true, allow_nil: true
|
|
15
23
|
validates :priority, inclusion: { in: APNS_PRIORITIES }, allow_nil: true
|
|
16
24
|
|
|
17
25
|
validates_with Rpush::Client::ActiveModel::Apns::DeviceTokenFormatValidator
|
|
18
|
-
validates_with Rpush::Client::ActiveModel::Apns::
|
|
26
|
+
validates_with Rpush::Client::ActiveModel::Apns::NotificationPayloadSizeValidator
|
|
19
27
|
|
|
20
28
|
base.const_set('APNS_DEFAULT_EXPIRY', APNS_DEFAULT_EXPIRY) unless base.const_defined?('APNS_DEFAULT_EXPIRY')
|
|
21
29
|
base.const_set('APNS_PRIORITY_IMMEDIATE', APNS_PRIORITY_IMMEDIATE) unless base.const_defined?('APNS_PRIORITY_IMMEDIATE')
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Rpush
|
|
2
|
+
module Client
|
|
3
|
+
module ActiveModel
|
|
4
|
+
module Apns
|
|
5
|
+
class NotificationPayloadSizeValidator < ::ActiveModel::Validator
|
|
6
|
+
def validate(record)
|
|
7
|
+
limit = record.class.max_payload_bytesize
|
|
8
|
+
return unless record.payload.bytesize > limit
|
|
9
|
+
record.errors[:base] << "APN notification cannot be larger than #{limit} bytes. Try condensing your alert and device attributes."
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -3,6 +3,20 @@ module Rpush
|
|
|
3
3
|
module ActiveModel
|
|
4
4
|
module Apns2
|
|
5
5
|
include Rpush::Client::ActiveModel::Apns
|
|
6
|
+
|
|
7
|
+
module Notification
|
|
8
|
+
MAX_PAYLOAD_BYTESIZE = 4096
|
|
9
|
+
|
|
10
|
+
module ClassMethods
|
|
11
|
+
def max_payload_bytesize
|
|
12
|
+
MAX_PAYLOAD_BYTESIZE
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.included(base)
|
|
17
|
+
base.extend ClassMethods
|
|
18
|
+
end
|
|
19
|
+
end
|
|
6
20
|
end
|
|
7
21
|
end
|
|
8
22
|
end
|
|
@@ -11,6 +11,7 @@ module Rpush
|
|
|
11
11
|
base.instance_eval do
|
|
12
12
|
validates :registration_ids, presence: true
|
|
13
13
|
validates :priority, inclusion: { in: GCM_PRIORITIES }, allow_nil: true
|
|
14
|
+
validates :dry_run, inclusion: { in: [true, false] }
|
|
14
15
|
|
|
15
16
|
validates_with Rpush::Client::ActiveModel::PayloadDataSizeValidator, limit: 4096
|
|
16
17
|
validates_with Rpush::Client::ActiveModel::RegistrationIdsCountValidator, limit: 1000
|
|
@@ -25,16 +26,16 @@ module Rpush
|
|
|
25
26
|
# I'm not happy about it, but this will have to do until I can take a further look.
|
|
26
27
|
def priority=(priority)
|
|
27
28
|
case priority
|
|
28
|
-
when 'high'
|
|
29
|
+
when 'high', GCM_PRIORITY_HIGH
|
|
29
30
|
super(GCM_PRIORITY_HIGH)
|
|
30
|
-
when 'normal'
|
|
31
|
+
when 'normal', GCM_PRIORITY_NORMAL
|
|
31
32
|
super(GCM_PRIORITY_NORMAL)
|
|
32
33
|
else
|
|
33
34
|
errors.add(:priority, 'must be one of either "normal" or "high"')
|
|
34
35
|
end
|
|
35
36
|
end
|
|
36
37
|
|
|
37
|
-
def as_json(options = nil)
|
|
38
|
+
def as_json(options = nil) # rubocop:disable Metrics/PerceivedComplexity
|
|
38
39
|
json = {
|
|
39
40
|
'registration_ids' => registration_ids,
|
|
40
41
|
'delay_while_idle' => delay_while_idle,
|
|
@@ -42,6 +43,8 @@ module Rpush
|
|
|
42
43
|
}
|
|
43
44
|
json['collapse_key'] = collapse_key if collapse_key
|
|
44
45
|
json['content_available'] = content_available if content_available
|
|
46
|
+
json['mutable_content'] = mutable_content if mutable_content
|
|
47
|
+
json['dry_run'] = dry_run if dry_run
|
|
45
48
|
json['notification'] = notification if notification
|
|
46
49
|
json['priority'] = priority_for_notification if priority
|
|
47
50
|
json['time_to_live'] = expiry if expiry
|
|
@@ -3,6 +3,13 @@ module Rpush
|
|
|
3
3
|
module ActiveModel
|
|
4
4
|
module Wns
|
|
5
5
|
module Notification
|
|
6
|
+
WNS_PRIORITY_HIGH = 1
|
|
7
|
+
WNS_PRIORITY_MEDIUM = 2
|
|
8
|
+
WNS_PRIORITY_LOW = 3
|
|
9
|
+
WNS_PRIORITY_VERY_LOW = 4
|
|
10
|
+
|
|
11
|
+
WNS_PRIORITIES = [WNS_PRIORITY_HIGH, WNS_PRIORITY_MEDIUM, WNS_PRIORITY_LOW, WNS_PRIORITY_VERY_LOW]
|
|
12
|
+
|
|
6
13
|
module InstanceMethods
|
|
7
14
|
def alert=(value)
|
|
8
15
|
return unless value
|
|
@@ -23,6 +30,7 @@ module Rpush
|
|
|
23
30
|
validates :uri, presence: true
|
|
24
31
|
validates :uri, format: { with: %r{https?://[\S]+} }
|
|
25
32
|
validates :data, presence: true, unless: :skip_data_validation?
|
|
33
|
+
validates :priority, inclusion: { in: WNS_PRIORITIES }, allow_nil: true
|
|
26
34
|
end
|
|
27
35
|
end
|
|
28
36
|
end
|
|
@@ -5,6 +5,7 @@ require 'rpush/client/active_model'
|
|
|
5
5
|
require 'rpush/client/active_record/notification'
|
|
6
6
|
require 'rpush/client/active_record/app'
|
|
7
7
|
|
|
8
|
+
require 'rpush/client/active_record/apns/active_record_serializable_notification'
|
|
8
9
|
require 'rpush/client/active_record/apns/notification'
|
|
9
10
|
require 'rpush/client/active_record/apns/feedback'
|
|
10
11
|
require 'rpush/client/active_record/apns/app'
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Rpush
|
|
2
|
+
module Client
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module Apns
|
|
5
|
+
module ActiveRecordSerializableNotification
|
|
6
|
+
def alert=(alert)
|
|
7
|
+
if alert.is_a?(Hash)
|
|
8
|
+
write_attribute(:alert, multi_json_dump(alert))
|
|
9
|
+
self.alert_is_json = true if has_attribute?(:alert_is_json)
|
|
10
|
+
else
|
|
11
|
+
write_attribute(:alert, alert)
|
|
12
|
+
self.alert_is_json = false if has_attribute?(:alert_is_json)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def alert
|
|
17
|
+
string_or_json = read_attribute(:alert)
|
|
18
|
+
|
|
19
|
+
if has_attribute?(:alert_is_json)
|
|
20
|
+
if alert_is_json?
|
|
21
|
+
multi_json_load(string_or_json)
|
|
22
|
+
else
|
|
23
|
+
string_or_json
|
|
24
|
+
end
|
|
25
|
+
else
|
|
26
|
+
begin
|
|
27
|
+
multi_json_load(string_or_json)
|
|
28
|
+
rescue StandardError
|
|
29
|
+
string_or_json
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def sound=(sound)
|
|
35
|
+
if sound.is_a?(Hash)
|
|
36
|
+
write_attribute(:sound, multi_json_dump(sound))
|
|
37
|
+
self.sound_is_json = true if has_attribute?(:sound_is_json)
|
|
38
|
+
else
|
|
39
|
+
write_attribute(:sound, sound)
|
|
40
|
+
self.sound_is_json = false if has_attribute?(:sound_is_json)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def sound
|
|
45
|
+
string_or_json = read_attribute(:sound)
|
|
46
|
+
|
|
47
|
+
if has_attribute?(:sound_is_json)
|
|
48
|
+
if sound_is_json?
|
|
49
|
+
multi_json_load(string_or_json)
|
|
50
|
+
else
|
|
51
|
+
string_or_json
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
begin
|
|
55
|
+
multi_json_load(string_or_json)
|
|
56
|
+
rescue StandardError
|
|
57
|
+
string_or_json
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -3,36 +3,8 @@ module Rpush
|
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
module Apns
|
|
5
5
|
class Notification < Rpush::Client::ActiveRecord::Notification
|
|
6
|
-
include Deprecatable
|
|
7
6
|
include Rpush::Client::ActiveModel::Apns::Notification
|
|
8
|
-
|
|
9
|
-
def alert=(alert)
|
|
10
|
-
if alert.is_a?(Hash)
|
|
11
|
-
write_attribute(:alert, multi_json_dump(alert))
|
|
12
|
-
self.alert_is_json = true if has_attribute?(:alert_is_json)
|
|
13
|
-
else
|
|
14
|
-
write_attribute(:alert, alert)
|
|
15
|
-
self.alert_is_json = false if has_attribute?(:alert_is_json)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def alert
|
|
20
|
-
string_or_json = read_attribute(:alert)
|
|
21
|
-
|
|
22
|
-
if has_attribute?(:alert_is_json)
|
|
23
|
-
if alert_is_json?
|
|
24
|
-
multi_json_load(string_or_json)
|
|
25
|
-
else
|
|
26
|
-
string_or_json
|
|
27
|
-
end
|
|
28
|
-
else
|
|
29
|
-
begin
|
|
30
|
-
multi_json_load(string_or_json)
|
|
31
|
-
rescue StandardError
|
|
32
|
-
string_or_json
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
7
|
+
include ActiveRecordSerializableNotification
|
|
36
8
|
end
|
|
37
9
|
end
|
|
38
10
|
end
|
|
@@ -2,7 +2,10 @@ module Rpush
|
|
|
2
2
|
module Client
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
module Apns2
|
|
5
|
-
class Notification < Rpush::Client::ActiveRecord::
|
|
5
|
+
class Notification < Rpush::Client::ActiveRecord::Notification
|
|
6
|
+
include Rpush::Client::ActiveModel::Apns::Notification
|
|
7
|
+
include Rpush::Client::ActiveModel::Apns2::Notification
|
|
8
|
+
include Rpush::Client::ActiveRecord::Apns::ActiveRecordSerializableNotification
|
|
6
9
|
end
|
|
7
10
|
end
|
|
8
11
|
end
|
|
@@ -6,7 +6,7 @@ module Rpush
|
|
|
6
6
|
|
|
7
7
|
has_many :notifications, class_name: 'Rpush::Client::ActiveRecord::Notification', dependent: :destroy
|
|
8
8
|
|
|
9
|
-
validates :name, presence: true, uniqueness: { scope: [:type, :environment] }
|
|
9
|
+
validates :name, presence: true, uniqueness: { scope: [:type, :environment], case_sensitive: true }
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -21,7 +21,7 @@ module Rpush
|
|
|
21
21
|
def notification=(attrs)
|
|
22
22
|
return unless attrs
|
|
23
23
|
fail ArgumentError, 'must be a Hash' unless attrs.is_a?(Hash)
|
|
24
|
-
write_attribute(:notification, multi_json_dump(attrs.merge(
|
|
24
|
+
write_attribute(:notification, multi_json_dump(attrs.merge(notification || {})))
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def registration_ids=(ids)
|