jera_push 1.2.4 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +12 -18
  3. data/app/controllers/jera_push/admin/messages_controller.rb +27 -12
  4. data/app/controllers/jera_push/jera_push_controller.rb +0 -2
  5. data/app/presenters/jera_push/message_presenter.rb +22 -18
  6. data/app/views/jera_push/admin/messages/show.html.erb +7 -4
  7. data/config/locale/jera_push.pt-BR.yml +7 -0
  8. data/config/routes.rb +1 -0
  9. data/lib/generators/active_record/templates/create_jera_push_devices.rb +2 -1
  10. data/lib/generators/active_record/templates/create_jera_push_messages.rb +6 -3
  11. data/lib/generators/active_record/templates/create_jera_push_messages_devices.rb +3 -3
  12. data/lib/generators/jera_push/templates/jera_push.rb +2 -1
  13. data/lib/jera_push/firebase/client.rb +53 -56
  14. data/lib/jera_push/models/android_config.rb +33 -0
  15. data/lib/jera_push/models/apple_config.rb +61 -0
  16. data/lib/jera_push/models/device.rb +3 -31
  17. data/lib/jera_push/models/message.rb +2 -142
  18. data/lib/jera_push/models/message_device.rb +1 -0
  19. data/lib/jera_push/models/notification.rb +25 -0
  20. data/lib/jera_push/models/push_body.rb +90 -0
  21. data/lib/jera_push/services/base_service.rb +23 -0
  22. data/lib/jera_push/services/send_message.rb +20 -4
  23. data/lib/jera_push/services/send_push_service.rb +42 -0
  24. data/lib/jera_push/services/send_to_device_service.rb +42 -0
  25. data/lib/jera_push/services/send_to_devices_service.rb +45 -0
  26. data/lib/jera_push/services/send_to_everyone_service.rb +40 -0
  27. data/lib/jera_push/services/send_to_topic_service.rb +37 -0
  28. data/lib/jera_push/services/topic_service.rb +18 -0
  29. data/lib/jera_push/version.rb +1 -1
  30. data/lib/jera_push.rb +23 -5
  31. metadata +75 -116
  32. data/test/dummy/README.rdoc +0 -28
  33. data/test/dummy/Rakefile +0 -6
  34. data/test/dummy/app/assets/javascripts/application.js +0 -13
  35. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  36. data/test/dummy/app/controllers/application_controller.rb +0 -5
  37. data/test/dummy/app/helpers/application_helper.rb +0 -2
  38. data/test/dummy/app/models/user.rb +0 -3
  39. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  40. data/test/dummy/bin/bundle +0 -3
  41. data/test/dummy/bin/rails +0 -4
  42. data/test/dummy/bin/rake +0 -4
  43. data/test/dummy/bin/setup +0 -29
  44. data/test/dummy/config/application.rb +0 -25
  45. data/test/dummy/config/boot.rb +0 -5
  46. data/test/dummy/config/database.yml +0 -16
  47. data/test/dummy/config/environment.rb +0 -5
  48. data/test/dummy/config/environments/development.rb +0 -41
  49. data/test/dummy/config/environments/production.rb +0 -79
  50. data/test/dummy/config/environments/test.rb +0 -42
  51. data/test/dummy/config/initializers/assets.rb +0 -12
  52. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  53. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  54. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  55. data/test/dummy/config/initializers/inflections.rb +0 -16
  56. data/test/dummy/config/initializers/mime_types.rb +0 -4
  57. data/test/dummy/config/initializers/session_store.rb +0 -3
  58. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  59. data/test/dummy/config/locales/en.yml +0 -23
  60. data/test/dummy/config/locales/pt-BR.yml +0 -23
  61. data/test/dummy/config/routes.rb +0 -57
  62. data/test/dummy/config/secrets.yml +0 -22
  63. data/test/dummy/config.ru +0 -4
  64. data/test/dummy/db/migrate/20161005121035_create_users.rb +0 -10
  65. data/test/dummy/db/schema.rb +0 -61
  66. data/test/dummy/db/seeds.rb +0 -70
  67. data/test/dummy/public/404.html +0 -67
  68. data/test/dummy/public/422.html +0 -67
  69. data/test/dummy/public/500.html +0 -66
  70. data/test/dummy/public/favicon.ico +0 -0
  71. data/test/dummy/test/fixtures/users.yml +0 -7
  72. data/test/dummy/test/models/user_test.rb +0 -7
  73. data/test/jera_push_test.rb +0 -7
  74. data/test/test_helper.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6f63d90cf49a65d29029d1c6597afb8e813537a7b60ed9b045a885eb1799f81
