< Summary

Information
Class: OzonOrdersWeb.Api.OzonHandoverImportController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Api/OzonHandoverImportController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 17
Coverable lines: 17
Total lines: 64
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Import()0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Api/OzonHandoverImportController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Services.OzonHandoverServices;
 4
 5namespace OzonOrdersWeb.Api;
 6
 7/// <summary>
 8/// Приём JSON-документов выдачи/приёма-передачи Ozon (формат приложения "Telegram Lite").
 9///
 10/// Endpoint: POST /api/ozon-handover/import
 11///
 12/// — Публичный (нет cookie-авторизации): вызывающая сторона — внешнее приложение без
 13///   пользовательской сессии. Доступ ограничен заголовком X-Api-Key (см. OzonHandoverApiKeyFilter).
 14/// — Позиции акта (items[].item_no) сопоставляются с заказами по Order.ShipmentNumber.
 15/// — Повторный POST того же документа (то же поле closed.id) идемпотентен: существующий батч
 16///   и его акты/позиции полностью пересоздаются из нового содержимого.
 17/// </summary>
 18[ApiController]
 19[AllowAnonymous]
 20[IgnoreAntiforgeryToken]
 21[Route("api/ozon-handover")]
 22[ServiceFilter(typeof(OzonHandoverApiKeyFilter))]
 23public sealed class OzonHandoverImportController : ControllerBase
 24{
 25    private readonly IOzonHandoverImportService _importService;
 26    private readonly ILogger<OzonHandoverImportController> _logger;
 27
 028    public OzonHandoverImportController(
 029        IOzonHandoverImportService importService,
 030        ILogger<OzonHandoverImportController> logger)
 31    {
 032        _importService = importService;
 033        _logger = logger;
 034    }
 35
 36    /// <summary>
 37    /// Импортировать документ выдачи/приёма-передачи Ozon и привязать позиции к заказам.
 38    /// </summary>
 39    /// <param name="request">JSON-документ в формате "Telegram Lite" (document_type, closed, summary, groups[]).</param
 40    /// <response code="200">Документ обработан, возвращена сводка по сопоставлению позиций с заказами.</response>
 41    /// <response code="400">Некорректный формат документа.</response>
 42    /// <response code="401">Отсутствует или неверен заголовок X-Api-Key.</response>
 43    [HttpPost("import")]
 44    [ProducesResponseType(typeof(OzonHandoverImportResult), StatusCodes.Status200OK)]
 45    [ProducesResponseType(StatusCodes.Status400BadRequest)]
 46    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
 47    public async Task<ActionResult<OzonHandoverImportResult>> Import(
 48        [FromBody] OzonHandoverImportRequest request,
 49        CancellationToken ct)
 50    {
 051        var result = await _importService.ImportAsync(request, ct);
 52
 053        _logger.LogInformation(
 054            "Ozon handover import: батч {BatchId} ({Action}), актов: {Acts}, позиций: {Items}, сопоставлено с заказами: 
 055            result.BatchId,
 056            result.WasUpdated ? "обновлён" : "создан",
 057            result.ActsCount,
 058            result.ItemsCount,
 059            result.MatchedItemsCount,
 060            result.UnmatchedItemsCount);
 61
 062        return Ok(result);
 063    }
 64}