namespace TaxBaik.Web.Services; using System.Net.Http.Json; using TaxBaik.Application.DTOs; public interface IBlogBrowserClient { Task<(IEnumerable Items, int Total)> GetAdminPagedAsync(int page = 1, int pageSize = 20, CancellationToken ct = default); Task GetByIdAsync(int id, CancellationToken ct = default); Task CreateAsync(CreateBlogPostDto dto, CancellationToken ct = default); Task UpdateAsync(int id, CreateBlogPostDto dto, CancellationToken ct = default); Task DeleteAsync(int id, CancellationToken ct = default); Task TogglePublishAsync(int id, CreateBlogPostDto dto, CancellationToken ct = default); } public class BlogBrowserClient : IBlogBrowserClient { private readonly HttpClient _http; private readonly ILogger _logger; private readonly ITokenStore _tokenStore; public BlogBrowserClient(HttpClient http, ILogger logger, ITokenStore tokenStore) { _http = http; _logger = logger; _tokenStore = tokenStore; } private void EnsureAuthHeader() { if (!string.IsNullOrEmpty(_tokenStore.AccessToken)) _http.DefaultRequestHeaders.Authorization = new("Bearer", _tokenStore.AccessToken); else _http.DefaultRequestHeaders.Authorization = null; } public async Task<(IEnumerable Items, int Total)> GetAdminPagedAsync(int page = 1, int pageSize = 20, CancellationToken ct = default) { EnsureAuthHeader(); var result = await _http.GetFromJsonAsync($"blog/admin?page={page}&pageSize={pageSize}", ct); return result != null ? (result.Data, result.Total) : ([], 0); } public async Task GetByIdAsync(int id, CancellationToken ct = default) { EnsureAuthHeader(); return await _http.GetFromJsonAsync($"blog/{id}", ct); } public async Task CreateAsync(CreateBlogPostDto dto, CancellationToken ct = default) { EnsureAuthHeader(); var response = await _http.PostAsJsonAsync("blog", dto, ct); if (!response.IsSuccessStatusCode) return null; var content = await response.Content.ReadAsStringAsync(ct); return System.Text.Json.JsonSerializer.Deserialize(content, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } public async Task UpdateAsync(int id, CreateBlogPostDto dto, CancellationToken ct = default) { EnsureAuthHeader(); var response = await _http.PutAsJsonAsync($"blog/{id}", dto, ct); if (!response.IsSuccessStatusCode) return null; var content = await response.Content.ReadAsStringAsync(ct); return System.Text.Json.JsonSerializer.Deserialize(content, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } public async Task DeleteAsync(int id, CancellationToken ct = default) { EnsureAuthHeader(); var response = await _http.DeleteAsync($"blog/{id}", ct); return response.IsSuccessStatusCode; } public async Task TogglePublishAsync(int id, CreateBlogPostDto dto, CancellationToken ct = default) { var result = await UpdateAsync(id, dto, ct); return result != null; } private sealed class PagedResponse { public List Data { get; set; } = []; public int Total { get; set; } } }