2026-07-19 10:05:42 +02:00
|
|
|
import { cookies } from "next/headers"
|
|
|
|
|
import { redirect } from "next/navigation"
|
2026-07-17 21:40:42 +02:00
|
|
|
|
2026-07-19 10:05:42 +02:00
|
|
|
// Server-side, IKKE nettleser-fetch -- går derfor IKKE gjennom
|
|
|
|
|
// next.config.mjs sin rewrites() (samme mønster som generateMetadata i
|
|
|
|
|
// app/t/[id]/page.tsx). Peker direkte på API-et.
|
|
|
|
|
const API_ORIGIN = process.env.TEECUP_API_ORIGIN || "http://localhost:8000"
|
|
|
|
|
// Må matche SESSION_COOKIE_NAME i app/auth.py -- ingen delt konstant på
|
|
|
|
|
// tvers av Python/TypeScript, samme mønster som andre API-kontrakt-felt
|
|
|
|
|
// som dupliseres bevisst i frontend-koden.
|
|
|
|
|
const SESSION_COOKIE_NAME = "teecup_session"
|
|
|
|
|
|
|
|
|
|
export default async function Page() {
|
|
|
|
|
// Reell bug funnet 2026-07-19: denne siden viste ALLTID innloggingsskjemaet,
|
|
|
|
|
// uansett om brukeren allerede hadde en helt gyldig sesjonscookie (30 dager,
|
|
|
|
|
// bekreftet riktig satt) -- Dashboard sjekker /auth/me og sender deg HIT ved
|
|
|
|
|
// manglende sesjon, men ingenting gjorde det motsatte. En bruker som besøkte
|
|
|
|
|
// teecup.teeoff.no direkte (i stedet for å navigere til /dashboard) så derfor
|
|
|
|
|
// alltid innloggingsskjemaet og ba unødvendig om en ny magic-link hver gang.
|
|
|
|
|
const cookieStore = await cookies()
|
|
|
|
|
const session = cookieStore.get(SESSION_COOKIE_NAME)
|
|
|
|
|
let authenticated = false
|
Update Todos
Skriv migrasjon 019 (app_user.country + bio)
Backend: profile_complete-felt, ProfileUpdate country/bio/HCP-cap
Frontend: onboarding-visning i /account, gate i page.tsx + dashboard.tsx
Scratch-verifiser hele flyten
Be om bekreftelse og rull ut live
Scratch-verifisert, alt grønt:
Migrasjon 019 kjørte rent (001→019), test_isolation.sql 12/12 uendret.
16/16 backend-sjekker: fersk konto starter profile_complete: false, delvis utfylling forblir ufullstendig, HCP >54 avvist (422), full utfylling (inkl. HCP=54) gir profile_complete: true, beskrivelse er reelt valgfri, å nullstille et obligatorisk felt i etterkant slår profile_complete tilbake til false, full isolasjon mellom to kontoer.
Ekte produksjonsbuild av frontend kompilerte rent, alle 16 ruter listet.
Ekte HTTP-nivå-bevis mot en kjørende produksjonscontainer: anonym mot / → 200 (innloggingsskjema), en ekte innlogget-men-ufullstendig sesjonscookie mot / → 307 → /account.
Klar for ekte teecup_db. Dette krever:
Kjøre 019_profile_country_bio.sql mot ekte teecup_db (kun to nye nullable kolonner på app_user — additivt, ingen eksisterende rader berørt).
docker compose up -d --build teecup_api teecup_frontend.
Verdt å merke: med dette rullet ut vil både hei@erol.no og erol.haagenrud@envide.no bli sendt til profil-fullføring ved neste innlogging — ingen av kontoene har disse feltene utfylt i dag (bekreftet med spørringen tidligere).
2026-07-22 07:53:29 +02:00
|
|
|
let profileComplete = true
|
2026-07-19 10:05:42 +02:00
|
|
|
if (session) {
|
|
|
|
|
try {
|
|
|
|
|
const res = await fetch(`${API_ORIGIN}/auth/me`, {
|
|
|
|
|
headers: { Cookie: `${SESSION_COOKIE_NAME}=${session.value}` },
|
|
|
|
|
cache: "no-store",
|
|
|
|
|
})
|
|
|
|
|
authenticated = res.ok
|
Update Todos
Skriv migrasjon 019 (app_user.country + bio)
Backend: profile_complete-felt, ProfileUpdate country/bio/HCP-cap
Frontend: onboarding-visning i /account, gate i page.tsx + dashboard.tsx
Scratch-verifiser hele flyten
Be om bekreftelse og rull ut live
Scratch-verifisert, alt grønt:
Migrasjon 019 kjørte rent (001→019), test_isolation.sql 12/12 uendret.
16/16 backend-sjekker: fersk konto starter profile_complete: false, delvis utfylling forblir ufullstendig, HCP >54 avvist (422), full utfylling (inkl. HCP=54) gir profile_complete: true, beskrivelse er reelt valgfri, å nullstille et obligatorisk felt i etterkant slår profile_complete tilbake til false, full isolasjon mellom to kontoer.
Ekte produksjonsbuild av frontend kompilerte rent, alle 16 ruter listet.
Ekte HTTP-nivå-bevis mot en kjørende produksjonscontainer: anonym mot / → 200 (innloggingsskjema), en ekte innlogget-men-ufullstendig sesjonscookie mot / → 307 → /account.
Klar for ekte teecup_db. Dette krever:
Kjøre 019_profile_country_bio.sql mot ekte teecup_db (kun to nye nullable kolonner på app_user — additivt, ingen eksisterende rader berørt).
docker compose up -d --build teecup_api teecup_frontend.
Verdt å merke: med dette rullet ut vil både hei@erol.no og erol.haagenrud@envide.no bli sendt til profil-fullføring ved neste innlogging — ingen av kontoene har disse feltene utfylt i dag (bekreftet med spørringen tidligere).
2026-07-22 07:53:29 +02:00
|
|
|
if (res.ok) {
|
|
|
|
|
const data = await res.json()
|
|
|
|
|
profileComplete = Boolean(data.profile_complete)
|
|
|
|
|
}
|
2026-07-19 10:05:42 +02:00
|
|
|
} catch {
|
|
|
|
|
// API utilgjengelig -- vis innloggingsskjemaet i stedet for å henge.
|
|
|
|
|
authenticated = false
|
|
|
|
|
}
|
|
|
|
|
}
|
Gjør /logg-inn til den ekte innloggingssiden
/logg-inn (clubhouse-palett, TeeCupAuth) var en foreldreløs V0-
utforskning -- ingenting i appen lenket eller redirectet dit, og
TeeCupAuth var 100% mock (sleep()-baserte stubber, hardkodet
demo-passord, falske invitasjonskoder, en falsk "2FA-kode sendes"-tekst
som aldri sendte noe). Flagget eksplisitt til bruker før arbeid startet,
siden dette er sikkerhetskritisk kode og omfanget var langt større enn
en ren redirect-ombytting.
Full port: ekte POST /auth/request-link, POST /auth/login-password
(identisk LoginResult-statushåndtering som den gamle LoginForm), GET
/public/tournaments/by-code/{code}. TwoFactorVerifyForm/
TwoFactorSetupForm gjenbrukt UENDRET (lavest mulig risiko for
sikkerhetskritisk 2FA-kode). app/page.tsx redusert til en tynn
videresending (autentisert -> /dashboard//account, uautentisert ->
/logg-inn), beholdt for gamle bokmerker. Gammel LoginForm slettet.
Alle ~11 uautentisert-redirect-steder (committet i forrige commit)
pekte allerede til /logg-inn.
Én reell bug funnet og rettet under scratch-verifisering:
app/logg-inn/page.tsx kalte redirect() INNI en try/catch som fanget
Next.js sin egen NEXT_REDIRECT-kontrollflyt-exception stille -- en
allerede innlogget bruker fikk se innloggingsskjemaet på nytt i stedet
for å bli sendt videre. Rettet ved å flytte redirect()-kallet utenfor
try/catch, samme mønster som den opprinnelige /-siden alltid brukte.
Se CHANGELOG.md punkt 42 for full verifiseringsdetalj.
2026-08-08 12:34:50 +02:00
|
|
|
// Obligatorisk profil-fullføring (2026-07-22): en innlogget bruker som
|
|
|
|
|
// ennå ikke har fylt ut de obligatoriske profilfeltene sendes til
|
|
|
|
|
// /account (som selv viser en fokusert fullførings-visning) i stedet
|
|
|
|
|
// for dashbordet -- se AccountSettings sin profile_complete-gren.
|
|
|
|
|
//
|
|
|
|
|
// /logg-inn overtok rollen som ekte innloggingsside 2026-08-08 (se
|
|
|
|
|
// CHANGELOG.md) -- denne siden (root) er nå bare en tynn videresending,
|
|
|
|
|
// beholdt for gamle bokmerker/lenker til teecup.golf/. Selve
|
|
|
|
|
// innloggingsskjemaet (LoginForm, Forest Green) er fjernet -- erstattet
|
|
|
|
|
// av TeeCupAuth (clubhouse-palett) på /logg-inn.
|
|
|
|
|
redirect(authenticated ? (profileComplete ? "/dashboard" : "/account") : "/logg-inn")
|
2026-07-17 21:40:42 +02:00
|
|
|
}
|