using System.Net.Http.Json; using System.Text.Json; using DiunaBI.Application.DTOModels; using DiunaBI.Application.DTOModels.Common; namespace DiunaBI.UI.Shared.Services; public class LayerService { private readonly HttpClient _httpClient; public LayerService(HttpClient httpClient) { _httpClient = httpClient; } private readonly JsonSerializerOptions _jsonOptions = new() { PropertyNameCaseInsensitive = true }; public async Task> GetLayersAsync(LayerFilterRequest filterRequest) { // Calculate start index from page number (page 1 = start 0, page 2 = start 50, etc.) var start = (filterRequest.Page - 1) * filterRequest.PageSize; var query = $"Layers?start={start}&limit={filterRequest.PageSize}"; if (!string.IsNullOrEmpty(filterRequest.Search)) query += $"&name={Uri.EscapeDataString(filterRequest.Search)}"; if (filterRequest.Type.HasValue) query += $"&type={(int)filterRequest.Type.Value}"; var response = await _httpClient.GetAsync(query); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); var result = JsonSerializer.Deserialize>(json, _jsonOptions); return result ?? new PagedResult(); } public async Task GetLayerByIdAsync(Guid id) { var response = await _httpClient.GetAsync($"Layers/{id}"); if (!response.IsSuccessStatusCode) return null; return await response.Content.ReadFromJsonAsync(); } public async Task UpdateRecordsAsync(Guid layerId, List records) { // TODO: Implement if needed - backend doesn't have PUT endpoint yet // For now we don't need it for read-only view return await Task.FromResult(false); } public async Task CreateRecordAsync(Guid layerId, RecordDto record) { var response = await _httpClient.PostAsJsonAsync($"Layers/{layerId}/records", record); if (!response.IsSuccessStatusCode) { var error = await response.Content.ReadAsStringAsync(); Console.Error.WriteLine($"CreateRecordAsync failed: {response.StatusCode} - {error}"); return null; } return await response.Content.ReadFromJsonAsync(); } public async Task UpdateRecordAsync(Guid layerId, Guid recordId, RecordDto record) { var response = await _httpClient.PutAsJsonAsync($"Layers/{layerId}/records/{recordId}", record); if (!response.IsSuccessStatusCode) { var error = await response.Content.ReadAsStringAsync(); Console.Error.WriteLine($"UpdateRecordAsync failed: {response.StatusCode} - {error}"); return null; } return await response.Content.ReadFromJsonAsync(); } public async Task DeleteRecordAsync(Guid layerId, Guid recordId) { var response = await _httpClient.DeleteAsync($"Layers/{layerId}/records/{recordId}"); return response.IsSuccessStatusCode; } public async Task> GetRecordHistoryAsync(Guid layerId, Guid recordId) { var response = await _httpClient.GetAsync($"Layers/{layerId}/records/{recordId}/history"); if (!response.IsSuccessStatusCode) { var error = await response.Content.ReadAsStringAsync(); Console.Error.WriteLine($"GetRecordHistoryAsync failed: {response.StatusCode} - {error}"); return new List(); } return await response.Content.ReadFromJsonAsync>() ?? new List(); } public async Task> GetDeletedRecordsAsync(Guid layerId) { var response = await _httpClient.GetAsync($"Layers/{layerId}/records/deleted"); if (!response.IsSuccessStatusCode) { var error = await response.Content.ReadAsStringAsync(); Console.Error.WriteLine($"GetDeletedRecordsAsync failed: {response.StatusCode} - {error}"); return new List(); } return await response.Content.ReadFromJsonAsync>() ?? new List(); } }