< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.Directories.ShateMController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/ShateMController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 67
Coverable lines: 67
Total lines: 114
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 28
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor(...)100%210%
Index()100%210%
Logs()100%210%
Ping()100%210%
Read()0%156120%
Search()0%620%
CheckoutData()100%210%
AvailableDates()0%2040%
Error(...)0%7280%
JsonToken(...)100%210%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/Directories/ShateMController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Newtonsoft.Json.Linq;
 4using Newtonsoft.Json;
 5using Services.ApiServices.ShateMApi;
 6using Services.ApiServices.ApiSupplierRequestLog;
 7using OzonOrdersWeb.TransactionServices;
 8
 9namespace OzonOrdersWeb.Areas.Studio2.Controllers.Directories;
 10
 11[Authorize(Roles = "User,Admin")]
 12[Area("Studio2")]
 13[Route("ShateM/[action]")]
 14public sealed class ShateMController : Controller
 15{
 016    private static readonly IReadOnlyDictionary<string, string> ReadOperations = new Dictionary<string, string>(StringCo
 017    {
 018        ["articles-search"] = "/api/v1/articles/search",
 019        ["articles-search-path"] = "/api/v1/articles/search/{id}",
 020        ["article"] = "/api/v1/articles/{id}",
 021        ["analogs"] = "/api/v1/articles/{id}/analogs",
 022        ["cart-items"] = "/api/v1/cartitems",
 023        ["cart-item"] = "/api/v1/cartitems/{id}",
 024        ["agreements"] = "/api/v1/customer/agreements",
 025        ["customer"] = "/api/v1/customer/info",
 026        ["addresses"] = "/api/v1/delivery/addresses",
 027        ["available-datetimes"] = "/api/v1/delivery/availabledatetimes",
 028        ["locations"] = "/api/v1/locations",
 029        ["order-item-history"] = "/api/v1/orderitems/{id}/statuseshistory",
 030        ["order-statuses"] = "/api/v1/orderitemstatuscodes",
 031        ["orders"] = "/api/v1/orders",
 032        ["returns"] = "/api/v1/returns",
 033        ["return-reasons"] = "/api/v1/returns/returnitemreasons",
 034        ["return-statuses"] = "/api/v1/returns/returnitemstatuscodes",
 035        ["return-history"] = "/api/v1/returns/{id}/statuseshistory",
 036        ["trademarks"] = "/api/v1/trademarks",
 037        ["trademark"] = "/api/v1/trademarks/{id}"
 038    };
 039    private static readonly IReadOnlyDictionary<string, string> SearchOperations = new Dictionary<string, string>(String
 040    {
 041        ["articles-filter"] = "/api/v1/articles/search",
 042        ["contents"] = "/api/v1/contents/search",
 043        ["prices"] = "/api/v1/prices/search",
 044        ["prices-with-article-info"] = "/api/v1/prices/search/with_article_info"
 045    };
 46    private readonly ShateMDataManager _shateM;
 47    private readonly ApiSupplierRequestLogStore _logs;
 48    private readonly ShateMCartService _cart;
 49
 050    public ShateMController(ShateMDataManager shateM, ApiSupplierRequestLogStore logs, ShateMCartService cart)
 51    {
 052        _shateM = shateM;
 053        _logs = logs;
 054        _cart = cart;
 055    }
 56
 57    [HttpGet, Route("~/ShateM")]
 058    public IActionResult Index() => View();
 59
 60    [HttpGet]
 061    public IActionResult Logs() => Json(_logs.Get("ShateM"));
 62
 63    [HttpGet]
 64    public async Task<IActionResult> Ping(CancellationToken cancellationToken)
 65    {
 066        try { return JsonToken(await _shateM.PingAsync(cancellationToken)); }
 067        catch (Exception ex) { return Error(ex); }
 068    }
 69
 70    [HttpGet]
 71    public async Task<IActionResult> Read(string operation, string? id, CancellationToken cancellationToken)
 72    {
 073        if (!ReadOperations.TryGetValue(operation, out var template)) return BadRequest(new { error = true, message = "Н
 074        if ((template.Contains("{id}", StringComparison.Ordinal) || operation.Equals("articles-search", StringComparison
 075        var path = template.Replace("{id}", Uri.EscapeDataString(id ?? string.Empty), StringComparison.Ordinal);
 076        var query = Request.Query.Where(x => x.Key is not "operation" and not "id").ToDictionary(x => x.Key, x => (strin
 077        if (operation.Equals("articles-search", StringComparison.OrdinalIgnoreCase)) query["searchString"] = id;
 078        try { return JsonToken(await _shateM.GetAsync(path, query, cancellationToken)); }
 079        catch (Exception ex) { return Error(ex); }
 080    }
 81
 82    [HttpGet]
 83    public async Task<IActionResult> Search(string operation, string payload, CancellationToken cancellationToken)
 84    {
 085        if (!SearchOperations.TryGetValue(operation, out var path)) return BadRequest(new { error = true, message = "Нед
 086        try { return JsonToken(await _shateM.SearchAsync(path, JToken.Parse(payload), cancellationToken)); }
 087        catch (Newtonsoft.Json.JsonReaderException) { return BadRequest(new { error = true, message = "Фильтр должен быт
 088        catch (Exception ex) { return Error(ex); }
 089    }
 90
 91    [HttpGet]
 92    public async Task<IActionResult> CheckoutData(CancellationToken cancellationToken)
 93    {
 094        try { return JsonToken(await _cart.GetCheckoutDataAsync(cancellationToken)); }
 095        catch (Exception ex) { return Error(ex); }
 096    }
 97
 98    [HttpGet]
 99    public async Task<IActionResult> AvailableDates(string locationCode, string deliveryAddressCode, CancellationToken c
 100    {
 0101        if (string.IsNullOrWhiteSpace(locationCode) || string.IsNullOrWhiteSpace(deliveryAddressCode))
 0102            return BadRequest(new { error = true, message = "Укажите склад и адрес доставки Шате‑М." });
 0103        try { return JsonToken(await _cart.GetAvailableDatesAsync(locationCode, deliveryAddressCode, cancellationToken))
 0104        catch (Exception ex) { return Error(ex); }
 0105    }
 106
 0107    private IActionResult Error(Exception ex) => ex switch
 0108    {
 0109        ShateMApiException api => StatusCode(api.StatusCode is >= 400 and < 600 ? api.StatusCode.Value : 502, new { erro
 0110        _ => StatusCode(500, new { error = true, message = "Не удалось выполнить запрос к Шате-М." })
 0111    };
 112
 0113    private ContentResult JsonToken(JToken token) => Content(token.ToString(Formatting.None), "application/json");
 114}