feat: mostly just scaffolding

This commit is contained in:
Greboh committed 2026-11-07 11:34:17 +01:00
1 parent 5c0ef79b63
commit 4c517788fe
23 files changed
+312

No files matched your search

@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\Hearth.Accounts.Contracts\Hearth.Accounts.Contracts.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\Hearth.Characters.Contracts\Hearth.Characters.Contracts.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>
+10
View File
@@ -0,0 +1,10 @@
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
</Project>
+15
View File
@@ -0,0 +1,15 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.10.0" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="10.10.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.20.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.20.1" />
</ItemGroup>
</Project>
+3
View File
@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>
@@ -0,0 +1,3 @@
<Project Sdk="Microsoft.NET.Sdk">
</Project>
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\Hearth.Guilds.Contracts\Hearth.Guilds.Contracts.csproj" />
</ItemGroup>
</Project>
+30
View File
@@ -0,0 +1,30 @@
<Solution>
<Folder Name="/Solution Items/">
<File Path="Directory.Build.props" />
<File Path="Directory.Packages.props" />
<File Path="global.json" />
</Folder>
<Folder Name="/Hosts/">
<Project Path="Hosts/Hearth.Api/Hearth.Api.csproj" />
<Project Path="Hosts/Hearth.AppHost/Hearth.AppHost.csproj" />
<Project Path="Hosts/Hearth.Hosting/Hearth.Hosting.csproj" />
</Folder>
<Folder Name="/Commons/">
<Project Path="Commons/Hearth.Commons/Hearth.Commons.csproj" />
</Folder>
<Folder Name="/Characters/">
<Project Path="Characters/Hearth.Characters/Hearth.Characters.csproj" />
<Project Path="Characters/Hearth.Characters.Contracts/Hearth.Characters.Contracts.csproj" />
</Folder>
<Folder Name="/Guilds/">
<Project Path="Guilds/Hearth.Guilds/Hearth.Guilds.csproj" />
<Project Path="Guilds/Hearth.Guilds.Contracts/Hearth.Guilds.Contracts.csproj" />
</Folder>
<Folder Name="/Accounts/">
<Project Path="Accounts/Hearth.Accounts/Hearth.Accounts.csproj" />
<Project Path="Accounts/Hearth.Accounts.Contracts/Hearth.Accounts.Contracts.csproj" />
</Folder>
<Folder Name="/External/">
<Project Path="External/Hearth.External/Hearth.External.csproj" />
</Folder>
</Solution>
+11
View File
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<ProjectReference Include="..\Hearth.Hosting\Hearth.Hosting.csproj" />
<ProjectReference Include="..\..\Characters\Hearth.Characters\Hearth.Characters.csproj" />
<ProjectReference Include="..\..\Guilds\Hearth.Guilds\Hearth.Guilds.csproj" />
<ProjectReference Include="..\..\Accounts\Hearth.Accounts\Hearth.Accounts.csproj" />
<ProjectReference Include="..\..\External\Hearth.External\Hearth.External.csproj" />
</ItemGroup>
</Project>
+11
View File
@@ -0,0 +1,11 @@
using Hearth.Hosting;
var builder = WebApplication.CreateBuilder(args);
builder.AddHostDefaults();
var app = builder.Build();
app.MapHostEndpoints();
app.Run();
@@ -0,0 +1,13 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"launchBrowser": false,
"applicationUrl": "http://localhost:5080",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
+5
View File
@@ -0,0 +1,5 @@
var builder = DistributedApplication.CreateBuilder(args);
builder.AddProject<Projects.Hearth_Api>("api");
builder.Build().Run();
@@ -0,0 +1,13 @@
<Project Sdk="Aspire.AppHost.Sdk/13.6.4">
<PropertyGroup>
<OutputType>Exe</OutputType>
<AspireUseCliBundle>true</AspireUseCliBundle>
<UserSecretsId>388fbdf7-df04-4c75-858e-1bdc720d2a91</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Hearth.Api\Hearth.Api.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,30 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:17277;http://localhost:15247",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21265",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22059"
}
},
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:15247",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"DOTNET_ENVIRONMENT": "Development",
"ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19112",
"ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20192",
"ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
}
}
}
}
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Aspire.Hosting.Dcp": "Warning"
}
}
}
@@ -0,0 +1,5 @@
{
"appHost": {
"path": "Hearth.AppHost.csproj"
}
}
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>
</Project>
@@ -0,0 +1,85 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace Hearth.Hosting;
// Setup every Hearth host needs the same way: logging and telemetry, health endpoints, service discovery and HTTP resilience.
// Only hosts reference this project; anything a single host or a module needs belongs elsewhere.
public static class HostingExtensions
{
private const string HealthEndpointPath = "/health";
private const string AlivenessEndpointPath = "/alive";
private const string LiveTag = "live";
public static TBuilder AddHostDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
{
http.AddStandardResilienceHandler();
http.AddServiceDiscovery();
});
return builder;
}
public static TBuilder ConfigureOpenTelemetry<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
var openTelemetry = builder.Services
.AddOpenTelemetry()
.WithMetrics(metrics => metrics
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation())
.WithTracing(tracing => tracing
.AddSource(builder.Environment.ApplicationName)
.AddAspNetCoreInstrumentation(options => options.Filter = context =>
!context.Request.Path.StartsWithSegments(HealthEndpointPath)
&& !context.Request.Path.StartsWithSegments(AlivenessEndpointPath))
.AddHttpClientInstrumentation());
if (!string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]))
{
openTelemetry.UseOtlpExporter();
}
return builder;
}
public static TBuilder AddDefaultHealthChecks<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder
{
builder.Services
.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy(), [LiveTag]);
return builder;
}
// Mapped in every environment, unlike the Aspire template: the Kubernetes probes need them in production.
public static WebApplication MapHostEndpoints(this WebApplication app)
{
app.MapHealthChecks(HealthEndpointPath);
app.MapHealthChecks(
AlivenessEndpointPath,
new HealthCheckOptions { Predicate = registration => registration.Tags.Contains(LiveTag) }
);
return app;
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"sdk": {
"version": "10.0.100",
"rollForward": "latestFeature"
},
"test": {
"runner": "Microsoft.Testing.Platform"
}
}