Удалил лишнее

This commit is contained in:
parent 985c0489d0
commit 2232061f95
8 changed files with 0 additions and 285 deletions

View File

@ -1,17 +0,0 @@
namespace AsbCloudApp.Data;
/// <summary>
/// DTO способа доставки уведомления
/// </summary>
public class NotificationTransportDto
{
/// <summary>
/// Id способа доставки уведомления
/// </summary>
public int Id { get; set; }
/// <summary>
/// Название способа доставки
/// </summary>
public string Name { get; set; } = null!;
}

View File

@ -1,41 +0,0 @@
using System.Collections.Generic;
using System.Threading;
using AsbCloudApp.Data;
namespace AsbCloudApp.Services;
/// <summary>
/// Сервис для добавление уведомлений в очередь
/// </summary>
public interface INotificationSendingQueueService
{
/// <summary>
/// Флаг для проверки пустая ли коллекция
/// </summary>
bool IsEmpty { get; }
/// <summary>
/// Добавление одного уведомления в очередь
/// </summary>
/// <param name="notificationDto"></param>
void Enqueue(NotificationDto notificationDto);
/// <summary>
/// Добавление нескольких уведомлений в очередь
/// </summary>
/// <param name="notifications"></param>
void EnqueueRange(IEnumerable<NotificationDto> notifications);
/// <summary>
/// Извлечение элемента из очереди и его удаление
/// </summary>
/// <param name="notification"></param>
/// <returns></returns>
bool TryDequeue(out NotificationDto notification);
/// <summary>
/// Метод ожидания нового уведомления
/// </summary>
/// <param name="cancellationToken"></param>
void Wait(CancellationToken cancellationToken);
}

View File

@ -1,20 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace AsbCloudDb.Model;
[Table("t_notification_transport"), Comment("Способ доставки уведомлений")]
public class NotificationTransport : IId
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("name"), Comment("Название способа доставки уведомлений")]
public string Name { get; set; } = null!;
[InverseProperty(nameof(Notification.NotificationTransport))]
public virtual ICollection<Notification> Notifications { get; set; } = null!;
}

View File

@ -1,42 +0,0 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using AsbCloudApp.Data;
using AsbCloudApp.Services;
namespace AsbCloudInfrastructure.Services;
public class NotificationSendingQueueService : INotificationSendingQueueService
{
private readonly ManualResetEventSlim manualResetEventSlim = new();
private readonly ConcurrentQueue<NotificationDto> notificationsQueue = new();
public bool IsEmpty => notificationsQueue.IsEmpty;
public void Enqueue(NotificationDto notification)
{
notificationsQueue.Enqueue(notification);
manualResetEventSlim.Set();
}
public void EnqueueRange(IEnumerable<NotificationDto> notifications)
{
foreach (var notification in notifications)
{
notificationsQueue.Enqueue(notification);
}
manualResetEventSlim.Set();
}
public bool TryDequeue(out NotificationDto notification)
{
return notificationsQueue.TryDequeue(out notification!);
}
public void Wait(CancellationToken cancellationToken)
{
manualResetEventSlim.Wait(cancellationToken);
manualResetEventSlim.Reset();
}
}

View File

