< Summary

Class:SVETA.Api.Controllers.WalletController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/WalletController.cs
Covered lines:0
Uncovered lines:83
Coverable lines:83
Total lines:255
Line coverage:0% (0 of 83)
Covered branches:0
Total branches:38
Branch coverage:0% (0 of 38)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
Get()0%100%
GetFreeBalance()0%100%
CreateTransaction()0%100%
CheckSms()0%0%
RetrySms()0%100%
Confirm()0%100%
Cancel()0%100%
TransactionInfo()0%0%
GetAccountHistory()0%0%
GetParam(...)0%0%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Controllers/WalletController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.Extensions.Logging;
 4using SVETA.Api.Data.DTO;
 5using SVETA.Api.Data.DTO.Wallet;
 6using SVETA.Api.Helpers.Authorize;
 7using SVETA.Api.Services.Implements;
 8using Swashbuckle.AspNetCore.Annotations;
 9using System;
 10using System.Collections.Generic;
 11using System.Linq;
 12using System.Linq.Expressions;
 13using System.Threading.Tasks;
 14using SVETA.Api.Data.DTO.Movements;
 15using SVETA.Api.Helpers;
 16using SVETA.Api.Services.Interfaces;
 17using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 18using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 19using WinSolutions.Sveta.Common.Extensions;
 20
 21namespace SVETA.Api.Controllers
 22{
 23    [Route("api/v1/Wallet")]
 24    [ApiController]
 25    [Authorize]
 26    public class WalletController : SvetaController
 27    {
 28        private readonly ILogger<WalletController> _logger;
 29        private readonly IWalletPaymentService _walletPaymentService;
 30        private readonly IMovementStatusRouter _movementStatusRouter;
 31        private User user;
 32
 33        public WalletController(
 34            IWalletPaymentService walletPaymentService,
 35            IMovementStatusRouter movementStatusRouter,
 036            ILogger<WalletController> logger) : base(logger)
 037        {
 038            _walletPaymentService = walletPaymentService;
 039            _movementStatusRouter = movementStatusRouter;
 040            _logger = logger;
 041        }
 42
 43
 44        /// <summary>
 45        /// Возвращает информацию о кошельке
 46        /// </summary>
 47        /// <remarks>author: aabelentsov</remarks>
 48        /// <returns></returns>
 49        [HttpGet()]
 50        [SwaggerResponse(200, "Успешно", typeof(WalletBalanceFreeResponse))]
 51        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 52        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 53        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 54        [Authorize(Roles = Role.ShopOwner + "," + Role.SupplierOwner)]
 55        public async Task<IActionResult> Get()
 056        {
 057            var result = await _walletPaymentService.GetWalletInfo();
 058            return Ok(result);
 059        }
 60
 61        /// <summary>
 62        /// Возвращает баланс кошелька
 63        /// </summary>
 64        /// <remarks>author: aabelentsov</remarks>
 65        /// <param name="sum">Сумма которая должна быть доступна на балансе</param>
 66        /// <returns></returns>
 67        [HttpGet("FreeBalance")]
 68        [SwaggerResponse(200, "Успешно", typeof(WalletBalanceFreeResponse))]
 69        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 70        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 71        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 72        [Authorize(Roles = Role.ShopOwner + "," + Role.SupplierOwner)]
 73        public async Task<IActionResult> GetFreeBalance(decimal sum)
 074        {
 075            var result = await _walletPaymentService.GetWalletFreeBalance(0, sum);
 076            return Ok(result);
 077        }
 78
 79        /// <summary>
 80        /// Создание транзакции для оплаты (сделку) (холдирование средств)
 81        /// </summary>
 82        /// <remarks>author: aabelentsov</remarks>
 83        /// <param name="requestDto">Объект с номером документа</param>
 84        /// <returns></returns>
 85        [HttpPost]
 86        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 87        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 88        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 89        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 90        [Authorize(Roles = Role.ShopOwner)]
 91        public async Task<IActionResult> CreateTransaction([FromBody] MovementCreateOnBaseDto requestDto)
 092        {
 093            await _walletPaymentService.CreateTransaction(requestDto.MovementId);
 094            return Ok();
 095        }
 96
 97
 98        /// <summary>
 99        /// Подтвердить транзакцию (сделку) через СМС-код
 100        /// </summary>
 101        /// <remarks>author: aabelentsov</remarks>
 102        /// <param name="request">Объект с документом и кодом</param>
 103        /// <returns></returns>
 104        [HttpPut("CheckSms")]
 105        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 106        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 107        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 108        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 109        [Authorize(Roles = Role.ShopOwner)]
 110        public async Task<IActionResult> CheckSms(WalletCheckSmsRequestDto request)
 0111        {
 0112            await _walletPaymentService.CheckSms(request.MovementId, request.Code.NormalizeName()).ConfigureAwait(false)
 0113            await _movementStatusRouter.SetNextStatus(request.MovementId, MovementStatusKeys.payment).ConfigureAwait(fal
 0114            return Ok();
 0115        }
 116
 117        /// <summary>
 118        /// Отправляет повторное смс - лаг для повторной смс 119 сек
 119        /// </summary>
 120        /// <param name="requestDto">Объект с номером документа</param>
 121        /// <returns></returns>
 122        [HttpPut("Retrysms")]
 123        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 124        [SwaggerResponse(400, "Ошибка валидации входных параметров", typeof(ErrorDTO))]
 125        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 126        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 127        [Authorize(Roles = Role.ShopOwner)]
 128        public async Task<IActionResult> RetrySms([FromBody] MovementCreateOnBaseDto requestDto)
 0129        {
 0130            await _walletPaymentService.RetrySms(requestDto.MovementId);
 0131            return Ok();
 0132        }
 133
 134        /// <summary>
 135        /// Подтверждение транзакции
 136        /// </summary>
 137        /// <remarks>author: aabelentsov</remarks>
 138        /// <param name="requestDto">Объект с номером документа</param>
 139        /// <returns></returns>
 140        [HttpPut("Confirm")]
 141        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 142        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 143        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 144        [Authorize(Roles = Role.ShopOwner)]
 145        private async Task<IActionResult> Confirm([FromBody] MovementCreateOnBaseDto requestDto)
 0146        {
 0147            await _walletPaymentService.ConfirmTransaction(requestDto.MovementId);
 0148            return Ok();
 0149        }
 150
 151        /// <summary>
 152        /// Отмена транзакции (сделки)
 153        /// </summary>
 154        /// <remarks>author: aabelentsov</remarks>
 155        /// <param name="requestDto">Объект с номером документа</param>
 156        /// <returns></returns>
 157        [HttpPut("Cancel")]
 158        [SwaggerResponse(200, "Успешно", typeof(OkResult))]
 159        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 160        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 161        [Authorize(Roles = Role.ShopOwner)]
 162        private async Task<IActionResult> Cancel([FromBody] MovementCreateOnBaseDto requestDto)
 0163        {
 0164            await _walletPaymentService.CancelTransaction(requestDto.MovementId);
 0165            return Ok();
 0166        }
 167
 168        /// <summary>
 169        /// Возвращает информацию о транзакции
 170        /// </summary>
 171        /// <remarks>author: aabelentsov</remarks>
 172        /// <param name="transactionId">Guid - Идентиификатор транзакции</param>
 173        /// <returns></returns>
 174        [HttpGet("History/{transactionId}")]
 175        [SwaggerResponse(200, "Успешно", typeof(WalletTransactionHistory))]
 176        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 177        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 178        [Authorize(Roles = Role.ShopOwner + "," + Role.SystemOperator + "," + Role.SystemAdmin)]
 179        public async Task<IActionResult> TransactionInfo(string transactionId)
 0180        {
 0181            var content = await _walletPaymentService.GetTransactionInfo(transactionId);
 0182            if (content == null)
 0183                return NotFound();
 0184            return Ok(content);
 0185        }
 186
 187        ///  <summary>
 188        /// История транзакций за период по контрагенту
 189        ///  </summary>
 190        ///  <remarks>author: aabelentsov</remarks>
 191        ///  <param name="typeRecord">тип записей - hold/record по умолчанию - record</param>
 192        ///  <param name="active">1 - активный холд (если ничего не указано - выводится все) </param>
 193        ///  <param name="status">статус транзакции (если ничего не указано - выводится все)</param>
 194        ///  <param name="fromDate">начальное время периода проводок</param>
 195        ///  <param name="toDate">конечное время периода проводок</param>
 196        ///  <param name="sort">сортировка по умолчанию по created_on,created_on|desc,sum,sum|desc</param>
 197        ///  <param name="page">Номер страницы для отбора 1 по умолчанию, меньше или 0 изменится на 1 </param>
 198        ///  <param name="limit">Количество для отбора, меньше или 0 изменится на 10</param>
 199        ///  <returns></returns>
 200        [HttpGet("History")]
 201        [SwaggerResponse(200, "Успешно", typeof(BaseResponseDTO<WalletHistoryResponse>))]
 202        [SwaggerResponse(403, "Ошибка прав доступа", typeof(ErrorDTO))]
 203        [SwaggerResponse(500, "Ошибка на стороне сервера", typeof(ErrorDTO))]
 204        [Authorize(Roles = Role.ShopOwner + "," + Role.SystemAdmin + "," + Role.SystemOperator + "," + Role.SupplierOwne
 205        public async Task<IActionResult> GetAccountHistory(string typeRecord, int active, int status, DateTimeOffset fro
 206            DateTimeOffset toDate, string sort, int page = 1, int limit = 10)
 0207        {
 0208            page = page < 1 ? 1 : page;
 0209            limit = limit < 1 ? 10 : limit;
 0210            var content =
 0211                await _walletPaymentService.GetAccountHistory(typeRecord, active, status, fromDate.GetStartOfDate(), toD
 212
 0213            var total = content.Count;
 214
 0215            Expression<Func<WalletHistoryResponse, object>> sortExpression =
 0216                (sort?.Split("|").ElementAtOrDefault(0) ?? "").ToLower() switch
 0217                {
 0218                    "created_on" => e => e.Dadd,
 0219                    "sum" => e => e.Sm,
 0220                    _ => e => e.Dadd
 0221                };
 0222            var result = (sort?.Split("|").ElementAtOrDefault(1) ?? "").ToLower() switch
 0223            {
 0224                "desc" => content.AsQueryable().OrderByDescending(sortExpression),
 0225                _ => content.AsQueryable().OrderBy(sortExpression)
 0226            };
 0227            var response = new BaseResponseDTO<WalletHistoryResponse>(
 0228                $"api/v1/Wallet/History", page, limit,
 0229                total, total, "", param: GetParam(typeRecord, active, status, fromDate, toDate))
 0230            {
 0231                Data = result.Skip((page -1 ) * limit).Take(limit).ToList()
 0232            };
 0233            return Ok(response);
 0234        }
 235
 236        private string GetParam(string typeRecord, int active, int status, DateTimeOffset fromDate,
 237            DateTimeOffset toDate)
 0238        {
 0239            var param = "";
 0240            if (!string.IsNullOrEmpty(typeRecord))
 0241                param += $"typeRecord={typeRecord}";
 0242            if (active != 0)
 0243                param += $"&active={active}";
 0244            if (status != 0)
 0245                param += $"&status={status}";
 0246            if (fromDate != DateTimeOffset.MinValue)
 0247                param += $"&fromDate={fromDate.ToISOString()}";
 0248            if (toDate != DateTimeOffset.MinValue)
 0249                param += $"&toDate={toDate.ToISOString()}";
 0250            if (param.StartsWith("&"))
 0251                param = param.Trim(new char[] { '&' });
 0252            return param;
 0253        }
 254    }
 255}