namespace TaxBaik.Web.Services; using System.Text.Json; public interface IApiClient { Task GetAsync(string endpoint); Task PostAsync(string endpoint, object data); Task PutAsync(string endpoint, object data); Task DeleteAsync(string endpoint); Task SetAuthToken(string? token); } public class ApiClient : IApiClient { private readonly HttpClient _httpClient; private string? _authToken; public ApiClient(HttpClient httpClient) { _httpClient = httpClient; } public async Task SetAuthToken(string? token) { _authToken = token; if (token != null) _httpClient.DefaultRequestHeaders.Authorization = new("Bearer", token); else _httpClient.DefaultRequestHeaders.Authorization = null; } public async Task GetAsync(string endpoint) { try { var response = await _httpClient.GetAsync($"/taxbaik/api/{endpoint}"); if (!response.IsSuccessStatusCode) return default; var content = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task PostAsync(string endpoint, object data) { try { var json = JsonSerializer.Serialize(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync($"/taxbaik/api/{endpoint}", content); if (!response.IsSuccessStatusCode) return default; var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task PutAsync(string endpoint, object data) { try { var json = JsonSerializer.Serialize(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PutAsync($"/taxbaik/api/{endpoint}", content); if (!response.IsSuccessStatusCode) return default; var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task DeleteAsync(string endpoint) { try { await _httpClient.DeleteAsync($"/taxbaik/api/{endpoint}"); } catch { // Ignore } } }