diff --git a/AsbCloudApp/Services/Notifications/NotificationService.cs b/AsbCloudApp/Services/Notifications/NotificationService.cs index 4537f04e..d0414213 100644 --- a/AsbCloudApp/Services/Notifications/NotificationService.cs +++ b/AsbCloudApp/Services/Notifications/NotificationService.cs @@ -61,6 +61,9 @@ public class NotificationService var notificationTransportService = GetTransportService(request.IdTransportType); await notificationTransportService.SendAsync(notification, cancellationToken); + + notification.SentDate = DateTime.UtcNow; + await notificationRepository.UpdateAsync(notification, cancellationToken); } /// @@ -104,6 +107,14 @@ public class NotificationService await notificationTransportService.SendRangeAsync(notifications, cancellationToken); + + var tasks = notifications.Select(notification => + { + notification.SentDate = DateTime.UtcNow; + return notificationRepository.UpdateAsync(notification, cancellationToken); + }); + + await Task.WhenAll(tasks); } private INotificationTransportService GetTransportService(int idTransportType) diff --git a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs index c766c5b0..57605438 100644 --- a/AsbCloudInfrastructure/Background/WorkToSendEmail.cs +++ b/AsbCloudInfrastructure/Background/WorkToSendEmail.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Repositories; using AsbCloudApp.Services.Notifications; using Microsoft.Extensions.DependencyInjection; using System; @@ -22,7 +23,13 @@ namespace AsbCloudInfrastructure.Background protected override async Task Action(string id, IServiceProvider services, Action onProgressCallback, CancellationToken token) { var notificationService = services.GetRequiredService(); + var notificationRepository = services.GetRequiredService(); + await notificationService.SendAsync(notification, token); + + notification.SentDate = DateTime.UtcNow; + await notificationRepository.UpdateAsync(notification, token); + } diff --git a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs index a0f9e208..9ff3961f 100644 --- a/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs +++ b/AsbCloudInfrastructure/Services/Email/EmailNotificationTransportService.cs @@ -17,7 +17,6 @@ namespace AsbCloudInfrastructure.Services.Email public class EmailNotificationTransportService : INotificationTransportService { - private readonly INotificationRepository notificationRepository; private readonly IUserRepository userRepository; private readonly string sender; private readonly string smtpPassword; @@ -26,12 +25,10 @@ namespace AsbCloudInfrastructure.Services.Email public int IdTransportType => 1; public bool IsConfigured { get; } - public EmailNotificationTransportService(BackgroundWorker backgroundWorker, + public EmailNotificationTransportService( IConfiguration configuration, - INotificationRepository notificationRepository, IUserRepository userRepository) { - this.notificationRepository = notificationRepository; this.userRepository = userRepository; this.sender = configuration.GetValue("email:sender", string.Empty); @@ -80,8 +77,6 @@ namespace AsbCloudInfrastructure.Services.Email client.Credentials = new System.Net.NetworkCredential(sender, smtpPassword); await client.SendMailAsync(message, token); - notification.SentDate = DateTime.UtcNow; - await notificationRepository.UpdateAsync(notification, token); Trace.TraceInformation($"Send email to {user.Email} subj:{notification.Title} html body count {notification.Message.Length}"); } diff --git a/AsbCloudWebApi.Tests/UnitTests/Services/Notification/EmailNotificationTransportServiceTests.cs b/AsbCloudWebApi.Tests/UnitTests/Services/Notification/EmailNotificationTransportServiceTests.cs new file mode 100644 index 00000000..696f4060 --- /dev/null +++ b/AsbCloudWebApi.Tests/UnitTests/Services/Notification/EmailNotificationTransportServiceTests.cs @@ -0,0 +1,78 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Data.User; +using AsbCloudApp.Repositories; +using AsbCloudApp.Services.Notifications; +using AsbCloudInfrastructure.Services.Email; +using Microsoft.Extensions.Configuration; +using NSubstitute; +using System; +using System.Collections.Generic; +using System.Net.Mail; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace AsbCloudWebApi.Tests.UnitTests.Services.Notification +{ + public class EmailNotificationTransportServiceTests + { + private IUserRepository userRepository; + private INotificationTransportService notificationTransportService; + + private readonly NotificationDto notification = new NotificationDto() + { + Message = "Message", + Title = "Title", + IdUser = 1, + IdTransportType = 1, + IdState = 0, + RegistrationDate = DateTime.Now, + IdNotificationCategory = 10000, + }; + private readonly UserExtendedDto user = new UserExtendedDto() + { + Id = 1, + IdCompany = 1, + Email = "studio@yandex.ru", + IdState = 1, + Login = "studio", + Name = "Test", + Patronymic = "Test", + Phone = "22-22-22", + Position = "Test", + Surname = "Test", + }; + + private static Dictionary configSettings = new() + { + { "email:sender", "bot@digitaldrilling.ru" }, + { "email:password", "8wZrXSfP" }, + { "email:smtpServer", "smtp.timeweb.ru" } + }; + + public EmailNotificationTransportServiceTests() + { + IConfiguration configuration = new ConfigurationBuilder() + .AddInMemoryCollection(configSettings) + .Build(); + + userRepository = Substitute.For(); + + notificationTransportService = new EmailNotificationTransportService(configuration, userRepository); + } + + [Fact] + public async Task SendAsync() + { + userRepository.GetOrDefaultAsync(Arg.Any(), Arg.Any()).Returns(user); + try + { + await notificationTransportService.SendAsync(notification, CancellationToken.None); + } + catch (Exception e) + { + Assert.True(e is SmtpException); + } + } + } +}