using System.Net.Http.Json; using System.Text.Json; using AutoCatCore.Model; using AutoCatCore.Model.Requests; using AutoCatCore.Services.Storage; namespace AutoCatCore.Services.Api; public class ApiService : IApiService { private readonly HttpClient _httpClient; public ApiService(IStorageService storageService) { _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri("http://127.0.0.1:3000"); SetAccessToken(storageService.AuthToken); } private static async Task GetDataOrThrow(HttpResponseMessage response) { string responseStr = await response.Content.ReadAsStringAsync(); var resp = JsonSerializer.Deserialize>(responseStr, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); if (resp is null) throw new Exception("Error deserializing response"); if (resp.Success) return resp.Data ?? throw new Exception("Empty response"); throw new Exception(resp.Error); } private void SetAccessToken(string? token) { if (token is null) return; _httpClient.DefaultRequestHeaders.Remove("Authorization"); _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}"); } public async Task Login(string email, string password) { var response = await _httpClient.PostAsJsonAsync("user/login", new { email, password }); var result = await GetDataOrThrow(response); SetAccessToken(result.Token); return result; } public async Task> GetVehicles() { var response = await _httpClient.GetAsync("vehicles"); return await GetDataOrThrow>(response); } public async Task CheckNumber(string number) { var response = await _httpClient.PostAsJsonAsync("vehicles/check", new { number }); return await GetDataOrThrow(response); } }