4
- data.tar.gz: 57af32466be12fbc0828920abc1f556b9351452f491e4981cf54a93a1dda060e
3
+ metadata.gz: aed822e33bf25c1e59e030e3d32d4aa45de406535a3993339ae12e43cd27b90c
4
+ data.tar.gz: d11416aeea95d06bbaa598a0d3c3c2c61c7912c0361f4e2888c378de9cf7add9
5
5
  SHA512:
6
- metadata.gz: 7bfd9f73d69b6650e536549022c378eb34404ff494ff71d718974af27236f3b0cfe56107c130b6149485398675b86b47cc02815e3a0cb487691c86ca0d99b2b9
7
- data.tar.gz: 7c6c7e81a5efb2eff4de42167b54d55953d8ac8522e0a74628146b911c6a5cb2de2dbe38df5e13b03d182a7b2df8ada0874c55f89cb8389259f8b8180bc8119a
6
+ metadata.gz: 793828acf069f18159e6ec301327b0cbe21e4e8600c1485931e26b0229e299d7c287e8b275aa0e7e5ca254fab8e5317f5d618f703eea78cc01d8572ebb482e91
7
+ data.tar.gz: 8bd496cc69b14561a847e5ae7ce1b198a9d21a98642abec25c11e46863be75b1e8ae5af357c04ec24728d0050178f3f346eeeb7ae553624271cbb7ae5d736393
data/Rakefile CHANGED
@@ -1,10 +1,16 @@
1
+ require 'rake'
2
+
1
3
  begin
2
4
  require 'bundler/setup'
5
+
6
+ Bundler::GemHelper.install_tasks
3
7
  rescue LoadError
4
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
8
+ puts 'although not required, bundler is recommended for running the tests'
5
9
  end
6
10
 
7
- require 'rdoc/task'
11
+ task default: :spec
12
+
13
+ require 'rspec/core/rake_task'
8
14
 
9
15
  RDoc::Task.new(:rdoc) do |rdoc|
10
16
  rdoc.rdoc_dir = 'rdoc'
@@ -14,21 +20,9 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
20
  rdoc.rdoc_files.include('lib/**/*.rb')
15
21
  end
16
22
 
23
+ require 'rubocop/rake_task'
17
24
 
18
-
19
-
20
-
21
-
22
- Bundler::GemHelper.install_tasks
23
-
24
- require 'rake/testtask'
25
-
26
- Rake::TestTask.new(:test) do |t|
27
- t.libs << 'lib'
28
- t.libs << 'test'
29
- t.pattern = 'test/**/*_test.rb'
30
- t.verbose = false
25
+ RuboCop::RakeTask.new do |task|
26
+ task.requires << 'rubocop-performance'
27
+ task.requires << 'rubocop-rspec'
31
28
  end
32
-
33
-
34
- task default: :test
@@ -28,7 +28,7 @@ module JeraPush
28
28
  end
29
29
 
30
30
  def create
31
- push_message = JeraPush::Service::SendMessage.new(message_params).call
31
+ push_message = JeraPush::Services::SendMessage.new(params).call
32
32
 
33
33
  if push_message
34
34
  flash[:notice] = t('jera_push.admin.messages.new.toast.success')
@@ -40,20 +40,35 @@ module JeraPush
40
40
  end
41
41
  end
42
42
 
43
+ def resend_push
44
+ message = JeraPush::Message.find(params[:id])
45
+ message.devices.find_each do |device|
46
+ push = JeraPush::PushBody.new(
47
+ title: message.title,
48
+ body: message.body,
49
+ data: message.data,
50
+ device: device
51
+ )
52
+ JeraPush::Services::SendPushService.new(push: push,
53
+ message: message,
54
+ message_device: message.message_devices.where(device: device).last
55
+ ).call
56
+ end
57
+ flash[:notice] = t('jera_push.admin.messages.new.toast.success')
58
+ redirect_to jera_push_admin_message_path(message)
59
+ end
60
+
43
61
  private
44
62
 
45
- def apply_filter
46
- @filter = JeraPush::DeviceFilter.new device_filter_params
47
- @devices = @filter.search.limit(params[:limit]).order(created_at: :desc)
48
- @message_devices = JeraPush::MessageDevice.includes(:device).where('message_id = :id and device_id in (:device_ids)', id: params[:id], device_ids: @devices.pluck(:id))
49
- end
63
+ def apply_filter
64
+ @filter = JeraPush::DeviceFilter.new device_filter_params
65
+ @devices = @filter.search.limit(params[:limit]).order(created_at: :desc)
66
+ @message_devices = JeraPush::MessageDevice.includes(:device).where(message_id: params[:id], device_id: @devices.pluck(:id))
67
+ end
50
68
 
