FCM kifejlesztése

This commit is contained in:
2025-05-16 07:45:58 +02:00
parent da92dc45b6
commit 4c25dd2105
8 changed files with 103 additions and 76 deletions
@@ -30,39 +30,7 @@ namespace WorkFlowCheck.API.Controllers
try try
{ {
var pathToJsonKey = "com-nuvolar-wfcapp-firebase-adminsdk-fbsvc-37642626e4.json"; retVal.IsSuccess = await _messageService.SendFCMMessage(fCMMessageDTO);
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) catch (Exception ex)
{ {
@@ -82,39 +50,7 @@ namespace WorkFlowCheck.API.Controllers
try try
{ {
var pathToJsonKey = "com-nuvolar-wfcapp-firebase-adminsdk-fbsvc-37642626e4.json"; retVal.IsSuccess = await _messageService.SendFCMMessageToLastToken(fCMMessageDTO);
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();
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -1,6 +1,6 @@
{ {
"ConnectionStrings": { "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": { "Logging": {
"LogLevel": { "LogLevel": {
@@ -26,13 +26,16 @@ namespace WorkFlowCheck.BL.Services
{ {
private readonly INumberGeneratorService _numberGeneratorService; private readonly INumberGeneratorService _numberGeneratorService;
private readonly IMessageService _messageService;
public CheckListService(AppDbContext dbContext, public CheckListService(AppDbContext dbContext,
IMapper mapper, IMapper mapper,
INumberGeneratorService numberGeneratorService, INumberGeneratorService numberGeneratorService,
IMessageService messageService,
IUserService userService) : base(dbContext, mapper) IUserService userService) : base(dbContext, mapper)
{ {
_numberGeneratorService = numberGeneratorService; _numberGeneratorService = numberGeneratorService;
_messageService = messageService;
} }
public async Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id) public async Task<CheckListHeaderDTO> GetCheckListHeaderAsync(int Id)
@@ -3,13 +3,17 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using WorkFlowCheck.Common.DTO;
namespace WorkFlowCheck.BL.Services.Interfaces namespace WorkFlowCheck.BL.Services.Interfaces
{ {
public interface IMessageService public interface IMessageService
{ {
Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody); Task<bool> SendMailAsync(List<string> recipients, string subject, string htmlBody);
Task<bool> SendFCMTokenAsync(string token); Task<bool> SendFCMTokenAsync(string token);
Task<string> GetLastFCMTokensAsync(); Task<string> GetLastFCMTokensAsync();
Task<bool> SendFCMMessage(FCMMessageDTO fCMMessageDTO);
Task<bool> SendFCMMessageToLastToken(FCMMessageDTO fCMMessageDTO);
} }
} }
@@ -9,6 +9,11 @@ using WorkFlowCheck.DL.Entities;
using AutoMapper; using AutoMapper;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using WorkFlowCheck.DL; 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 namespace WorkFlowCheck.BL.Services
{ {
@@ -53,13 +58,20 @@ namespace WorkFlowCheck.BL.Services
var retVal = true; var retVal = true;
try 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 FCMToken = new FCMToken();
}; FCMToken.Token = token;
await _dbContext.FCMTokens.AddAsync(FCMToken); await _dbContext.FCMTokens.AddAsync(FCMToken);
}
else
{
FCMToken.LastModAt = DateTime.UtcNow;
}
await _dbContext.SaveChangesAsync(); await _dbContext.SaveChangesAsync();
} }
} }
@@ -78,7 +90,7 @@ namespace WorkFlowCheck.BL.Services
{ {
var FCMToken = await _dbContext.FCMTokens var FCMToken = await _dbContext.FCMTokens
.AsNoTracking() .AsNoTracking()
.OrderByDescending(x => x.CreatedAt) .OrderByDescending(x => x.LastModAt)
.Take(1) .Take(1)
.FirstOrDefaultAsync(); .FirstOrDefaultAsync();
if (FCMToken != null && !string.IsNullOrEmpty(FCMToken.Token)) if (FCMToken != null && !string.IsNullOrEmpty(FCMToken.Token))
@@ -93,6 +105,67 @@ namespace WorkFlowCheck.BL.Services
} }
return retVal; return retVal;
} }
public async Task<bool> 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<bool> SendFCMMessageToLastToken(FCMMessageDTO fCMMessageDTO)
{
var retVal = true;
try
{
fCMMessageDTO.Token = await GetLastFCMTokensAsync();
retVal = await SendFCMMessage(fCMMessageDTO);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
return retVal;
}
} }
} }
+12 -2
View File
@@ -19,15 +19,17 @@ namespace WorkFlowCheck.BL.Services
{ {
private readonly IRequestContext _requestContext; private readonly IRequestContext _requestContext;
private readonly IUserService _userService; private readonly IUserService _userService;
private readonly IMessageService _messageService;
public SyncService(AppDbContext dbContext, public SyncService(AppDbContext dbContext,
IMapper mapper, IMapper mapper,
IRequestContext requestContext, IRequestContext requestContext,
IMessageService messageService,
IUserService userService) : base(dbContext, mapper) IUserService userService) : base(dbContext, mapper)
{ {
_requestContext = requestContext; _requestContext = requestContext;
_userService = userService; _userService = userService;
_messageService = messageService;
} }
public async Task<List<CheckPointDTO>> GetAllCheckPointAsync() public async Task<List<CheckPointDTO>> GetAllCheckPointAsync()
@@ -398,7 +400,7 @@ namespace WorkFlowCheck.BL.Services
var deviceMessageDTO = new DeviceMessageDTO() var deviceMessageDTO = new DeviceMessageDTO()
{ {
IsReaded = false, IsReaded = false,
Message = "Ellenőrző lap blokkolva!", Message = $"Ellenőrző lap blokkolva! [{checkListHeaderDTO.DocumentNumber}]",
SendDate = DateTime.UtcNow, SendDate = DateTime.UtcNow,
ExtraDataJSON = "", ExtraDataJSON = "",
RoleId = item.ParentId, RoleId = item.ParentId,
@@ -407,6 +409,14 @@ namespace WorkFlowCheck.BL.Services
}; };
await this.DeviceMessageSend(deviceMessageDTO); 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; return retVal;
} }
@@ -17,6 +17,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" /> <PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" /> <PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
<PackageReference Include="Google.Apis.Auth" Version="1.69.0" />
<PackageReference Include="MailKit" Version="4.11.0" /> <PackageReference Include="MailKit" Version="4.11.0" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.3" /> <PackageReference Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageReference Include="Serilog.Expressions" Version="5.0.0" /> <PackageReference Include="Serilog.Expressions" Version="5.0.0" />
@@ -7,7 +7,7 @@ namespace WorkFlowCheck.Web.Helpers
public static class SystemHelper public static class SystemHelper
{ {
public static string DatabaseName = ""; 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) public async static Task GetAPIInfoAsync(IConfiguration configuration)
{ {