< Summary

Class:SVETA.Api.Services.Implements.SmsWorker
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/SmsWorker.cs
Covered lines:12
Uncovered lines:42
Coverable lines:54
Total lines:118
Line coverage:22.2% (12 of 54)
Covered branches:2
Total branches:16
Branch coverage:12.5% (2 of 16)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetToken()0%0%
SendSmsByPattern()16.12%16.66%
PrepareRecord(...)0%100%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using SVETA.Api.Helpers.Authorize;
 3using SVETA.Api.Services.Interfaces;
 4using System;
 5using System.Linq;
 6using CrmVtbc;
 7using System.Collections.Generic;
 8using Microsoft.Extensions.Options;
 9using SVETA.Api.Data.Domain;
 10using WinSolutions.Sveta.Common;
 11using System.Net.Http;
 12using System.Security.Claims;
 13using System.Threading.Tasks;
 14using Newtonsoft.Json;
 15using Newtonsoft.Json.Converters;
 16using Newtonsoft.Json.Serialization;
 17using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 18using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 19using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 20using WinSolutions.Sveta.Server.Services.Interfaces;
 21using Microsoft.Extensions.Logging;
 22using SVETA.Api.Helpers;
 23using SVETA.API.IntegrationTest.Common;
 24using SVETA.Api.Data.DTO.Sms;
 25using WinSolutions.Sveta.Server.Services.Implements;
 26
 27namespace SVETA.Api.Services.Implements
 28{
 29    public class SmsWorker : ISmsWorker
 30    {
 31        private readonly ILogger<SmsWorker> _logger;
 32        private readonly SmsSettings _smsOptions;
 33        private readonly HttpClient httpClient;
 34        private readonly ISmsHistoryService _smsHistoryService;
 35
 8336        public SmsWorker(ILogger<SmsWorker> logger, IOptions<SmsSettings> smsOptions, ISmsHistoryService smsHistoryServi
 8337        {
 8338            _logger = logger;
 8339            _smsHistoryService = smsHistoryService;
 8340            _smsOptions = smsOptions.Value;
 8341            httpClient = new HttpClient();
 8342        }
 43
 44        /// <summary>
 45        /// получает токен для методов работы с смс
 46        /// </summary>
 47        /// <returns></returns>
 48        private async Task<string> GetToken()
 049        {
 050            var response = await httpClient.PostAsync(_smsOptions.AuthService,
 051                StringContentCreator.CreateContent(new { login = _smsOptions.Login, Password = _smsOptions.Password.Encr
 052                SymmetricCrypto.DecryptData(Convert.FromBase64String(_smsOptions.Password.Value)) :
 053                _smsOptions.Password.Value }));
 054            var token = JsonConvert.DeserializeObject<SmsToken>(await response.Content.ReadAsStringAsync()).Token;
 055            return token;
 056        }
 57
 58        /// <summary>
 59        /// Отправляет смс по шаблону
 60        /// </summary>
 61        /// <param name="patternId">id шаблона</param>
 62        /// <param name="phone">телефон в формате +7</param>
 63        /// <param name="contragentExtKey">внешний ключ контрагента</param>
 64        /// <param name="properties">словарь с переменными для шаблона</param>
 65        /// <returns></returns>
 66        public async Task SendSmsByPattern(string patternId, string phone, string contragentExtKey, Dictionary<string,st
 15267        {
 68            try
 15269            {
 15270                if (!_smsOptions.SmsSendOn)
 15271                    return;
 072                var data = new SmsPatternRequestDTO()
 073                {
 074                    CompanyId = contragentExtKey,
 075                    PatternId = patternId,
 076                    Phone = phone,
 077                    Properties = properties
 078                };
 079                var token = await GetToken();
 080                if (string.IsNullOrWhiteSpace(token))
 081                {
 082                    _logger.LogError("Не удалось отправить смс. Не получен токен для отправки смс.");
 083                    await _smsHistoryService.Create(PrepareRecord(data, 0, "Не удалось получить токен для отправки смс."
 084                    return;
 85                }
 86
 087                StringContent requestContent = StringContentCreator.CreateContent(data);
 088                httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("
 089                var response = await httpClient.PostAsync(_smsOptions.SmsService + _smsOptions.SendByPattern, requestCon
 090                var content = await response.Content.ReadAsStringAsync();
 091                if (!response.IsSuccessStatusCode)
 092                    _logger.LogError($"Не удалось отправить смс. Статус {(int)response.StatusCode}. Ответ {content}");
 093                await _smsHistoryService.Create(PrepareRecord(data, (int)response.StatusCode, content));
 094            }
 095            catch (Exception e)
 096            {
 097                _logger.LogError($"Не удалось отправить смс");
 098                _logger.LogError(e.Message + "\n" + e.StackTrace);
 099            }
 152100        }
 101
 102        /// <summary>
 103        /// Преобразует объект SmsPatternRequestDTO в SmsHistory
 104        /// </summary>
 105        /// <param name="data">объект SmsPatternRequestDTO</param>
 106        /// <param name="statusCode">код ответа от смс гейта</param>
 107        /// <param name="error">ошибка</param>
 108        /// <returns></returns>
 0109        private SmsHistory PrepareRecord(SmsPatternRequestDTO data, int statusCode, string error) => new SmsHistory()
 0110        {
 0111            PatternId = data.PatternId,
 0112            ContragentExtKey = data.CompanyId,
 0113            Phone = data.Phone,
 0114            StatusCode = statusCode,
 0115            Error = error
 0116        };
 117    }
 118}