using System.Net.Http.Json; using DbFirst.BlazorWebApp.Models; namespace DbFirst.BlazorWebApp.Services; public class LayoutApiClient { private readonly HttpClient _httpClient; private const string Endpoint = "api/layouts"; public LayoutApiClient(HttpClient httpClient) { _httpClient = httpClient; } public async Task GetAsync(string layoutType, string layoutKey, string userName) { var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}"; var response = await _httpClient.GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { return null; } response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync(); } public async Task UpsertAsync(LayoutDto dto) { var response = await _httpClient.PostAsJsonAsync(Endpoint, dto); if (!response.IsSuccessStatusCode) { var detail = await ReadErrorAsync(response); throw new InvalidOperationException(detail); } var payload = await response.Content.ReadFromJsonAsync(); return payload ?? dto; } private static async Task ReadErrorAsync(HttpResponseMessage response) { var body = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrWhiteSpace(body)) { return body; } return $"{(int)response.StatusCode} {response.ReasonPhrase}".Trim(); } public async Task DeleteAsync(string layoutType, string layoutKey, string userName) { var url = $"{Endpoint}?layoutType={Uri.EscapeDataString(layoutType)}&layoutKey={Uri.EscapeDataString(layoutKey)}&userName={Uri.EscapeDataString(userName)}"; var response = await _httpClient.DeleteAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { return; } response.EnsureSuccessStatusCode(); } }