#heading[Klassediagram]

In dit hoofdstuk wordt een logisch klassediagram gepresenteerd dat de belangrijkste domeinmodellen (typen) van Serengo samenvat. Hoewel de implementatie in TypeScript + Drizzle ORM gebeurt in plaats van klassieke OOP-klassen, kunnen we de structuur voorstellen als een verzameling klassen met velden en relaties. Dit klassediagram sluit nauw aan op het ERD, maar benadrukt vooral de verantwoordelijkheid per type in de applicatielogica.

== Overzicht van domeinmodellen

De kernmodellen zijn:

- *User*
  - Velden: id, naam, e-mailadres, avatar/profielfoto, aanmaakdatum, OAuth-gegevens.
  - Verantwoordelijkheid: vertegenwoordigt een eindgebruiker; koppelt naar sessies, find-activiteit en sociale relaties.

- *Location*
  - Velden: id, naam, beschrijving (optioneel), coördinaten (latitude, longitude), type/categorie.
  - Verantwoordelijkheid: beschrijft een fysieke plaats op de kaart waarop meerdere finds kunnen worden geprojecteerd.

- *Find*
  - Velden: id, eigenaar (user-id), location-id, titel, beschrijving, privacy-instelling, timestamps, verwijzingen naar media.
  - Verantwoordelijkheid: vormt de kern-"post" in de applicatie: een verhaal + media gekoppeld aan een locatie.

- *MediaItem*
  - Velden: id, find-id, type (afbeelding/video), url (naar R2), fallback-url, metadata (bijv. formaat, grootte).
  - Verantwoordelijkheid: encapsuleert één mediabestand; zorgt voor scheiding tussen inhoud (find) en opslag (R2).

- *Comment*
  - Velden: id, find-id, user-id, inhoud, aanmaakdatum.
  - Verantwoordelijkheid: laat gebruikers reageren op finds; gekoppeld aan de API-sync-laag voor realtime updates.

- *Like*
  - Velden: id, find-id, user-id, timestamp.
  - Verantwoordelijkheid: registreert een "vind-ik-leuk"-actie op een find.

- *Rating*
  - Velden: id, find-id, user-id, waarde (1–5), timestamp.
  - Verantwoordelijkheid: legt een expliciete beoordeling van een find vast, los van likes.

- *Friendship*
  - Velden: id, requester-id, addressee-id, status (pending, accepted, rejected), timestamps.
  - Verantwoordelijkheid: modelleert de vriendrelatie en vormt de basis voor privacy-bewuste filtering.

- *Notification* (logisch model bovenop meerdere DB-tabellen)
  - Velden: id, user-id, type (like, comment, friend-request, ...), payload, status (gelezen/ongelezen).
  - Verantwoordelijkheid: representeert een gebeurtenis die aan de gebruiker wordt gecommuniceerd; gebruikt samen met subscription- en preference-modellen voor Web Push.

== Relatie met frontend en stores

In de frontend worden deze modellen gebruikt in Svelte-componenten en Svelte stores:

- In `src/lib/stores/api-sync.ts` wordt een typesafe representatie van finds, comments, likes en ratings bijgehouden.
- Components in `src/lib/components/finds/` en `src/lib/components/map/` ontvangen deze modellen via props en renderen ze in de UI.
- Door overal TypeScript-typen te gebruiken, blijven de klassediagram-concepten consistent tussen database, serverlogica en frontend.

Het klassediagram helpt zo om de logische structuur van de applicatie in één oogopslag te begrijpen en vormt een brug tussen het relationele ERD en de concrete implementatie in TypeScript en Svelte.