using System.Net.Http.Json; namespace EntKube.Web.Components.Provisioning; /// /// BFF proxy endpoints for service provisioning. The Blazor frontend calls these /// endpoints, and the BFF forwards requests to the Provisioning microservice. /// public static class ServicesProxyEndpoints { public static void Map(IEndpointRouteBuilder app) { RouteGroupBuilder group = app.MapGroup("/api/services") .RequireAuthorization() .DisableAntiforgery(); // GET /api/services — list all services (optionally filtered by clusterId) group.MapGet("", async (Guid? clusterId, IHttpClientFactory httpClientFactory, CancellationToken ct) => { HttpClient client = httpClientFactory.CreateClient("ProvisioningApi"); string url = clusterId.HasValue ? $"/api/services?clusterId={clusterId.Value}" : "/api/services"; HttpResponseMessage response = await client.GetAsync(url, ct); response.EnsureSuccessStatusCode(); return Results.Stream(await response.Content.ReadAsStreamAsync(ct), "application/json"); }); // POST /api/services — provision a new service group.MapPost("", async (ProvisionServiceRequest request, IHttpClientFactory httpClientFactory, CancellationToken ct) => { HttpClient client = httpClientFactory.CreateClient("ProvisioningApi"); HttpResponseMessage response = await client.PostAsJsonAsync("/api/services", request, ct); if (!response.IsSuccessStatusCode) { return Results.StatusCode((int)response.StatusCode); } return Results.Stream(await response.Content.ReadAsStreamAsync(ct), "application/json"); }); // POST /api/services/{id}/decommission — request decommissioning group.MapPost("{id:guid}/decommission", async (Guid id, IHttpClientFactory httpClientFactory, CancellationToken ct) => { HttpClient client = httpClientFactory.CreateClient("ProvisioningApi"); HttpResponseMessage response = await client.PostAsync($"/api/services/{id}/decommission", null, ct); if (!response.IsSuccessStatusCode) { return Results.StatusCode((int)response.StatusCode); } return Results.Stream(await response.Content.ReadAsStreamAsync(ct), "application/json"); }); } } public record ProvisionServiceRequest(Guid ClusterId, string ServiceType, string Name, string Namespace);