From f221d7cee5071664a168b9d2d99fde8c0cb34ca9 Mon Sep 17 00:00:00 2001 From: Sluijsens Date: Mon, 22 Jun 2026 11:06:34 +0200 Subject: [PATCH] fix(unit-2-auth): Redirect to /setup on API failure; store owner display name - Router catch block now falls back to { initialized: false } instead of silently continuing, preventing unwanted redirect to /login when the API call fails at startup - Add Name field to CreateOwnerRequest and propagate to ApplicationUser.DisplayName so the owner's display name is stored during initial setup Co-Authored-By: Claude Haiku 4.5 --- frontend/src/router.tsx | 8 +++++--- .../Identity/Models/IdentityRequests.cs | 2 +- src/SlpModularCms.Core/Identity/Services/SetupService.cs | 5 +++-- .../Controllers/SetupController.cs | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/frontend/src/router.tsx b/frontend/src/router.tsx index 3e5117e..482fdff 100644 --- a/frontend/src/router.tsx +++ b/frontend/src/router.tsx @@ -91,9 +91,11 @@ const rootRoute = createRootRouteWithContext()({ let status: SetupStatus; try { status = await fetchSetupStatus(); - } catch { - // Network failure — let routes render; API calls will surface errors. - return; + } catch (err) { + // On network failure, assume not initialized so the user can set up + // the system once the backend is reachable. Logging helps debugging. + console.warn('[InitGuard] Setup status check failed, assuming not initialized:', err); + status = { initialized: false }; } const onSetup = location.pathname === '/setup'; diff --git a/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs b/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs index 5ee9496..54fcec9 100644 --- a/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs +++ b/src/SlpModularCms.Core/Identity/Models/IdentityRequests.cs @@ -1,6 +1,6 @@ namespace SlpModularCms.Core.Identity.Models; -public record CreateOwnerRequest(string Email, string Password); +public record CreateOwnerRequest(string Name, string Email, string Password); public record LoginRequest(string Email, string Password); public record InviteUserRequest(string Email, string Role); public record CompleteSetupRequest(string Token, string Password); diff --git a/src/SlpModularCms.Core/Identity/Services/SetupService.cs b/src/SlpModularCms.Core/Identity/Services/SetupService.cs index 114714f..f120b44 100644 --- a/src/SlpModularCms.Core/Identity/Services/SetupService.cs +++ b/src/SlpModularCms.Core/Identity/Services/SetupService.cs @@ -8,7 +8,7 @@ namespace SlpModularCms.Core.Identity.Services; public interface ISetupService { Task IsSystemInitializedAsync(); - Task CreateInitialOwnerAsync(string email, string password); + Task CreateInitialOwnerAsync(string name, string email, string password); } public class SetupService : ISetupService @@ -27,7 +27,7 @@ public class SetupService : ISetupService return await _userManager.Users.AnyAsync(); } - public async Task CreateInitialOwnerAsync(string email, string password) + public async Task CreateInitialOwnerAsync(string name, string email, string password) { if (await IsSystemInitializedAsync()) { @@ -48,6 +48,7 @@ public class SetupService : ISetupService { UserName = email, Email = email, + DisplayName = name, IsActive = true }; diff --git a/src/SlpModularCms.Modules.Identity/Controllers/SetupController.cs b/src/SlpModularCms.Modules.Identity/Controllers/SetupController.cs index 6566757..722c14b 100644 --- a/src/SlpModularCms.Modules.Identity/Controllers/SetupController.cs +++ b/src/SlpModularCms.Modules.Identity/Controllers/SetupController.cs @@ -25,7 +25,7 @@ public class SetupController : ControllerBase [HttpPost("owner")] public async Task CreateOwner([FromBody] CreateOwnerRequest request) { - await _setupService.CreateInitialOwnerAsync(request.Email, request.Password); + await _setupService.CreateInitialOwnerAsync(request.Name, request.Email, request.Password); return Ok(new { Message = "Systeem succesvol geïnitialiseerd. De eerste eigenaar is aangemaakt." }); } }