using System.Text.Json.Serialization; using GerbilManagerWebAPI.Endpoints; using Microsoft.EntityFrameworkCore; using Scalar.AspNetCore; var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); // LAN reachability: bind on all interfaces (keep the Aspire/launch-assigned port), // so phones/laptops on the home network can reach the API (trusted LAN, no auth). var aspnetUrls = Environment.GetEnvironmentVariable("ASPNETCORE_URLS"); if (!string.IsNullOrWhiteSpace(aspnetUrls)) { var lanUrls = string.Join(';', aspnetUrls .Split(';', StringSplitOptions.RemoveEmptyEntries) .Select(u => u.Replace("localhost", "0.0.0.0").Replace("127.0.0.1", "0.0.0.0"))); builder.WebHost.UseUrls(lanUrls); } builder.AddNpgsqlDbContext("gerbilmanager"); // JSON: camelCase property names + enums serialised as their string names (frontend contract). builder.Services.ConfigureHttpJsonOptions(o => { o.SerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; o.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); // Permissive CORS for the trusted home LAN (no auth — see board constraint). const string LanCorsPolicy = "lan"; builder.Services.AddCors(options => options.AddPolicy(LanCorsPolicy, policy => policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); // OpenAPI document for the Scalar API reference (Swashbuckle removed). builder.Services.AddOpenApi(); var app = builder.Build(); app.MapDefaultEndpoints(); // API reference at /scalar (built on the OpenAPI doc at /openapi/v1.json). app.MapOpenApi(); app.MapScalarApiReference(); if (app.Environment.IsDevelopment()) { // Aspire provisions an empty database in dev — bring the schema up to date. using var scope = app.Services.CreateScope(); scope.ServiceProvider.GetRequiredService().Database.Migrate(); } app.UseCors(LanCorsPolicy); // Endpoint groups (Minimal API, no controllers). app.MapGerbilEndpoints(); app.MapLitterEndpoints(); app.MapContactEndpoints(); app.MapEnclosureEndpoints(); app.MapColorVarietyEndpoints(); app.MapHealthRecordEndpoints(); app.MapWeightRecordEndpoints(); app.MapInbreedingEndpoints(); app.MapPhotoEndpoints(); app.MapContractEndpoints(); app.MapSettingsEndpoints(); app.Run(); // Sichtbarer Programmtyp für WebApplicationFactory (Endpoint-Tests). public partial class Program { }