29 lines
		
	
	
		
			903 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
		
			903 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class SendPushNotificationService < BaseService
 | |
|   def call(notification)
 | |
|     return if ENV['FCM_API_KEY'].blank?
 | |
| 
 | |
|     devices = Device.where(account: notification.account).pluck(:registration_id)
 | |
|     fcm     = FCM.new(ENV['FCM_API_KEY'])
 | |
| 
 | |
|     response = fcm.send(devices, data: { notification_id: notification.id }, collapse_key: :notifications, priority: :high)
 | |
|     handle_response(response)
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def handle_response(response)
 | |
|     update_canonical_ids(response[:canonical_ids]) if response[:canonical_ids]
 | |
|     remove_bad_ids(response[:not_registered_ids])  if response[:not_registered_ids]
 | |
|   end
 | |
| 
 | |
|   def update_canonical_ids(ids)
 | |
|     ids.each { |pair| Device.find_by(registration_id: pair[:old]).update(registration_id: pair[:new]) }
 | |
|   end
 | |
| 
 | |
|   def remove_bad_ids(bad_ids)
 | |
|     Device.where(registration_id: bad_ids).delete_all unless bad_ids.empty?
 | |
|   end
 | |
| end
 |