using System.Text.Json;
using System.Text.Json.Serialization;
using YandexMusic.API.Converters;
using YandexMusic.API.Models.Common;
namespace YandexMusic.API.Common.Providers;
/// Базовый провайдер HTTP-запросов с общей логикой десериализации.
public abstract class CommonRequestProvider : IRequestProvider
{
/// Хранилище данных авторизации.
protected readonly AuthStorage storage;
/// Инициализирует новый экземпляр провайдера.
/// Хранилище авторизации.
protected CommonRequestProvider(AuthStorage authStorage)
{
storage = authStorage;
}
/// Выполняет HTTP-запрос и возвращает ответ.
public abstract Task GetWebResponseAsync(
HttpRequestMessage message,
HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead);
/// Преобразует HTTP-ответ в объект типа T.
public virtual async Task GetDataFromResponseAsync(
YandexMusicApi api,
HttpResponseMessage response)
{
var json = await response.Content.ReadAsStringAsync();
JsonSerializerOptions JsonOptions = new()
{
PropertyNameCaseInsensitive = true,
Converters = {
new JsonStringEnumConverter(JsonNamingPolicy.KebabCaseLower),
new IntToStringConverter(),
new StringToIntConverter(),
new YExecutionContextConverter(api, storage),
}
};
if (!response.IsSuccessStatusCode)
{
var error = JsonSerializer.Deserialize(json, JsonOptions);
throw error ?? new Exception("Ошибка десериализации ответа с ошибкой.");
}
try
{
// Если нужен контекст выполнения, он добавляется через кастомный конвертер
return JsonSerializer.Deserialize(json, JsonOptions)
?? throw new JsonException("Десериализация вернула null");
}
catch (Exception ex)
{
throw new Exception($"Ошибка десериализации: {ex.Message}", ex);
}
}
}