Compare commits

..

2 Commits

Author SHA1 Message Date
Michele
44fcd37366 Fix middleware redirect URLs missing basePath
- Use request.nextUrl.clone() instead of new URL() for redirects
- This preserves the /leopost basePath in redirect URLs
- Fixes 404 error when unauthenticated user visits /dashboard

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 12:02:01 +01:00
Michele
2c2238548a test(01): complete UAT - 11 passed, 1 issue
Issue found:
- Middleware redirect missing basePath (redirects to /login/ instead of /leopost/login/)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 12:00:36 +01:00
2 changed files with 88 additions and 2 deletions

View File

@@ -0,0 +1,81 @@
---
status: complete
phase: 01-foundation-auth
source: 01-01-SUMMARY.md, 01-02-SUMMARY.md, 01-03-SUMMARY.md, 01-04-SUMMARY.md, 01-05-SUMMARY.md, 01-06-SUMMARY.md
started: 2026-01-31T20:15:00Z
updated: 2026-01-31T20:30:00Z
---
## Current Test
[testing complete]
## Tests
### 1. Homepage carica correttamente
expected: Visitando https://lab.mlhub.it/leopost/ si vede la landing page con titolo "Leopost", descrizione del prodotto, e pulsanti "Inizia gratis" e "Accedi"
result: pass
### 2. Pagina di registrazione
expected: Cliccando "Inizia gratis" o visitando /register/ si vede il form di registrazione con pulsante "Accedi con Google" in alto, divisore "oppure", e form email/password sotto
result: pass
### 3. Pagina di login
expected: Visitando /login/ si vede il form di login con pulsante "Accedi con Google" in alto, divisore "oppure", e form email/password sotto
result: pass
### 4. Registrazione con email/password
expected: Inserendo email e password validi nel form di registrazione e cliccando "Registrati", l'utente viene registrato e vede messaggio di conferma email
result: pass
### 5. Login con Google OAuth
expected: Cliccando "Accedi con Google", l'utente viene reindirizzato a Google, seleziona account, e torna autenticato alla dashboard
result: pass
### 6. Protezione route - utente non autenticato
expected: Visitando /dashboard/ senza essere loggati, si viene reindirizzati a /login/
result: issue
reported: "quasi giusto: se vado su https://lab.mlhub.it/leopost/dashboard, mi reindirizza qui https://lab.mlhub.it/login/?redirectTo=%2Fdashboard%2F e mi mostra errore 404, dovrebbe reindirizzarmi qui https://lab.mlhub.it/leopost/login/?redirectTo=%2Fdashboard%2F"
severity: major
### 7. Dashboard dopo login
expected: Dopo il login, l'utente vede la dashboard con il suo piano attuale, checklist onboarding, e navigazione con nome utente
result: pass
### 8. Persistenza sessione
expected: Dopo il login, ricaricando la pagina (F5), l'utente rimane autenticato e vede ancora la dashboard
result: pass
### 9. Logout
expected: Cliccando sul menu utente e poi "Esci", l'utente viene disconnesso e reindirizzato alla pagina di login
result: pass
### 10. Pagina subscription
expected: Visitando /subscription/ da autenticati, si vedono i 3 piani (Gratuito, Creator, Pro) con prezzi, funzionalita, e pulsante per cambiare piano
result: pass
### 11. Cambio piano
expected: Cliccando "Passa a questo piano" su un piano diverso dal corrente, il piano dell'utente viene aggiornato immediatamente (visibile nel badge piano)
result: pass
### 12. Testi in italiano
expected: Tutti i testi dell'interfaccia sono in italiano (pulsanti, messaggi, descrizioni piani)
result: pass
## Summary
total: 12
passed: 11
issues: 1
pending: 0
skipped: 0
## Gaps
- truth: "Visitando /dashboard/ senza essere loggati, si viene reindirizzati a /login/"
status: failed
reason: "User reported: quasi giusto: se vado su https://lab.mlhub.it/leopost/dashboard, mi reindirizza qui https://lab.mlhub.it/login/?redirectTo=%2Fdashboard%2F e mi mostra errore 404, dovrebbe reindirizzarmi qui https://lab.mlhub.it/leopost/login/?redirectTo=%2Fdashboard%2F"
severity: major
test: 6
artifacts: []
missing: []

View File

@@ -18,7 +18,9 @@ export async function middleware(request: NextRequest) {
) )
if (isProtectedRoute && !user) { if (isProtectedRoute && !user) {
const redirectUrl = new URL('/login/', request.url) // Use nextUrl.clone() to preserve basePath in redirect
const redirectUrl = request.nextUrl.clone()
redirectUrl.pathname = '/login/'
redirectUrl.searchParams.set('redirectTo', pathname) redirectUrl.searchParams.set('redirectTo', pathname)
return NextResponse.redirect(redirectUrl) return NextResponse.redirect(redirectUrl)
} }
@@ -29,7 +31,10 @@ export async function middleware(request: NextRequest) {
) )
if (isAuthRoute && user) { if (isAuthRoute && user) {
return NextResponse.redirect(new URL('/dashboard/', request.url)) // Use nextUrl.clone() to preserve basePath in redirect
const url = request.nextUrl.clone()
url.pathname = '/dashboard/'
return NextResponse.redirect(url)
} }
return supabaseResponse return supabaseResponse