< Summary

Class:SVETA.Api.Services.Implements.WalletHttpClient
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Services/Implements/WalletHttpClient.cs
Covered lines:0
Uncovered lines:118
Coverable lines:118
Total lines:261
Line coverage:0% (0 of 118)
Covered branches:0
Total branches:6
Branch coverage:0% (0 of 6)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
GetWalletBalance()0%100%
GetFreeBalance()0%100%
CreateTransaction()0%100%
CheckSms()0%100%
RetrySms()0%100%
ConfirmTransaction()0%100%
CancelTransaction()0%100%
ChangeDeal()0%100%
CheckChangeDeal()0%100%
GetTransactionInfo()0%0%
GetTransactionHistory()0%0%
CreateEvent()0%100%
GetUrl(...)0%0%
CreateContent(...)0%100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Net.Http;
 5using System.Text;
 6using System.Threading.Tasks;
 7using Microsoft.Extensions.Logging;
 8using Microsoft.Extensions.Options;
 9using Newtonsoft.Json;
 10using Newtonsoft.Json.Converters;
 11using Newtonsoft.Json.Serialization;
 12using SVETA.Api.Data.DTO.Wallet;
 13using SVETA.Api.Helpers;
 14using SVETA.Api.Services.Interfaces;
 15using WinSolutions.Sveta.Common;
 16using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 17using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 18using WinSolutions.Sveta.Server.Services.Interfaces;
 19using SVETA.Api.Data.Domain;
 20
 21namespace SVETA.Api.Services.Implements
 22{
 23    public class WalletHttpClient: IWalletHttpClient
 24    {
 25        private readonly ILogger<WalletHttpClient> _logger;
 26        private readonly HttpClient httpClient;
 27        private readonly WalletSettings _walletSettings;
 28        private readonly ConfigurationsSettings _confsSettings;
 29        private readonly IEventService _eventService;
 30        private readonly IUserService _userService;
 31        private readonly IAuthenticationService _authUserService;
 32
 033        public WalletHttpClient(ILogger<WalletHttpClient> logger,
 034            IOptions<WalletSettings> options,
 035            IEventService eventService,
 036            IAuthenticationService authUserService,
 037            IUserService userService,
 038            IOptions<ConfigurationsSettings> confsSettings
 039            )
 040        {
 041            _confsSettings = confsSettings.Value;
 042            _walletSettings = options.Value;
 043            _authUserService = authUserService;
 044            _eventService = eventService;
 045            _userService = userService;
 046            httpClient = new HttpClient();
 047        }
 48
 49        /// <summary>
 50        /// Возвращает баланс кошелька в формате ВТБ
 51        /// </summary>
 52        /// <param name="walletId">идентификатор кошелька</param>
 53        /// <returns></returns>
 54        public async Task<WalletResponseDTO<WalletBalanceResponse>> GetWalletBalance(string walletId)
 055        {
 056            StringContent data = CreateContent(new { id = walletId });
 057            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "GetAcc")), d
 058            var raw = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());
 059            return JsonConvert.DeserializeObject<WalletResponseDTO<WalletBalanceResponse>>(await response.Content.ReadAs
 060        }
 61
 62        /// <summary>
 63        /// Возвращает свободный баланс на сумму
 64        /// </summary>
 65        /// <param name="walletId">Идентификатор кошелька</param>
 66        /// <param name="sum">Сумма, которая должна быть доступна на балансе</param>
 67        /// <returns></returns>
 68        public async Task<WalletResponseDTO<WalletBalanceFreeVtbResponse>> GetFreeBalance(string walletId, decimal sum)
 069        {
 070            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "GetAccBalanc
 071                CreateContent(new {id = walletId, sum}));
 072            var raw = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());
 073            return JsonConvert.DeserializeObject<WalletResponseDTO<WalletBalanceFreeVtbResponse>>(
 074                await response.Content.ReadAsStringAsync());
 075        }
 76
 77        /// <summary>
 78        /// Отправляет запрос на создание транзакции
 79        /// </summary>
 80        /// <param name="movementGuid">Guid документа для которого создается транзакция</param>
 81        /// <param name="request">Объект с данными</param>
 82        /// <returns></returns>
 83        public async Task<WalletResponseDTO<WalletTransactionResponse>> CreateTransaction(Guid movementGuid, WalletReque
 084        {
 085            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "CreateTransa
 086                CreateContent(request));
 087            var raw = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());
 088            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactionResponse>>(await response.Con
 089            await CreateEvent(movementGuid, new { Request = request, Response = content });
 090            return content;
 091        }
 92        /// <summary>
 93        /// Отправляет запрос на проверку смс
 94        /// </summary>
 95        /// <param name="trGuid">GUID транзакции в SVETA</param>
 96        /// <param name="checkRequest"></param>
 97        /// <returns></returns>
 98        public async Task<WalletResponseDTO<WalletTransactActionResponseFull>> CheckSms(Guid trGuid,
 99            WalletCheckSmsRequest checkRequest)
 0100        {
 0101            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "ActionTransa
 0102                CreateContent(checkRequest));
 0103            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactActionResponseFull>>(await respo
 0104            await CreateEvent(trGuid, new { Request = checkRequest, Response = content });
 0105            return content;
 0106        }
 107
 108        /// <summary>
 109        /// Запрашивает повторное смс с кодом
 110        /// </summary>
 111        /// <param name="trGuid">GUID транзакции в SVETA</param>
 112        /// <param name="request"></param>
 113        /// <returns></returns>
 114        public async Task<WalletResponseDTO<WalletTransactActionResponseFull>> RetrySms(Guid trGuid,
 115            WalletConfirmReqDTO request)
 0116        {
 0117            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "ActionTransa
 0118                CreateContent(request));
 0119            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactActionResponseFull>>(await respo
 120
 0121            await CreateEvent(trGuid, new { Request = request, Response = content });
 0122            return content;
 0123        }
 124        /// <summary>
 125        /// Подтверждение транзакции
 126        /// </summary>
 127        /// <param name="trGuid">GUID транзакции в SVETA</param>
 128        /// <param name="request">Объект с запросом</param>
 129        /// <returns></returns>
 130        public async Task<WalletResponseDTO<WalletTransactActionResponseFull>> ConfirmTransaction(Guid trGuid, WalletCon
 0131        {
 0132            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "ActionTransa
 0133                CreateContent(request));
 134
 0135            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactActionResponseFull>>(await respo
 136
 0137            await CreateEvent(trGuid, new { Request = request, Response = content });
 0138            return content;
 0139        }
 140
 141        /// <summary>
 142        /// Отмена транзакции
 143        /// </summary>
 144        /// <param name="trGuid"></param>
 145        /// <param name="request"></param>
 146        /// <returns></returns>
 147        public async Task<WalletResponseDTO<WalletTransactActionResponseFull>> CancelTransaction(Guid trGuid,
 148            WalletConfirmReqDTO request)
 0149        {
 0150            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "ActionTransa
 0151                CreateContent(request));
 152
 0153            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactActionResponseFull>>(await respo
 0154            await CreateEvent(trGuid, new { Request = request, Response = content });
 0155            return content;
 0156        }
 157
 158        /// <summary>
 159        /// Изменяет сумму сделки
 160        /// </summary>
 161        /// <param name="trGuid"></param>
 162        /// <param name="request"></param>
 163        /// <returns></returns>
 164        public async Task<WalletResponseDTO<WalletTransactionChangeDeal>> ChangeDeal(Guid trGuid,
 165            WalletChangeDealRequestDto request)
 0166        {
 0167            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "ChangeTransa
 0168                CreateContent(request));
 169
 0170            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactionChangeDeal>>(await response.C
 0171            await CreateEvent(trGuid, new { Request = request, Response = content });
 0172            return content;
 0173        }
 174
 175        //WalletResponseDTO<WalletTransactionChangeDeal>
 176        public async Task<WalletResponseDTO<WalletTransactionCheckChangeDeal>> CheckChangeDeal(Guid trGuid,
 177            WalletChangeDealRequestDto request)
 0178        {
 0179            var response =
 0180                await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "CheckChangeTransaction"
 0181            var content = JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactionCheckChangeDeal>>(await respo
 0182            await CreateEvent(trGuid, new {Request = request, Response = content});
 0183            return content;
 0184        }
 185
 186        /// <summary>
 187        /// Возвращает информацию о транзакции
 188        /// </summary>
 189        /// <param name="transactionId">Идентификатор транзакции</param>
 190        /// <returns></returns>
 191        public async Task<WalletResponseDTO<WalletTransactionHistory>> GetTransactionInfo(string transactionId)
 0192        {
 0193            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "GetTransacti
 0194                CreateContent(new { id = transactionId }));
 0195            return JsonConvert.DeserializeObject<WalletResponseDTO<WalletTransactionHistory>>(
 0196                await response.Content.ReadAsStringAsync());
 0197        }
 198
 199        /// <summary>
 200        /// Возвращает историческую информацию по кошельку
 201        /// </summary>
 202        /// <param name="request"></param>
 203        /// <returns></returns>
 204        public async Task<WalletResponseDTO<List<WalletHistoryResponse>>> GetTransactionHistory(WalletHistoryRequest req
 0205        {
 0206            var response = await httpClient.PostAsync(GetUrl(_confsSettings.GetConfValue("WalletSettings", "AccountHisto
 0207                CreateContent(request));
 0208            var content = await response.Content.ReadAsStringAsync();
 0209            return JsonConvert.DeserializeObject<WalletResponseDTO<List<WalletHistoryResponse>>>(content);
 0210        }
 211
 212        private async Task CreateEvent(Guid extId, object request)
 0213        {
 0214            Event requestEvent = new Event
 0215            {
 0216                DtCreated = DateTime.UtcNow,
 0217                User = await _userService.GetUser(_authUserService.UserId),
 0218                EventsKind = await _eventService.GetEventKind((long)EventKind.Create),
 0219                Entity = "WalletRequest",
 0220                RecordGuid = extId,
 0221                ReasonJson = JsonConvert.SerializeObject(request)
 0222            };
 0223            await _eventService.CreateEvent(requestEvent);
 0224        }
 0225        private string GetUrl(string chankUrl) => $"{_walletSettings.Url}/" +
 0226            $"{_walletSettings.AppName}/" +
 0227            $"{chankUrl}?tnx={(_walletSettings.Tnx.Encrypted ? SymmetricCrypto.DecryptData(Convert.FromBase64String(_wal
 228        private static StringContent CreateContent(object body)
 0229        {
 0230            var serializeSettings = new JsonSerializerSettings
 0231            {
 0232                ContractResolver = new CamelCasePropertyNamesContractResolver()
 0233            };
 0234            serializeSettings.Converters.Add(new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-ddTHH:mm:ss" });
 0235            var res = JsonConvert.SerializeObject(body, serializeSettings);
 0236            var cont = new StringContent(
 0237                res,
 0238                Encoding.UTF8,
 0239                "application/json");
 0240            return cont;
 0241        }
 242    }
 243
 244    public interface IWalletHttpClient
 245    {
 246        Task<WalletResponseDTO<WalletBalanceResponse>> GetWalletBalance(string walletId);
 247        Task<WalletResponseDTO<WalletBalanceFreeVtbResponse>> GetFreeBalance(string walletId, decimal sum);
 248        Task<WalletResponseDTO<WalletTransactionResponse>> CreateTransaction(Guid movementGuid, WalletRequest request);
 249        Task<WalletResponseDTO<WalletTransactActionResponseFull>> CheckSms(Guid trGuid, WalletCheckSmsRequest checkReque
 250        Task<WalletResponseDTO<WalletTransactActionResponseFull>> RetrySms(Guid trGuid, WalletConfirmReqDTO request);
 251        Task<WalletResponseDTO<WalletTransactActionResponseFull>> ConfirmTransaction(Guid trGuid, WalletConfirmReqDTO re
 252        Task<WalletResponseDTO<WalletTransactActionResponseFull>> CancelTransaction(Guid trGuid, WalletConfirmReqDTO req
 253
 254        Task<WalletResponseDTO<WalletTransactionChangeDeal>> ChangeDeal(Guid trGuid, WalletChangeDealRequestDto request)
 255        Task<WalletResponseDTO<WalletTransactionHistory>> GetTransactionInfo(string transactionId);
 256        Task<WalletResponseDTO<List<WalletHistoryResponse>>> GetTransactionHistory(WalletHistoryRequest request);
 257
 258        Task<WalletResponseDTO<WalletTransactionCheckChangeDeal>> CheckChangeDeal(Guid trGuid,
 259            WalletChangeDealRequestDto request);
 260    }
 261}