fwt_push_notification_server 0.0.6 → 0.0.7.b4

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.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/fwt_push_notification_server/device_tokens_controller.rb +5 -26
  3. data/app/models/fwt_push_notification_server/device_token.rb +9 -0
  4. data/config/routes.rb +2 -7
  5. data/lib/devise/models/notifiable.rb +30 -0
  6. data/lib/fwt_push_notification_server/engine.rb +2 -6
  7. data/lib/fwt_push_notification_server/version.rb +1 -1
  8. data/lib/fwt_push_notification_server.rb +56 -42
  9. data/lib/generators/fwt_push_notification_server/install/install_generator.rb +1 -8
  10. data/lib/generators/fwt_push_notification_server/install/templates/add_provider_to_push_notification_server_device_tokens.rb +7 -0
  11. data/lib/generators/fwt_push_notification_server/install/templates/create_fwt_push_notification_server_device_tokens.rb +1 -2
  12. data/lib/generators/fwt_push_notification_server/install/templates/initializer.rb +14 -16
  13. data/lib/notifier/apns.rb +38 -0
  14. data/lib/notifier/base.rb +28 -0
  15. data/lib/notifier/gcm.rb +41 -0
  16. metadata +13 -347
  17. data/app/assets/images/fw-logo.png +0 -0
  18. data/app/assets/javascripts/fwt_push_notification_server/application.js +0 -13
  19. data/app/assets/javascripts/fwt_push_notification_server/device_tokens.js +0 -2
  20. data/app/assets/stylesheets/fwt_push_notification_server/application.css.scss +0 -192
  21. data/app/assets/stylesheets/fwt_push_notification_server/device_tokens.css +0 -4
  22. data/app/assets/stylesheets/fwt_push_notification_server/jquery-ui-timepicker-addon.css +0 -10
  23. data/app/assets/stylesheets/fwt_push_notification_server/jquery-ui.css +0 -474
  24. data/app/assets/stylesheets/fwt_push_notification_server/jquery.ui.theme.css +0 -248
  25. data/app/controllers/fwt_push_notification_server/application_controller.rb +0 -9
  26. data/app/helpers/fwt_push_notification_server/application_helper.rb +0 -6
  27. data/app/models/fwt_push_notification_server/user.rb +0 -7
  28. data/app/views/fwt_push_notification_server/application/_empty_view.html.erb +0 -1
  29. data/app/views/fwt_push_notification_server/device_tokens/index.html.erb +0 -35
  30. data/app/views/layouts/fwt_push_notification_server/_messages.html.erb +0 -6
  31. data/app/views/layouts/fwt_push_notification_server/application.html.erb +0 -30
  32. data/config/initializers/devise.rb +0 -27
  33. data/config/locales/devise.en.yml +0 -60
  34. data/lib/generators/fwt_push_notification_server/install/templates/devise_create_fwt_push_notification_server_users.rb +0 -31
  35. data/lib/generators/fwt_push_notification_server/install/templates/seeds.rb +0 -5
  36. data/test/controllers/fwt_push_notification_server/device_tokens_controller_test.rb +0 -51
  37. data/test/dummy/Rakefile +0 -6
  38. data/test/dummy/app/assets/javascripts/application.js +0 -13
  39. data/test/dummy/app/assets/stylesheets/application.css +0 -13
  40. data/test/dummy/app/controllers/application_controller.rb +0 -5
  41. data/test/dummy/app/helpers/application_helper.rb +0 -2
  42. data/test/dummy/bin/bundle +0 -3
  43. data/test/dummy/bin/rails +0 -4
  44. data/test/dummy/bin/rake +0 -4
  45. data/test/dummy/config/application.rb +0 -23
  46. data/test/dummy/config/boot.rb +0 -5
  47. data/test/dummy/config/database.yml +0 -25
  48. data/test/dummy/config/environment.rb +0 -5
  49. data/test/dummy/config/environments/development.rb +0 -29
  50. data/test/dummy/config/environments/production.rb +0 -80
  51. data/test/dummy/config/environments/test.rb +0 -36
  52. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  53. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  54. data/test/dummy/config/initializers/fwt_push_notification_server.rb +0 -19
  55. data/test/dummy/config/initializers/inflections.rb +0 -16
  56. data/test/dummy/config/initializers/mime_types.rb +0 -5
  57. data/test/dummy/config/initializers/secret_token.rb +0 -12
  58. data/test/dummy/config/initializers/session_store.rb +0 -3
  59. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  60. data/test/dummy/config/locales/en.yml +0 -23
  61. data/test/dummy/config/routes.rb +0 -5
  62. data/test/dummy/config.ru +0 -4
  63. data/test/dummy/db/development.sqlite3 +0 -0
  64. data/test/dummy/db/migrate/20130918095820_create_fwt_push_notification_server_device_tokens.rb +0 -14
  65. data/test/dummy/db/migrate/20130918095821_devise_create_fwt_push_notification_server_users.rb +0 -31
  66. data/test/dummy/db/schema.rb +0 -43
  67. data/test/dummy/db/seeds.rb +0 -5
  68. data/test/dummy/log/development.log +0 -16238
  69. data/test/dummy/log/test.log +0 -10
  70. data/test/dummy/public/404.html +0 -58
  71. data/test/dummy/public/422.html +0 -58
  72. data/test/dummy/public/500.html +0 -57
  73. data/test/dummy/public/favicon.ico +0 -0
  74. data/test/dummy/tmp/cache/assets/development/sass/12c8e9505bddaa133e5fb349c2a5686f5ceccada/bootstrap.scssc +0 -0
  75. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_accordion.scssc +0 -0
  76. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_alerts.scssc +0 -0
  77. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_breadcrumbs.scssc +0 -0
  78. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_button-groups.scssc +0 -0
  79. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_buttons.scssc +0 -0
  80. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_carousel.scssc +0 -0
  81. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_close.scssc +0 -0
  82. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_code.scssc +0 -0
  83. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_component-animations.scssc +0 -0
  84. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_dropdowns.scssc +0 -0
  85. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_forms.scssc +0 -0
  86. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_grid.scssc +0 -0
  87. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_hero-unit.scssc +0 -0
  88. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_labels-badges.scssc +0 -0
  89. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_layouts.scssc +0 -0
  90. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_media.scssc +0 -0
  91. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_mixins.scssc +0 -0
  92. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_modals.scssc +0 -0
  93. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_navbar.scssc +0 -0
  94. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_navs.scssc +0 -0
  95. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_pager.scssc +0 -0
  96. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_pagination.scssc +0 -0
  97. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_popovers.scssc +0 -0
  98. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_progress-bars.scssc +0 -0
  99. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_reset.scssc +0 -0
  100. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_scaffolding.scssc +0 -0
  101. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_sprites.scssc +0 -0
  102. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_tables.scssc +0 -0
  103. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_thumbnails.scssc +0 -0
  104. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_tooltip.scssc +0 -0
  105. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_type.scssc +0 -0
  106. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_utilities.scssc +0 -0
  107. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_variables.scssc +0 -0
  108. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/_wells.scssc +0 -0
  109. data/test/dummy/tmp/cache/assets/development/sass/7c851c8cce3147a485a2e36f9c2ea3624eca398d/bootstrap.scssc +0 -0
  110. data/test/dummy/tmp/cache/assets/development/sass/dd375f805d06ad6efb1710787bd24bcab705b025/application.css.scssc +0 -0
  111. data/test/dummy/tmp/cache/assets/development/sprockets/018e8124fa401e10da2a0f8d089b1467 +0 -0
  112. data/test/dummy/tmp/cache/assets/development/sprockets/04f93e7cd5f3c6bd6c26ea15acf03144 +0 -0
  113. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  114. data/test/dummy/tmp/cache/assets/development/sprockets/1e51677f9d96bb542510a33f91cbd9b6 +0 -0
  115. data/test/dummy/tmp/cache/assets/development/sprockets/23bb189d596dce443600523c2af2f418 +0 -0
  116. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  117. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  118. data/test/dummy/tmp/cache/assets/development/sprockets/375c78da06e45aab2bc0723f291620f6 +0 -0
  119. data/test/dummy/tmp/cache/assets/development/sprockets/3bebeefd5ffe6a58fb03bf1f37ac9163 +0 -0
  120. data/test/dummy/tmp/cache/assets/development/sprockets/40525813aeb4df11bbc7934420765970 +0 -0
  121. data/test/dummy/tmp/cache/assets/development/sprockets/4809faed3f3c49e4f0069d90c42db9fa +0 -0
  122. data/test/dummy/tmp/cache/assets/development/sprockets/4837e9658be5fa714ededd423bec6394 +0 -0
  123. data/test/dummy/tmp/cache/assets/development/sprockets/4930f39005ca20c14fe5b6ff5e3462c5 +0 -0
  124. data/test/dummy/tmp/cache/assets/development/sprockets/4edaf8d607c191a1d04f54ceafa27f34 +0 -0
  125. data/test/dummy/tmp/cache/assets/development/sprockets/525db6dca24b08bdb1073bd610b641fa +0 -0
  126. data/test/dummy/tmp/cache/assets/development/sprockets/52fc34b303a5058c0f82e03f5e49be15 +0 -0
  127. data/test/dummy/tmp/cache/assets/development/sprockets/53a6a8c806fb66ef100dcdec2c14667f +0 -0
  128. data/test/dummy/tmp/cache/assets/development/sprockets/5d48cbe0eb7f4d2a888760672ebcd0b5 +0 -0
  129. data/test/dummy/tmp/cache/assets/development/sprockets/5dbf4424a551546c8ca2ea3693f57aad +0 -0
  130. data/test/dummy/tmp/cache/assets/development/sprockets/63e1b63a0601a563b63be1b6cb6f14e8 +0 -0
  131. data/test/dummy/tmp/cache/assets/development/sprockets/7525085b7df71dd698c4ddd96818b178 +0 -0
  132. data/test/dummy/tmp/cache/assets/development/sprockets/7c0cc261ea34e01a60b85decd619d572 +0 -0
  133. data/test/dummy/tmp/cache/assets/development/sprockets/807b74c8c0f4286940e0f072e71dbf48 +0 -0
  134. data/test/dummy/tmp/cache/assets/development/sprockets/86b51d868b31f8ec21eab714b70f25c8 +0 -0
  135. data/test/dummy/tmp/cache/assets/development/sprockets/871bed79442dc4d0f7e860539e548c11 +0 -0
  136. data/test/dummy/tmp/cache/assets/development/sprockets/873e96cc154ed7b8f89ae6ebd6330d76 +0 -0
  137. data/test/dummy/tmp/cache/assets/development/sprockets/9266b6839c460333f8fabb33531b0aa5 +0 -0
  138. data/test/dummy/tmp/cache/assets/development/sprockets/9619769a83bc4c96187fad84dd44f662 +0 -0
  139. data/test/dummy/tmp/cache/assets/development/sprockets/984da49c74b19af286bd6da0be3b7f41 +0 -0
  140. data/test/dummy/tmp/cache/assets/development/sprockets/b3329085a217fc47138d40e542cbab29 +0 -0
  141. data/test/dummy/tmp/cache/assets/development/sprockets/b49ac435bde8ad5725858653ed8c96b0 +0 -0
  142. data/test/dummy/tmp/cache/assets/development/sprockets/c88406e714c83dc7a8eba7dfc687b9be +0 -0
  143. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  144. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  145. data/test/dummy/tmp/cache/assets/development/sprockets/db1758582caea75d451566fa655186d1 +0 -0
  146. data/test/dummy/tmp/cache/assets/development/sprockets/ee6e9c40abd892aaef0bbbf0bd11c5e0 +0 -0
  147. data/test/dummy/tmp/cache/assets/development/sprockets/f0e74746290141cd77d8e42db2047501 +0 -0
  148. data/test/dummy/tmp/cache/assets/development/sprockets/f301640fffe07f12598645f72b673e29 +0 -0
  149. data/test/dummy/tmp/cache/assets/development/sprockets/f3f906a5c3f8d16aaa9833a07d5f87dc +0 -0
  150. data/test/dummy/tmp/cache/assets/development/sprockets/f6db10193f0119f139b2d45d263ed768 +0 -0
  151. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  152. data/test/dummy/tmp/cache/assets/development/sprockets/fa7addf7e35b3a6bfcff34dc107fad07 +0 -0
  153. data/test/fixtures/fwt_push_notification_server/device_tokens.yml +0 -13
  154. data/test/fixtures/fwt_push_notification_server/users.yml +0 -11
  155. data/test/fwt_push_notification_server_test.rb +0 -9
  156. data/test/helpers/fwt_push_notification_server/device_tokens_helper_test.rb +0 -6
  157. data/test/integration/navigation_test.rb +0 -10
  158. data/test/models/fwt_push_notification_server/device_token_test.rb +0 -9
  159. data/test/models/fwt_push_notification_server/user_test.rb +0 -9
  160. data/test/test_helper.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a98d7e08a6ce4dc5ab5581744f744465c9ac05a
