Chore: Firebase Cloud Messaging Support (#858)

This commit is contained in:
Sojan Jose 2020-06-05 00:15:50 +05:30 committed by GitHub
parent e783c3af5d
commit a13a474c23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 59 additions and 2 deletions

View file

@ -102,6 +102,9 @@ CHARGEBEE_WEBHOOK_PASSWORD=
## generate a new key value here : https://d3v.one/vapid-key-generator/
# VAPID_PUBLIC_KEY=
# VAPID_PRIVATE_KEY=
#
# for mobile apps
# FCM_SERVER_KEY=
## Bot Customizations
USE_INBOX_AVATAR_FOR_BOT=true

View file

@ -84,6 +84,7 @@ gem 'sidekiq'
gem 'flag_shih_tzu'
##-- Push notification service --##
gem 'fcm'
gem 'webpush'
group :development do

View file

@ -189,6 +189,8 @@ GEM
multipart-post (>= 1.2, < 3)
faraday_middleware (1.0.0)
faraday (~> 1.0)
fcm (1.0.1)
faraday (~> 1.0.0)
ffi (1.12.2)
flag_shih_tzu (0.3.23)
foreman (0.87.1)
@ -547,6 +549,7 @@ DEPENDENCIES
facebook-messenger
factory_bot_rails
faker
fcm
flag_shih_tzu
foreman
google-cloud-storage

View file

@ -12,6 +12,8 @@ class NotificationSubscriptionBuilder
def identifier
@identifier ||= params[:subscription_attributes][:endpoint] if params[:subscription_type] == 'browser_push'
@identifier ||= params[:device_id] if params[:subscription_type] == 'fcm'
@identifier
end
def identifier_subscription

View file

@ -22,7 +22,7 @@ class NotificationSubscription < ApplicationRecord
SUBSCRIPTION_TYPES = {
browser_push: 1,
gcm: 2
fcm: 2
}.freeze
enum subscription_type: SUBSCRIPTION_TYPES

View file

@ -7,7 +7,8 @@ class Notification::PushNotificationService
return unless user_subscribed_to_notification?
notification_subscriptions.each do |subscription|
send_browser_push(subscription) if subscription.browser_push?
send_browser_push(subscription)
send_fcm_push(subscription)
end
end
@ -53,6 +54,8 @@ class Notification::PushNotificationService
end
def send_browser_push(subscription)
return unless subscription.browser_push?
Webpush.payload_send(
message: JSON.generate(push_message),
endpoint: subscription.subscription_attributes['endpoint'],
@ -70,4 +73,17 @@ class Notification::PushNotificationService
rescue Webpush::ExpiredSubscription
subscription.destroy!
end
def send_fcm_push(subscription)
return unless subscription.fcm?
fcm = FCM.new(ENV['FCM_SERVER_KEY'])
options = { "notification": {
"title": notification.notification_type.titleize,
"body": push_message_title,
"notification": notification.to_json
} }
response = fcm.send([subscription.subscription_attributes['push_token']], options)
subscription.destroy! if JSON.parse(response[:body])['results']&.first&.keys&.include?('error')
end
end

View file

@ -0,0 +1,32 @@
require 'rails_helper'
describe Notification::PushNotificationService do
let!(:account) { create(:account) }
let!(:user) { create(:user, account: account) }
let!(:notification) { create(:notification, user: user, account: user.accounts.first) }
let(:fcm_double) { double }
before do
allow(Webpush).to receive(:payload_send).and_return(true)
allow(FCM).to receive(:new).and_return(fcm_double)
allow(fcm_double).to receive(:send).and_return({ body: { 'results': [] }.to_json })
end
describe '#perform' do
it 'sends webpush notifications for webpush subscription' do
create(:notification_subscription, user: notification.user)
described_class.new(notification: notification).perform
expect(Webpush).to have_received(:payload_send)
expect(FCM).not_to have_received(:new)
end
it 'sends a fcm notification for firebase subscription' do
create(:notification_subscription, user: notification.user, subscription_type: 'fcm')
described_class.new(notification: notification).perform
expect(FCM).to have_received(:new)
expect(Webpush).not_to have_received(:payload_send)
end
end
end