jera_push 1.2.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +12 -18
- data/app/controllers/jera_push/admin/messages_controller.rb +22 -13
- data/app/presenters/jera_push/message_presenter.rb +22 -18
- data/app/views/jera_push/admin/messages/show.html.erb +7 -4
- data/config/locale/jera_push.pt-BR.yml +7 -0
- data/config/routes.rb +1 -0
- data/lib/generators/active_record/templates/create_jera_push_devices.rb +2 -1
- data/lib/generators/active_record/templates/create_jera_push_messages.rb +6 -3
- data/lib/generators/active_record/templates/create_jera_push_messages_devices.rb +3 -3
- data/lib/generators/jera_push/templates/jera_push.rb +2 -1
- data/lib/jera_push/firebase/client.rb +56 -59
- data/lib/jera_push/models/device.rb +3 -31
- data/lib/jera_push/models/message.rb +2 -142
- data/lib/jera_push/models/message_device.rb +1 -0
- data/lib/jera_push/services/base_service.rb +23 -0
- data/lib/jera_push/services/send_message.rb +19 -5
- data/lib/jera_push/services/send_push_service.rb +99 -0
- data/lib/jera_push/services/send_to_device_service.rb +52 -0
- data/lib/jera_push/services/send_to_devices_service.rb +54 -0
- data/lib/jera_push/services/send_to_everyone_service.rb +40 -0
- data/lib/jera_push/services/send_to_topic_service.rb +37 -0
- data/lib/jera_push/services/topic_service.rb +18 -0
- data/lib/jera_push/version.rb +1 -1
- data/lib/jera_push.rb +19 -5
- metadata +71 -116
- data/test/dummy/README.rdoc +0 -28
- data/test/dummy/Rakefile +0 -6
- data/test/dummy/app/assets/javascripts/application.js +0 -13
- data/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/test/dummy/app/controllers/application_controller.rb +0 -5
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/models/user.rb +0 -3
- data/test/dummy/app/views/layouts/application.html.erb +0 -14
- data/test/dummy/bin/bundle +0 -3
- data/test/dummy/bin/rails +0 -4
- data/test/dummy/bin/rake +0 -4
- data/test/dummy/bin/setup +0 -29
- data/test/dummy/config/application.rb +0 -25
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/database.yml +0 -16
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -41
- data/test/dummy/config/environments/production.rb +0 -79
- data/test/dummy/config/environments/test.rb +0 -42
- data/test/dummy/config/initializers/assets.rb +0 -12
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -4
- data/test/dummy/config/initializers/session_store.rb +0 -3
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/test/dummy/config/locales/en.yml +0 -23
- data/test/dummy/config/locales/pt-BR.yml +0 -23
- data/test/dummy/config/routes.rb +0 -57
- data/test/dummy/config/secrets.yml +0 -22
- data/test/dummy/config.ru +0 -4
- data/test/dummy/db/migrate/20161005121035_create_users.rb +0 -10
- data/test/dummy/db/schema.rb +0 -61
- data/test/dummy/db/seeds.rb +0 -70
- data/test/dummy/public/404.html +0 -67
- data/test/dummy/public/422.html +0 -67
- data/test/dummy/public/500.html +0 -66
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/test/fixtures/users.yml +0 -7
- data/test/dummy/test/models/user_test.rb +0 -7
- data/test/jera_push_test.rb +0 -7
- data/test/test_helper.rb +0 -20
@@ -1,5 +1,5 @@
|
|
1
1
|
module JeraPush
|
2
|
-
module
|
2
|
+
module Services
|
3
3
|
class SendMessage
|
4
4
|
|
5
5
|
def initialize(*args)
|
@@ -11,13 +11,19 @@ module JeraPush
|
|
11
11
|
def call
|
12
12
|
return false unless valid?
|
13
13
|
|
14
|
-
message_content =
|
14
|
+
message_content = format_hash(@message)
|
15
15
|
case @type
|
16
16
|
when :broadcast
|
17
|
-
|
17
|
+
# Topicos não estão funcionando.
|
18
|
+
# JeraPush::Message.send_broadcast(content: message_content)
|
18
19
|
when :specific
|
19
20
|
target_devices = JeraPush::Device.where(id: @devices.uniq.map(&:to_i))
|
20
|
-
JeraPush::
|
21
|
+
result = JeraPush::Services::SendToDevicesService.new(devices: target_devices,
|
22
|
+
title: message_content[:title],
|
23
|
+
body: message_content[:body],
|
24
|
+
data: message_content
|
25
|
+
).call
|
26
|
+
result
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
@@ -26,6 +32,14 @@ module JeraPush
|
|
26
32
|
@type.to_sym == :broadcast ? valid : valid && @devices.present?
|
27
33
|
end
|
28
34
|
|
35
|
+
def format_hash(messages = [])
|
36
|
+
return false if messages.blank?
|
37
|
+
messages.collect do |obj|
|
38
|
+
hash = { obj[:key].to_sym => obj[:value] }
|
39
|
+
hash.delete_if { |key, value| key.blank? || value.blank? }
|
40
|
+
end.reduce(:merge)
|
41
|
+
end
|
42
|
+
|
29
43
|
end
|
30
44
|
end
|
31
|
-
end
|
45
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class SendPushService < JeraPush::Services::BaseService
|
3
|
+
def initialize(device:, message:, message_device:, android_config: {}, ios_config: {})
|
4
|
+
super
|
5
|
+
@device = device
|
6
|
+
@message = message
|
7
|
+
@message_device = message_device
|
8
|
+
@android_config = android_config
|
9
|
+
@ios_config = ios_config
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
return @errors if @errors.present?
|
14
|
+
|
15
|
+
send_push
|
16
|
+
|
17
|
+
@message
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def send_push
|
23
|
+
@response = @firebase.send_to_device(message: message_params(@device))
|
24
|
+
@message_device.update(status: :success)
|
25
|
+
@message.update(success_count: @message.success_count + 1)
|
26
|
+
rescue Google::Apis::AuthorizationError => e
|
27
|
+
message = JSON.parse(e.body)
|
28
|
+
@message_device.update(status: :error, error_message: message.to_json)
|
29
|
+
@message.update(failure_count: @message.failure_count + 1)
|
30
|
+
rescue Google::Apis::ClientError => e
|
31
|
+
response = JSON.parse(e.body, symbolize_names: true)
|
32
|
+
error_code = response[:error][:details][0][:errorCode]
|
33
|
+
@message_device.update(status: :error, error_message: response.to_json)
|
34
|
+
@message.update(failure_count: @message.failure_count + 1)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Documentação com o atributos que podem ser usados em { message: }
|
38
|
+
# https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages?hl=pt-br
|
39
|
+
def message_params(device)
|
40
|
+
case device.platform.to_sym
|
41
|
+
when :android
|
42
|
+
android_params(device.token)
|
43
|
+
when :ios
|
44
|
+
ios_params(device.token)
|
45
|
+
else
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def android_params(token)
|
51
|
+
{
|
52
|
+
message: {
|
53
|
+
token: token,
|
54
|
+
notification: notification,
|
55
|
+
data: @message.data,
|
56
|
+
android: android_configs
|
57
|
+
},
|
58
|
+
validate_only: false
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def ios_params(token)
|
63
|
+
{
|
64
|
+
message: {
|
65
|
+
token: token,
|
66
|
+
notification: notification,
|
67
|
+
data: @message.data,
|
68
|
+
apns: apns_params
|
69
|
+
},
|
70
|
+
validate_only: false
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def notification
|
75
|
+
{ title: @message.title, body: @message.body }
|
76
|
+
end
|
77
|
+
|
78
|
+
def apns_params
|
79
|
+
@ios_config.empty? ? default_apns_params : @ios_config
|
80
|
+
end
|
81
|
+
|
82
|
+
def android_configs
|
83
|
+
@android_config.merge({ priority: 'high'})
|
84
|
+
end
|
85
|
+
|
86
|
+
def default_apns_params
|
87
|
+
{
|
88
|
+
headers: {
|
89
|
+
'apns-priority': '5'
|
90
|
+
},
|
91
|
+
payload: {
|
92
|
+
aps: {
|
93
|
+
'content-available': 1
|
94
|
+
}
|
95
|
+
}
|
96
|
+
}
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class SendToDeviceService < JeraPush::Services::BaseService
|
3
|
+
def initialize(device:, title:, body:, data:, android: {}, ios: {})
|
4
|
+
super
|
5
|
+
@device = device
|
6
|
+
@title = title
|
7
|
+
@body = body
|
8
|
+
@data = data
|
9
|
+
@android_config = android
|
10
|
+
@ios_config = ios
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
validate_device
|
15
|
+
|
16
|
+
return @errors if @errors.present?
|
17
|
+
|
18
|
+
create_message
|
19
|
+
add_devices_to_message
|
20
|
+
send_push
|
21
|
+
|
22
|
+
@message
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def validate_device
|
28
|
+
@errors.add(:base, message: I18n.t('jera_push.services.errors.not_found.device')) if @device.blank?
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_message
|
32
|
+
@message = JeraPush::Message.create(title: @title, body: @body, data: data_params)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_devices_to_message
|
36
|
+
@message_device = @message.message_devices.create(device: @device)
|
37
|
+
end
|
38
|
+
|
39
|
+
def send_push
|
40
|
+
JeraPush::Services::SendPushService.new(device: @device,
|
41
|
+
message: @message,
|
42
|
+
message_device: @message_device,
|
43
|
+
ios_config: @ios_config,
|
44
|
+
android_config: @android_config
|
45
|
+
).call
|
46
|
+
end
|
47
|
+
|
48
|
+
def data_params
|
49
|
+
@data.merge({ title: @title, body: @body })
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class SendToDevicesService < JeraPush::Services::BaseService
|
3
|
+
def initialize(devices:, title:, body:, data:, android: {}, ios: {})
|
4
|
+
super
|
5
|
+
@devices = devices
|
6
|
+
@title = title
|
7
|
+
@body = body
|
8
|
+
@data = data
|
9
|
+
@android_config = android
|
10
|
+
@ios_config = ios
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
validate_device
|
15
|
+
|
16
|
+
return @errors if @errors.present?
|
17
|
+
|
18
|
+
create_message
|
19
|
+
send_push_to_devices
|
20
|
+
|
21
|
+
@message
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def validate_device
|
27
|
+
@errors.add(:base, message: I18n.t('jera_push.services.errors.not_found.device')) if @devices.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_message
|
31
|
+
@message = JeraPush::Message.create(title: @title, body: @body, data: data_params)
|
32
|
+
end
|
33
|
+
|
34
|
+
def send_push_to_devices
|
35
|
+
@devices.each do |device|
|
36
|
+
message_device = @message.message_devices.create(device: device)
|
37
|
+
send_push(device, message_device)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def send_push(device, message_device)
|
42
|
+
JeraPush::Services::SendPushService.new(device: device,
|
43
|
+
message: @message,
|
44
|
+
message_device: message_device,
|
45
|
+
ios_config: @ios_config,
|
46
|
+
android_config: @android_config
|
47
|
+
).call
|
48
|
+
end
|
49
|
+
|
50
|
+
def data_params
|
51
|
+
@data.merge({ title: @title, body: @body })
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class SendToEveryoneService < JeraPush::Services::BaseService
|
3
|
+
def initialize(title:, body:)
|
4
|
+
super
|
5
|
+
@title = title
|
6
|
+
@body = body
|
7
|
+
end
|
8
|
+
|
9
|
+
def call
|
10
|
+
create_message
|
11
|
+
send_android
|
12
|
+
send_ios
|
13
|
+
update_message
|
14
|
+
|
15
|
+
@message
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def create_message
|
21
|
+
@message = JeraPush::Message.create(title: @title, body: @body, kind: :everyone)
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_android
|
25
|
+
@response_android = @firebase.send_message_to_topic(message: @message, topic: JeraPush.send('topic_android'))
|
26
|
+
end
|
27
|
+
|
28
|
+
def send_ios
|
29
|
+
@response_ios = @firebase.send_message_to_topic(message: @message, topic: JeraPush.send('topic_ios'))
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_message
|
33
|
+
@message.update(
|
34
|
+
success_count: @response_android["success"] + @response_ios["success"],
|
35
|
+
failure_count: @response_android["failure"] + @response_ios["failure"]
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class SendToTopicService < JeraPush::Services::BaseService
|
3
|
+
def initialize(title:, body:, topic:)
|
4
|
+
super
|
5
|
+
@title = title
|
6
|
+
@body = body
|
7
|
+
@topic = topic
|
8
|
+
end
|
9
|
+
|
10
|
+
def call
|
11
|
+
create_message
|
12
|
+
send_topic
|
13
|
+
update_message
|
14
|
+
|
15
|
+
@message
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def create_message
|
21
|
+
@message = JeraPush::Message.create(title: @title, body: @body, kind: :topic)
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_topic
|
25
|
+
@response = @firebase.send_message_to_topic(message: @message, topic: @topic)
|
26
|
+
end
|
27
|
+
|
28
|
+
def update_message
|
29
|
+
@message.update(
|
30
|
+
multicast_id: @response["multicast_id"],
|
31
|
+
success_count: @response["success"],
|
32
|
+
failure_count: @response["failure"]
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module JeraPush::Services
|
2
|
+
class TopicService < JeraPush::Services::BaseService
|
3
|
+
DEFAULT_TOPIC = 'general'
|
4
|
+
|
5
|
+
def initialize(*)
|
6
|
+
super
|
7
|
+
end
|
8
|
+
|
9
|
+
def subscribe(device:, topic: DEFAULT_TOPIC)
|
10
|
+
@firebase.add_device_to_topic(device: device, topic: topic)
|
11
|
+
end
|
12
|
+
|
13
|
+
def unsubscribe(device:, topic: DEFAULT_TOPIC)
|
14
|
+
@firebase.remove_device_from_topic(devices: [device], topic: topic)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/jera_push/version.rb
CHANGED
data/lib/jera_push.rb
CHANGED
@@ -5,10 +5,19 @@ require 'kaminari'
|
|
5
5
|
require 'jera_push/engine'
|
6
6
|
require 'jera_push/firebase/client'
|
7
7
|
require 'jera_push/firebase/api_result'
|
8
|
+
require 'googleauth'
|
9
|
+
require 'google/apis/fcm_v1'
|
10
|
+
|
11
|
+
require 'jera_push/services/base_service'
|
8
12
|
require 'jera_push/services/send_message'
|
13
|
+
require 'jera_push/services/send_push_service'
|
14
|
+
require 'jera_push/services/send_to_device_service'
|
15
|
+
require 'jera_push/services/send_to_devices_service'
|
16
|
+
require 'jera_push/services/send_to_everyone_service'
|
17
|
+
require 'jera_push/services/send_to_topic_service'
|
18
|
+
require 'jera_push/services/topic_service'
|
9
19
|
|
10
20
|
module JeraPush
|
11
|
-
|
12
21
|
autoload :Device, 'jera_push/models/device.rb'
|
13
22
|
autoload :Message, 'jera_push/models/message.rb'
|
14
23
|
autoload :MessageDevice, 'jera_push/models/message_device.rb'
|
@@ -17,11 +26,20 @@ module JeraPush
|
|
17
26
|
mattr_accessor :firebase_api_key
|
18
27
|
@@firebase_api_key = nil
|
19
28
|
|
29
|
+
mattr_accessor :project_name
|
30
|
+
@@project_name = nil
|
31
|
+
|
32
|
+
mattr_accessor :project_id
|
33
|
+
@@project_id = nil
|
34
|
+
|
20
35
|
mattr_accessor :default_topic
|
21
36
|
@@default_topic = 'jera_push_development'
|
22
37
|
|
23
38
|
mattr_accessor :resources_name
|
24
39
|
@@resources_name = nil
|
40
|
+
|
41
|
+
mattr_accessor :credentials_path
|
42
|
+
@@credentials_path = nil
|
25
43
|
|
26
44
|
mattr_accessor :resource_attributes
|
27
45
|
@@resource_attributes = []
|
@@ -29,7 +47,6 @@ module JeraPush
|
|
29
47
|
mattr_accessor :admin_login
|
30
48
|
@@resources_name = { username: 'jera_push', password: 'JeraPushAdmin' }
|
31
49
|
|
32
|
-
|
33
50
|
def self.setup
|
34
51
|
yield self
|
35
52
|
end
|
@@ -42,7 +59,4 @@ module JeraPush
|
|
42
59
|
@@ios_topic ||= "#{@@default_topic}_ios"
|
43
60
|
end
|
44
61
|
|
45
|
-
def self.topic_chrome
|
46
|
-
@@chrome_topic ||= "#{@@default_topic}_chrome"
|
47
|
-
end
|
48
62
|
end
|