UC-LLN-DEL-003 — Gedeelde oefening starten
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-DEL-003 |
| Naam | Gedeelde oefening starten |
| Domein | Leerling |
| Subdomein | Gedeelde oefeningen |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, autorisatielaag, database, modulelaag |
| Rolcontext | Ingelogde gebruiker met actieve leerlingrolcontext die ontvanger is van de gedeelde oefening. |
| Betrokken schermen | Ontvangen gedeelde oefeningen; oefenscherm; niet-beschikbaarafhandeling. |
| Gerelateerde usecases | UC-LLN-DEL-001; UC-LLN-DEL-002; UC-LLN-DEL-004; UC-LLN-OEF-004; UC-LLN-OEF-008 |
| Primaire entiteiten | SharedExercises, ExerciseRuns, ExerciseRunProgress, Users |
| Secundaire entiteiten / events | Bronrunpayload, ExerciseModules, SharedExerciseStarted |
| Gerelateerde popups | POP-LLN-DEL-SHARED-START-NOT-AVAILABLE, POP-LLN-DEL-SHARED-START-ERROR |
| Popupregister | Centrale bron; deze usecase verwijst uitsluitend naar PopupKey. |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een leerling een ontvangen gedeelde oefening voor het eerst start. Een gedeelde oefening wordt bij delen alleen administratief ontvangen. Pas bij starten maakt OefenHub een zelfstandige ExerciseRun voor de ontvanger aan.
De eerste start gebruikt dezelfde vraaginhoud en dezelfde vraagvolgorde als de bronrun van de afzender. De nieuwe run krijgt eigen voortgang, antwoorden, totalen en statistieken. De bronrun van de afzender blijft ongewijzigd.
3. Scope
3.1 Binnen scope
- Controleren dat de ingelogde leerling de bedoelde ontvanger is.
- Controleren dat het ontvangen item niet door de ontvanger uit het overzicht is verwijderd.
- Controleren dat het item nog niet eerder gestart is als eerste uitvoering.
- Lezen van bronvraaginhoud en bronvolgorde.
- Aanmaken van een zelfstandige ontvangerrun.
- Initialiseren van voortgangsdata.
- Openen van het oefenscherm met de eerste vraag.
3.2 Buiten scope
- Delen van de oefening door de afzender.
- Tonen van het volledige ontvangen overzicht.
- Opnieuw maken na eerdere uitvoering.
- Regulier starten vanuit het oefenaanbod.
- Vraag beantwoorden, voortgang per antwoord opslaan en afronden.
- Resultaatweergave, statistieken, geschiedenis en PDF-export.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is ingelogd met een actieve leerlingrolcontext. |
| PRE-002 | Het ontvangen gedeelde-oefeningrecord bestaat. |
| PRE-003 | Het record is gericht aan de ingelogde leerling. |
| PRE-004 | Het record is niet door de ontvanger uit het overzicht verwijderd. |
| PRE-005 | Er bestaat nog geen eerste ontvangerrun voor dit gedeelde record. |
| PRE-006 | De broninhoud is beschikbaar en veilig renderbaar via de modulelaag of historische renderrepresentatie. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Bij succes is een zelfstandige ontvangerrun aangemaakt. |
| POST-002 | De ontvangerrun is gekoppeld aan de ontvanger en aan het gedeelde record. |
| POST-003 | De vraaginhoud en vraagvolgorde van de bronrun zijn voor de eerste uitvoering vastgelegd. |
| POST-004 | Het oefenscherm opent met de eerste vraag. |
| POST-005 | De bronrun van de afzender blijft ongewijzigd. |
| POST-006 | Bij foutafhandeling ontstaat geen half bruikbare run. |
6. Trigger
De leerling kiest Start bij een ontvangen gedeelde oefening die nog niet eerder door deze ontvanger is gestart.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Ontvangen gedeelde oefeningen | Kiest Start. | Frontend stuurt startverzoek. | PRE-001. |
| 2 | Backend | Autorisatielaag | Controleert sessie en leerlingrol. | Alleen ontvanger mag starten. | BR-001. |
| 3 | Backend | Database | Laadt gedeeld record. | Record moet aan deze leerling gekoppeld zijn. | PRE-002, PRE-003. |
| 4 | Backend | Database | Controleert verwijdermarkering. | Verborgen item wordt geweigerd. | PRE-004. |
| 5 | Backend | Database | Controleert eerdere eerste start. | Dubbele eerste start wordt voorkomen. | PRE-005. |
| 6 | Backend | Modulelaag | Leest broninhoud en bronvolgorde. | Inhoud is bruikbaar voor ontvanger. | PRE-006. |
| 7 | Backend | Database | Start transactie. | Runaanmaak en koppeling worden samen verwerkt. | Alles of niets. |
| 8 | Backend | Database | Maakt ontvangerrun aan. | Run is zelfstandig en aan gedeeld record gekoppeld. | POST-001, POST-002. |
| 9 | Backend | Database | Initialiseert voortgang. | Eerste vraagvolgorde is gelijk aan de bronrun. | POST-003. |
| 10 | Frontend | Oefenscherm | Opent eerste vraag. | Leerling kan beginnen met oefenen. | Vervolg in oefenusecases. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Gebruiker is geen leerling. | Backend weigert toegang. | Generieke toegangafhandeling. | Geen. |
| ALT-002 | 3 | Gedeeld record bestaat niet of hoort niet bij de leerling. | Backend blokkeert zonder details te lekken. | POP-LLN-DEL-SHARED-START-NOT-AVAILABLE. | Geen. |
| ALT-003 | 4 | Item is door ontvanger uit overzicht verwijderd. | Start wordt geweigerd. | POP-LLN-DEL-SHARED-START-NOT-AVAILABLE. | Geen. |
| ALT-004 | 5 | Eerste start bestaat al. | Systeem verwijst naar hervatten of opnieuw maken waar toegestaan. | Inline afhandeling. | Geen nieuwe eerste run. |
| ALT-005 | 6 | Bronpayload is niet beschikbaar of onveilig. | Start wordt geweigerd. | POP-LLN-DEL-SHARED-START-NOT-AVAILABLE. | Geen. |
| ALT-006 | 6 | Module of historische renderrepresentatie kan niet renderen. | Start wordt geweigerd. | POP-LLN-DEL-SHARED-START-NOT-AVAILABLE. | Geen. |
| ALT-007 | 8 | Runaanmaak faalt. | Transactie rolt terug. | POP-LLN-DEL-SHARED-START-ERROR. | Geen half bruikbare run. |
| ALT-008 | 10 | Navigatie naar oefenscherm faalt na succesvolle runaanmaak. | Run blijft bestaan en kan via hervatten beschikbaar zijn. | Generieke foutafhandeling. | Run blijft consistent. |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Alleen de bedoelde ontvanger mag een ontvangen gedeelde oefening starten. |
| BR-002 | De ontvanger wordt server-side uit de sessie bepaald. |
| BR-003 | Een door de ontvanger verwijderd ontvangen item kan niet normaal gestart worden. |
| BR-004 | De eerste start gebruikt dezelfde vraaginhoud en vraagvolgorde als de bronrun. |
| BR-005 | De ontvangerrun is zelfstandig en heeft eigen voortgang, antwoorden, totalen en statistieken. |
| BR-006 | De bronrun van de afzender wordt niet aangepast. |
| BR-007 | Actuele oefeningconfiguratie wordt niet gebruikt om een nieuwe set te genereren. |
| BR-008 | Een mislukte start mag geen half bruikbare run achterlaten. |
| BR-009 | Beëindiging van de vriendschap na ontvangst blokkeert een reeds ontvangen gedeelde oefening niet automatisch. |
| BR-010 | Starten geeft geen bredere toegang tot het niveau, de categorie of de docentcontext van de afzender. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| Sessiecontext | Bevat actief intern Users.Id en actieve leerlingrol. |
SharedExerciseId | Bestaat en is gekoppeld aan de ingelogde leerling als ontvanger. |
| Verwijdermarkering | Mag niet gezet zijn voor normale start. |
| Eerste ontvangerrun | Mag nog niet bestaan voor deze eerste-startflow. |
| Bronrunverwijzing | Verwijst naar een afgeronde bronrun met beschikbare vraaginhoud. |
| Modulepayload | Moet veilig decodeerbaar en renderbaar zijn. |
| Actor | Wordt server-side uit sessie bepaald. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 7 | Transactie | Database | Start transactionele verwerking van de startactie. |
| 8 | Insert | ExerciseRuns | Maakt zelfstandige ontvangerrun aan. |
| 8 | Update | SharedExercises | Legt koppeling naar de eerste ontvangerrun vast wanneer het datamodel dit ondersteunt. |
| 9 | Insert/initialisatie | ExerciseRunProgress / runpayload | Initialiseert vraagvolgorde, voortgang en vraagcontext. |
| 9 | Event | SharedExerciseStarted | Registreert dat de ontvanger de gedeelde oefening is gestart. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
| Bronrun van afzender | Blijft ongewijzigd. |
UserRelationships | Starten maakt of beëindigt geen vriendschap. |
RelationshipInvitations | Uitnodigingen zijn geen onderdeel van deze flow. |
SystemMessages | Mailboxleesstatus valt onder het generieke berichtendomein. |
UserSettings | Voorkeuren worden niet gewijzigd. |
| Actuele oefeningconfiguratie | Wordt niet gebruikt als bron voor nieuwe vraaggeneratie. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Eerste start van gedeelde oefening
16.2 Start geblokkeerd door ongeldige ontvanger
17. Popupverwijzingen
| PopupKey | Moment | Toepassing |
|---|---|---|
POP-LLN-DEL-SHARED-START-NOT-AVAILABLE | Record, broninhoud of renderbaarheid is niet beschikbaar. | Blokkeert start zonder technische details te tonen. |
POP-LLN-DEL-SHARED-START-ERROR | Fout tijdens aanmaak van de ontvangerrun. | Meldt startfout en voorkomt half bruikbare run. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Gedeelde oefeningen beschrijft starten van een ontvangen gedeelde oefening en de bijbehorende gebruikersfeedback. |
| Technisch Ontwerp | Oefenruns, voortgang, resultaten, statistieken en PDF-brondata beschrijft het aanmaken van de ontvangerrun vanuit SharedExercises. |
| Technisch Ontwerp | Oefenmodulecontract en dynamische module-integratie beschrijft moduleconfiguratie, payloadversies en vraaggeneratie. |
| Technisch Ontwerp | Autorisatie, policies en server-side contextcontrole beschrijft server-side objecttoegang en IDOR-preventie. |
| Software Requirements Specification | Borgt de centrale requirements voor starten, autorisatie, bronrun-snapshots en veilige foutafhandeling. |
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-DEL-003-001 | SRS-LRN-001 SRS-SHR-001 AC-LRN-001 AC-SHR-001 | Een gedeelde oefening alleen laten starten door de bedoelde ontvanger |
REQ-UC-LLN-DEL-003-002 | SRS-LRN-001 SRS-SHR-003 AC-LRN-001 AC-SHR-003 | Bij eerste start een zelfstandige ExerciseRun voor de ontvanger aanmaken |
REQ-UC-LLN-DEL-003-003 | SRS-LRN-001 SRS-SHR-003 AC-LRN-001 AC-SHR-003 | Bij eerste start dezelfde vraaginhoud en vraagvolgorde gebruiken als de bronrun |
REQ-UC-LLN-DEL-003-004 | SRS-LRN-009 SRS-SHR-003 AC-LRN-009 AC-SHR-003 | De bronrun van de afzender niet wijzigen |
REQ-UC-LLN-DEL-003-005 | SRS-LRN-009 SRS-SHR-001 SRS-NFR-AUD-001 AC-LRN-009 AC-SHR-001 AC-NFR-AUD-001 | De ontvangerrun herleidbaar koppelen aan het gedeelde record |
REQ-UC-LLN-DEL-003-006 | SRS-LRN-003 SRS-SHR-001 AC-LRN-003 AC-SHR-001 | Voortgangsdata voor de ontvangerrun initialiseren |
REQ-UC-LLN-DEL-003-007 | SRS-AUTH-001 SRS-LRN-001 SRS-SHR-001 SRS-NFR-SEC-001 AC-AUTH-001 AC-LRN-001 AC-SHR-001 AC-NFR-SEC-001 | Niet-startbare gedeelde oefeningen veilig blokkeren |
REQ-UC-LLN-DEL-003-008 | SRS-LRN-001 SRS-SHR-001 SRS-NFR-AVL-001 AC-LRN-001 AC-SHR-001 AC-NFR-AVL-001 | Mislukte startacties zonder half bruikbare run afhandelen |