using Common.Models.Confiq; using Common.Models.Enums; using Common.Models.Notification; using Common.Models.RequestResponse; using Common.Utility; using log4net; using MoreLinq; using Newtonsoft.Json; using Repository.DAO.ThirdParty; using System; using System.Collections.Generic; using System.Configuration; using System.Dynamic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Web.Script.Serialization; namespace Business.BusinessLogic.NotificationApiService { public class FireBaseService { private readonly ILog _log = LogManager.GetLogger(typeof(FireBaseService)); private readonly IThirdPartyRepo _thirdPartyRepo; public FireBaseService() { _thirdPartyRepo = new ThirdPartyRepo(); } public TPResponse PushNotify(SendNotificationRequest model) { TPResponse _tPResponse = new TPResponse(); //_log.Info($"IsBulkNotification {model.IsBulkNotification}"); List tPResponses = new List(); Task.Run(() => { Notify(model); }).ContinueWith(y => { _log.Debug($"PushNotify Responses {JsonConvert.SerializeObject(tPResponses)}"); //tPResponses.Where(x => x.ResponseCode.Equals("0")).ToList().ForEach(z => //{ // _thirdPartyRepo.UpdateNotificationStatus(z.Id); //}); }); _tPResponse.ResponseCode = "0"; _tPResponse.Msg = "PushNotify Sent Sucessfully."; return _tPResponse; } private void Notify(SendNotificationRequest model) { try { if (!model.Recipients.Any()) { _log.Info("Recipient(s) are empty."); return; } var applicationId = ConfigurationManager.AppSettings["FcmAuthorizationHeader"]; var senderId = ConfigurationManager.AppSettings["fcmSenderId"]; var langauge = string.IsNullOrEmpty(model.Language) ? ConfigurationManager.AppSettings["lang"] : model.Language; var serializer = new JavaScriptSerializer(); if (model.IsBulkNotification) { foreach (var batch in model.Recipients.GroupBy(c => c.DeviceType).ToList()) { var templatejson = Helpers.GetMapping(Common.Models.Enums.MappingType.PUSH_NOTIFY_TEMPLATE, model.Template.ToString(), langauge); var deviceType = batch.Key; var title = batch.First().NotificationContent.Title ?? GetStatic.ReadWebConfig("PushNotifyAlertTitle", ""); var body = batch.First().NotificationContent.Body; var image = batch.First().NotificationContent.Image; var navigateURL = batch.First().NotificationContent.NavigateURL; var clickActivity = batch.First().NotificationContent.ClickActivity; var messageType = batch.First().NotificationContent.MessageType; if (model.Template != NotifyTemplate.NONE) { if (!string.IsNullOrEmpty(body)) { List mappings = JsonConvert.DeserializeObject>(body); body = templatejson.SText; mappings.ForEach(x => { body = body.Replace(string.Format("{{{0}}}", x.SValue), x.SText); }); } title = templatejson.DText; } foreach (var batchDevice in batch.Batch(100)) { var recipientsList = batchDevice.Select(c => c.Address).Distinct().ToList(); string json; if (deviceType == DeviceType.Android.ToString()) { var data = new { registration_ids = recipientsList.ToArray(), notification = new { body, title, sound = "Enabled", click_action = clickActivity ?? string.Empty, message_type = messageType ?? string.Empty }, data = new { image = image ?? string.Empty, url = navigateURL ?? string.Empty } }; json = serializer.Serialize(data); } else { var data = new { registration_ids = recipientsList.ToArray(), content_available = true, mutable_content = true, notification = new { body, title, sound = "Enabled", click_action = clickActivity ?? string.Empty, message_type = messageType ?? string.Empty }, data = new { mediaUrl = string.IsNullOrEmpty(image) ? string.Empty : ConfigurationManager.AppSettings["ApplicationMainUrl"] + "api/" + image, url = navigateURL ?? string.Empty } }; json = serializer.Serialize(data); } Invoke(applicationId, senderId, json); } } // _thirdPartyRepo.UpdateNotificationStatus(model.ToString()); } else { string body; string title; var templatejson = Helpers.GetMapping(Common.Models.Enums.MappingType.PUSH_NOTIFY_TEMPLATE, model.Template.ToString(), langauge); foreach (var batch in model.Recipients) { if (model.Template != NotifyTemplate.NONE) { body = templatejson.SText; if (!string.IsNullOrEmpty(batch.NotificationContent.Body)) { List mappings = JsonConvert.DeserializeObject>(batch.NotificationContent.Body); mappings.ForEach(x => { body = body.Replace(string.Format("{{{0}}}", x.SValue), x.SText); }); } title = templatejson.DText; } else { body = batch.NotificationContent.Body; title = batch.NotificationContent.Title ?? GetStatic.ReadWebConfig("PushNotifyAlertTitle", "JME"); } string json; if (batch.DeviceType == DeviceType.Android.ToString()) { var data = new { to = batch.Address, notification = new { body = body, title = batch.NotificationContent.Title ?? GetStatic.ReadWebConfig("PushNotifyAlertTitle", "JME"), sound = "Enabled", click_action = batch.NotificationContent.ClickActivity ?? string.Empty, message_type = batch.NotificationContent.MessageType ?? string.Empty }, data = new { image = batch.NotificationContent.Image ?? string.Empty, url = batch.NotificationContent.NavigateURL ?? string.Empty } }; json = serializer.Serialize(data); } else { var data = new { to = batch.Address, content_available = true, mutable_content = true, notification = new { body = body, title = batch.NotificationContent.Title ?? GetStatic.ReadWebConfig("PushNotifyAlertTitle", "JME"), sound = "Enabled", click_action = batch.NotificationContent.ClickActivity ?? string.Empty, message_type = batch.NotificationContent.MessageType ?? string.Empty }, data = new { url = batch.NotificationContent.NavigateURL ?? string.Empty, mediaUrl = string.IsNullOrEmpty(batch.NotificationContent.Image) ? string.Empty : ConfigurationManager.AppSettings["ApplicationMainUrl"] + "api/" + batch.NotificationContent.Image } }; json = serializer.Serialize(data); } Invoke(applicationId, senderId, json); } } model.Recipients.ForEach(x => { _thirdPartyRepo.UpdateNotificationStatus(x.BroadCastNoticeId.ToString()); }); } catch (Exception ex) { _log.Error("FireBaseService Exception", ex); } } private void Invoke(string applicationId, string senderId, string json) { var tRequest = WebRequest.Create(ConfigurationManager.AppSettings["GoogleFcm"].ToString()); tRequest.Method = "post"; tRequest.ContentType = "application/json"; var byteArray = Encoding.UTF8.GetBytes(json); tRequest.Headers.Add($"Authorization: key={applicationId}"); tRequest.Headers.Add($"Sender: id={senderId}"); tRequest.ContentLength = byteArray.Length; var serializer = new JavaScriptSerializer(); try { using (var dataStream = tRequest.GetRequestStream()) { dataStream.Write(byteArray, 0, byteArray.Length); using (var tResponse = tRequest.GetResponse()) { using (var dataStreamResponse = tResponse.GetResponseStream()) { using (var tReader = new StreamReader(dataStreamResponse)) { var sResponseFromServer = tReader.ReadToEnd(); var str = sResponseFromServer; try { //dynamic reply = new System.Dynamic.ExpandoObject(); //reply.Response = str; //reply.Data = str; var js = new JavaScriptSerializer(); _log.Info($"REQUEST {json} | RESPONSE {str}"); } catch (Exception) { // ignored } } } } } } catch (Exception ex) { _log.Error("Google FCM Api Invoke failed Exception", ex); } } } }