UC-LLN-TOEG-001 — Beschikbare categorieën bekijken
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-TOEG-001 |
| Naam | Beschikbare categorieën bekijken |
| Domein | Leerling / Oefenaanbod en toegang |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, autorisatielaag, database, categorie-readmodel, routeguard |
| Rolcontext | Ingelogde gebruiker met rol Leerling en een geldige of opnieuw te bepalen actieve niveaucontext. |
| Betrokken schermen | Leerlingnavigatie, leerling-frontpage, categoriecomponent, oefenaanbodcomponent, routeguard voor leerlingroutes. |
| Gerelateerde usecases | UC-LLN-TOEG-002 — Beschikbare oefeningen bekijken; UC-LLN-TOEG-003 — Oefeningstoegang controleren bij openen; UC-LLN-TOEG-005 — Open niveau gebruiken; UC-LLN-TOEG-006 — Privéniveau gebruiken via autorisatie; UC-LLN-FP-001 — Leerling-frontpage bekijken; UC-GEN-PROF-003 — Verplicht niveau instellen |
| Primaire entiteiten | Users, UserSettings, TeacherLevels, TeacherLevelCategories, Categories, TeacherStudentLevelAccess, UserRelationships |
| Secundaire entiteiten / events | TeacherLevelCategoryExercises, Exercises, ExerciseModules |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een leerling de beschikbare categorieën binnen de actuele leerlingcontext bekijkt. De categorieën die zichtbaar worden, zijn geen vrij opvraagbare catalogus, maar een server-side afgeleide selectie op basis van de ingelogde leerling, het actieve niveau, actieve docent- leerlingcontext, eventuele open-niveauregels, actieve categorie-koppelingen en actieve onderliggende oefeningen.
De leerlingnavigatie toont alleen categorieën die functioneel beschikbaar zijn om verder naar oefeningen
te gaan. Een centrale categorie kan dus bestaan in Categories, maar toch niet zichtbaar zijn voor een
specifieke leerling wanneer de categorie niet aan het actieve niveau is gekoppeld, de niveaucontext niet
meer toegankelijk is, de categorie-koppeling inactief is of er binnen die categorie geen actieve
onderliggende oefening meer beschikbaar is. Frontend-zichtbaarheid is hierbij uitsluitend presentatie; de
backend blijft bron voor de toegangsbeslissing.
Deze usecase maakt geen nieuwe categorieën, geen nieuwe autorisaties en geen oefenruns aan. Het doel is alleen het bepalen en tonen van de toegestane categorie-ingangen voor de leerling. Wanneer geen categorieën beschikbaar zijn, toont de interface een lege staat of vervolgroute, zonder dat het systeem automatisch een niveau, categorie of autorisatie verzint.
3. Scope
Deze usecase omvat wel:
- laden van beschikbare categorieën voor de ingelogde leerling
- bepalen van de actuele niveaucontext voor categoriequeries
- server-side filteren op toegankelijke niveaus, actieve categorie-koppelingen en actieve onderliggende oefeningen
- tonen van categorie-identiteit zoals naam, icoon en kleur vanuit het centrale categoriemodel
- respecteren van sortering binnen het docentniveau waar die beschikbaar is
- tonen van een lege staat wanneer geen categorieën beschikbaar zijn
- blokkeren van categorieën buiten de toegestane leerlingcontext
- doorverwijzen naar bestaande profiel- of accountflows wanneer niveaucontext ontbreekt
Deze usecase omvat niet:
- aanmaken, wijzigen, migreren of verwijderen van categorieën
- docentbeheer van niveaus en categorieën
- beheerderacties rond centrale categorie-identiteit
- starten of genereren van een oefening
- tonen van volledige oefeningdetails
- wijzigen van niveauautorisaties
- maken of accepteren van relaties
- instellen van verplicht niveau zelf; dat hoort bij de profielusecase
- opslaan van een frontpage-specifieke cachetabel
DRY-afbakening voor deze usecase: beheer van niveaus, categorieën, oefeningen, relaties en autorisaties blijft bij de daarvoor bedoelde docent-, beheerder-, profiel- en relatieusecases. Deze usecase gebruikt de uitkomst daarvan als toegangsvoorwaarde en maakt die processen niet opnieuw bronhoudend.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is succesvol ingelogd en heeft de rol Leerling. |
| PRE-002 | Er is een actuele leerlingcontext beschikbaar of deze kan server-side worden bepaald. |
| PRE-003 | De leerling heeft een geselecteerd of afleidbaar actief niveau, tenzij de flow naar verplichte niveaukeuze moet gaan. |
| PRE-004 | De backend kan toegankelijke niveaus bepalen op basis van open-niveauregels of actieve niveauautorisatie. |
| PRE-005 | Categorieën, niveau-categorie-koppelingen en onderliggende oefenkoppelingen zijn beschikbaar als brondata. |
| PRE-006 | Routeguard en autorisatielaag vertrouwen niet op clientstate als bron voor categoriezichtbaarheid. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De leerling ziet alleen categorieën die binnen de actuele leerlingcontext beschikbaar zijn. |
| POST-002 | Categorieën zonder actieve onderliggende oefenmogelijkheid worden niet als startbare categorie getoond. |
| POST-003 | De getoonde categorienaam, kleur en icoon komen uit het centrale categoriemodel. |
| POST-004 | Er zijn geen categorieën, relaties, autorisaties of oefenruns aangemaakt. |
| POST-005 | Wanneer de niveaucontext ontbreekt of ongeldig is, is geen misleidende categoriecatalogus getoond. |
| POST-006 | Wanneer geen categorieën beschikbaar zijn, is een veilige lege staat of bestaande vervolgroute getoond. |
| POST-007 | Eventuele vervolgactie naar oefeningen moet opnieuw server-side worden gecontroleerd. |
6. Trigger
De usecase start wanneer de leerling de leerling-frontpage, categorienavigatie of oefenaanbodroute opent en de frontend categorieën voor de actuele leerlingcontext moet tonen.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Leerling-frontpage / navigatie | Opent de leerlingomgeving of categorieoverzicht. | Frontend vraagt categorieën op voor de actuele leerlingcontext. | Geen client-side categoriecatalogus als bron. |
| 2 | OefenHub frontend | Categoriecomponent | Stuurt een categoriequery naar de backend. | Backend ontvangt alleen sessiecontext en optionele routecontext. | UserId en rolcontext komen uit sessie, niet uit routeparameter. |
| 3 | OefenHub backend | Routeguard / autorisatielaag | Controleert of de gebruiker actief leerling is. | Niet-leerlingcontext wordt geblokkeerd of naar juiste context geleid. | Leerlingrol mag niet gecombineerd zijn met ouder/docent/beheerder. |
| 4 | OefenHub backend | Niveaucontextresolver | Bepaalt het actieve niveau van de leerling. | Geselecteerd niveau wordt gevalideerd of een geldige context wordt afgeleid. | UserSettings.SelectedTeacherLevelId mag niet blind worden vertrouwd. |
| 5 | OefenHub backend | Toegangscontrole | Controleert of het niveau toegankelijk is. | Alleen toegankelijke open of geautoriseerde niveaus blijven over. | Open niveau of TeacherStudentLevelAccess + actieve relatie. |
| 6 | OefenHub backend | Databasequery | Haalt actieve TeacherLevelCategories voor het niveau op. | Inactieve of niet-gekoppelde categorieën vallen af. | TeacherLevelCategories.IsActive = true. |
| 7 | OefenHub backend | Databasequery | Controleert aanwezigheid van actieve onderliggende oefenkoppelingen. | Categorieën zonder actieve oefening worden niet als startbare categorie getoond. | TeacherLevelCategoryExercises.IsActive en Exercises.IsActive. |
| 8 | OefenHub backend | Categoriemodel | Leest centrale categorienaam, kleur en icoon. | Response bevat alleen presentatievelden die de leerling mag zien. | Naam/kleur/icoon uit Categories. |
| 9 | OefenHub backend | Readmodel / sortering | Sorteert categorieën volgens niveaucontext. | Frontend ontvangt geordende toegestane lijst. | SortOrder is presentatielogica. |
| 10 | OefenHub frontend | Categoriecomponent | Toont de categorieën in navigatie of overzicht. | Leerling ziet alleen toegestane categorie-ingangen. | Geen datamutatie. |
| 11 | Leerling | Categoriecomponent | Kan een categorie kiezen. | Vervolg naar UC-LLN-TOEG-002. | Oefeningen worden opnieuw server-side bepaald. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 3 | Gebruiker heeft geen actieve leerlingrol. | Routeguard blokkeert leerlingcategorieën en leidt naar bestaande account-/contextafhandeling. | Geen popupregister-popup. | Geen. |
| ALT-002 | 4 | Er is geen geselecteerd of afleidbaar niveau. | Systeem leidt naar bestaande verplichte niveauflow of toont beperkte context zonder categorieën. | Geen nieuwe popupkey. | Geen. |
| ALT-003 | 4 | Geselecteerd niveau bestaat niet meer of is inactief. | Systeem beschouwt de niveaucontext als ongeldig en bepaalt opnieuw of een alternatief gekozen moet worden. | Componentmelding of bestaande profielroute. | Geen categorie-mutatie. |
| ALT-004 | 5 | Niveau is niet toegankelijk voor deze leerling. | Categoriequery retourneert geen categorieën voor dit niveau en routeguard voorkomt doorgebruik. | Geen popupregister-popup. | Geen. |
| ALT-005 | 6 | Geen actieve categorie-koppelingen binnen het niveau. | Frontend toont een lege staat voor oefenaanbod. | Leegstaatcomponent. | Geen. |
| ALT-006 | 7 | Categorie heeft geen actieve onderliggende oefening. | Categorie wordt niet getoond als startbare ingang. | Geen. | Geen. |
| ALT-007 | 8 | Centrale categorie is gedeactiveerd of gemigreerd. | Categorie wordt niet nieuw aangeboden, tenzij historische context elders expliciet nodig is. | Geen. | Geen. |
| ALT-008 | 9 | SortOrder ontbreekt of bevat gelijke waarden. | Systeem gebruikt stabiele fallbacksortering zonder inhoud te verbergen. | Geen. | Geen. |
| ALT-009 | 10 | Frontend had nog oude categorieën in cache. | Backendresponse overschrijft oude weergave; clientcache is niet leidend. | Geen. | Geen. |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Een leerling mag alleen categorieën zien binnen een niveau dat op dat moment voor die leerling toegankelijk is. |
| BR-002 | Frontend-zichtbaarheid van categorieën is nooit voldoende autorisatie voor het openen van oefeningen. |
| BR-003 | Een categorie wordt alleen als startbare leerlingcategorie getoond wanneer binnen die niveau-categorie minimaal één actieve oefening beschikbaar is. |
| BR-004 | Naam, kleur en icoon van een categorie worden centraal uit Categories gelezen en niet per leerlingcontext aangepast. |
| BR-005 | TeacherLevelCategories.IsActive is een afgeleide operationele vlag en wordt niet door de leerling gewijzigd. |
| BR-006 | Een lege categorie-lijst veroorzaakt geen automatische toekenning van niveauautorisatie. |
| BR-007 | Een ontbrekend verplicht niveau wordt niet stilzwijgend ingevuld door de categorieflow. |
| BR-008 | Categoriequeries filteren altijd server-side op de ingelogde leerling. |
| BR-009 | Historische categoriecontext van afgeronde runs hoort bij geschiedenis en niet bij het actuele oefenaanbod. |
| BR-010 | Deze usecase maakt geen relaties, uitnodigingen, systeemberichten of oefenruns aan. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| Leerlingcontext | Moet uit de server-side sessie komen en rol Leerling bevatten. |
| Actief niveau | Moet bestaan, actief zijn en toegankelijk zijn voor de leerling. |
| Open niveau | Mag alleen als actuele context worden gebruikt wanneer het niveau functioneel als open beschikbaar is. |
| Privéniveau | Vereist actieve docent-leerlingrelatie en actieve niveauautorisatie. |
| Categorie-koppeling | Moet actief gekoppeld zijn aan het actuele niveau. |
| Categorie-identiteit | Moet bestaan in Categories en niet als nieuwe leerlingwaarde worden aangemaakt. |
| Onderliggende oefening | Minimaal één actieve oefenkoppeling en actieve oefening is vereist voor zichtbaarheid als startbare categorie. |
| Routeparameters | Mogen de server-side leerlingcontext niet vervangen. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 1 | Read | Users / sessiecontext | Ingelogde leerling wordt bepaald. |
| 4 | Read | UserSettings | Geselecteerde niveaucontext wordt gelezen en gevalideerd. |
| 5 | Read | TeacherLevels, TeacherStudentLevelAccess, UserRelationships | Toegankelijke niveaus worden bepaald. |
| 6 | Read | TeacherLevelCategories | Actieve categorie-koppelingen worden opgehaald. |
| 7 | Read | TeacherLevelCategoryExercises, Exercises | Categorieën zonder actieve oefening worden uitgefilterd. |
| 8 | Read | Categories | Naam, kleur en icoon worden gelezen. |
Deze usecase kent geen persistente domeinevents. Het samenstellen van de categorielijst is readmodelgedrag binnen de actuele leerlingcontext.
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
Categories | Leerling bekijkt centrale categorieën maar wijzigt ze niet. |
TeacherLevelCategories | Zichtbaarheid wordt gelezen, niet handmatig aangepast. |
TeacherStudentLevelAccess | Deze usecase kent geen niveauautorisatie toe. |
UserRelationships | Deze usecase maakt of beëindigt geen docent-leerlingrelatie. |
UserSettings | Categorieën bekijken wijzigt het geselecteerde niveau niet. |
ExerciseRuns | Er wordt nog geen oefening gestart. |
SystemMessages | Lege staten of blokkades maken geen systeembericht aan. |
13. State diagram
Niet van toepassing. Deze usecase raakt geen persistent statusobject met een eigen lifecycle. Toegang en zichtbaarheid worden afgeleid uit actuele niveaucontext, autorisaties, actieve relaties en contentstatussen.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Niet van toepassing | Deze usecase gebruikt routeguard-, leegstaat- of componentgedrag en geen popupregister-popup. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Functioneel Ontwerp beschrijft zichtbaar oefenaanbod, niveaucontext, categorie-/oefeningtoegang en veilige blokkades. |
| Technisch Ontwerp | Technisch Ontwerp: autorisatie en contextcontrole, oefencatalogus, readmodels en frontend-routing 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 aanbodfiltering, server-side autorisatie, blokkades en geen ongewenste datamutaties. |
| Database-informatie | Database-informatie blijft bron voor catalogus-, autorisatie- en soft-linkrelaties waarmee zichtbaar aanbod server-side wordt bepaald. |
| Ontwerpbronnen | Ontwerpbronnen bevatten aanvullende businessregels voor oefenaanbod, niveaus, categorieën en autorisatiegrenzen. |
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-TOEG-001-001 | SRS-AUTH-001 SRS-RDM-001 SRS-RDM-005 SRS-CAT-001 SRS-LRN-009 AC-AUTH-001 AC-RDM-001 AC-RDM-005 AC-CAT-001 AC-LRN-009 | Categorieën voor leerlingen server-side filteren op actuele leerlingcontext |
REQ-UC-LLN-TOEG-001-002 | 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 | Alleen categorieën tonen binnen een voor de leerling toegankelijk niveau |
REQ-UC-LLN-TOEG-001-003 | SRS-CAT-001 SRS-LRN-001 AC-CAT-001 AC-LRN-001 | Categorieën zonder actieve onderliggende oefening niet als startbare categorie tonen |
REQ-UC-LLN-TOEG-001-004 | SRS-CAT-002 SRS-LRN-009 AC-CAT-002 AC-LRN-009 | Categorienaam, kleur en icoon lezen uit de centrale categoriebron |
REQ-UC-LLN-TOEG-001-005 | SRS-AUTH-001 SRS-CAT-001 SRS-LRN-009 AC-AUTH-001 AC-CAT-001 AC-LRN-009 | Bij categorieën bekijken geen niveauautorisatie aanmaken of wijzigen |
REQ-UC-LLN-TOEG-001-006 | SRS-CAT-006 SRS-LRN-009 SRS-NFR-SEC-001 AC-CAT-006 AC-LRN-009 AC-NFR-SEC-001 | Ontbrekende of ongeldige niveaucontext veilig afhandelen zonder categoriecatalogus vrij te geven |
REQ-UC-LLN-TOEG-001-007 | SRS-AUTH-001 SRS-AUTH-002 SRS-CAT-001 SRS-LRN-009 AC-AUTH-001 AC-AUTH-002 AC-CAT-001 AC-LRN-009 | Clientstate of routeparameters niet gebruiken als autorisatiebron voor categoriezichtbaarheid |
REQ-UC-LLN-TOEG-001-008 | SRS-RDM-001 SRS-RDM-005 SRS-CAT-001 SRS-LRN-009 AC-RDM-001 AC-RDM-005 AC-CAT-001 AC-LRN-009 | Een lege staat kunnen tonen wanneer geen categorieën beschikbaar zijn |
REQ-UC-LLN-TOEG-001-009 | SRS-CAT-001 SRS-LRN-009 AC-CAT-001 AC-LRN-009 | Gedeactiveerde of gemigreerde categorieën niet als nieuwe leerlingingang tonen |
REQ-UC-LLN-TOEG-001-010 | SRS-RDM-001 SRS-RDM-005 SRS-CAT-006 SRS-LRN-009 AC-RDM-001 AC-RDM-005 AC-CAT-006 AC-LRN-009 | Categorieën stabiel sorteren binnen de niveaucontext |
REQ-UC-LLN-TOEG-001-011 | SRS-LRN-009 SRS-GUA-001 AC-LRN-009 AC-GUA-001 | Actuele brondata gebruiken wanneer frontendcache verouderd is |
REQ-UC-LLN-TOEG-001-012 | SRS-RDM-001 SRS-RDM-005 SRS-RDM-006 SRS-CAT-004 SRS-LRN-005 AC-RDM-001 AC-RDM-005 AC-RDM-006 AC-CAT-004 AC-LRN-005 | Categorieën niet uit historische exercise runs afleiden voor actueel aanbod |
REQ-UC-LLN-TOEG-001-013 | SRS-RDM-001 SRS-RDM-005 SRS-CAT-006 SRS-LRN-009 AC-RDM-001 AC-RDM-005 AC-CAT-006 AC-LRN-009 | Open en privéniveaucontext op dezelfde categoriefiltering laten uitkomen |
REQ-UC-LLN-TOEG-001-014 | SRS-CAT-001 SRS-LRN-009 AC-CAT-001 AC-LRN-009 | Een categorie alleen tonen als vervolg naar oefeningen zinvol is |