DD.WellWorkover.Cloud/AsbCloudApp/Services/Notifications/NotificationService.cs

117 lines
4.7 KiB
C#
Raw Normal View History

2023-07-17 11:48:52 +05:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data;
using AsbCloudApp.Exceptions;
using AsbCloudApp.Repositories;
using AsbCloudApp.Requests;
namespace AsbCloudApp.Services.Notifications;
/// <summary>
/// Сервис для работы с уведомлениями
/// </summary>
public class NotificationService
{
private readonly ICrudRepository<NotificationCategoryDto> notificationCategoryRepository;
private readonly INotificationRepository notificationRepository;
private readonly IEnumerable<INotificationTransportService> notificationTransportServices;
/// <summary>
/// Сервис для работы с уведомлениями
/// </summary>
/// <param name="notificationCategoryRepository"></param>
/// <param name="notificationRepository"></param>
/// <param name="notificationTransportServices"></param>
public NotificationService(ICrudRepository<NotificationCategoryDto> notificationCategoryRepository,
INotificationRepository notificationRepository,
IEnumerable<INotificationTransportService> notificationTransportServices)
{
this.notificationCategoryRepository = notificationCategoryRepository;
this.notificationRepository = notificationRepository;
this.notificationTransportServices = notificationTransportServices;
}
2023-07-17 11:48:52 +05:00
/// <summary>
/// Отправка нового уведомления
/// </summary>
/// <param name="request"></param>
2023-07-17 11:48:52 +05:00
/// <param name="cancellationToken"></param>
public async Task NotifyAsync(NotifyRequest request,
2023-07-17 11:48:52 +05:00
CancellationToken cancellationToken)
{
var notificationCategory = await notificationCategoryRepository.GetOrDefaultAsync(request.IdNotificationCategory, cancellationToken)
2023-09-29 12:06:46 +05:00
?? throw new ArgumentInvalidException(nameof(request.IdNotificationCategory), "Категория уведомления не найдена");
2023-07-17 11:48:52 +05:00
var notification = new NotificationDto
2023-07-17 11:48:52 +05:00
{
IdUser = request.IdUser,
RegistrationDate = DateTime.UtcNow,
IdNotificationCategory = notificationCategory.Id,
Title = request.Title,
Message = request.Message,
IdTransportType = request.IdTransportType,
2023-07-17 11:48:52 +05:00
};
notification.Id = await notificationRepository.InsertAsync(notification, cancellationToken);
2023-07-17 11:48:52 +05:00
notification.NotificationCategory = notificationCategory;
var notificationTransportService = GetTransportService(request.IdTransportType);
2023-07-17 11:48:52 +05:00
await notificationTransportService.SendAsync(notification, cancellationToken);
}
/// <summary>
/// Обновление уведомления
/// </summary>
/// <param name="idNotification"></param>
/// <param name="isRead"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task UpdateAsync(int idNotification,
2023-07-17 11:48:52 +05:00
bool isRead,
CancellationToken cancellationToken)
{
var notification = await notificationRepository.GetOrDefaultAsync(idNotification, cancellationToken)
2023-09-29 12:06:46 +05:00
?? throw new ArgumentInvalidException(nameof(idNotification), "Уведомление не найдено");
2023-07-17 11:48:52 +05:00
if(isRead && !notification.SentDate.HasValue)
2023-09-29 12:06:46 +05:00
throw new ArgumentInvalidException(nameof(isRead), "Уведомление не может быть прочитано");
notification.ReadDate = isRead ? DateTime.UtcNow : null;
2023-07-17 11:48:52 +05:00
await notificationRepository.UpdateAsync(notification,
cancellationToken);
}
/// <summary>
/// Отправка уведомлений, которые не были отправлены
/// </summary>
/// <param name="idUser"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task RenotifyAsync(int idUser, CancellationToken cancellationToken)
2023-07-17 11:48:52 +05:00
{
const int idTransportType = 0;
var notifications = await notificationRepository.GetAllAsync(idUser, false,
idTransportType,
2023-07-17 11:48:52 +05:00
cancellationToken);
var notificationTransportService = GetTransportService(idTransportType);
2023-07-17 11:48:52 +05:00
await notificationTransportService.SendRangeAsync(notifications,
2023-07-17 11:48:52 +05:00
cancellationToken);
}
private INotificationTransportService GetTransportService(int idTransportType)
2023-07-17 11:48:52 +05:00
{
var notificationTransportService = notificationTransportServices
.FirstOrDefault(s => s.IdTransportType == idTransportType)
2023-09-29 12:06:46 +05:00
?? throw new ArgumentInvalidException(nameof(idTransportType), "Доставщик уведомлений не найден");
2023-07-17 11:48:52 +05:00
return notificationTransportService;
}
}