From 4c25dd21053aebcdf97aa413140c250605a79d62 Mon Sep 17 00:00:00 2001 From: ivanszabo Date: Fri, 16 May 2025 07:45:49 +0200 Subject: [PATCH] =?UTF-8?q?FCM=20kifejleszt=C3=A9se?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/FCMController.cs | 68 +-------------- .../appsettings.Development.json | 2 +- .../Services/CheckListService.cs | 3 + .../Services/Interfaces/IMessageService.cs | 4 + .../Services/MessageService.cs | 85 +++++++++++++++++-- src/WorkFlowCheck.BL/Services/SyncService.cs | 14 ++- src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj | 1 + src/WorkFlowCheck.Web/Helpers/SystemHelper.cs | 2 +- 8 files changed, 103 insertions(+), 76 deletions(-) diff --git a/src/WorkFlowCheck.API/Controllers/FCMController.cs b/src/WorkFlowCheck.API/Controllers/FCMController.cs index 2ee378c..c3141dd 100644 --- a/src/WorkFlowCheck.API/Controllers/FCMController.cs +++ b/src/WorkFlowCheck.API/Controllers/FCMController.cs @@ -30,39 +30,7 @@ namespace WorkFlowCheck.API.Controllers try { - var pathToJsonKey = "com-nuvolar-wfcapp-firebase-adminsdk-fbsvc-37642626e4.json"; - var projectId = "com-nuvolar-wfcapp"; - var credential = GoogleCredential - .FromFile(pathToJsonKey) - .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); - var accessToken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); - - var client = new HttpClient(); - client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); - - - var message = new - { - message = new - { - token = fCMMessageDTO.Token, - notification = new - { - title = fCMMessageDTO.Title, - body = fCMMessageDTO.Body, - } - } - }; - - var json = JsonConvert.SerializeObject(message); - var content = new StringContent(json, Encoding.UTF8, "application/json"); - - - var response = await client.PostAsync($"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send", content); - - var result = await response.Content.ReadAsStringAsync(); - - + retVal.IsSuccess = await _messageService.SendFCMMessage(fCMMessageDTO); } catch (Exception ex) { @@ -82,39 +50,7 @@ namespace WorkFlowCheck.API.Controllers try { - var pathToJsonKey = "com-nuvolar-wfcapp-firebase-adminsdk-fbsvc-37642626e4.json"; - var projectId = "com-nuvolar-wfcapp"; - var credential = GoogleCredential - .FromFile(pathToJsonKey) - .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); - var accessToken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); - - var client = new HttpClient(); - client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); - - - var message = new - { - message = new - { - token = await _messageService.GetLastFCMTokensAsync(), - notification = new - { - title = fCMMessageDTO.Title, - body = fCMMessageDTO.Body, - } - } - }; - - var json = JsonConvert.SerializeObject(message); - var content = new StringContent(json, Encoding.UTF8, "application/json"); - - - var response = await client.PostAsync($"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send", content); - - var result = await response.Content.ReadAsStringAsync(); - - + retVal.IsSuccess = await _messageService.SendFCMMessageToLastToken(fCMMessageDTO); } catch (Exception ex) { diff --git a/src/WorkFlowCheck.API/appsettings.Development.json b/src/WorkFlowCheck.API/appsettings.Development.json index 8526c55..1a9ed94 100644 --- a/src/WorkFlowCheck.API/appsettings.Development.json +++ b/src/WorkFlowCheck.API/appsettings.Development.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Data Source=WS2016DC\\SQLEXPRESS;Initial Catalog=WFC;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False" + "DefaultConnection": "Data Source=WS2016DC\\SQLEXPRESS;Initial Catalog=WFCUAT;Integrated Security=True;Connect Timeout=30;Encrypt=False;Trust Server Certificate=False;Application Intent=ReadWrite;Multi Subnet Failover=False" }, "Logging": { "LogLevel": { diff --git a/src/WorkFlowCheck.BL/Services/CheckListService.cs b/src/WorkFlowCheck.BL/Services/CheckListService.cs index 02d21be..71a7de2 100644 --- a/src/WorkFlowCheck.BL/Services/CheckListService.cs +++ b/src/WorkFlowCheck.BL/Services/CheckListService.cs @@ -26,13 +26,16 @@ namespace WorkFlowCheck.BL.Services { private readonly INumberGeneratorService _numberGeneratorService; + private readonly IMessageService _messageService; public CheckListService(AppDbContext dbContext, IMapper mapper, INumberGeneratorService numberGeneratorService, + IMessageService messageService, IUserService userService) : base(dbContext, mapper) { _numberGeneratorService = numberGeneratorService; + _messageService = messageService; } public async Task GetCheckListHeaderAsync(int Id) diff --git a/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs b/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs index 1fd59ee..aa4d5cf 100644 --- a/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs +++ b/src/WorkFlowCheck.BL/Services/Interfaces/IMessageService.cs @@ -3,13 +3,17 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using WorkFlowCheck.Common.DTO; namespace WorkFlowCheck.BL.Services.Interfaces { public interface IMessageService { Task SendMailAsync(List recipients, string subject, string htmlBody); + Task SendFCMTokenAsync(string token); Task GetLastFCMTokensAsync(); + Task SendFCMMessage(FCMMessageDTO fCMMessageDTO); + Task SendFCMMessageToLastToken(FCMMessageDTO fCMMessageDTO); } } diff --git a/src/WorkFlowCheck.BL/Services/MessageService.cs b/src/WorkFlowCheck.BL/Services/MessageService.cs index b33a71e..c641415 100644 --- a/src/WorkFlowCheck.BL/Services/MessageService.cs +++ b/src/WorkFlowCheck.BL/Services/MessageService.cs @@ -9,6 +9,11 @@ using WorkFlowCheck.DL.Entities; using AutoMapper; using Microsoft.EntityFrameworkCore; using WorkFlowCheck.DL; +using WorkFlowCheck.Common.DTO; +using System.Net.Http.Headers; +using System.Text; +using Google.Apis.Auth.OAuth2; +using Newtonsoft.Json; namespace WorkFlowCheck.BL.Services { @@ -53,13 +58,20 @@ namespace WorkFlowCheck.BL.Services var retVal = true; try { - if (string.IsNullOrEmpty(token)) + if (!string.IsNullOrEmpty(token)) { - var FCMToken = new FCMToken() + + var FCMToken = await _dbContext.FCMTokens.Where(w => w.Token == token).FirstOrDefaultAsync(); + if (FCMToken == null) { - Token = token - }; - await _dbContext.FCMTokens.AddAsync(FCMToken); + FCMToken = new FCMToken(); + FCMToken.Token = token; + await _dbContext.FCMTokens.AddAsync(FCMToken); + } + else + { + FCMToken.LastModAt = DateTime.UtcNow; + } await _dbContext.SaveChangesAsync(); } } @@ -78,7 +90,7 @@ namespace WorkFlowCheck.BL.Services { var FCMToken = await _dbContext.FCMTokens .AsNoTracking() - .OrderByDescending(x => x.CreatedAt) + .OrderByDescending(x => x.LastModAt) .Take(1) .FirstOrDefaultAsync(); if (FCMToken != null && !string.IsNullOrEmpty(FCMToken.Token)) @@ -93,6 +105,67 @@ namespace WorkFlowCheck.BL.Services } return retVal; } + public async Task SendFCMMessage(FCMMessageDTO fCMMessageDTO) + { + var retVal = true; + try + { + var pathToJsonKey = "com-nuvolar-wfcapp-firebase-adminsdk-fbsvc-37642626e4.json"; + var projectId = "com-nuvolar-wfcapp"; + var credential = GoogleCredential + .FromFile(pathToJsonKey) + .CreateScoped("https://www.googleapis.com/auth/firebase.messaging"); + var accessToken = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); + + var client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + + + var message = new + { + message = new + { + token = fCMMessageDTO.Token, + notification = new + { + title = fCMMessageDTO.Title, + body = fCMMessageDTO.Body, + } + } + }; + + var json = JsonConvert.SerializeObject(message); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + + var response = await client.PostAsync($"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send", content); + + var result = await response.Content.ReadAsStringAsync(); + + + } + catch (Exception ex) + { + retVal = false; + Log.Error(ex.Message); + } + return retVal; + } + public async Task SendFCMMessageToLastToken(FCMMessageDTO fCMMessageDTO) + { + var retVal = true; + try + { + fCMMessageDTO.Token = await GetLastFCMTokensAsync(); + + retVal = await SendFCMMessage(fCMMessageDTO); + } + catch (Exception ex) + { + Log.Error(ex.Message); + } + return retVal; + } } } diff --git a/src/WorkFlowCheck.BL/Services/SyncService.cs b/src/WorkFlowCheck.BL/Services/SyncService.cs index 7195aa4..85c8744 100644 --- a/src/WorkFlowCheck.BL/Services/SyncService.cs +++ b/src/WorkFlowCheck.BL/Services/SyncService.cs @@ -19,15 +19,17 @@ namespace WorkFlowCheck.BL.Services { private readonly IRequestContext _requestContext; private readonly IUserService _userService; - + private readonly IMessageService _messageService; public SyncService(AppDbContext dbContext, IMapper mapper, IRequestContext requestContext, + IMessageService messageService, IUserService userService) : base(dbContext, mapper) { _requestContext = requestContext; _userService = userService; + _messageService = messageService; } public async Task> GetAllCheckPointAsync() @@ -398,7 +400,7 @@ namespace WorkFlowCheck.BL.Services var deviceMessageDTO = new DeviceMessageDTO() { IsReaded = false, - Message = "Ellenőrző lap blokkolva!", + Message = $"Ellenőrző lap blokkolva! [{checkListHeaderDTO.DocumentNumber}]", SendDate = DateTime.UtcNow, ExtraDataJSON = "", RoleId = item.ParentId, @@ -407,6 +409,14 @@ namespace WorkFlowCheck.BL.Services }; await this.DeviceMessageSend(deviceMessageDTO); + + var fCMMessageDTO = new FCMMessageDTO + { + Body = deviceMessageDTO.Message, + Title = "Blokkolási értesítés", + UserId = user.Id, + }; + await _messageService.SendFCMMessageToLastToken(fCMMessageDTO); } return retVal; } diff --git a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj index eb5ed4f..72db9dd 100644 --- a/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj +++ b/src/WorkFlowCheck.BL/WorkFlowCheck.BL.csproj @@ -17,6 +17,7 @@ + diff --git a/src/WorkFlowCheck.Web/Helpers/SystemHelper.cs b/src/WorkFlowCheck.Web/Helpers/SystemHelper.cs index 86722e8..6779ec8 100644 --- a/src/WorkFlowCheck.Web/Helpers/SystemHelper.cs +++ b/src/WorkFlowCheck.Web/Helpers/SystemHelper.cs @@ -7,7 +7,7 @@ namespace WorkFlowCheck.Web.Helpers public static class SystemHelper { public static string DatabaseName = ""; - public static string ProgramVersion = "v1.1.022"; + public static string ProgramVersion = "v1.1.023"; public async static Task GetAPIInfoAsync(IConfiguration configuration) {