Files
Entkube/src/EntKube.Web/Components/Provisioning/ServicesProxyEndpoints.cs
2026-05-13 14:01:32 +02:00

61 lines
2.5 KiB
C#

using System.Net.Http.Json;
namespace EntKube.Web.Components.Provisioning;
/// <summary>
/// BFF proxy endpoints for service provisioning. The Blazor frontend calls these
/// endpoints, and the BFF forwards requests to the Provisioning microservice.
/// </summary>
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);