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(); // FEAT-12a: provider-agnostic AI config (env vars AI__BaseUrl/AI__ApiKey/AI__Model // or user-secrets — never committed) + typed client for sale-ad generation. builder.Services.AddOptions() .BindConfiguration(GerbilManagerWebAPI.SaleAd.AiOptions.SectionName); builder.Services.AddHttpClient( http => http.Timeout = TimeSpan.FromSeconds(60)); var app = builder.Build(); app.MapDefaultEndpoints(); // API reference at /scalar (built on the OpenAPI doc at /openapi/v1.json). app.MapOpenApi(); app.MapScalarApiReference(); // Apply EF migrations at startup (no-op if schema is current; safe for single-instance deploy). 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.MapSaleAdEndpoints(); app.MapImportEndpoints(); app.Run();