feat(backend): restructure API into layers with OpenAPI, versioning and error handling

Split the backend into API host, Domain, Application and Infrastructure projects. Add Swagger/OpenAPI per API version, Asp.Versioning (query/header), ProblemDetails with a global exception handler and SurrealQL migrations applied at startup (namespace/database ensured). Infrastructure owns the SurrealDB client, settings and DI.
This commit is contained in:
Rafał Tyński
2026-10-04 01:49:51 +02:00
parent 0a5ef715eb
commit b3756238a3
26 changed files with 437 additions and 63 deletions
@@ -0,0 +1,6 @@
namespace TarninaHub.Application.Abstractions;
public interface IMigrationRunner
{
Task ApplyAsync(CancellationToken cancellationToken);
}
@@ -0,0 +1,14 @@
using TarninaHub.Application.Dtos;
namespace TarninaHub.Application.Abstractions;
public interface IStorageService
{
Task InitializeAsync(CancellationToken cancellationToken);
StorageInfo GetInfo();
Task<int> GetProbeCountAsync(CancellationToken cancellationToken);
Task<StorageProbe> AddProbeAsync(CancellationToken cancellationToken);
}
+25
View File
@@ -0,0 +1,25 @@
namespace TarninaHub.Application.Dtos;
public sealed class StorageProbe
{
public string Label { get; set; } = "probe";
public DateTimeOffset CreatedAt { get; set; }
}
public sealed record StorageInfo(
string Engine,
string DataDirectory,
string Namespace,
string Database);
public sealed record StorageStatusResponse(
string Engine,
string DataDirectory,
string Namespace,
string Database,
int ProbeCount);
public sealed record StorageProbeResponse(
string Label,
DateTimeOffset CreatedAt);
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Domain\TarninaHub.Domain.csproj" />
</ItemGroup>
</Project>