2023-10-24 12:10:19 +10:00
using Microsoft.Extensions.Logging ;
using PARR.EsppApi.Models ;
using System.Text.Json ;
namespace PARR.EsppApi
{
internal class EsppHttpService
{
private readonly ILogger < EsppHttpService > logger ;
private readonly HttpClient httpClient ;
2023-10-27 16:39:59 +10:00
public EsppHttpService ( ILogger < EsppHttpService > logger , HttpClient httpClient )
2023-10-24 12:10:19 +10:00
{
this . logger = logger ;
this . httpClient = httpClient ;
}
public async Task < EsppResultBase < T > > SendAsync < T > ( string query ) where T : class
{
var request = new HttpRequestMessage ( HttpMethod . Post , "" ) ;
request . Content = new StringContent ( query ) ;
try
{
logger . LogDebug ( $"Отправляю запрос в А С У ЕСПП({query})" ) ;
var response = await httpClient . SendAsync ( request ) ;
if ( ! response . IsSuccessStatusCode )
logger . LogError ( $"Ошибка при получении данных из А С У ЕСПП, StatusCode:{response.StatusCode}" ) ;
var responseString = await response . Content . ReadAsStringAsync ( ) ;
logger . LogDebug ( $"Получил данные, строка: {responseString}" ) ;
2023-11-21 12:26:08 +10:00
var errors = CheckErrors < T > ( responseString , query ) ;
if ( errors ! = null )
return errors ;
2023-10-24 12:10:19 +10:00
var obj = JsonSerializer . Deserialize < T > ( responseString ) ;
2023-10-27 16:39:59 +10:00
return new EsppResultBase < T > ( obj , true ) ;
2023-10-24 12:10:19 +10:00
}
catch ( Exception ex )
{
logger . LogError ( ex , "Ошибка при получении данных из А С У ЕСПП" ) ;
return new EsppResultBase < T > ( null , false , ex ) ;
}
}
2023-11-21 12:26:08 +10:00
/// <summary>
/// Проверка респонса на ошибки. В ЕСПП полный вест кост кастом
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
private EsppResultBase < T > ? CheckErrors < T > ( string response , string query ) where T : class
{
//Если вернет "ErrorCode":"0" - то все успешно прошло, если вернет другой ErrorCode, то не успешно
//Н е всегда возвращается ErrorCode, если получали например наряд, он вернет тело наряда
if ( response . Contains ( "ErrorCode" ) & & response . Contains ( "Message" ) )
{
if ( ! response . Contains ( "\"ErrorCode\":\"0\"" ) )
{
logger . LogError ( new Exception ( response ) , $"Ошибка при выполнении запроса в ЕСПП. Тело запроса: {query}" ) ;
return new EsppResultBase < T > ( null , false , new Exception ( $"Espp error: {response}" ) ) ;
}
// а х а х а х ! Может быть "ErrorCode":"0", и "Message":"Успешно", но в "MessageESPP":"err - Операция 'Прочее(работы)' не найденаЗапись \"Трудозатраты и Время в пути\" добавлена."
// "Message":"Успешно","ErrorCode":"0","MessageESPP":"err - Операция 'Прочее(работы)' не найденаЗапись \"Трудозатраты и Время в пути\" добавлена."
// т е это ошибка. рука лицо и привет разрабам ЕСПП
// делаем тупо, может стоит переделать
if ( response . Contains ( "\"MessageESPP\":\"err" ) )
{
logger . LogError ( new Exception ( response ) , $"Ошибка при выполнении запроса в ЕСПП. Тело запроса: {query}" ) ;
return new EsppResultBase < T > ( null , false , new Exception ( $"Espp error: {response}" ) ) ;
}
}
return null ;
}
2023-10-24 12:10:19 +10:00
}
}