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; /// Настройки сериализации JSON (регистронезависимые, поддержка enum-строк). private static readonly JsonSerializerOptions JsonOptions = new() { PropertyNameCaseInsensitive = true, Converters = { new JsonStringEnumConverter(JsonNamingPolicy.KebabCaseLower), new IntToStringConverter() } }; /// Инициализирует новый экземпляр провайдера. /// Хранилище авторизации. 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(); 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); } } }