4
- data.tar.gz: 9d61f5bd7dccccb2bdad535cf9d08341f25818d0
3
+ metadata.gz: 7172b0f43a912e0d5fb9cffc3d7dfd4e17e2b1e0
4
+ data.tar.gz: 3d376af460f6b7bf7d1828946ddda354610a0f1f
5
5
  SHA512:
6
- metadata.gz: 55c320a011822f617a37f154e803b3156d9a449d2abda7ca000f616720bc1a039cdbfcf68aa0be4c6f6b25b85711c5624d72828ad1a6e6b46cf801ec6fa16723
7
- data.tar.gz: 07682b7ff307e4809600bedd2522458389d0c226adbaf6212901383252e36f7bef4f4612d83d17d196c990a7bf43259d83e74b031a1afada84879162d1708b15
6
+ metadata.gz: f497d2a95216156d3b1eb88c48c95821331c8413defa2159944b7599ad346bd4f1dd4c8e41c6d4914108aa3a4ae2948ee68dc9c410849090f489027b532df00a
7
+ data.tar.gz: 206e5e4e2f6493bf8836e0e8d0ee2d2d452d0352ebbc2e1c7aa227441608c7e0c458f54640ee015d52ef3d4b0e66c09ebf087f46b0172dd4415347bb9a831bd1
@@ -1,35 +1,15 @@
1
- require_dependency "fwt_push_notification_server/application_controller"
2
- require 'digest'
3
1
 