51
- def message_params
52
- params.permit(:type, devices: [], message: [:key, :value])
53
- end
69
+ def device_filter_params
70
+ params.permit(:value, :field, platform: []).merge({ message_id: params[:id] })
71
+ end
54
72
 
55
- def device_filter_params
56
- params.permit(:value, :field, :resource_name, platform: []).merge({ message_id: params[:id] })
57
- end
58
73
  end
59
74
  end
@@ -1,7 +1,5 @@
1
1
  module JeraPush
2
2
  class JeraPushController < ::ApplicationController
3
- protect_from_forgery unless: -> { request.format.json? }
4
-
5
3
  protected
6
4
 
7
5
  def render_invalid_params
@@ -1,25 +1,29 @@
1
1
  class JeraPush::MessagePresenter < BasePresenter
2
2
 
3
- def list_content
4
- JSON.pretty_generate({
5
- title: item.content["title"],
6
- body: item.content["body"]
7
- })
8
- end
3
+ def list_content
4
+ JSON.pretty_generate({
5
+ title: item.title,
6
+ body: item.body
7
+ })
8
+ end
9
9
 
10
- def display_content
11
- JSON.pretty_generate(item.content)
12
- end
10
+ def display_content
11
+ JSON.pretty_generate({
12
+ title: item.title,
13
+ body: item.body,
14
+ data: item.data
15
+ })
16
+ end
13
17
 
14
- def display_created_at
15
- item.created_at.strftime('%d/%m/%Y %H:%M')
16
- end
18
+ def display_created_at
19
+ item.created_at.strftime('%d/%m/%Y %H:%M')
20
+ end
17
21
 
18
- def show_link
19
- helpers.link_to(
20
- helpers.t('jera_push.admin.buttons.details'),
21
- Rails.application.routes.url_helpers.jera_push_admin_message_path(item), class: 'waves-effect waves-light btn'
22
- )
23
- end
22
+ def show_link
23
+ helpers.link_to(
24
+ helpers.t('jera_push.admin.buttons.details'),
25
+ Rails.application.routes.url_helpers.jera_push_admin_message_path(item), class: 'waves-effect waves-light btn'
26
+ )
27
+ end
24
28
 
25
29
  end
@@ -2,7 +2,10 @@
2
2
 
3
3
  <div class="details">
4
4
  <h3><%= t('jera_push.active_record.model.message.one') %></h3>
5
-
5
+ <%= form_tag resend_push_jera_push_admin_message_path(@message), method: :get, class: 'col s12', remote: true do |f| %>
6
+ <%= submit_tag t('jera_push.admin.messages.resend'), class: 'btn' %>
7
+ <% end %>
8
+ <br>
6
9
  <span class="field">
7
10
  <%= t('jera_push.active_record.messages.attributes.id') %>
8
11
  </span>
@@ -13,7 +16,7 @@
13
16
  </span>
14
17
  <blockquote class="json-message"><%= @message.display_content %></blockquote>
15
18
 
16
- <% unless @message.kind.broadcast? %>
19
+ <% unless @message.kind.everyone? %>
17
20
  <span class="field">
18
21
  <%= t('jera_push.active_record.messages.attributes.status') %>
19
22
  </span>
@@ -25,8 +28,8 @@
25
28
  <% end %>
26
29
  </div>
27
30
 
28
- <% if @message.kind.broadcast? %>
29
- <h3><%= JeraPush::Message.kind.broadcast.text %></h3>
31
+ <% if @message.kind.everyone? %>
32
+ <h3><%= JeraPush::Message.kind.everyone.text %></h3>
30
33
 
31
34
  <div class="message-info">
32
35
  <%= render partial: 'jera_push/admin/messages/broadcast_message', message: @message %>
@@ -29,6 +29,7 @@ pt-BR:
29
29
  admin:
30
30
  attributes:
31
31
  id: Identificador
32
+ token: Token
32
33
  name: Nome
33
34
  email: Email
34
35
  navbar:
@@ -62,6 +63,7 @@ pt-BR:
62
63
  messages:
63
64
  failures: "Falhas: %{value}"
64
65
  success: "Sucessos: %{value}"
