UC-LLN-OEF-002 — Verder gaan met niet-afgeronde oefening
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-OEF-002 |
| Naam | Verder gaan met niet-afgeronde oefening |
| Domein | Leerling / Oefenen en voortgang |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, routeguard, autorisatielaag, database, technische module, SignalR-service |
| Rolcontext | Ingelogde leerling die binnen dezelfde oefening en actieve niveaucontext een hervatbare niet-afgeronde exercise run heeft. |
| Betrokken schermen | Oefening-startpagina, oefenscherm, vraagcomponent, voortgangscomponent, live-meekijkcomponent. |
| Gerelateerde usecases | UC-LLN-OEF-001 — Oefening-startpagina openen; UC-LLN-OEF-004 — Vraag beantwoorden; UC-LLN-OEF-007 — Oefening onderbreken; UC-LLN-OEF-008 — Oefening afronden; UC-LLN-TOEG-003 — Oefeningstoegang controleren bij openen |
| Primaire entiteiten | ExerciseRuns, ExerciseRunProgress, Exercises, ExerciseModules, Users, TeacherLevels |
| Secundaire entiteiten / events | Geen persistente events; bestaande run-, voortgangs- en live-voortgangsreadmodels. |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een leerling via de actie Verder gaan een eerder gestarte maar nog niet afgeronde exercise run hervat. Het systeem gebruikt altijd de laatst gestarte niet-afgeronde run binnen dezelfde oefening en dezelfde actieve niveaucontext. Runs uit andere niveaus of andere oefeningcontexten worden niet hervat via deze actie.
Het hervatten opent het oefenscherm op de juiste voortgangspositie. Reeds opgeslagen antwoorden, afrondingen per vraag, Geen idee-markeringen en module-specifieke vraaggegevens blijven behouden. De leerling gaat verder vanaf de eerstvolgende nog niet definitief afgeronde vraag of, wanneer de modulecontext dat vereist, vanaf de actuele server-side voortgangspositie.
Hervatten is geen nieuwe oefening starten. Er wordt geen nieuwe exercise run aangemaakt en er worden geen uniforme statistieken opnieuw berekend. Het systeem leest de bestaande run, controleert actuele toegang en maakt de voortgang opnieuw beschikbaar voor rendering en eventuele live-meekijkers.
Deze usecase stopt zodra de leerling het oefenscherm met de hervatte run ziet. Het beantwoorden van de volgende vraag, opnieuw opslaan van voortgang, onderbreken en afronden vallen onder aparte vervolgusecases.
3. Scope
Deze usecase omvat wel:
- aanklikken van
Verder gaanop de oefening-startpagina - opnieuw server-side controleren van leerlingcontext en oefeningtoegang
- selecteren van de laatst gestarte niet-afgeronde run binnen dezelfde oefening en niveaucontext
- laden van opgeslagen runmetadata, vraagpayload en voortgangsregels
- bepalen van de hervatpositie
- openen van het oefenscherm met de bestaande run
- beschikbaar maken van de actuele voortgang voor live meekijken
- veilig blokkeren wanneer de run niet meer hervatbaar is
Deze usecase omvat niet:
- aanmaken van een nieuwe exercise run
- wijzigen van de vraagvolgorde
- beantwoorden of beoordelen van een vraag
- afronden van de run
- berekenen van eindstatistieken
- wijzigen van niveauautorisaties
- tonen van geschiedenis of resultaatdetails
- oplossen van verouderde of corrupte modulepayloads buiten veilige foutafhandeling
DRY-afbakening voor deze usecase: de regels voor het bepalen of een oefening toegankelijk is blijven bij de oefenaanbod- en toegangsusecases. Deze usecase gebruikt die controle als voorwaarde voordat een bestaande run wordt hervat.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De leerling is ingelogd en heeft een actieve leerlingrol. |
| PRE-002 | De oefening-startpagina heeft Verder gaan getoond op basis van een bestaande niet-afgeronde run. |
| PRE-003 | De backend kan de actuele leerling-, oefening- en niveaucontext opnieuw valideren. |
| PRE-004 | De betreffende exercise run bestaat en is niet afgerond. |
| PRE-005 | De run hoort bij dezelfde leerling, oefening en actieve niveaucontext. |
| PRE-006 | De technische module die nodig is om de vraag te renderen is beschikbaar of veilig afhandelbaar. |
| PRE-007 | De opgeslagen voortgang bevat voldoende informatie om de hervatpositie te bepalen. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De leerling ziet het oefenscherm voor de bestaande niet-afgeronde run. |
| POST-002 | Er is geen nieuwe exercise run aangemaakt. |
| POST-003 | De bestaande run blijft niet-afgerond totdat een latere afrondingsusecase haar voltooit. |
| POST-004 | Opgeslagen antwoorden en voortgang blijven behouden. |
| POST-005 | De actuele voortgang is opnieuw beschikbaar voor verdere beantwoording en eventuele live-meekijkers. |
| POST-006 | Niet-hervatbare runs leiden tot veilige blokkade zonder nieuwe run aan te maken. |
| POST-007 | Er zijn geen resultaten, eindstatistieken of geschiedenisrecords aangemaakt. |
6. Trigger
De usecase start wanneer de leerling op de oefening-startpagina de actie Verder gaan kiest.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Oefening-startpagina | Klikt op Verder gaan. | Frontend vraagt hervatcontext op. | Actie bevat geen vertrouwbare autorisatieclaims. |
| 2 | OefenHub frontend | Routeguard | Controleert actuele sessie. | Request gaat alleen door bij geldige sessie. | Server-side sessie is leidend. |
| 3 | OefenHub backend | Autorisatielaag | Controleert leerlingrol, niveaucontext en oefeningtoegang opnieuw. | Alleen geldige context mag hervatten. | UC-LLN-TOEG-003. |
| 4 | OefenHub backend | Runresolver | Zoekt niet-afgeronde runs voor dezelfde leerling, oefening en niveaucontext. | Kandidaten worden gefilterd op IsCompleted = false. | ExerciseRuns. |
| 5 | OefenHub backend | Runresolver | Selecteert de laatst gestarte niet-afgeronde run. | Run wordt gekozen als hervatdoel. | Laatste niet-afgeronde run wint. |
| 6 | OefenHub backend | Runservice | Laadt runmetadata en vraag-/antwoordpayload. | Bestaande voortgang wordt beschikbaar. | JSON/base64-payload en vaste kolommen. |
| 7 | OefenHub backend | Progressservice | Laadt vraaggebonden voortgangsregels. | Reeds afgeronde vragen en actuele positie worden bepaald. | ExerciseRunProgress of equivalente server-side voortgangsopslag. |
| 8 | OefenHub backend | Technische module | Bereidt rendering van de actuele vraag voor. | Module-specifieke vraagrepresentatie wordt afgeleid. | Module vertaalt payload naar eigen DTO. |
| 9 | OefenHub backend | Oefenscherm-readmodel | Bouwt hervatweergave op. | Readmodel bevat actuele vraag, voortgang en runcontext. | Geen nieuwe run. |
| 10 | OefenHub frontend | Oefenscherm | Rendert hervatte oefening. | Leerling ziet de actuele vraag en voortgang. | Vervolg via vraag-beantwoordenflow. |
| 11 | OefenHub backend | SignalR / live voortgang | Maakt actuele runstatus beschikbaar voor bevoegde meekijkers. | Eventuele meekijkers kunnen vervolgupdates ontvangen. | Geen nieuwe meekijksessie voor leerling. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Sessie is verlopen | Routeguard leidt naar login of veilige publieke context. | Niet van toepassing | Geen |
| ALT-002 | 3 | Leerling heeft geen toegang meer tot de oefening | Hervatten wordt geblokkeerd. | Componentmelding / toegangafhandeling | Geen |
| ALT-003 | 4 | Geen niet-afgeronde run meer gevonden | Systeem keert terug naar startpagina zonder Verder gaan. | Componentmelding / bijgewerkte staat | Geen |
| ALT-004 | 5 | Meerdere niet-afgeronde runs bestaan | Systeem kiest de laatst gestarte run binnen dezelfde context. | Niet van toepassing | Geen |
| ALT-005 | 5 | Alleen runs uit andere niveaus bestaan | Deze runs worden genegeerd voor Verder gaan. | Niet van toepassing | Geen |
| ALT-006 | 6 | Runpayload is technisch niet leesbaar | Hervatten wordt veilig geblokkeerd en technisch gelogd. | Componentmelding / foutafhandeling | Geen domeinmutatie |
| ALT-007 | 8 | Technische module is niet beschikbaar | Hervatten wordt geblokkeerd; bestaande run blijft bewaard. | Componentmelding / foutafhandeling | Geen |
| ALT-008 | 10 | Vraag was al afgerond maar run niet voltooid | Systeem bepaalt eerstvolgende niet-afgeronde vraag of actuele modulepositie. | Niet van toepassing | Geen |
| ALT-009 | 11 | Geen bevoegde meekijkers actief | Er wordt geen live update naar derden gestuurd. | Niet van toepassing | Geen |
| ALT-010 | 11 | Meekijker heeft geen actuele autorisatie meer | Live update wordt niet verstuurd naar die meekijker. | Niet van toepassing | Geen |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Verder gaan hervat nooit een oefening uit een andere actieve niveaucontext. |
| BR-002 | Verder gaan maakt geen nieuwe exercise run aan. |
| BR-003 | Bij meerdere niet-afgeronde runs binnen dezelfde context wordt de laatst gestarte run hervat. |
| BR-004 | Een niet-afgeronde run verschijnt nog niet als afgeronde geschiedenisregel. |
| BR-005 | Hervatten vereist dezelfde server-side toegangscontrole als nieuw openen of starten. |
| BR-006 | Opgeslagen vraag- en antwoordpayload blijft bron van waarheid voor de inhoud van de hervatte run. |
| BR-007 | Uniforme runmetadata en voortgangsregels worden gelezen om de actuele stand te bepalen. |
| BR-008 | Hervatten mag geen eindstatistieken berekenen of afrondmoment zetten. |
| BR-009 | Een abrupt onderbroken oefening blijft hervatbaar zolang de toegang en runstatus dit toestaan. |
| BR-010 | Live meekijken gebruikt server-side opgeslagen voortgang en niet alleen clientstate. |
| BR-011 | Als de technische module niet meer beschikbaar is, mag de run niet corrupt worden aangepast. |
| BR-012 | De leerling ziet geen technische run- of vraagidentifiers. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| ExerciseRun | Moet bestaan, bij de leerling horen, niet afgerond zijn en binnen dezelfde oefening en niveaucontext vallen. |
| Oefeningtoegang | Moet op het moment van hervatten opnieuw geldig zijn. |
| Niveaucontext | Moet overeenkomen met de runcontext. |
| Vraagpayload | Moet decodeerbaar zijn voor de gekoppelde technische module. |
| Voortgangsregels | Moeten consistent zijn met totaal aantal vragen en runstatus. |
| Hervatpositie | Mag niet voorbij een afgeronde run wijzen. |
| Technische module | Moet beschikbaar zijn voor rendering of leiden tot veilige blokkade. |
| Live voortgang | Mag alleen naar bevoegde meekijkers worden gepubliceerd. |
| Clientparameter run-id | Mag niet zonder server-side eigenaarschapcontrole worden vertrouwd. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 1-11 | Geen persistente mutatie | Niet van toepassing | Hervatten leest de bestaande run, voortgang en modulecontext; de eerstvolgende voortgangsmutatie ontstaat pas bij vraagbeantwoording of afronding. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
ExerciseRuns | Hervatten maakt geen nieuwe run aan en rondt de bestaande run niet af. |
ExerciseRunProgress | Alleen laden/renderen; beantwoording wijzigt voortgang pas in UC-LLN-OEF-004. |
ExerciseModules | Module wordt alleen aangeroepen voor rendering. |
UserSettings | Niveaucontext wordt niet gewijzigd. |
StudentLevelAuthorizations | Autorisaties worden alleen gecontroleerd. |
SystemMessages | Hervatten maakt geen systeemberichten aan. |
LiveViewAudit | De leerling start geen meekijksessie; bestaande meekijkers worden alleen gevoed met voortgang. |
| Eindstatistieken | Worden pas berekend bij afronden. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Bestaande run hervatten
16.2 Hervatten blokkeren
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Niet van toepassing | Hervatten gebruikt geen domeinspecifieke popupregister-popup. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Functioneel Ontwerp beschrijft starten, hervatten, beantwoorden, Geen idee, onderbreken, afronden en resultaatnavigatie binnen de leerling-oefenflow. |
| Technisch Ontwerp | Technisch Ontwerp: oefencatalogus, oefenmodulecontract, oefenruns en voortgang, live meekijken en frontend-oefencontext 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 oefenruns, voortgangsopslag, modulegedrag, foutafhandeling en veilige server-side verwerking. |
| Database-informatie | Database-informatie blijft bron voor ExerciseRuns, ExerciseRunProgress, payloadvelden, snapshots en soft links richting gebruiker en catalogus. |
| Ontwerpbronnen | Ontwerpbronnen bevatten aanvullende businessregels voor oefenflow, modulepayloads, Geen idee en voortgangsregistratie. |
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-OEF-002-001 | SRS-AUTH-001 SRS-LRN-002 SRS-LRN-007 AC-AUTH-001 AC-LRN-002 AC-LRN-007 | Bij Verder gaan opnieuw server-side controleren of de leerling de oefening mag hervatten |
REQ-UC-LLN-OEF-002-002 | SRS-CAT-006 SRS-LRN-002 SRS-LRN-007 AC-CAT-006 AC-LRN-002 AC-LRN-007 | Alleen niet-afgeronde runs binnen dezelfde leerling-, oefening- en niveaucontext als hervatkandidaat gebruiken |
REQ-UC-LLN-OEF-002-003 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Bij meerdere hervatkandidaten de laatst gestarte niet-afgeronde run kiezen |
REQ-UC-LLN-OEF-002-004 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Bij hervatten geen nieuwe exercise run aanmaken |
REQ-UC-LLN-OEF-002-005 | SRS-LRN-003 AC-LRN-003 | Opgeslagen vraagpayload en voortgangsregels laden voordat het oefenscherm wordt getoond |
REQ-UC-LLN-OEF-002-006 | SRS-AUTH-001 SRS-LRN-002 SRS-LRN-007 AC-AUTH-001 AC-LRN-002 AC-LRN-007 | De hervatpositie bepalen op basis van server-side opgeslagen voortgang |
REQ-UC-LLN-OEF-002-007 | SRS-AUTH-001 SRS-ACC-003 SRS-ACC-005 SRS-LRN-002 SRS-LRN-007 SRS-NFR-SEC-001 AC-AUTH-001 AC-ACC-003 AC-ACC-005 AC-LRN-002 AC-LRN-007 AC-NFR-SEC-001 | Hervatten veilig blokkeren wanneer de run niet meer bestaat, al afgerond is of niet meer toegankelijk is |
REQ-UC-LLN-OEF-002-008 | SRS-AUTH-001 SRS-LRN-009 SRS-LIVE-001 AC-AUTH-001 AC-LRN-009 AC-LIVE-001 | Eventuele live-meekijkers alleen updates tonen wanneer zij op dat moment bevoegd zijn |
REQ-UC-LLN-OEF-002-009 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Bij hervatten geen eindstatistieken berekenen of afrondmoment zetten |
REQ-UC-LLN-OEF-002-010 | SRS-LRN-009 SRS-MOD-003 SRS-NFR-SEC-001 AC-LRN-009 AC-MOD-003 AC-NFR-SEC-001 | Technische module- of payloadfouten veilig afhandelen zonder de bestaande run corrupt te wijzigen |
REQ-UC-LLN-OEF-002-011 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Een run die al is afgerond niet meer via Verder gaan hervatten |
REQ-UC-LLN-OEF-002-012 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Bij hervatten voorkomen dat antwoorden of markeringen opnieuw worden geïnitialiseerd |
REQ-UC-LLN-OEF-002-013 | SRS-AUTH-001 SRS-LRN-003 AC-AUTH-001 AC-LRN-003 | De voortgangspositie herleiden uit server-side opgeslagen voortgang en niet uit browserstate |
REQ-UC-LLN-OEF-002-014 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Een niet-hervatbare run niet automatisch verwijderen |
REQ-UC-LLN-OEF-002-015 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Het hervatten van een run scheiden van het beantwoorden van de eerstvolgende vraag |
REQ-UC-LLN-OEF-002-016 | SRS-AUTH-001 SRS-ACC-003 SRS-ACC-005 SRS-LRN-009 SRS-NFR-ACC-001 AC-AUTH-001 AC-ACC-003 AC-ACC-005 AC-LRN-009 AC-NFR-ACC-001 | Een gewijzigde actuele toegang respecteren, ook wanneer de run eerder wel toegankelijk was |
REQ-UC-LLN-OEF-002-017 | SRS-LRN-008 SRS-MOD-003 AC-LRN-008 AC-MOD-003 | Bij module-onbeschikbaarheid een bestaande niet-afgeronde run historisch intact laten |
REQ-UC-LLN-OEF-002-018 | SRS-LRN-002 SRS-LRN-007 SRS-MOD-003 AC-LRN-002 AC-LRN-007 AC-MOD-003 | De hervatte vraag kunnen renderen met dezelfde modulecontext als de oorspronkelijke run |
REQ-UC-LLN-OEF-002-019 | SRS-LRN-002 SRS-LRN-007 SRS-MOD-003 AC-LRN-002 AC-LRN-007 AC-MOD-003 | Bij hervatten de uniforme runmetadata en modulepayload consistent combineren |
REQ-UC-LLN-OEF-002-020 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Bij hervatten geen nieuwe vraagset genereren |
REQ-UC-LLN-OEF-002-021 | SRS-AUTH-001 SRS-RDM-001 SRS-RDM-003 SRS-RDM-009 SRS-CAT-001 SRS-LRN-001 AC-AUTH-001 AC-RDM-001 AC-RDM-003 AC-RDM-009 AC-CAT-001 AC-LRN-001 | Bij vervallen toegang een veilige route terug naar het oefenaanbod of de startpagina bieden |
REQ-UC-LLN-OEF-002-022 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Voorkomen dat een leerling een run van een andere gebruiker hervat via een gemanipuleerde parameter |
REQ-UC-LLN-OEF-002-023 | SRS-LRN-003 SRS-NFR-SEC-001 AC-LRN-003 AC-NFR-SEC-001 | Reeds vastgelegde voortgang beschikbaar houden voor latere afronding of veilige analyse |
REQ-UC-LLN-OEF-002-024 | SRS-LRN-002 SRS-LRN-007 SRS-NFR-AUD-001 AC-LRN-002 AC-LRN-007 AC-NFR-AUD-001 | Hervatten kunnen uitvoeren zonder de geschiedenisweergave te wijzigen |
REQ-UC-LLN-OEF-002-025 | SRS-LRN-002 SRS-LRN-007 SRS-NFR-AUD-001 AC-LRN-002 AC-LRN-007 AC-NFR-AUD-001 | Een hervatpoging die wordt geblokkeerd technisch herleidbaar kunnen loggen |