< Summary

Class:SVETA.Api.Services.Implements.EmailWorker
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/EmailWorker.cs
Covered lines:16
Uncovered lines:72
Coverable lines:88
Total lines:165
Line coverage:18.1% (16 of 88)
Covered branches:2
Total branches:25
Branch coverage:8% (2 of 25)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
SendEmail()0%0%
SendEmailByPattern()17.85%20%
PrepareBodyForPattern(...)0%0%
PrepareRecord(...)0%100%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Newtonsoft.Json;
 3using Newtonsoft.Json.Converters;
 4using Newtonsoft.Json.Serialization;
 5using SVETA.Api.Helpers.Authorize;
 6using SVETA.Api.Services.Interfaces;
 7using System;
 8using System.IO;
 9using System.Linq;
 10using System.Collections.Generic;
 11using Microsoft.Extensions.Options;
 12using SVETA.Api.Data.Domain;
 13using WinSolutions.Sveta.Common;
 14using System.Net.Http;
 15using System.Security.Claims;
 16using MimeKit;
 17using MailKit.Net.Smtp;
 18using System.Threading.Tasks;
 19using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 20using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 21using WinSolutions.Sveta.Server.Services.Interfaces;
 22using Microsoft.Extensions.Logging;
 23using SVETA.Api.Data.DTO.Email;
 24using SVETA.API.IntegrationTest.Common;
 25using DocumentFormat.OpenXml.Office.CustomUI;
 26
 27namespace SVETA.Api.Services.Implements
 28{
 29    public class EmailWorker : IEmailWorker
 30    {
 31        private readonly SvetaDbContext _db;
 32        private readonly ConfigurationsSettings _confsSettings;
 33        private readonly IEmailGateHistoryService _emailGateSettings;
 34        private readonly EmailSettings _emailSettings;
 35        private readonly HttpClient httpClient;
 36        private readonly ILogger<EmailWorker> _logger;
 37
 8338        public EmailWorker(SvetaDbContext db,
 8339            ILogger<EmailWorker> logger,
 8340            IOptions<ConfigurationsSettings> confsSettings, IOptions<EmailSettings> emailSettings, IEmailGateHistoryServ
 8341        {
 8342            _db = db;
 8343            _confsSettings = confsSettings.Value;
 8344            _emailGateSettings = emailGateSettings;
 8345            _emailSettings = emailSettings.Value;
 8346            _logger = logger;
 8347            httpClient = new HttpClient();
 8348        }
 49
 50        /// <summary>
 51        /// Отправляет почту
 52        /// </summary>
 53        /// <param name="email">адресат</param>
 54        /// <param name="subject">Тема</param>
 55        /// <param name="body">Тело</param>
 56        /// <param name="attach">файл с полным путем</param>
 57        /// <returns></returns>
 58        public async Task SendEmail(string email, string subject, string body, string attach = null)
 059        {
 060            byte[] fileBytes = null;
 061            if (!string.IsNullOrWhiteSpace(attach))
 062                fileBytes = await File.ReadAllBytesAsync(attach);
 063            var emailMessage = new MimeMessage();
 064            emailMessage.To.Add(new MailboxAddress(email));
 065            emailMessage.Subject = subject;
 066            var bodyBuilder = new BodyBuilder();
 067            bodyBuilder.HtmlBody = body + "<br><br>";
 068            if (fileBytes != null) bodyBuilder.Attachments.Add(attach, fileBytes);
 069            emailMessage.Body = bodyBuilder.ToMessageBody();
 070            using (var client = new SmtpClient())
 071            {
 072                emailMessage.From.Add(new MailboxAddress(_confsSettings.GetConfValue("EmailSettings", "From")));
 073                await client.ConnectAsync(_confsSettings.GetConfValue("EmailSettings", "SmtpServer"), int.TryParse(_conf
 074                await client.AuthenticateAsync(_confsSettings.GetConfValue("EmailSettings", "Login"), _confsSettings.Get
 075                await client.SendAsync(emailMessage);
 076                await client.DisconnectAsync(true);
 077            }
 078        }
 79
 80        /// <summary>
 81        /// Отправляет email по шаблону
 82        /// </summary>
 83        /// <param name="templateId">id шаблона</param>
 84        /// <param name="subject">Тема письма</param>
 85        /// <param name="emailAddress">почта получателя</param>
 86        /// <param name="movement">документ. Может быть null, если в письме не требуется товарный состав документа</para
 87        /// <param name="parameters">словарь с переменными для шаблона</param>
 88        /// <returns></returns>
 89        public async Task SendEmailByPattern(int templateId, string subject, string emailAddress, Movement movement, Dic
 15290        {
 91            try
 15292            {
 15293                if (!_emailSettings.EmailGateSettings.EmailSendOn)
 15294                    return;
 095                if (movement != null)
 096                    parameters.Add("orderbody", PrepareBodyForPattern(movement)); //если передали документ, значит надо 
 097                var data = new EmailPatternRequestDTO()
 098                {
 099                    TemplateId = templateId,
 0100                    Topic = subject,
 0101                    Emails = new List<EmailParameters> { new EmailParameters {
 0102                          ToClientAddress = emailAddress,
 0103                          Parameters = parameters
 0104                        } }
 0105                };
 106
 0107                StringContent requestContent = StringContentCreator.CreateContent(data);
 0108                var response = await httpClient.PostAsync(_emailSettings.EmailGateSettings.EmailService + _emailSettings
 0109                var emailResponse = JsonConvert.DeserializeObject<EmailPatternResponseDTO>(await response.Content.ReadAs
 0110                if (!response.IsSuccessStatusCode)
 0111                    _logger.LogError($"Не удалось отправить email через шаблон. Статус запроса {(int)response.StatusCode
 0112                await _emailGateSettings.Create(PrepareRecord(data, (int)response.StatusCode, emailResponse));
 0113            }
 0114            catch (Exception e)
 0115            {
 0116                _logger.LogError($"Не удалось отправить email через шаблон");
 0117                _logger.LogError(e.Message + "\n" + e.StackTrace);
 0118            }
 152119        }
 120
 121        /// <summary>
 122        /// Создает html таблицу для товаров документа
 123        /// </summary>
 124        /// <param name="movement">документ</param>
 125        /// <returns></returns>
 126        private string PrepareBodyForPattern(Movement movement)
 0127        {
 0128            var body = "<table border=\"1\" cellspacing=\"0\"><tr>" +
 0129                 "<th>Название товара</th>" +
 0130                 "<th>Цена</th>" +
 0131                 "<th>Кол-во</th>" +
 0132                 "<th>Сумма</th>" +
 0133              "<tr/>";
 0134            foreach (var item in movement.Items)
 0135                body += "<tr>" +
 0136                 $"<td>{item.Good.Name}</td>" +
 0137                 $"<td>{item.Price}</td>" +
 0138                 $"<td>{item.Quantity}</td>" +
 0139                 $"<td>{(item.Price * item.Quantity).ToString("F2")}</td>" +
 0140              "</tr>";
 0141            body += "<tr>" +
 0142              "<td colspan=\"3\">Итого</td>" +
 0143              $"<td>{movement.PrepaimentSum}</td>" +
 0144              "</tr></table>";
 0145            return body;
 0146        }
 147
 148        /// <summary>
 149        /// Преобразует объект EmailPatternRequestDTO в EmailGateHistory
 150        /// </summary>
 151        /// <param name="data">объект EmailPatternRequestDTO</param>
 152        /// <param name="statusCode">код ответа от смс гейта</param>
 153        /// <param name="emailResponse">текст ответа в объекте EmailPatternResponseDTO</param>
 154        /// <returns></returns>
 0155        private EmailGateHistory PrepareRecord(EmailPatternRequestDTO data, int statusCode, EmailPatternResponseDTO emai
 0156        {
 0157            TemplateId = data.TemplateId,
 0158            Subject = data.Topic,
 0159            EmailAddress = data.Emails.FirstOrDefault().ToClientAddress,
 0160            StatusCode = statusCode,
 0161            ResponseStatus = emailResponse.Status,
 0162            ResponseText = emailResponse.StatusText
 0163        };
 164    }
 165}