DD.WellWorkover.Cloud/AsbCloudWebApi/SignalR/Services/SignalRNotificationTransportService.cs
Степанов Дмитрий Александрович 1b560dd0a2 Изменение уведомлений
1. Изменил сущность уведомлений. Добавил дату регистрации уведомления.
2. Добавил миграцию.
3. Изменил репозитории. Убрал метод для обновления коллекции уведомлений.
4. Поправил запрос для отправки уведомлений и метод контроллера.
5. Поправил логику обновления уведомления. Теперь обновление состояния уведомления происходит в транспорте, после успешной отправки уведомления.
2023-07-25 13:36:09 +05:00

63 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data;
using AsbCloudApp.Repositories;
using AsbCloudApp.Services.Notifications;
using Microsoft.AspNetCore.SignalR;
namespace AsbCloudWebApi.SignalR.Services;
public class SignalRNotificationTransportService : INotificationTransportService
{
private readonly ConnectionManagerService connectionManagerService;
private readonly IHubContext<NotificationHub> notificationHubContext;
private readonly INotificationRepository notificationRepository;
private readonly SemaphoreSlim semaphoreSlim = new (1, 1);
public SignalRNotificationTransportService(ConnectionManagerService connectionManagerService,
IHubContext<NotificationHub> notificationHubContext,
INotificationRepository notificationRepository)
{
this.connectionManagerService = connectionManagerService;
this.notificationHubContext = notificationHubContext;
this.notificationRepository = notificationRepository;
}
public int IdTransportType => 0;
public async Task SendAsync(NotificationDto notification,
CancellationToken cancellationToken)
{
const string method = "receiveNotifications";
var connectionId = connectionManagerService.GetConnectionIdByUserId(notification.IdUser);
if (!string.IsNullOrWhiteSpace(connectionId))
{
notification.SentDate = DateTime.UtcNow;
await notificationHubContext.Clients.Client(connectionId)
.SendAsync(method,
notification,
cancellationToken);
await semaphoreSlim.WaitAsync(cancellationToken);
await notificationRepository.UpdateAsync(notification, cancellationToken);
semaphoreSlim.Release();
}
}
public Task SendRangeAsync(IEnumerable<NotificationDto> notifications,
CancellationToken cancellationToken)
{
var tasks = notifications
.Select(notification => SendAsync(notification, cancellationToken));
return Task.WhenAll(tasks);
}
}