< Summary

Class:SVETA.Api.Services.Implements.SendEmailJob
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/SendEmailJob.cs
Covered lines:0
Uncovered lines:84
Coverable lines:84
Total lines:129
Line coverage:0% (0 of 84)
Covered branches:0
Total branches:34
Branch coverage:0% (0 of 34)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
DoWork()0%0%
ExecuteAsync()0%0%
StopAsync()0%100%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/SendEmailJob.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Threading;
 5using System.Threading.Tasks;
 6using Microsoft.EntityFrameworkCore.Internal;
 7using Microsoft.Extensions.DependencyInjection;
 8using Microsoft.Extensions.Hosting;
 9using Microsoft.Extensions.Logging;
 10using SVETA.Api.Helpers;
 11using SVETA.Api.Data.Domain;
 12using SVETA.Api.Services.Interfaces;
 13using WinSolutions.Sveta.Common;
 14using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 15using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 16using WinSolutions.Sveta.Server.Services.Interfaces;
 17using Microsoft.Extensions.Configuration;
 18using WinSolutions.Sveta.Server.Services.Implements;
 19using Microsoft.Extensions.Options;
 20
 21namespace SVETA.Api.Services.Implements
 22{
 23    public class SendEmailJob : BackgroundService
 24    {
 25        private readonly IServiceProvider _service;
 26        private readonly ILogger<SendEmailJob> _logger;
 27        private readonly IConfiguration _configuration;
 28        private readonly EmailSettings _emailSettings;
 29
 030        public SendEmailJob(IServiceProvider service, ILogger<SendEmailJob> logger, IConfiguration configuration, IOptio
 031        {
 032            _service = service;
 033            _emailSettings = emailSettings.Value;
 034            _configuration = configuration;
 035            _logger = logger;
 036        }
 37
 38        /// <summary>
 39        /// Джоб для отправки писем
 40        /// </summary>
 41        /// <returns></returns>
 42        private async Task DoWork()
 043        {
 044            var emails = new List<Email>() { };
 045            using (var scope = _service.CreateScope())
 046            {
 047                var authUserService = scope.ServiceProvider.GetRequiredService<IAuthenticationService>();
 048                authUserService.SwitchToServiceUser();
 049                var emailService = scope.ServiceProvider.GetRequiredService<IEmailService>();
 050                var emailWorker = scope.ServiceProvider.GetRequiredService<IEmailWorker>();
 051                var jobLogger = scope.ServiceProvider.GetRequiredService<IJobService>();
 52
 53                try
 054                {
 055                    await jobLogger.Create(new JobLogger
 056                    {
 057                        JobName = nameof(SendEmailJob),
 058                        LogLevel = JobLogLevel.info,
 059                        Log = $"Старт работы джоба. Статус отправки сообщений - {(_emailSettings.EmailJobOn ? "включен" 
 060                    });
 061                    if (!_emailSettings.EmailJobOn)
 062                        return;
 063                    emails = await emailService.GetEmailsForJob();
 064                    await jobLogger.Create(new JobLogger
 065                    {
 066                        JobName = nameof(SendEmailJob),
 067                        LogLevel = JobLogLevel.info,
 068                        Log = $"Количество писем для отправки: {emails.Count}"
 069                    });
 070                }
 071                catch (Exception ex)
 072                {
 073                    _logger.LogError($"Ошибка инициализации джоба {nameof(SendEmailJob)}. {ex.Message}");
 074                }
 075                if (emails.Count == 0)
 076                    return;
 077                foreach (var email in emails)
 078                {
 79                    try
 080                    {
 081                        await emailWorker.SendEmail(email.Receiver, email.Subject, email.Body, email.Attachment);
 082                        email.Status = (int)EmailStatus.Sent;
 083                        await emailService.Update(email);
 084                    }
 085                    catch (Exception ex)
 086                    {
 087                        _logger.LogError($"Ошибка отправки почты на адрес {email.Receiver}. {ex.Message}");
 088                        email.Status = (int)EmailStatus.Error;
 089                        email.Error = ex.Message;
 90                        try
 091                        {
 092                            await emailService.Update(email);
 093                            await jobLogger.Create(new JobLogger
 094                            {
 095                                JobName = nameof(SendEmailJob),
 096                                LogLevel = JobLogLevel.error,
 097                                Log = $"Ошибка отправки почты на адрес {email.Receiver}. {ex.Message}"
 098                            });
 099                        }
 0100                        catch (Exception ex1)
 0101                        {
 0102                            _logger.LogError($"Ошибка обновления статуса отправки на адрес {email.Receiver}. {ex1.Messag
 0103                        }
 0104                    }
 0105                }
 0106            }
 0107        }
 108        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 0109        {
 0110            _logger.LogDebug($"SendEmail Job is starting.");
 111
 0112            stoppingToken.Register(() =>
 0113                _logger.LogDebug($"SendEmail Job  background task is stopping."));
 114
 0115            while (!stoppingToken.IsCancellationRequested)
 0116            {
 0117                _logger.LogDebug($"SendEmail Job task doing background work.");
 0118                await DoWork();
 0119                await Task.Delay(300_000, stoppingToken);
 0120            }
 0121        }
 122        public override async Task StopAsync(CancellationToken stoppingToken)
 0123        {
 0124            _logger.LogInformation(
 0125                "SendEmail Job service is stopping.");
 0126            await Task.CompletedTask;
 0127        }
 128    }
 129}