UC-LLN-DEL-001 — Oefening delen met vriend
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-DEL-001 |
| Naam | Oefening delen met vriend |
| Domein | Leerling |
| Subdomein | Gedeelde oefeningen |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, autorisatielaag, database, berichtensysteem |
| Rolcontext | Ingelogde gebruiker met actieve leerlingrolcontext en een afgeronde eigen oefenrun die functioneel deelbaar is. |
| Betrokken schermen | Resultaatpopup na afronding; resultaatdetail vanuit geschiedenis; deelactie; vriendselectiecomponent; ontvangen gedeelde oefeningen-overzicht van ontvanger. |
| Gerelateerde usecases | UC-LLN-RES-001; UC-LLN-HIS-003; UC-LLN-DEL-002; UC-LLN-DEL-003; UC-LLN-DEL-006; UC-GEN-REL-001; UC-GEN-MSG-001 |
| Primaire entiteiten | ExerciseRuns, SharedExercises, Users, UserRelationships |
| Secundaire entiteiten / events | SystemMessages, ExerciseRunProgress, SharedExerciseCreated, SharedExerciseSystemMessageCreated, ShareExerciseDenied |
| Gerelateerde popups | POP-LLN-DEL-SHARE-SELECT, POP-LLN-DEL-SHARE-SUCCESS, POP-LLN-DEL-SHARE-FAILED, POP-LLN-DEL-NO-FRIENDS |
| Popupregister | Centrale bron; deze usecase verwijst uitsluitend naar PopupKey. |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een leerling een afgeronde eigen oefening deelt met een actieve vriend. Delen betekent dat dezelfde oefeninhoud beschikbaar wordt gemaakt voor de ontvanger. Het behaalde resultaat, de antwoorden en de statistieken van de deler worden niet als resultaat voor de ontvanger gedeeld.
Bij succesvol delen maakt OefenHub een administratief SharedExercises-record aan met de bronrun, deler, ontvanger en historische snapshotgegevens van niveau, categorie en oefening. Voor de ontvanger ontstaat nog geen ExerciseRun. Die ontstaat pas wanneer de ontvanger de gedeelde oefening start of opnieuw maakt.
3. Scope
3.1 Binnen scope
- Tonen of starten van de deelactie vanuit een afgerond resultaat of resultaatdetail.
- Server-side controleren dat de bronrun bij de ingelogde leerling hoort en afgerond is.
- Controleren dat de ontvanger een actieve vriend is en een actief leerlingaccount heeft.
- Vastleggen van het ontvangen gedeelde-oefeningrecord.
- Vastleggen van historische snapshotgegevens voor niveau, categorie en oefening.
- Informeren van de ontvanger via systeemcommunicatie wanneer de centrale berichtlogica dit ondersteunt.
3.2 Buiten scope
- Vriend uitnodigen, accepteren, afwijzen of ontkoppelen.
- Reguliere oefening opnieuw maken vanuit het eigen resultaat.
- Starten of beantwoorden van de gedeelde oefening door de ontvanger.
- Resultaatweergave, statistieken en PDF-export.
- Beheer van featuretoggles voor vriendschappen of delen.
- Delen met ouders, docenten, beheerders of onbekende e-mailadressen.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is ingelogd met een actieve leerlingrolcontext. |
| PRE-002 | De interne OefenHub-sessiecontext is server-side geldig opgebouwd. |
| PRE-003 | De bronrun bestaat, hoort bij de ingelogde leerling en is afgerond. |
| PRE-004 | De bronrun is geen docenttestrun of tijdelijke testrun. |
| PRE-005 | De functionaliteit voor vriendschappen en oefeningdelen is server-side beschikbaar. |
| PRE-006 | Er bestaat minimaal één actieve vriendrelatie met een actief leerlingaccount. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Bij succes is een ontvangen gedeelde oefening voor de ontvanger vastgelegd. |
| POST-002 | Bij succes is de ontvanger via systeemcommunicatie of het ontvangen overzicht vindbaar gemaakt. |
| POST-003 | De bronrun, antwoorden, statistieken en voortgang van de deler blijven ongewijzigd. |
| POST-004 | Voor de ontvanger ontstaat nog geen ExerciseRun. |
| POST-005 | Bij blokkade of fout ontstaat geen gedeeltelijk gedeeld record. |
| POST-006 | Relaties, accounts, profielgegevens en niveauautorisaties worden niet gewijzigd. |
6. Trigger
De leerling kiest vanuit een afgerond resultaat of resultaatdetail de actie om de oefening te delen.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Resultaatweergave | Kiest de deelactie. | Frontend vraagt deelcontext op. | Alleen vanuit afgeronde run. |
| 2 | Frontend | Deelcomponent | Vraagt mogelijke ontvangers op. | Backend start server-side controles. | Clientstate is niet leidend. |
| 3 | Backend | Autorisatielaag | Controleert leerlingrol en actief account. | Ongeldige context wordt geblokkeerd. | PRE-001, PRE-002. |
| 4 | Backend | Oefenrunlaag | Controleert bronrun. | Run is eigen, afgerond en deelbaar. | PRE-003, PRE-004. |
| 5 | Backend | Relatielaag | Laadt actieve vrienden. | Alleen actieve leerling-vrienden worden teruggegeven. | PRE-006. |
| 6 | Frontend | Deelcomponent | Toont ontvangers. | Leerling kiest één vriend. | Geen vrije e-mailinvoer. |
| 7 | Leerling | Deelcomponent | Bevestigt delen. | Frontend stuurt deelverzoek. | Ontvanger-id uit lijst is geen autorisatiebewijs. |
| 8 | Backend | Autorisatielaag | Hercontroleert bronrun, deler, ontvanger, relatie en features. | Race conditions worden afgevangen. | PRE-003 t/m PRE-006. |
| 9 | Backend | Database | Start transactie. | Shared-record wordt voorbereid. | Geen ontvangerrun. |
| 10 | Backend | Database | Legt SharedExercises vast. | Bronrun, deler, ontvanger en snapshots zijn opgeslagen. | StartedExerciseRunId blijft leeg. |
| 11 | Backend | Berichtensysteem | Maakt systeemcommunicatie voor ontvanger. | Ontvanger kan het item ontdekken. | Geen privéberichtthread. |
| 12 | Backend | Database | Commit transactie. | Deelactie is consistent opgeslagen. | Alles of niets. |
| 13 | Frontend | Resultaatweergave | Toont succesafhandeling. | Leerling blijft in resultaatcontext. | POP-LLN-DEL-SHARE-SUCCESS. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 1 | Deelactie is niet beschikbaar. | Frontend toont de actie niet of disabled. | Geen popup vereist. | Geen. |
| ALT-002 | 3 | Gebruiker heeft geen actieve leerlingcontext. | Backend weigert de actie. | Generieke niet-beschikbaarafhandeling. | Geen. |
| ALT-003 | 4 | Bronrun is niet afgerond of niet van de leerling. | Backend weigert zonder details van andere records vrij te geven. | POP-LLN-DEL-SHARE-FAILED. | Geen. |
| ALT-004 | 5 | Er zijn geen actieve vrienden. | Flow gaat naar de blokkeerusecase. | POP-LLN-DEL-NO-FRIENDS. | Geen. |
| ALT-005 | 8 | Feature vriendschappen of delen staat uit. | Backend weigert delen. | POP-LLN-DEL-SHARE-FAILED. | Geen. |
| ALT-006 | 8 | Relatie eindigt tussen tonen lijst en bevestigen. | Backend hercontroleert en weigert. | POP-LLN-DEL-SHARE-FAILED. | Geen. |
| ALT-007 | 8 | Ontvangeraccount is niet actief. | Backend weigert ontvanger. | POP-LLN-DEL-SHARE-FAILED. | Geen. |
| ALT-008 | 10 | Identiek openstaand gedeeld record bestaat al voor dezelfde ontvanger. | Backend past de centrale doubleregel toe en voorkomt ongecontroleerde doublures. | Informatieve of foutafhandeling via popupkey. | Geen nieuw doublerecord. |
| ALT-009 | 11 | Systeemcommunicatie faalt binnen de transactie. | Transactie wordt teruggedraaid of gecontroleerd afgehandeld volgens de centrale berichtlogica. | POP-LLN-DEL-SHARE-FAILED. | Geen half gedeeld record. |
| ALT-010 | 12 | Databasefout tijdens commit. | Transactie rolt terug. | POP-LLN-DEL-SHARE-FAILED. | Geen persistent shared-record. |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Alleen een leerling mag een afgeronde eigen leerlingrun delen met een actieve vriend. |
| BR-002 | Delen gebruikt de oefeninhoud van de bronrun, niet het behaalde resultaat van de deler. |
| BR-003 | Delen vereist een actieve Friendship-relatie op het moment van definitief delen. |
| BR-004 | Frontend-zichtbaarheid van de deelknop is geen autorisatiebron. |
| BR-005 | De backend controleert featurebeschikbaarheid, accountstatus, relatie en bronrun opnieuw bij definitief delen. |
| BR-006 | De ontvanger krijgt pas een ExerciseRun wanneer deze de gedeelde oefening zelf start of opnieuw maakt. |
| BR-007 | De bronrun van de deler wordt niet gewijzigd door delen. |
| BR-008 | Een ontvangen gedeelde oefening kan niet door de afzender worden teruggetrokken. |
| BR-009 | Beëindiging van de vriendschap verwijdert bestaande gedeelde oefeningen niet. |
| BR-010 | Snapshotwaarden voor niveau, categorie en oefening blijven historisch ongewijzigd. |
| BR-011 | Niet-afgeronde runs, docenttestruns en tijdelijke testruns mogen niet worden gedeeld. |
| BR-012 | Delen met ouder/voogd, docent, beheerder of onbekend e-mailadres valt buiten deze flow. |
| BR-013 | De deelactie maakt geen privéberichtthread aan. |
| BR-014 | Systeemcommunicatie is een ingang voor de ontvanger en geen bron van waarheid voor het gedeelde record. |
| BR-015 | Er mag geen half gedeelde oefening ontstaan. |
| BR-016 | Een ontvangen gedeelde oefening geeft geen bredere toegang tot het niveau, de categorie of de docentcontext van de deler. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
SourceExerciseRunId | Verplicht; bestaat; hoort bij de ingelogde leerling; is afgerond; is geen testrun. |
SharedByUserId | Wordt server-side uit sessie bepaald. |
SharedToUserId | Verplicht bij definitief delen; actief leerlingaccount; actief bevriend met deler. |
UserRelationships | Actieve relatie met relatietype Friendship en leerlingrolcontext aan beide kanten. |
| Deelfeature | Server-side actief voor de leerlingcontext. |
| Vriendschapsfeature | Server-side actief voor de leerlingcontext. |
| Snapshotvelden | Worden server-side bepaald uit de historische runcontext en zijn niet vrij invoerbaar. |
| Ontvangerselectie | Alleen keuze uit server-side geleverde vrienden; geen vrije invoer. |
| Systeemcommunicatie | Ontvanger heeft een intern Users.Id; verwijstype is centraal ondersteund. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 9 | Transactie | Database | Start transactionele verwerking van de deelactie. |
| 10 | Insert | SharedExercises | Maakt ontvangen gedeelde oefening aan met bronrun, deler, ontvanger en snapshots. |
| 10 | Event | SharedExerciseCreated | Registreert dat een gedeelde oefening is aangemaakt. |
| 11 | Insert | SystemMessages | Maakt systeemcommunicatie voor de ontvanger wanneer de berichtlogica dit ondersteunt. |
| 11 | Event | SharedExerciseSystemMessageCreated | Registreert communicatie richting ontvanger. |
| 12 | Transactie | Database | Commit of rollback van de complete deelactie. |
| ALT-004/ALT-006 | Logging | Applicatielog | Weigering wordt technisch herleidbaar gelogd zonder inhoudelijke payloaddetails. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
ExerciseRuns van de deler | De bronrun blijft ongewijzigd. |
ExerciseRunProgress van de deler | Vraagvoortgang wordt niet aangepast door delen. |
ExerciseRuns van de ontvanger | Ontstaat pas bij starten of opnieuw maken. |
UserRelationships | Delen maakt, wijzigt of beëindigt geen vriendschap. |
RelationshipInvitations | Uitnodigingen zijn geen onderdeel van deze flow. |
UserSettings | Voorkeuren worden niet gewijzigd. |
Tickets | Meldingen worden niet geraakt. |
| Privéberichtthreads | De deelactie maakt geen privéberichtthread aan. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Delen met actieve vriend
16.2 Delen geblokkeerd na hercontrole
17. Popupverwijzingen
| PopupKey | Moment | Toepassing |
|---|---|---|
POP-LLN-DEL-SHARE-SELECT | Leerling kiest delen. | Ontvangerselectie voor actieve vrienden. |
POP-LLN-DEL-SHARE-SUCCESS | Delen is succesvol verwerkt. | Bevestigt dat de oefening is gedeeld. |
POP-LLN-DEL-SHARE-FAILED | Delen faalt of wordt geweigerd. | Veilige foutafhandeling zonder brondata te lekken. |
POP-LLN-DEL-NO-FRIENDS | Geen actieve vrienden beschikbaar. | Verwijst naar de blokkeerflow zonder relatiebeheer te dupliceren. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Gedeelde oefeningen beschrijft delen met vrienden, zichtbaarheid, blokkades en gebruikersfeedback. |
| Technisch Ontwerp | Oefenruns, voortgang, resultaten, statistieken en PDF-brondata beschrijft SharedExercises, bronrun-snapshots en het ontstaan van een ontvangerrun. |
| Technisch Ontwerp | Relatiebeheer, uitnodigingen en gedeelde oefeningen beschrijft de friendship-check via publieke relationship-contracts. |
| Technisch Ontwerp | Berichten, systeemberichten, notificaties en privéthreads beschrijft systeemcommunicatie als vindbare ingang voor de ontvanger. |
| Software Requirements Specification | Borgt de centrale requirements voor delen, bronrunbescherming, ontvangerzichtbaarheid, autorisatie en traceerbare acceptatiecriteria. |
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-001-001 | SRS-REL-001 SRS-LRN-009 SRS-SHR-001 AC-REL-001 AC-LRN-009 AC-SHR-001 | Een afgeronde eigen leerlingrun kunnen delen met een actieve vriend |
REQ-UC-LLN-DEL-001-002 | SRS-AUTH-001 SRS-LRN-009 SRS-SHR-003 AC-AUTH-001 AC-LRN-009 AC-SHR-003 | Delen blokkeren wanneer de bronrun niet afgerond, niet eigen of een testrun is |
REQ-UC-LLN-DEL-001-003 | SRS-AUTH-001 SRS-ACC-002 SRS-REL-001 SRS-LRN-009 SRS-SHR-001 SRS-POP-003 AC-AUTH-001 AC-ACC-002 AC-REL-001 AC-LRN-009 AC-SHR-001 AC-POP-003 | Delen server-side autoriseren op leerlingrol, actieve vriendschap, accountstatus en featurebeschikbaarheid |
REQ-UC-LLN-DEL-001-004 | SRS-LRN-009 SRS-SHR-001 SRS-NFR-AUD-001 AC-LRN-009 AC-SHR-001 AC-NFR-AUD-001 | Bij delen een administratief gedeelde-oefeningenrecord vastleggen |
REQ-UC-LLN-DEL-001-005 | SRS-CAT-004 SRS-LRN-009 SRS-SHR-008 SRS-NFR-AUD-001 AC-CAT-004 AC-LRN-009 AC-SHR-008 AC-NFR-AUD-001 | Bij delen historische snapshotgegevens voor niveau, categorie en oefening vastleggen |
REQ-UC-LLN-DEL-001-006 | SRS-LRN-009 SRS-SHR-001 AC-LRN-009 AC-SHR-001 | Bij delen geen ontvangerrun aanmaken |
REQ-UC-LLN-DEL-001-007 | SRS-LRN-003 SRS-SHR-003 AC-LRN-003 AC-SHR-003 | De bronrun, antwoorden, statistieken en voortgang van de deler niet wijzigen |
REQ-UC-LLN-DEL-001-008 | SRS-LRN-009 SRS-SHR-001 AC-LRN-009 AC-SHR-001 | De ontvanger kunnen informeren via centrale systeemcommunicatie |
REQ-UC-LLN-DEL-001-009 | SRS-LRN-009 SRS-SHR-001 SRS-NFR-AVL-001 AC-LRN-009 AC-SHR-001 AC-NFR-AVL-001 | Voorkomen dat een mislukte deelactie een half gedeeld record achterlaat |
REQ-UC-LLN-DEL-001-010 | SRS-REL-003 SRS-REL-006 SRS-LRN-009 SRS-SHR-001 AC-REL-003 AC-REL-006 AC-LRN-009 AC-SHR-001 | Bestaande gedeelde oefeningen behouden wanneer de vriendschap daarna wordt beëindigd |