feat(frontend): Replace React with Blazor frontend

This commit is contained in:
2025-08-30 19:29:40 -04:00
parent 3b9c074bc7
commit 6063ed62e0
82 changed files with 22786 additions and 3435 deletions

View File

@@ -0,0 +1,182 @@
using System.Text;
using System.Text.Json;
using NimbusFlow.Frontend.Models;
namespace NimbusFlow.Frontend.Services
{
public class ApiService : IApiService
{
private readonly HttpClient _httpClient;
private readonly JsonSerializerOptions _jsonOptions;
public ApiService(HttpClient httpClient)
{
_httpClient = httpClient;
_jsonOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true
};
}
// Member operations
public async Task<List<Member>> GetMembersAsync()
{
var response = await _httpClient.GetAsync("members");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<Member>>(json, _jsonOptions) ?? new List<Member>();
}
public async Task<Member?> GetMemberAsync(int id)
{
var response = await _httpClient.GetAsync($"members/{id}");
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
return null;
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Member>(json, _jsonOptions);
}
public async Task<Member> CreateMemberAsync(Member member)
{
var json = JsonSerializer.Serialize(member, _jsonOptions);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("members", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Member>(responseJson, _jsonOptions) ?? member;
}
public async Task<Member> UpdateMemberAsync(Member member)
{
var json = JsonSerializer.Serialize(member, _jsonOptions);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PutAsync($"members/{member.MemberId}", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Member>(responseJson, _jsonOptions) ?? member;
}
public async Task<bool> DeleteMemberAsync(int id)
{
var response = await _httpClient.DeleteAsync($"members/{id}");
return response.IsSuccessStatusCode;
}
// Classification operations
public async Task<List<Classification>> GetClassificationsAsync()
{
var response = await _httpClient.GetAsync("classifications");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<Classification>>(json, _jsonOptions) ?? new List<Classification>();
}
// Service operations
public async Task<List<Service>> GetServicesAsync()
{
var response = await _httpClient.GetAsync("services");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<Service>>(json, _jsonOptions) ?? new List<Service>();
}
public async Task<Service?> GetServiceAsync(int id)
{
var response = await _httpClient.GetAsync($"services/{id}");
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
return null;
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Service>(json, _jsonOptions);
}
public async Task<Service> CreateServiceAsync(Service service)
{
var json = JsonSerializer.Serialize(service, _jsonOptions);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("services", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Service>(responseJson, _jsonOptions) ?? service;
}
// Schedule operations
public async Task<List<Schedule>> GetSchedulesAsync()
{
var response = await _httpClient.GetAsync("schedules");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<Schedule>>(json, _jsonOptions) ?? new List<Schedule>();
}
public async Task<List<Schedule>> GetMemberSchedulesAsync(int memberId)
{
var response = await _httpClient.GetAsync($"members/{memberId}/schedules");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<Schedule>>(json, _jsonOptions) ?? new List<Schedule>();
}
public async Task<Schedule?> GetScheduleAsync(int id)
{
var response = await _httpClient.GetAsync($"schedules/{id}");
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
return null;
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Schedule>(json, _jsonOptions);
}
public async Task<Schedule> AcceptScheduleAsync(int scheduleId)
{
var response = await _httpClient.PostAsync($"schedules/{scheduleId}/accept", null);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Schedule>(responseJson, _jsonOptions) ?? new Schedule();
}
public async Task<Schedule> DeclineScheduleAsync(int scheduleId, string? reason = null)
{
var content = new StringContent(
JsonSerializer.Serialize(new { reason }, _jsonOptions),
Encoding.UTF8,
"application/json"
);
var response = await _httpClient.PostAsync($"schedules/{scheduleId}/decline", content);
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Schedule>(responseJson, _jsonOptions) ?? new Schedule();
}
public async Task<bool> RemoveScheduleAsync(int scheduleId)
{
var response = await _httpClient.DeleteAsync($"schedules/{scheduleId}");
return response.IsSuccessStatusCode;
}
public async Task<Schedule?> ScheduleNextMemberAsync(int serviceId, List<int> classificationIds)
{
var content = new StringContent(
JsonSerializer.Serialize(new { serviceId, classificationIds }, _jsonOptions),
Encoding.UTF8,
"application/json"
);
var response = await _httpClient.PostAsync("schedules/schedule-next", content);
if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
return null;
response.EnsureSuccessStatusCode();
var responseJson = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<Schedule>(responseJson, _jsonOptions);
}
public async Task<List<ServiceType>> GetServiceTypesAsync()
{
var response = await _httpClient.GetAsync("service-types");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
return JsonSerializer.Deserialize<List<ServiceType>>(json, _jsonOptions) ?? new List<ServiceType>();
}
}
}

View File

@@ -0,0 +1,36 @@
using NimbusFlow.Frontend.Models;
namespace NimbusFlow.Frontend.Services
{
public interface IApiService
{
// Member operations
Task<List<Member>> GetMembersAsync();
Task<Member?> GetMemberAsync(int id);
Task<Member> CreateMemberAsync(Member member);
Task<Member> UpdateMemberAsync(Member member);
Task<bool> DeleteMemberAsync(int id);
// Classification operations
Task<List<Classification>> GetClassificationsAsync();
// Service operations
Task<List<Service>> GetServicesAsync();
Task<Service?> GetServiceAsync(int id);
Task<Service> CreateServiceAsync(Service service);
// Schedule operations
Task<List<Schedule>> GetSchedulesAsync();
Task<List<Schedule>> GetMemberSchedulesAsync(int memberId);
Task<Schedule?> GetScheduleAsync(int id);
Task<Schedule> AcceptScheduleAsync(int scheduleId);
Task<Schedule> DeclineScheduleAsync(int scheduleId, string? reason = null);
Task<bool> RemoveScheduleAsync(int scheduleId);
// Scheduling operations
Task<Schedule?> ScheduleNextMemberAsync(int serviceId, List<int> classificationIds);
// Service Types
Task<List<ServiceType>> GetServiceTypesAsync();
}
}