diff --git a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.csproj b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.csproj index 29b3a48a..0fc039e1 100644 --- a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.csproj +++ b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web.csproj @@ -19,6 +19,7 @@ + diff --git a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/Program.cs b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/Program.cs index a944b892..23099f15 100644 --- a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/Program.cs +++ b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/Program.cs @@ -1,7 +1,10 @@ -using EnvelopeGenerator.ReceiverUI.Web.Client.Utils; +using EnvelopeGenerator.ReceiverUI.Web.Client.Api; +using EnvelopeGenerator.ReceiverUI.Web.Client.Services; +using EnvelopeGenerator.ReceiverUI.Web.Client.Utils; using EnvelopeGenerator.ReceiverUI.Web.Components; using System.Text; + var builder = WebApplication.CreateBuilder(args); // Add services to the container. @@ -27,6 +30,26 @@ builder.Services.AddMvc(); builder.Services.AddDevExpressServerSideBlazorPdfViewer(); +// ── Receiver API + Auth + Localization (for prerender on the server) ─ +// During prerendering the components still need the same scoped services +// as on the WASM side. Server-side calls go directly to the API +// (configured via "Api:BaseUrl"); browser-side calls go through YARP. +// Note: server-side prerender does NOT forward the user's auth cookie yet +// (will be added in a later phase if interactive prerender is needed). +var apiBaseUrl = builder.Configuration["Api:BaseUrl"] + ?? throw new InvalidOperationException("Api:BaseUrl is missing from configuration."); +builder.Services.AddHttpClient(client => +{ + client.BaseAddress = new Uri(apiBaseUrl.TrimEnd('/') + "/"); +}); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +// ── YARP reverse proxy: forwards /api/** from the browser to the API +// (same-origin from the browser's POV → HttpOnly auth cookie flows). +builder.Services.AddReverseProxy() + .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); + var app = builder.Build(); // Configure the HTTP request pipeline. @@ -69,6 +92,10 @@ app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAntiforgery(); +// Forward all /api/** traffic (except /api/chat which is handled above) +// to the EnvelopeGenerator.API backend. +app.MapReverseProxy(); + app.MapRazorComponents() .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode() @@ -76,3 +103,4 @@ app.MapRazorComponents() .AllowAnonymous(); app.Run(); + diff --git a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/appsettings.json b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/appsettings.json index 5473a435..ca50199e 100644 --- a/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/appsettings.json +++ b/receiverUI/EnvelopeGenerator.ReceiverUI.Web/EnvelopeGenerator.ReceiverUI.Web/appsettings.json @@ -4,6 +4,28 @@ "Key": "DEMO", "DeploymentName": "gpt-4.1" }, + "Api": { + "BaseUrl": "https://localhost:8088" + }, + "ReverseProxy": { + "Routes": { + "envelope-api": { + "ClusterId": "envelope-api", + "Match": { + "Path": "/api/{**catch-all}" + } + } + }, + "Clusters": { + "envelope-api": { + "Destinations": { + "default": { + "Address": "https://localhost:8088" + } + } + } + } + }, "Logging": { "LogLevel": { "Default": "Information",