fwt_push_notification_server 0.0.6 → 0.0.7.b4

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