lib/jera_push/models/message.rb in jera_push-1.2.4 vs lib/jera_push/models/message.rb in jera_push-2.0.0

- old
+ new

@@ -1,153 +1,13 @@ require 'enumerize' class JeraPush::Message < ActiveRecord::Base extend Enumerize + self.table_name = "jera_push_messages" has_many :message_devices has_many :devices, through: :message_devices - serialize :broadcast_result + enumerize :kind, in: [:specific, :everyone, :topic], predicate: true, default: :specific - enumerize :kind, in: [:broadcast, :specific], predicate: true, default: :specific - - def self.send_to(target, content: {}) - return nil if target.blank? || content.blank? - - push_message = JeraPush::Message.create content: content - push_message.devices << target - - if push_message && target.is_a?(JeraPush::Device) - push_message.send_to_device device: target - else - push_message.send_to_devices devices: target - end - push_message - end - - def self.send_broadcast(content:) - return nil if content.blank? - - push_message = JeraPush::Message.create content: content, kind: :broadcast - @@client ||= JeraPush::Firebase::Client.instance - - results = [] - results << push_message.to_android_topic - results << push_message.to_ios_topic - results << push_message.to_chrome_topic - - JeraPush::Firebase::ApiResult.broadcast_result(message: push_message, results: results) - push_message - end - - def self.send_to_topic(topic: , content: {}) - return nil if topic.blank? || content.blank? - - push_message = JeraPush::Message.create content: content, topic: topic - client = JeraPush::Firebase::Client.instance - response = client.send_message_to_topic(message: { data: content }, topic: topic) - response.topic_result(message: push_message) - push_message - end - - def self.format_hash(messages = []) - return false if messages.blank? - messages.collect do |obj| - hash = { obj[:key].to_sym => obj[:value] } - hash.delete_if { |key, value| key.blank? || value.blank? } - end.reduce(:merge) - end - - def content=(content) - raise 'Invalid message format. Hash format expected' unless content.is_a? Hash - - super(content.to_json) - end - - def content - if super() - JSON.parse(super()) - else - return {} - end - end - - def send_to_devices(devices: []) - return nil if devices.empty? - platform_devices = devices.group_by { |device| device.platform } - client = JeraPush::Firebase::Client.instance - - platform_devices.keys.each do |platform| - payload = self.send("body_#{platform.to_s}", self.content) - response = client.send_message(message: payload, devices: platform_devices[platform]) - if response - response.result_to(message: self) - end - end - end - - def send_to_device(device: nil) - return nil if device.nil? - - payload = {} - if device.platform.ios? - payload = body_ios(self.content) - elsif device.platform.android? - payload = body_android(self.content) - elsif device.platform.chrome? - payload = body_chrome(self.content) - end - client = JeraPush::Firebase::Client.instance - response = client.send_message(message: payload, devices: [device]) - if response - response.result_to(message: self) - end - end - - def to_android_topic - @@client.send_message_to_topic( - message: body_android(content), - topic: JeraPush.topic_android - ) - end - - def to_ios_topic - @@client.send_message_to_topic( - message: body_ios(content), - topic: JeraPush.topic_ios - ) - end - - def to_chrome_topic - @@client.send_message_to_topic( - message: body_chrome(content), - topic: JeraPush.topic_chrome - ) - end - - private - - def body_ios(content) - params = [:title, :body, :'content-available', :sound, :badge, :click_action, :body_loc_key, :body_loc_args, :title_loc_key, :title_loc_args] - - content.symbolize_keys! - content[:sound] = 'default' unless content.has_key?(:sound) - - return { - notification: content.select { |key, value| params.include?(key) }, - data: content.reject { |key, value| params.include?(key) } - } - end - - def body_android(content) - return { - data: content - } - end - - def body_chrome(content) - return { - data: content - } - end end