4
2
  module FwtPushNotificationServer
5
3
 
6
- class DeviceTokensController < ApplicationController
4
+ class DeviceTokensController < FwtPushNotificationServer.api_controller_class
7
5
 
8
- skip_before_filter :authenticate_user!, :if => lambda {
9
- if params[:token].blank? || params[:sig].blank?
10
- false
11
- else
12
- token = params[:token]
13
- device_name = params[:device_name]
14
- device_id = params[:device_id]
15
- config = FwtPushNotificationServer.config
16
- key = config[:api_key]
17
- params_string = "token=#{token}&device_name=#{device_name}&device_id=#{device_id}"
18
- !!(Digest::HMAC.hexdigest(params_string, key, Digest::SHA256) == params[:sig])
19
- end
20
- }
21
-
22
- # GET /device_tokens
23
- def index
24
- @device_tokens = DeviceToken.page.per(100)
25
- end
6
+ skip_authorization_check
26
7
 
27
- # POST /device_tokens
28
8
  def create
29
9
  @device_token = DeviceToken.find_or_create_by_token(params[:token])
30
10
  @device_token.update_attributes({
31
- :device_id => params[:device_id] || "",
32
- :device_name => params[:device_name] || ""
11
+ :user_id => params[:user_id],
12
+ :provider => params[:provider]
33
13
  })
