// SPDX-License-Identifier: BUSL-1.1
// Copyright (c) 2025 StellaOps
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using StellaOps.Platform.WebService.Constants;
using StellaOps.Platform.WebService.Services;
namespace StellaOps.Platform.WebService.Endpoints;
///
/// Admin endpoints for managing DB-layer environment settings (Layer 3).
/// All endpoints require SetupRead or SetupAdmin authorization.
///
public static class EnvironmentSettingsAdminEndpoints
{
public static IEndpointRouteBuilder MapEnvironmentSettingsAdminEndpoints(this IEndpointRouteBuilder app)
{
var group = app.MapGroup("/platform/envsettings/db")
.WithTags("Environment Settings Admin");
group.MapGet("/", async (IEnvironmentSettingsStore store, CancellationToken ct) =>
{
var all = await store.GetAllAsync(ct);
return Results.Ok(all);
})
.WithName("ListDbEnvironmentSettings")
.WithSummary("List all DB-layer environment settings")
.Produces>(StatusCodes.Status200OK)
.RequireAuthorization(PlatformPolicies.SetupRead);
group.MapPut("/{key}", async (string key, SettingValueRequest body, IEnvironmentSettingsStore store, CancellationToken ct) =>
{
if (string.IsNullOrWhiteSpace(key))
return Results.BadRequest(new { error = "Key must not be empty." });
if (string.IsNullOrWhiteSpace(body.Value))
return Results.BadRequest(new { error = "Value must not be empty." });
await store.SetAsync(key, body.Value, body.UpdatedBy ?? "admin", ct);
return Results.Ok(new { key, value = body.Value });
})
.WithName("UpsertDbEnvironmentSetting")
.WithSummary("Create or update a DB-layer environment setting")
.Produces(StatusCodes.Status200OK)
.Produces(StatusCodes.Status400BadRequest)
.RequireAuthorization(PlatformPolicies.SetupAdmin);
group.MapDelete("/{key}", async (string key, IEnvironmentSettingsStore store, CancellationToken ct) =>
{
if (string.IsNullOrWhiteSpace(key))
return Results.BadRequest(new { error = "Key must not be empty." });
await store.DeleteAsync(key, ct);
return Results.NoContent();
})
.WithName("DeleteDbEnvironmentSetting")
.WithSummary("Delete a DB-layer environment setting")
.Produces(StatusCodes.Status204NoContent)
.Produces(StatusCodes.Status400BadRequest)
.RequireAuthorization(PlatformPolicies.SetupAdmin);
return app;
}
public sealed record SettingValueRequest(string Value, string? UpdatedBy = null);
}