Initial curated itworx-knowledge-hub source from 3b1751d0d9dee551aa6994eee0093704dc334817

This commit is contained in:
Public Source Publisher committed 2026-10-01 01:37:37 +02:00
commit ad8ad252a9
825 files changed
+124216

No files matched your search

@@ -0,0 +1,52 @@
using System.Security.Claims;
using ItWorx.KnowledgeHub.Api.Authorization;
using ItWorx.KnowledgeHub.Api.Security;
using ItWorx.KnowledgeHub.Application.Operations;
using ItWorx.KnowledgeHub.Application.Operations.UseCases;
using ItWorx.KnowledgeHub.Contracts.Operations;
using Microsoft.AspNetCore.Http.HttpResults;
namespace ItWorx.KnowledgeHub.Api.Endpoints;
/// <summary>
/// Administrator-only, cookie-authenticated backup management (docs/18-backup-restore.md).
/// Deliberately create/list only — restore is never reachable through the live
/// application's own HTTP surface (see <c>RestoreModeRunner</c> and ADR-016 decision 4).
/// </summary>
public static class BackupsEndpoints
{
public static IEndpointRouteBuilder MapBackupsEndpoints(this IEndpointRouteBuilder app)
{
var group = app.MapGroup("/api/v1/admin/backups")
.WithTags("Backups")
.RequireAuthorization(AuthorizationPolicies.RequireAdministrator);
group.MapGet("", ListAsync);
group.MapPost("", CreateAsync)
.AddEndpointFilter<AntiforgeryEndpointFilter>();
return app;
}
private static async Task<Ok<BackupListResponse>> ListAsync(ListBackupsUseCase useCase, CancellationToken cancellationToken)
{
var backups = await useCase.ExecuteAsync(cancellationToken);
return TypedResults.Ok(new BackupListResponse(backups.Select(ToResponse).ToList()));
}
private static async Task<Ok<BackupSummaryResponse>> CreateAsync(
CreateBackupUseCase useCase, ClaimsPrincipal principal, HttpContext httpContext, CancellationToken cancellationToken)
{
var correlationId = httpContext.Items[CorrelationIdMiddleware.ItemKey] as string;
var actorId = Guid.Parse(principal.FindFirstValue(ClaimTypes.NameIdentifier)!);
var summary = await useCase.ExecuteAsync(new CreateBackupCommand(actorId, correlationId), cancellationToken);
return TypedResults.Ok(ToResponse(summary));
}
private static BackupSummaryResponse ToResponse(BackupSummary summary) =>
new(
summary.BackupId, summary.CreatedAt, summary.TotalSizeBytes, summary.TableCount,
summary.TotalRowCount, summary.AttachmentCount, summary.SchemaVersion, summary.ProductVersion);
}