34
14
  if @device_token.present?
35
15
  @device_token.save
@@ -41,9 +21,8 @@ module FwtPushNotificationServer
41
21
  end
42
22
 
43
23
  private
44
- # Only allow a trusted parameter "white list" through.
45
24
  def device_token_params
46
- params.permit(:token, :device_id, :device_name, :is_valid, :key, :sig)
25
+ params.permit(:token, :user_id, :provider)
47
26
  end
48
27
 
49
28
  end
@@ -4,6 +4,15 @@ module FwtPushNotificationServer
4
4
 
5
5
  validates_uniqueness_of :token
6
6
 
7
+ def user
8
+ user_id.blank? ? nil : FwtPushNotificationServer.user_class.find_by(FwtPushNotificationServer.user_key => user_id)
9
+ end
10
+
11
+ def notifier
12
+ return nil if provider.nil?
13
+ FwtPushNotificationServer.notifiers[provider.to_sym]
14
+ end
15
+
7
16
  end
8
17
 
9
18
  end
data/config/routes.rb CHANGED
@@ -1,11 +1,6 @@
1
- FwtPushNotificationServer::Engine.routes.draw do
2
1
 
3
- resources :device_tokens, only: [:create, :index]
4
- root :to => 'device_tokens#index'
2
+ FwtPushNotificationServer::Engine.routes.draw do
5
3
 
