UC-LLN-FP-003 — Populaire categorieën en oefeningen tonen
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-FP-003 |
| Naam | Populaire categorieën en oefeningen tonen |
| Domein | Leerling / Frontpage en niveaucontext |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, routeguard, autorisatielaag, database, frontpage-readmodel |
| Rolcontext | Ingelogde gebruiker met rol Leerling en een geldige of te herstellen niveaucontext. |
| Betrokken schermen | Leerling-frontpage, leerlingnavigatie, frontpageblokken, routeguard voor leerlingroutes. |
| Gerelateerde usecases | UC-LLN-FP-001 — Leerling-frontpage bekijken; UC-LLN-FP-002 — Actieve niveaucontext toepassen; UC-LLN-TOEG-001 — Beschikbare categorieën bekijken; UC-LLN-TOEG-002 — Beschikbare oefeningen bekijken; UC-LLN-RES-001 — Resultaat na afronding bekijken |
| Primaire entiteiten | ExerciseRuns, TeacherLevels, TeacherLevelCategories, Categories, TeacherLevelCategoryExercises, Exercises |
| Secundaire entiteiten / events | Populaire-categorieënreadmodel |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe het blok Populaire categorieën op de leerling-frontpage wordt samengesteld. Het blok is een afgeleid overzicht op basis van afgeronde exercise runs binnen de actuele, toegankelijke niveaucontext van de leerling. Het doel is de leerling snel terug te leiden naar veelgebruikte categorieën en oefeningen zonder een apart populariteitsmodel of cachetabel als bron van waarheid te introduceren.
Alleen categorieën tellen mee waarvoor de leerling op dat moment binnen het actieve niveau toegang heeft. Populariteit wordt bepaald op basis van het aantal afgeronde exercise runs binnen die context. Onder elke populaire categorie worden maximaal drie populaire oefeningen getoond, eveneens afgeleid uit afgeronde runs binnen hetzelfde actieve niveau en dezelfde toegankelijke context.
Het blok is presentatief en oriënterend. Klikken op een populaire categorie of oefening blijft een normale vervolgactie waarbij categorie- en oefeningtoegang opnieuw server-side worden gecontroleerd. Als er nog geen afgeronde runs zijn of als eerder populaire inhoud niet langer toegankelijk is, toont het systeem geen misleidende populaire ingang.
3. Scope
Deze usecase omvat wel:
- bepalen van populaire categorieën voor de ingelogde leerling
- tellen van afgeronde exercise runs binnen actuele niveaucontext
- filteren op actuele toegang tot categorieën en oefeningen
- tonen van maximaal drie populaire oefeningen per categorie
- tonen van een lege of beperkte staat wanneer geen populaire data beschikbaar is
- voorkomen van aparte frontpage- of populariteitscache als bron
Deze usecase omvat niet:
- instellen van een verplicht niveau; dat hoort bij UC-GEN-PROF-003
- aanmaken of wijzigen van categorieën, oefeningen of niveaus
- toekennen of intrekken van niveauautorisaties
- starten, genereren of afronden van een oefening
- uitwerken van resultaten, geschiedenis of PDF-export
- uitwerken van systeemnotificaties; die lopen via UC-GEN-NOT-001 t/m UC-GEN-NOT-003
- opslaan van een aparte frontpagecache of frontpagebronrecord
DRY-afbakening voor deze usecase: profielbeheer, docentbeheer, relatievorming, systeemnotificaties en oefenuitvoering blijven bij hun eigen usecases. Deze frontpageusecase gebruikt alleen de uitkomsten daarvan als input of vervolgcontext.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is succesvol ingelogd. |
| PRE-002 | De gebruiker heeft de rol Leerling als actieve rolcontext. |
| PRE-003 | De backend kan de actuele account- en sessiecontext server-side bepalen. |
| PRE-004 | De relevante frontpage-, niveau- en oefendata zijn beschikbaar voor uitlezing. |
| PRE-005 | Routeguard en autorisatielaag vertrouwen niet op clientstate als autorisatiebron. |
| PRE-006 | Bestaande profiel- en accountflows zijn beschikbaar voor herstel van ontbrekende context. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De leerling ziet alleen informatie die binnen de actuele server-side context zichtbaar mag zijn. |
| POST-002 | Er is geen nieuwe frontpage-, sessie- of cache-entiteit aangemaakt. |
| POST-003 | Ontbrekende of ongeldige context leidt niet tot misleidende frontpageweergave. |
| POST-004 | Vervolgacties blijven onderhevig aan eigen server-side toegangscontrole. |
| POST-005 | Er zijn geen rollen, relaties, autorisaties, oefeningen of oefenruns aangemaakt of gewijzigd. |
| POST-006 | Eventuele lege staten zijn veilig en verwijzen niet naar ongeautoriseerde inhoud. |
6. Trigger
De usecase start wanneer de leerling-frontpage het blok Populaire categorieën moet vullen.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | OefenHub frontend | Leerling-frontpage | Vraagt populaire categorieën op. | Backend start met sessie- en contextcontrole. | Geen client-side populariteitsberekening. |
| 2 | OefenHub backend | Sessiecontext | Controleert actieve leerlingcontext. | Alleen geldige leerlingcontext gaat verder. | Users.Id uit sessie. |
| 3 | OefenHub backend | Niveaucontextresolver | Past actuele niveaucontext toe. | Alle tellingen worden tot dit niveau beperkt. | UC-LLN-FP-002. |
| 4 | OefenHub backend | Toegangscontrole | Bepaalt toegankelijke categorieën. | Niet-toegankelijke categorieën tellen niet mee. | UC-LLN-TOEG-001. |
| 5 | OefenHub backend | ExerciseRuns | Selecteert afgeronde runs van de leerling binnen de context. | Alleen afgeronde runs blijven over. | CompletedAtUtc / afgeronde status vereist. |
| 6 | OefenHub backend | Aggregatie | Groepeert runs per categorie. | Categorieën krijgen populariteitsscore. | Aantal afgeronde runs per categorie. |
| 7 | OefenHub backend | Aggregatie | Bepaalt per populaire categorie maximaal drie oefeningen. | Oefeningen worden gerangschikt binnen categorie. | Aantal afgeronde runs per oefening. |
| 8 | OefenHub backend | Actuele toegang | Controleert of categorie en oefening nog actueel zichtbaar/startbaar zijn. | Niet-actuele items vallen uit het blok. | Geen historische categorie als actuele ingang. |
| 9 | OefenHub backend | Readmodel | Bouwt compacte weergave met naam, icoon, kleur en oefeningen. | Frontend ontvangt afgeleid blok. | Geen persistente cache. |
| 10 | OefenHub frontend | Populaire-categorieënblok | Toont het blok of lege staat. | Leerling ziet actuele populaire ingangen. | Geen datamutatie. |
| 11 | Leerling | Populaire-categorieënblok | Klikt eventueel op categorie of oefening. | Vervolgusecase controleert toegang opnieuw. | UC-LLN-TOEG-002 / UC-LLN-TOEG-003. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 3 | Geen geldige niveaucontext | Blok wordt niet opgebouwd; frontpage gebruikt bestaande herstelroute. | Niet van toepassing | Geen |
| ALT-002 | 5 | Geen afgeronde runs binnen actieve context | Blok wordt niet getoond of toont neutrale lege staat. | Componentmelding / lege staat | Geen |
| ALT-003 | 8 | Historisch populaire categorie is niet langer toegankelijk | Categorie wordt niet als actuele ingang getoond. | Niet van toepassing | Geen |
| ALT-004 | 8 | Populaire oefening is in onderhoud of niet actief | Oefening valt uit de lijst; categorie kan blijven als andere actieve oefeningen bestaan. | Niet van toepassing | Geen |
| ALT-005 | 7 | Minder dan drie oefeningen beschikbaar | Systeem toont alleen de beschikbare oefeningen. | Niet van toepassing | Geen |
| ALT-006 | 11 | Leerling opent een oude populaire link | Oefeningstoegang wordt opnieuw gecontroleerd en zo nodig geblokkeerd. | Routeguard / componentmelding | Geen |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Populariteit op de leerling-frontpage wordt afgeleid uit afgeronde exercise runs van de huidige leerling. |
| BR-002 | Alle populariteit wordt begrensd tot de actuele actieve niveaucontext. |
| BR-003 | Alleen inhoud die actueel toegankelijk is mag als populaire ingang worden getoond. |
| BR-004 | Onder een populaire categorie worden maximaal drie populaire oefeningen getoond. |
| BR-005 | Het populariteitsblok maakt geen nieuwe cache- of samenvattingstabel aan. |
| BR-006 | Historische oefenresultaten mogen blijven bestaan, maar geven niet automatisch actuele starttoegang. |
| BR-007 | Frontendweergave mag nooit zwaarder wegen dan server-side autorisatie. |
| BR-008 | Een frontpageblok mag geen persoonsgegevens of technische identifiers tonen die niet functioneel nodig zijn. |
| BR-009 | Een lege staat mag geen automatische domeinmutatie veroorzaken. |
| BR-010 | Alle teller- en samenvattingswaarden moeten eenduidig zijn afgeleid uit bronrecords en filters. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| Exercise run | Moet afgerond zijn en bij de ingelogde leerling horen. |
| Niveaucontext | Moet overeenkomen met het actieve niveau van de frontpage. |
| Categorie | Moet actueel toegankelijk zijn binnen de context. |
| Oefening | Moet actief en zichtbaar/startbaar zijn binnen de context. |
| Aantal oefeningen | Maximaal drie per getoonde populaire categorie. |
| Frontpagecontext | Moet per request opnieuw uit server-side context worden afgeleid. |
| Clientstate | Mag alleen ondersteunend zijn en nooit autorisatie bepalen. |
| Lege staat | Moet functioneel neutraal zijn en geen verborgen of ongeautoriseerde data lekken. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| Gehele usecase | Geen domeinmutatie | Niet van toepassing | De usecase leest bestaande bronrecords en stelt een transient readmodel samen; er wordt geen functioneel domeinevent vastgelegd. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
ExerciseRuns | Tellen en groeperen wijzigt geen runs. |
Categories | Categorie-identiteit wordt alleen gelezen. |
Exercises | Oefeningen worden alleen gelezen. |
| Populariteitscache | Er wordt geen aparte persistente populariteitscache aangemaakt. |
UserSettings | De populariteitsweergave wijzigt geen voorkeuren of niveaukeuze. |
UserRoles | Frontpagecontext wijzigt geen roltoekenningen. |
SystemNotifications | Notificaties worden in generieke notificatieusecases verwerkt. |
13. State diagram
Niet van toepassing. Deze usecase wijzigt geen persistent statusobject. De weergegeven frontpage- of bloktoestand is afgeleid uit account-, niveau-, oefen- en rungegevens en vormt geen zelfstandige lifecycle.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Populaire categorieën berekenen
16.2 Klik op populaire oefening
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Gehele usecase | Deze usecase gebruikt routeguard-, component- of lege-staatgedrag en introduceert geen popupregister-popup. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Functioneel Ontwerp beschrijft de leerling-frontpage, actieve niveaucontext, frontpageblokken, lege toestanden en zichtbare vervolgacties. |
| Technisch Ontwerp | Technisch Ontwerp: rolflows, readmodels, tellers en badges en frontend-compositie beschrijft de technische afbakening, server-side brondata, autorisatie en UI-compositie voor deze usecase. |
| Software Requirements Specification | Software Requirements Specification bevat centrale eisen en acceptatiecriteria voor contextcontrole, frontpageweergave, readmodels en veilige lege toestanden. |
| Database-informatie | Database-informatie blijft bron voor onderliggende tabellen, readmodelbronnen en soft-link/snapshotregels; deze usecases introduceren geen eigen frontpagetabel. |
| Ontwerpbronnen | Ontwerpbronnen bevatten aanvullende businessregels voor frontpageblokken, contextafleiding en zichtbare acties. |
19. SRS-trace
Deze usecase bevat geen normatieve requirementtekst. De centrale eis en acceptatiecriteria staan in de SRS; onderstaande tabel koppelt de usecase-afleiding alleen aan centrale SRS-*- en AC-*-items.
| Usecase-afleiding | Dekt | Usecasecontext |
|---|---|---|
REQ-UC-LLN-FP-003-001 | SRS-RDM-001 SRS-RDM-005 SRS-RDM-006 SRS-CAT-006 SRS-LRN-005 AC-RDM-001 AC-RDM-005 AC-RDM-006 AC-CAT-006 AC-LRN-005 | Populaire categorieën afleiden uit afgeronde exercise runs binnen de actuele leerlingniveaucontext |
REQ-UC-LLN-FP-003-002 | SRS-CAT-001 SRS-LRN-009 SRS-NFR-PER-001 AC-CAT-001 AC-LRN-009 AC-NFR-PER-001 | Onder elke populaire categorie maximaal drie populaire oefeningen tonen |
REQ-UC-LLN-FP-003-003 | SRS-ACC-003 SRS-ACC-005 SRS-CAT-001 SRS-LRN-009 SRS-NFR-ACC-001 AC-ACC-003 AC-ACC-005 AC-CAT-001 AC-LRN-009 AC-NFR-ACC-001 | Niet langer toegankelijke categorieën of oefeningen uitsluiten van populaire frontpage-ingangen |
REQ-UC-LLN-FP-003-004 | SRS-LRN-009 AC-LRN-009 | Voor dit blok geen aparte bron- of cachetabel vereisen |
REQ-UC-LLN-FP-003-005 | SRS-RDM-001 SRS-RDM-009 SRS-LRN-009 SRS-NFR-SEC-001 AC-RDM-001 AC-RDM-009 AC-LRN-009 AC-NFR-SEC-001 | Een veilige lege staat ondersteunen wanneer er geen populaire gegevens beschikbaar zijn |