66
+ resend: Reenviar a push
65
67
  show:
66
68
  broadcast:
67
69
  platform: Plataforma
@@ -76,3 +78,8 @@ pt-BR:
76
78
  new_attribute: Novo Atributo
77
79
  specific: Específico
78
80
  broadcast: Broadcast
81
+ services:
82
+ errors:
83
+ not_found:
84
+ device: Dispositivo não pode ficar em branco
85
+
data/config/routes.rb CHANGED
@@ -10,6 +10,7 @@ Rails.application.routes.draw do
10
10
  end
11
11
  member do
12
12
  get :message_devices_filter, format: :js
13
+ get :resend_push, format: :js
13
14
  end
14
15
  end
15
16
  resources :devices, only: [:index]
@@ -5,8 +5,9 @@ class CreateJeraPushDevices < ActiveRecord::Migration<%= migration_version %>
5
5
  t.string :platform, index: true
6
6
  t.references :pushable, polymorphic: true, index: true
7
7
 
8
- t.timestamps null: false
8
+ t.timestamps
9
9
  end
10
+
10
11
  add_index :jera_push_devices, [:token, :platform], unique: true
11
12
  end
12
13
  end
@@ -1,17 +1,20 @@
1
1
  class CreateJeraPushMessages < ActiveRecord::Migration<%= migration_version %>
2
2
  def change
3
3
  create_table :jera_push_messages do |t|
4
- t.text :content
4
+ t.string :title
5
+ t.text :body
6
+ t.json :data
7
+ t.string :multicast_id
5
8
  t.text :broadcast_result
6
9
  t.string :status
7
10
  t.string :kind
8
11
  t.string :topic
9
12
  t.string :firebase_id
10
- t.string :error_message
13
+ t.json :error_message
11
14
  t.integer :failure_count, default: 0
12
15
  t.integer :success_count, default: 0
13
16
 
14
- t.timestamps null: false
17
+ t.timestamps
15
18
  end
16
19
  end
17
20
  end
@@ -1,13 +1,13 @@
1
1
  class CreateJeraPushMessagesDevices < ActiveRecord::Migration<%= migration_version %>
2
2
  def change
3
3
  create_table :jera_push_messages_devices do |t|
4
- t.integer :device_id, index: true, foreign_key: true
5
- t.integer :message_id, index: true, foreign_key: true
4
+ t.integer :device_id, index: true
5
+ t.integer :message_id, index: true
6
6
  t.string :status
7
7
  t.string :error_message
8
8
  t.string :firebase_id
9
9
 
10
- t.timestamps null: false
10
+ t.timestamps
11
11
  end
12
12
 
13
13
  add_index :jera_push_messages_devices, [:device_id, :message_id], unique: true, name: :jera_push_index_messages_id_devices_id
@@ -4,7 +4,8 @@ JeraPush.setup do |config|
4
4
  config.firebase_api_key = "YOUR_API_KEY"
5
5
  # Change this for every new model
6
6
  config.resources_name = ["<%= file_name.classify %>"]
7
-
7
+ config.project_name = "YOUR_PROJECT_NAME"
8
+ config.credentials_path = "YOUR_CREDENTIALS_PATH" #https://firebase.google.com/docs/cloud-messaging/migrate-v1?hl=pt-br#provide-credentials-manually
8
9
  ######################################################
9
10
  # Resource attribute showed in views #
10
11
  # IMPORTANT: All models need to have this attributes #
@@ -1,69 +1,66 @@
1
- module JeraPush
2
- module Firebase
3
- class Client
1
+ module JeraPush::Firebase
2
+ class Client
3
+ FIREBASE_API_VERSION = 'v1'.freeze
4
+ FIREBASE_INSTANCE_ID_URL = 'https://iid.googleapis.com/iid'.freeze
5
+ SCOPE = 'https://www.googleapis.com/auth/firebase.messaging'.freeze
4
6
 
5
- cattr_accessor :client
7
+ def initialize
8
+ @client = Google::Apis::FcmV1::FirebaseCloudMessagingService.new
9
+ @authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
10
+ json_key_io: File.open(::JeraPush::credentials_path),
11
+ scope: SCOPE
12
+ )
13
+ @client.authorization = fetch_access_token
14
+ end
6
15
 
7
- FIREBASE_URL = "https://fcm.googleapis.com/fcm/send"
8
- FIREBASE_INSTANCE_ID_URL = "https://iid.googleapis.com/iid"
16
+ def send_to_device(push:)
17
+ @client.send_message("projects/#{::JeraPush.project_name}", push.to_json, options: { retries: 3, multiplier: 1, max_interval: 2 })
18
+ end
9
19
 
