Owner decision pending (STATE.md DC-100 tick): adopt/ship/park. Preserved from fragile git stash to named branch 2026-08-23. NOTE: requires a Windows build machine (WinUI XAML compiler + MSIX do not cross-build on Linux) — see WINDOWS_APP_BUILD.md in this tree. Secret-scanned clean 2026-08-23 (no keys/tokens/PEM in tree).
88 lines
3.0 KiB
C#
88 lines
3.0 KiB
C#
using System.Net.Http.Json;
|
|
using System.Text.Json;
|
|
using DashCaddy.Desktop.Models;
|
|
|
|
namespace DashCaddy.Desktop.Services;
|
|
|
|
public class ApiClient
|
|
{
|
|
private readonly HttpClient _httpClient;
|
|
private readonly string _baseUrl;
|
|
|
|
public ApiClient(string baseUrl)
|
|
{
|
|
_baseUrl = baseUrl.TrimEnd('/');
|
|
_httpClient = new HttpClient
|
|
{
|
|
BaseAddress = new Uri(_baseUrl),
|
|
Timeout = TimeSpan.FromSeconds(30)
|
|
};
|
|
}
|
|
|
|
public async Task<List<ServiceModel>> GetServicesAsync()
|
|
{
|
|
var response = await _httpClient.GetAsync("/api/v1/services");
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<List<ServiceModel>>>();
|
|
return result?.Data ?? new List<ServiceModel>();
|
|
}
|
|
|
|
public async Task<ServiceModel> GetServiceAsync(string id)
|
|
{
|
|
var response = await _httpClient.GetAsync($"/api/v1/services/{id}");
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<ServiceModel>>();
|
|
return result?.Data;
|
|
}
|
|
|
|
public async Task<ServiceModel> CreateServiceAsync(ServiceModel service)
|
|
{
|
|
var response = await _httpClient.PostAsJsonAsync("/api/v1/services", service);
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<ServiceModel>>();
|
|
return result?.Data;
|
|
}
|
|
|
|
public async Task<ServiceModel> UpdateServiceAsync(string id, ServiceModel service)
|
|
{
|
|
var response = await _httpClient.PutAsJsonAsync($"/api/v1/services/{id}", service);
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<ServiceModel>>();
|
|
return result?.Data;
|
|
}
|
|
|
|
public async Task RemoveServiceAsync(string id)
|
|
{
|
|
var response = await _httpClient.DeleteAsync($"/api/v1/services/{id}");
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public async Task<HealthResponse> GetHealthAsync()
|
|
{
|
|
var response = await _httpClient.GetAsync("/api/v1/health");
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<HealthResponse>>();
|
|
return result?.Data ?? new HealthResponse();
|
|
}
|
|
|
|
public async Task<Dictionary<string, string>> GetConfigAsync()
|
|
{
|
|
var response = await _httpClient.GetAsync("/api/v1/config");
|
|
response.EnsureSuccessStatusCode();
|
|
var result = await response.Content.ReadFromJsonAsync<ApiResponse<Dictionary<string, string>>>();
|
|
return result?.Data ?? new Dictionary<string, string>();
|
|
}
|
|
|
|
public async Task UpdateConfigAsync(Dictionary<string, string> config)
|
|
{
|
|
var response = await _httpClient.PutAsJsonAsync("/api/v1/config", config);
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
private class ApiResponse<T>
|
|
{
|
|
public bool Success { get; set; }
|
|
public T Data { get; set; }
|
|
public string Error { get; set; }
|
|
}
|
|
} |