AyCode.Core/AyCode.Services/Nav/Ekaer/EkaerSubmitService.cs

46 lines
2.1 KiB
C#

using AyCode.Services.Nav.Ekaer.Models;
namespace AyCode.Services.Nav.Ekaer;
/// <inheritdoc cref="IEkaerSubmitService"/>
/// <remarks>
/// A NAV-küldést az <see cref="EkaerManageService"/> végzi (auth + HTTP), a validációt az
/// <see cref="IEkaerTradeCardValidator"/>. Ez az osztály csak a sorrendet (validate → send) köti egységbe.
/// </remarks>
public sealed class EkaerSubmitService : IEkaerSubmitService
{
private readonly EkaerManageService _manageService;
private readonly IEkaerTradeCardValidator _validator;
public EkaerSubmitService(EkaerManageService manageService, IEkaerTradeCardValidator validator)
{
_manageService = manageService ?? throw new ArgumentNullException(nameof(manageService));
_validator = validator ?? throw new ArgumentNullException(nameof(validator));
}
public async Task<EkaerSubmitResult> SubmitAsync(IReadOnlyList<TradeCardOperationType> operations, CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(operations);
// 1) Validáció — bármilyen hiba esetén NEM küldünk; a teljes hibalistát visszaadjuk.
var errors = _validator.Validate(operations);
if (errors.Count > 0)
return EkaerSubmitResult.Invalid(errors);
// 2) Request összeállítás. A Header/User példányt itt kell létrehozni (a generált ctor csak a
// TradeCardOperations kollekciót inicializálja); a TARTALMUKAT (requestId, timestamp, hash-ek) az
// ApplyAuthentication tölti a NavReportServiceBase-ben.
var request = new ManageTradeCardsRequest
{
Header = new BasicHeaderType(),
User = new UserHeaderType(),
};
foreach (var operation in operations)
request.TradeCardOperations.Add(operation);
// 3) Küldés. NAV-oldali hibánál NavReportException propagál (a hívó logolja/kezeli).
var response = await _manageService.ManageAsync(request, cancellationToken).ConfigureAwait(false);
return EkaerSubmitResult.Sent(response);
}
}