10
- def default_headers
11
- return {
12
- "Authorization" => "key=#{::JeraPush.firebase_api_key}",
13
- "Content-Type" => "application/json"
14
- }
15
- end
20
+ def add_device_to_topic(topic:, device:)
21
+ send(url: "#{FIREBASE_INSTANCE_ID_URL}/v1/#{device.token}/rel/topics/#{topic}")
22
+ end
16
23
 
17
- def self.instance
18
- @@client ||= JeraPush::Firebase::Client.new
19
- end
24
+ def remove_device_from_topic(topic:, devices: [])
25
+ send(
26
+ url: "#{FIREBASE_INSTANCE_ID_URL}/v1:batchRemove",
27
+ body: {
28
+ to: "/topics/#{topic}",
29
+ registration_tokens: devices.pluck(:token)
30
+ }.to_json
31
+ )
32
+ end
20
33
 
21
- def send_message(message:, devices: [])
22
- registration_ids = devices.map(&:token)
23
- body = { registration_ids: registration_ids, priority: 'high' }
24
- response = HTTParty.post(FIREBASE_URL, { body: body.merge!(message).to_json, headers: default_headers })
25
- puts response
26
- ApiResult.new(response, registration_ids: registration_ids)
27
- end
34
+ def send_message_to_topic(message:, topic:)
35
+ send(
36
+ url: FIREBASE_URL,
37
+ body: {
38
+ title: message.title,
39
+ body: message.body,
40
+ to: "/topics/#{topic}",
41
+ priority: 'high'
42
+ }.to_json
43
+ )
44
+ end
28
45
 
29
- def send_message_to_topic(message:, topic:)
30
- body = { to: "/topics/#{topic}", priority: 'high' }
31
- response = HTTParty.post(FIREBASE_URL, { body: body.merge!(message).to_json, headers: default_headers })
32
- puts response
33
- ApiResult.new(response, topic: topic)
34
- end
46
+ private
35
47
 
36
- def device_details(device:)
37
- url = "#{FIREBASE_INSTANCE_ID_URL}/info/#{device.token}/"
38
- response = HTTParty.post(url, { body: Hash.new.to_json, headers: default_headers })
39
- ApiResult.new(response)
40
- end
48
+ def send(url:, body: {})
49
+ response = HTTParty.post(url, { body: body, headers: default_headers })
50
+ JSON.parse(response)
51
+ end
41
52
 
42
- def add_device_to_topic(topic:, device:)
43
- url = "#{FIREBASE_INSTANCE_ID_URL}/v1/#{device.token}/rel/topics/#{topic}"
44
- response = HTTParty.post(url, { body: Hash.new.to_json, headers: default_headers })
45
- ApiResult.new(response)
46
- end
53
+ def fetch_access_token
54
+ @authorizer.fetch_access_token! if @authorizer.needs_access_token?
47
55
 
48
- def add_devices_to_topic(topic:, devices: [])
49
- url = "#{FIREBASE_INSTANCE_ID_URL}/v1:batchAdd"
50
- body = {
51
- "to": "/topics/#{topic}",
52
- "registration_tokens": devices.map(&:token),
53
- }
54
- response = HTTParty.post(url, { body: body.to_json, headers: default_headers })
55
- ApiResult.new(response)
56
- end
56
+ @authorizer
57
+ end
57
58
 
58
- def remove_device_from_topic(topic:, devices: [])
59
- url = "#{FIREBASE_INSTANCE_ID_URL}/v1:batchRemove"
60
- body = {
61
- "to": "/topics/#{topic}",
62
- "registration_tokens": devices.map(&:token),
63
- }
64
- response = HTTParty.post(url, { body: body.to_json, headers: default_headers })
65
- ApiResult.new(response)
66
- end
59
+ def default_headers
60
+ {
61
+ "Authorization" => "key=#{::JeraPush.firebase_api_key}",
62
+ "Content-Type" => "application/json"
63
+ }
67
64
  end
68
65
  end
69
66
  end
