dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-invest/brokerage-service/sinv/quotes$ sed -n '1,120p' src/Quotes.Application/Api/IpsApiClient.cs
using Flurl.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using RSHBIntech.BrokerageService.Sinv.Quotes.Application.Contracts;
namespace RSHBIntech.BrokerageService.Sinv.Quotes.Application.Api;
/// <inheritdoc/>
public sealed class IpsApiClient : IIpsApiClient
{
private readonly IOptionsMonitor<IpsApiOptions> _ipsApiOptions;
private readonly ILogger<IpsApiClient> _logger;
public IpsApiClient(IOptionsMonitor<IpsApiOptions> ipsApiOptions, ILogger<IpsApiClient> logger)
{
_ipsApiOptions = ipsApiOptions;
_logger = logger;
}
/// <inheritdoc/>
public async Task<bool> UpdateBbInstrumentAsync(BbInstrumentIpsContract bbInstrument, CancellationToken cancellationToken)
{
try
{
string? baseUrl = _ipsApiOptions.CurrentValue.BaseApiUrl;
if (baseUrl is null)
{
_logger.LogWarning("Настройка IpsApiOptions:BaseApiUrl не задана, обновление первичного размещения в IPS невозможно");
return false;
}
_logger.LogInformation("Выполнение запроса для обновления размещения в IPS с данными {@ApiRequestBody}", bbInstrument);
string apiUrl = $"{baseUrl}/api/v2/IPO_INSTRUMENTS/write";
await apiUrl.PatchJsonAsync(bbInstrument, cancellationToken: cancellationToken);
_logger.LogInformation("Запрос api для обновления размещения в IPS успешно завершен");
return true;
}
catch (FlurlHttpException httpException)
{
_logger.LogError(httpException, "При обновлении через api в IPS первичного размещения с книгой произошла ошибка с кодом ответа {HttpCode}", httpException.StatusCode);
}
catch (Exception exception)
{
_logger.LogError(exception, "При обновлении через api в IPS первичного размещения с книгой произошла ошибка");
}
return false;
}
}dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-invest/brokerage-service/sinv/quotes$ cat src/Quotes.Application/Api/IpsApiOptions.cs
namespace RSHBIntech.BrokerageService.Sinv.Quotes.Application.Api;
/// <summary>
/// Настройки для взаимодействия с IPS по api
/// </summary>
public sealed class IpsApiOptions
{
/// <summary>
/// Адрес IPS Api
/// </summary>
public required string? BaseApiUrl { get; init; }
/// <summary>
/// Использовать заглушку
/// </summary>
public required bool UseMock { get; init; }
}dmitriev-aal@VDI-Dmitriev-A:~/Desktop/rshbintech/it-invest/brokerage-service/sinv/quotes$