6
- devise_for :users, {
7
- class_name: 'FwtPushNotificationServer::User',
8
- module: :devise
9
- }
4
+ resources :device_tokens, only: [:create]
10
5
 
11
6
  end
@@ -0,0 +1,30 @@
1
+ module Devise
2
+ module Models
3
+
4
+ module Notifiable
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ def notify_once(message)
9
+ device_tokens.each do |device|
10
+ next unless device.is_valid
11
+ device.notifier.notify_once(message, device) unless device.notifier.nil?
12
+ end
13
+ end
14
+
15
+ def schedule_notification
16
+ device_tokens.each do |device|
17
+ next unless device.is_valid
18
+ device.notifier.add_device_token(device) unless device.notifier.nil?
19
+ end
20
+ end
21
+
22
+ def device_tokens
23
+ key = FwtPushNotificationServer.user_key
24
+ FwtPushNotificationServer::DeviceToken.where(:user_id => send(key))
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+ end
@@ -1,11 +1,7 @@
1
- require "kaminari-bootstrap"
2
- require "bootstrap-sass"
3
- require "sass-rails"
4
1
  require "devise"
5
2
  require "cancan"
6
- require "simple_form"
7
- require "rails_bootstrap_navbar"
8
- require "coffee-rails"
3
+ require "grocer"
4
+ require "gcm"
9
5
 
10
6
  module FwtPushNotificationServer
11
7
 
@@ -1,3 +1,3 @@
1
1
  module FwtPushNotificationServer
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7.b4"
3
3
  end
@@ -1,48 +1,62 @@
1
1
  require "fwt_push_notification_server/engine"
2
- require 'active_support/core_ext/hash/slice'
3
- require "devise"
4
- require "grocer"
2
+ require 'notifier/base'
3
+ require 'notifier/apns'
4
+ require 'notifier/gcm'
5
5
 
6
6
  module FwtPushNotificationServer
7
7
 