@@ -0,0 +1,33 @@
1
+ module JeraPush
2
+ class AndroidConfig
3
+ # REF: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br#AndroidMessagePriority
4
+ attr_accessor :priority
5
+ attr_accessor :analytics_label
6
+
7
+
8
+ def initialize(
9
+ priority: 'high',
10
+ analytics_label: nil
11
+ )
12
+ self.priority = priority
13
+ self.analytics_label = analytics_label
14
+ end
15
+
16
+ def to_json
17
+ android_body
18
+ end
19
+
20
+ private
21
+
22
+ # REF: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br#AndroidConfig
23
+ def android_body
24
+ {
25
+ priority: priority,
26
+ # REF: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br#FcmOptions
27
+ fcm_options: {
28
+ analytics_label: analytics_label
29
+ }
30
+ }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,61 @@
1
+ module JeraPush
2
+ # REF: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br#ApnsConfig
3
+ class AppleConfig
4
+ # Specify 5 to send the notification based on power considerations on the user’s device.
5
+ # Specify 10 to send the notification immediately.
6
+ attr_accessor :apns_priority
7
+ attr_accessor :headers
8
+ # REF: https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification
9
+ # REF: https://developer.apple.com/documentation/usernotifications/pushing-background-updates-to-your-app
10
+ attr_accessor :content_available
11
+ # REF: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br#ApnsFcmOptions
12
+ attr_accessor :analytics_label
13
+ attr_accessor :analytics_image
14
+
15
+ def initialize(
16
+ apns_priority: '5',
17
+ headers: {},
18
+ content_available: 1,
19
+ analytics_label: nil,
20
+ analytics_image: nil
21
+ )
22
+ self.apns_priority = apns_priority
23
+ self.headers = headers
24
+ self.content_available = content_available
25
+ self.analytics_label = analytics_label
26
+ end
27
+
28
+ def to_json
29
+ apns_body
30
+ end
31
+
32
+ private
33
+
34
+ def apns_body
35
+ {
36
+ headers: headers_body,
37
+ payload: payload_body,
38
+ fcm_options: fcm_body
39
+ }
40
+ end
41
+
42
+ def headers_body
43
+ headers.merge!({ 'apns-priority': apns_priority} )
44
+ end
45
+
46
+ def payload_body
47
+ {
48
+ aps: {
49
+ 'content-available': content_available
50
+ }
51
+ }
52
+ end
53
+
54
+ def fcm_body
55
+ {
56
+ analytics_label: analytics_label,
57
+ image: analytics_image
58
+ }
59
+ end
60
+ end
61
+ end
@@ -3,21 +3,16 @@ require 'enumerize'
3
3
  class JeraPush::Device < ActiveRecord::Base
4
4
  extend Enumerize
5
5
 
6
- DEFAULT_TOPIC = 'general'
7
-
8
6
  self.table_name = "jera_push_devices"
9
7
 
10
- has_many :message_devices, table_name: "jera_push_message_devices"
11
- has_many :messages, through: :message_devices, table_name: "jera_push_messages"
12
-
13
8
  belongs_to :pushable, polymorphic: true
14
9
 
10
+ has_many :message_devices, class_name: "JeraPush::MessageDevice"
11
+ has_many :messages, through: :message_devices, class_name: "JeraPush::Message"
12
+
15
13
  validates :token, :platform, presence: true
16
14
  validates :token, uniqueness: { scope: :platform }
17
15
 
18
- after_create :register_to_current_topic
19
- before_destroy :unregister_from_current_topic
20
-
21
16
  enumerize :platform, in: [:android, :ios, :chrome], predicate: true
22
17
 
23
18
  scope :ios, -> { where(platform: :ios) }
@@ -25,27 +20,4 @@ class JeraPush::Device < ActiveRecord::Base
25
20
  scope :chrome, -> { where(platform: :chrome) }
26
21
  scope :with_joins, -> (resource_type) { joins("INNER JOIN #{resource_type.downcase.pluralize} ON jera_push_devices.pushable_id = #{resource_type.downcase.pluralize}.id AND jera_push_devices.pushable_type = '#{resource_type}'") }
27
22
 
28
- def send_message(message)
29
- JeraPush::Message.send_to self, content: message
30
- end
31
-
32
- def subscribe(topic)
33
- client = JeraPush::Firebase::Client.instance
34
- client.add_device_to_topic(topic: topic, device: self)
35
- end
36
-
37
- def unsubscribe(topic)
38
- client = JeraPush::Firebase::Client.instance
39
- client.remove_device_from_topic(topic: topic, devices: [self])
40
- end
41
-
42
- private
43
-
44
- def register_to_current_topic
45
- subscribe(JeraPush.send("topic_#{self.platform}"))
46
- end
47
-
48
- def unregister_from_current_topic
49
- unsubscribe(JeraPush.send("topic_#{self.platform}"))
50
- end
51
23
  end