Deel 2
Deel 2
Tijdens deel 2 van het project voeg je CRUD-acties toe voor alle tabellen in de database die gevalideerd worden met Zod en enkel beschikbaar zijn voor geauthenticeerde en geautoriseerde gebruikers (met uitzondering van het registeren/inloggen van een gebruiker).
Voor elk van de tabellen moeten read, create, update en delete operaties voorzien zijn. Je mag hier enkel van afwijken als je meer dan 8 tabellen hebt in je database.
Read operaties
Je maakt verplicht gebruik van server components om data op te halen en te tonen op je webpagina. Enkel in heel specifieke situaties, die je goed kan beargumenteren op het mondeling examen, mag je een API-route gebruiken om data op te halen.
Formulieren
De formulieren die je gebruikt om de CRUD-operaties te implementeren moeten verplicht gebruik maken van react-hook_form, Zod, server functions en server actions.
De formulieren moeten zowel client-side als server-side gevalideerd worden, hiervoor maak je verplicht gebruik van Zod schema's.
Voor formulieren die ingestuurd worden via API-routes krijg je geen punten.
Validatie
We verwachten dat je correct gebruik maakt van Zod, dit betekent dat je schema's hergebruikt, combineert, specifieert, ... Als je voor elke operatie volledig nieuwe schema's bouwt, zul je hier aanzienlijk wat punten mee verliezen. Je moet dus gebruik maken van de extend, merge, pick, omit, ... methodes.
Logging
Voor elke operaties moeten logs aanwezig zijn, hiervoor gebruik je Pino. We willen minstens het volgende loggen:
- Operatie is gestart (inclusief de naam van de operatie, voor generische namen zoals "server function" verlies je punten)
- Eventuele foutmeldingen
- Belangrijke events in de operatie (user aangemaakt, sessie gestart, gefaalde login pogingen, ...)
- Operatie is beëindigd, inclusief de tijd die hiervoor nodig was
Elk van de logs moet een requestId, pad en methode bevatten, in het geval dat het request gedaan wordt door een ingelogde gebruiker voeg je ook het userId en sessionId toe.
Voor request naar statische assets zoals afbeeldingen, mag geen log statement uitgeprint worden.
Loggen gebeurd op een verschillende manier, afhankelijk van de environment. In development logt Pino naar de terminal, in productie naar een bestand.
Authenticatie & autorisatie
Elke pagina in de applicatie moet afgeschermd worden zodat enkel geauthenticeerde en geautoriseerde gebruikers toegang hebben tot pagina's, server functions en route handlers.
Je implementeert deze authenticatie via een JSON Web Token die in een veilig HTTP-only cookie bewaard wordt. Deze token moet alle informatie over de gebruiker en sessie bevatten.
Je gebruikt een twee-staps-proces om de bevoegdheid van de gebruiker te valideren
- Read operaties worden in eerste instantie gevalideerd in een proxy functie die de database enkel aanspreekt in uitzonderlijke gevallen en meestal werkt op basis van de data in de JWT.
- Indien een pagina informatie over de gebruiker nodig heeft, controleer je de geldigheid van de sessie via de database. Dit mag echter enkel gebeuren in het Next process en niet in de proxy functie.
- Create, delete of update operaties moeten altijd via de database gevalideerd worden.