8
- mattr_accessor :config
9
-
10
- def self.apns_config
11
- config.slice(:gateway, :certificate, :passphrase)
12
- end
13
-
14
- def self.send_notification_to_all(alert)
15
- devices = DeviceToken.where(:is_valid => true).all
16
- send_notification(alert, devices)
17
- end
18
-
19
- def self.send_notification(alert, device_tokens)
20
-
21
- alert = alert.byteslice(0, 232)
22
- alert += '...' if alert.bytesize > 232
23
-
24
- config = self.apns_config
25
-
26
- pusher = Grocer.pusher(config)
27
-
28
- device_tokens = [device_tokens] unless device_tokens.is_a?(Array)
29
-
30
- device_tokens.each do |device|
31
- if device.is_valid
32
- token = device.token
33
- n = Grocer::Notification.new(device_token: token, alert: alert)
34
- pusher.push n
35
- end
36
- end
37
-
38
- feedback = Grocer.feedback(config)
39
- feedback.each do |attempt|
40
- token = attempt.device_token
41
- device_token = DeviceToken.find_by_token(token)
42
- device_token.update_attribute("is_valid", false) unless device_token.nil?
43
- puts "Device #{token} failed at #{attempt.timestamp}"
44
- end
45
-
46
- end
8
+ mattr_accessor :api_controller_class
9
+
10
+ mattr_accessor :authentication_filter
11
+ @@authentication_filter = :authenticate_user!
12
+
13
+ mattr_accessor :user_class
14
+
15
+ mattr_accessor :user_key
16
+ @@user_key = :user_id
17
+
18
+ mattr_accessor :apns_gateway
19
+ @@apns_gateway = 'sandbox.push.apple.com'
20
+
21
+ mattr_accessor :apns_certificate
22
+
23
+ mattr_accessor :apns_passphrase
24
+
25
+
26
+ mattr_accessor :gcm_api_key
27
+
28
+ def self.configure
29
+ yield self
30
+ end
31
+
32
+ ###
33
+ # Push Notifications
34
+ ###
35
+
36
+ mattr_accessor :notifiers
37
+ @@notifiers = {
38
+ :apns => Notifier::APNS.new,
39
+ :gcm => Notifier::GCM.new
40
+ }
41
+
42
+ def self.apns_config
43
+ {
44
+ :gateway => apns_gateway,
45
+ :certificate => apns_certificate,
46
+ :passphrase => apns_passphrase
47
+ }
48
+ end
49
+
50
+ def self.begin_transaction(message)
51
+ notifiers.each_value do |notifier|
52
+ notifier.begin_transaction(message)
53
+ end
54
+ end
55
+
56
+ def self.commit_transaction
57
+ notifiers.each_value do |notifier|
58
+ notifier.commit_transaction
59
+ end
60
+ end
47
61
 
48
62
  end
@@ -22,7 +22,7 @@ module FwtPushNotificationServer
22
22
 
23
23
  def copy_migrations
24
24
  migration_template "create_fwt_push_notification_server_device_tokens.rb", "db/migrate/create_fwt_push_notification_server_device_tokens.rb"
25
- migration_template "devise_create_fwt_push_notification_server_users.rb", "db/migrate/devise_create_fwt_push_notification_server_users.rb"
25
+ migration_template "add_provider_to_push_notification_server_device_tokens.rb", "db/migrate/add_provider_to_push_notification_server_device_tokens.rb"
26
26
  end
27
27
 
28
28
  desc "Add initializer"
@@ -31,13 +31,6 @@ module FwtPushNotificationServer
31
31
  copy_file "initializer.rb", "config/initializers/#{app_name}.rb"
32
32
  end
33
33
 
34
- desc "Add seeds"
35
-
36
- def append_seeds
37
- seeds = File.read(File.join(File.dirname(__FILE__), "templates/seeds.rb"))
38
- append_file "db/seeds.rb", seeds
39
- end
40
-
41
34
  private
42
35
  def app_name
43
36
  "fwt_push_notification_server"
@@ -0,0 +1,7 @@
1
+ class AddProviderToPushNotificationServerDeviceTokens < ActiveRecord::Migration
2
+
3
+ def change
4
+ add_column :fwt_push_notification_server_device_tokens, :provider, :string
5
+ end
6
+
7
+ end
@@ -3,8 +3,7 @@ class CreateFwtPushNotificationServerDeviceTokens < ActiveRecord::Migration
3
3
  def change
4
4
  create_table :fwt_push_notification_server_device_tokens do |t|
5
5
  t.string :token
6
- t.string :device_id
7
- t.string :device_name
6
+ t.string :user_id
8
7
  t.boolean :is_valid, :default => true
9
8
 
10
9
  t.timestamps
@@ -1,20 +1,18 @@
1
- #development (sandbox)
2
- FwtPushNotificationServer.config = {
3
1
 
4
- :api_key => 'YOUR-DEVELOPMENT-KEY-HERE',
5
- :certificate => File.join(Rails.root, 'config', 'APNSDevelopment.pem'),
6
- :passphrase => 'PASSPHRASE',
7
- :gateway => 'gateway.sandbox.push.apple.com',
8
- :title => 'FWT Push Notifications'
9
- };
2
+ FwtPushNotificationServer.configure do |config|
10
3
 
