De applicatie is een klassieke monolithische Express-app. De frontend is statisch (gekopieerd bij deploy), de API draait op dezelfde origin. Geen CDN, geen aparte proxy: alles via één platform.
static()./api/* endpoints aan. JWT-token wordt meegestuurd als Bearer header (opgeslagen in localStorage + cookie).requireAuth verifieert het JWT-token en controleert de sessie-tabel in PostgreSQL. requireAdmin controleert ook is_admin = TRUE.
De scheduler detecteert of er live wedstrijden zijn door elke 5 minuten de
matches-tabel te controleren op status IN_PLAY of PAUSED.
De dagelijkse update-mail triggert automatisch zodra alle wedstrijden van de dag
status FINISHED hebben: niet op een vaste tijd. De verificatie tegen
FotMob/api-football draait mee in de nachtelijke sync en bij elke handmatige admin-sync.
Magic links zijn 30 minuten geldig en eenmalig bruikbaar. Na verificatie wordt een JWT-token
aangemaakt (30 dagen geldig) dat opgeslagen wordt in zowel localStorage als een
httpOnly-achtige cookie voor maximale compatibiliteit.
De scoring-logica verwerkt elke FINISHED-wedstrijd en berekent punten voor alle openstaande voorspellingen.
Poule-eindstand (10/6/3 ptn) en toernooi-voorspellingen (kampioen 15 ptn, topscorer 10 ptn) worden apart verwerkt. Resultaten worden opgeslagen en geaggregeerd in de ranglijst-view.
frontend/.git push → GitHubmain branch op GitHub.