@ -1,71 +0,0 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Data;
using AsbCloudApp.Exceptions;
using AsbCloudApp.Repositories;
using AsbCloudApp.Services;
namespace AsbCloudInfrastructure.Services;
public class NotificationService : INotificationService
{
private readonly INotificationSendingQueueService notificationSendingQueueService;
private readonly INotificationRepository notificationRepository;
public NotificationService(INotificationSendingQueueService notificationSendingQueueService,
INotificationRepository notificationRepository)
{
this.notificationSendingQueueService = notificationSendingQueueService;
this.notificationRepository = notificationRepository;
}
public async Task SendNotificationAsync(int idUser,
int idNotificationTransport,
int idNotificationCategory,
string title,
string subject,
TimeSpan timeToLife,
CancellationToken cancellationToken)
{
NotificationDto notification = new()
{
IdUser = idUser,
IdNotificationTransport = idNotificationTransport,
IdNotificationCategory = idNotificationCategory,
Title = title,
Subject = subject,
TimeToLife = timeToLife
};
await notificationRepository.InsertAsync(notification,
cancellationToken);
notificationSendingQueueService.Enqueue(notification);
}
public async Task UpdateNotificationAsync(int idNotification,
bool isRead,
CancellationToken cancellationToken)
{
var notification = await notificationRepository.GetOrDefaultAsync(idNotification,
cancellationToken) ?? throw new ArgumentInvalidException("Уведомление не найдено",
nameof(idNotification));
notification.IsRead = isRead;
await notificationRepository.UpdateAsync(notification,
cancellationToken);
}
public async Task ResendNotificationAsync(int idUser,
int idNotificationTransport,
CancellationToken cancellationToken)
{
var notifications = await notificationRepository.GetUnsentNotificationsAsync(idUser,
idNotificationTransport,
cancellationToken);
notificationSendingQueueService.EnqueueRange(notifications);
}
}

View File

@ -1,8 +0,0 @@
namespace AsbCloudWebApi.Options.Notifications;
public class NotificationsOptionsSignalR
{
public string Method { get; set; } = null!;
public int IdTransport { get; set; }
}

View File

@ -1,82 +0,0 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using AsbCloudApp.Repositories;
using AsbCloudApp.Services;
using AsbCloudWebApi.Options.Notifications;
using AsbCloudWebApi.SignalR.ConnectionManager;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
namespace AsbCloudWebApi.SignalR.BackgroundServices;
public class SignalRNotificationSender : BackgroundService
{
private readonly IConnectionManager connectionManager;
private readonly INotificationSendingQueueService notificationSendingQueueService;
private readonly IHubContext<NotificationHub> notificationHubContext;
private readonly NotificationsOptionsSignalR notificationsOptionsSignalR;
private readonly IServiceProvider serviceProvider;
public SignalRNotificationSender(IConnectionManager connectionManager,
INotificationSendingQueueService notificationSendingQueueService,
IHubContext<NotificationHub> notificationHubContext,
IOptions<NotificationsOptionsSignalR> notificationsOptionsSignalR,
IServiceProvider serviceProvider)
{
this.connectionManager = connectionManager;
this.notificationSendingQueueService = notificationSendingQueueService;
this.notificationHubContext = notificationHubContext;
this.notificationsOptionsSignalR = notificationsOptionsSignalR.Value;
this.serviceProvider = serviceProvider;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.Run( async () =>
{
await SendAsync(stoppingToken);
}, stoppingToken);
}
private async Task SendAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
notificationSendingQueueService.Wait(cancellationToken);
while (!notificationSendingQueueService.IsEmpty)
{
if (notificationSendingQueueService.TryDequeue(out var notification))
{
string userId = notification.IdUser.ToString();
var connectionId = connectionManager.GetConnectionIdByUserId(userId);
if (!string.IsNullOrWhiteSpace(connectionId))
{
await notificationHubContext.Clients.Client(connectionId)
.SendAsync(notificationsOptionsSignalR.Method,
notification,
cancellationToken);
notification.SentDateAtUtc = DateTime.UtcNow;
notification.IsRead = false;
}
var scope = serviceProvider.CreateScope();
var notificationRepository = scope.ServiceProvider.GetService<INotificationRepository>();
if (notificationRepository != null)
{
await notificationRepository.UpdateAsync(notification,
cancellationToken);
}
}
}
}
}
}

View File

@ -27,10 +27,6 @@
"supportMail": "support@digitaldrilling.ru"
},
"DirectoryNameHelpPageFiles": "helpPages",
"NotificationsOptionsSignalR": {
"Method": "notifications",
"IdTransport": 1
},
"Urls": "http://0.0.0.0:5000" //;https://0.0.0.0:5001" //,
// See https man: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-6.0
//"Kestrel": {