11
- #production
12
- # FwtPushNotificationServer.config = {
4
+ # APNS
5
+ config.apns_certificate = File.join(Rails.root, 'config', 'APNSDevelopment.pem')
6
+ config.apns_passphrase = 'PASSPHRASE'
7
+ config.apns_gateway = 'gateway.sandbox.push.apple.com'
8
+
9
+ # GCM
10
+ config.gcm_api_key = 'YOUR-KEY-HERE'
13
11
 
14
- # :api_key => 'YOUR-PRODUCTION-KEY-HERE',
15
- # :certificate => File.join(Rails.root, 'config', 'APNSProduction.pem'),
16
- # :passphrase => 'PASSPHRASE',
17
- # :gateway => 'gateway.push.apple.com',
18
- # :title => 'FWT Push Notifications'
12
+ # Devise integration
13
+ config.api_controller_class = ApplicationController
14
+ config.authentication_filter = :authenticate_user!
15
+ config.user_class = User
16
+ config.user_key = :user_id
19
17
 
20
- # };
18
+ end
@@ -0,0 +1,38 @@
1
+ module FwtPushNotificationServer
2
+
3
+ module Notifier
4
+
5
+ class APNS < Notifier::Base
6
+
7
+ def notify_once(message, device_tokens)
8
+
9
+ alert = message.byteslice(0, 232)
10
+ alert += '...' if alert.bytesize > 232
11
+
12
+ config = FwtPushNotificationServer.apns_config
13
+ pusher = Grocer.pusher(config)
14
+
15
+ device_tokens = [device_tokens] unless device_tokens.is_a?(Array)
16
+ device_tokens.each do |device|
17
+ if device.is_valid
18
+ token = device.token
19
+ n = Grocer::Notification.new(device_token: token, alert: alert)
20
+ pusher.push n
21
+ end
22
+ end
23
+
24
+ feedback = Grocer.feedback(config)
25
+ feedback.each do |attempt|
26
+ token = attempt.device_token
27
+ device_token = DeviceToken.find_by_token(token)
28
+ device_token.update_attribute("is_valid", false) unless device_token.nil?
29
+ puts "APNS: Device #{token} failed at #{attempt.timestamp}"
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,28 @@
1
+ module FwtPushNotificationServer
2
+
3
+ module Notifier
4
+
5
+ class Base
6
+
7
+ def begin_transaction(message)
8
+ @device_tokens = []
9
+ @message = message
10
+ end
11
+
12
+ def add_device_token(device_token)
13
+ @device_tokens << device_token if device_token.is_valid
14
+ end
15
+
16
+ def commit_transaction
17
+ notify_once(@message, @device_tokens.uniq)
18
+ end
19
+
20
+ def notify_once(message, device_tokens)
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,41 @@
1
+ module FwtPushNotificationServer
2
+
3
+ module Notifier
4
+
5
+ class GCM < Notifier::Base
6
+
7
+ def notify_once(message, device_tokens)
8
+
9
+ @device_tokens = device_tokens.is_a?(Array) ? device_tokens : [device_tokens]
10
+
11
+ @gcm = ::GCM.new(FwtPushNotificationServer.gcm_api_key)
12
+
13
+ @registration_ids = []
14
+ @payload = { :data => { :message => message } }
15
+ @device_tokens.each do |device|
16
+ @registration_ids << device.token
17
+ if @registration_ids.count == 1000
18
+ send_batch
19
+ end
20
+ end
21
+ send_batch
22
+ end
23
+
24
+ private
25
+ def send_batch
26
+ response = @gcm.send_notification(@registration_ids, @payload)
27
+ body = JSON.parse(response.fetch(:body, "{}"))
28
+ results = body.fetch("results", [])
29
+ results.each_with_index do |result, idx|
30
+ if result["error"]
31
+ @device_tokens[idx].update_attribute('is_valid', false)
32
+ end
33
+ end
34
+ @registration_ids = []
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end