UC-GEN-ACC-004 — Account verwijderen aanvragen
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-GEN-ACC-004 |
| Naam | Account verwijderen aanvragen |
| Domein | Generiek / Account |
| Primaire actor | Gebruiker |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, accountservice, autorisatieservice, relatieservice, docentstructuurservice, oefenrunservice, berichtenservice, meldingenservice, accountlogkanaal |
| Rolcontext | Geauthenticeerde gebruiker met een actief intern OefenHub-account. De gebruiker handelt namens het eigen account. Beheerderverwijdering van een ander account valt buiten deze usecase. |
| Betrokken schermen | Profiel / accountinstellingen; account-verwijderen-flow; bevestigingspopup; eventuele eigenaarschap-/opvolgerkeuze voor docentniveaus; generieke uitlog- of publieke route na afronding. |
| Gerelateerde usecases | UC-GEN-ACC-001 — Eerste login en account provisioning; UC-GEN-ACC-002 — Inloggen en sessie verwerken; UC-GEN-ACC-003 — Geen rol of onvolledig account afhandelen; UC-GEN-REL-004 — Relatie ontkoppelen; UC-GEN-MSG-005 — Privéberichtthread verwijderen; UC-GEN-PROF-001 — Profiel bekijken |
| Primaire entiteiten | Users, UserRoles, UserSettings, accountlogkanaal |
| Secundaire entiteiten / events | UserRelationships, RelationshipEvents, RelationshipInvitations, SystemMessages, PrivateMessageThreadParticipants, Tickets, ExerciseRuns, LevelAuthorizations, Levels, LevelCollaborators, SharedExercises, LiveViewAudit, AccountDeletionRequested, AccountAnonymized, AccountDependenciesCleaned, AccountDeletionBlocked |
| Gerelateerde popups | POP-GEN-ACC-DELETE-CONFIRM, POP-GEN-ACC-DELETE-BLOCKED, POP-GEN-ACC-DELETE-FAILED |
| Popupregister | POP-GEN-ACC-DELETE-CONFIRM, POP-GEN-ACC-DELETE-BLOCKED en POP-GEN-ACC-DELETE-FAILED staan centraal in het popupregister. Popupteksten en knopteksten worden niet in deze usecase gedupliceerd. |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een ingelogde gebruiker vanuit OefenHub het eigen account verwijdert. Functioneel ziet de gebruiker dit als één verwijderactie met een expliciete bevestiging. Na bevestiging voert OefenHub direct een gecontroleerde verwijder- en anonimiseerflow uit: persoonsgegevens in het interne OefenHub-account worden geanonimiseerd, reguliere toegang wordt beëindigd, relaties en afhankelijke toegang worden opgeruimd en de actie wordt technisch en auditbaar herleidbaar vastgelegd.
De usecase gaat over het interne OefenHub-account en de OefenHub-domeindata. Authenticatie, wachtwoorden, credentials, e-mailverificatie en primaire identity-provideraccounts blijven eigendom van de externe identity provider. OefenHub vraagt of verwerkt daarom geen wachtwoord in deze flow. Wanneer herauthenticatie of extra identiteitscontrole vereist is, verloopt die via de identity-providerflow en niet via een eigen OefenHub-wachtwoordformulier.
Er bestaat voor eindgebruikers geen apart tussenstation waarin het account zichtbaar blijft als “verwijderd maar nog niet geanonimiseerd”. Wanneer de gebruiker de verwijdering definitief bevestigt en de noodzakelijke afhankelijkheden verwerkt kunnen worden, wordt de interne OefenHub-verwijdering direct uitgevoerd. Na afronding heeft de gebruiker geen reguliere OefenHub-applicatietoegang meer met dit interne account.
3. Scope
Deze usecase omvat wel:
- starten van accountverwijdering door de ingelogde gebruiker voor het eigen account;
- tonen van een expliciete bevestiging vóór definitieve verwijdering;
- server-side controleren dat de gebruiker alleen het eigen account verwijdert;
- bepalen van domeinafhankelijkheden die vóór verwijdering moeten worden verwerkt;
- verwerken van docentniveau-eigenaarschap wanneer de verwijderende gebruiker eigenaar is van één of meer niveaus;
- direct anonimiseren van zichtbare persoonsgegevens in
Users; - blokkeren van verdere reguliere OefenHub-toegang voor het verwijderde/geanonimiseerde interne account;
- verbreken of beëindigen van actieve relaties en afhankelijke toegang;
- opruimen of niet-actief maken van openstaande uitnodigingen en openstaande afhankelijkheden die aan het account gekoppeld zijn;
- voorkomen dat open oefenruns na accountverwijdering hervatbaar blijven;
- zichtbaar houden van bestaande geschiedenis onder geanonimiseerde identiteit waar historische of functionele reconstructie nodig blijft;
- beëindigen van de huidige OefenHub-applicatiesessie na succesvolle verwijdering;
- vastleggen van account lifecycle-logging zonder wachtwoorden, tokens of credentialgegevens.
Deze usecase omvat niet:
- verwijderen, deactiveren of wijzigen van het externe identity-provideraccount;
- Keycloak-wachtwoordcontrole, wachtwoord-reset, credentialbeheer of e-mailverificatie;
- beheerderverwijdering of deactivering van een ander account;
- accountreactivatie of herstel na anonimisering;
- export van persoonsgegevens vóór verwijdering;
- wijzigen van rollen als zelfstandige beheeractie;
- inhoudelijk verwijderen van oefengeschiedenis, afgeronde oefenruns of auditrecords;
- verwijderen van privéberichtinhoud uit de mailbox van andere deelnemers buiten de bestaande berichtretentie- en zichtbaarheidsregels;
- genereren van seeddata of implementatiecode.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is ingelogd en heeft een geldige OefenHub-sessiecontext. |
| PRE-002 | De sessiecontext is gekoppeld aan precies één intern Users.Id. |
| PRE-003 | Het interne account is actief op het moment dat de gebruiker de verwijderactie start. |
| PRE-004 | De accountverwijderactie is bereikbaar vanuit een geautoriseerde eigen-accountcontext, bijvoorbeeld profiel of accountinstellingen. |
| PRE-005 | De backend kan server-side vaststellen dat de gebruiker het eigen account verwijdert en niet een ander account via route- of formuliermanipulatie. |
| PRE-006 | De backend kan de relevante accountafhankelijkheden bepalen voordat de definitieve anonimisering wordt uitgevoerd. |
| PRE-007 | Voor docentaccounts kan de backend bepalen of de gebruiker eigenaar is van niveaus en hoeveel actieve collaborators per niveau beschikbaar zijn. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Het interne OefenHub-account is geanonimiseerd en reguliere OefenHub-toegang is beëindigd. |
| POST-002 | Zichtbare persoonsgegevens in Users zijn vervangen door de vastgestelde geanonimiseerde waarden. |
| POST-003 | Het account kan niet opnieuw als regulier nieuw account worden geprovisioneerd voor dezelfde externe identiteit. |
| POST-004 | Actieve relaties en afhankelijke toegang die aan het account gekoppeld waren, zijn beëindigd of niet langer bruikbaar. |
| POST-005 | Openstaande relatie-uitnodigingen die door of naar het account lopen, zijn niet langer accepteerbaar. |
| POST-006 | Open oefenruns van de gebruiker zijn niet langer hervatbaar en verschijnen niet meer in normale geschiedenis- of statistiekweergaven. |
| POST-007 | Afgeronde geschiedenis blijft waar nodig historisch raadpleegbaar onder geanonimiseerde identiteit. |
| POST-008 | Eventuele docentniveaus waarvan de gebruiker eigenaar was, zijn volgens de collaboratorregels overgedragen of historisch/inactief gemaakt. |
| POST-009 | De actieve OefenHub-sessie van de gebruiker is beëindigd. |
| POST-010 | De verwijdering, anonimisering en belangrijkste afhankelijkheidsmutaties zijn technisch herleidbaar vastgelegd in het accountlogkanaal en waar relevant in domeinhistorie. |
| POST-011 | Wanneer verwijdering niet veilig kan worden afgerond, is het account niet half geanonimiseerd en blijft de bestaande toestand consistent. |
6. Trigger
De usecase start wanneer een ingelogde gebruiker vanuit het eigen profiel of de accountinstellingen kiest voor de actie om het eigen account te verwijderen.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Gebruiker | Profiel / accountinstellingen | Kiest de actie om het eigen account te verwijderen. | OefenHub opent de accountverwijderen-flow. | De actie is alleen beschikbaar binnen de eigen geauthenticeerde accountcontext. |
| 2 | OefenHub frontend | Account-verwijderen-flow | Vraagt de backend om de verwijdercontext voor het eigen account. | Backend bepaalt server-side de relevante afhankelijkheden. | Frontend levert geen beslissende UserId voor het te verwijderen account. |
| 3 | OefenHub backend | Accountservice | Controleert sessie, Users.Id, Users.IsActive en eigen-accountautorisatie. | Alleen het eigen actieve account mag via deze flow worden verwijderd. | Objectniveau-autorisatie wordt server-side afgedwongen. |
| 4 | OefenHub backend | Afhankelijkhedenanalyse | Bepaalt relaties, uitnodigingen, open runs, gedeelde oefeningen, meldingen, privéberichtdeelnames, niveauautorisaties en docentniveau-eigenaarschap. | De verwijderflow krijgt een complete verwerkingsset voor de definitieve stap. | Analyse is read-only. |
| 5 | OefenHub backend | Docentstructuurservice | Controleert of de gebruiker eigenaar is van niveaus. | Voor niveaus zonder actieve collaborator wordt historisch/inactief maken voorbereid; bij één actieve collaborator wordt automatische overdracht voorbereid; bij meerdere collaborators is opvolgerkeuze vereist. | Niveau-eigenaarschap mag niet onbepaald achterblijven. |
| 6 | Gebruiker | Account-verwijderen-flow | Kiest waar nodig opvolgende eigenaar voor niveaus met meerdere actieve collaborators. | OefenHub valideert de gekozen opvolgers. | Alleen actieve collaborators van het betreffende niveau zijn geldig. |
| 7 | OefenHub frontend | Bevestigingspopup | Toont de definitieve bevestiging via POP-GEN-ACC-DELETE-CONFIRM. | De gebruiker kan annuleren of definitief bevestigen. | Popupinhoud komt uit het popupregister. |
| 8 | Gebruiker | Bevestigingspopup | Bevestigt definitief dat het account verwijderd moet worden. | Frontend verzendt de bevestiging naar de backend. | Er wordt geen wachtwoord aan OefenHub gevraagd. |
| 9 | OefenHub backend | Accountservice / transactionele verwerking | Start de gecontroleerde verwijder- en anonimiseerflow. | Backend voert de mutaties in een consistente volgorde uit. | Falen mag geen half geanonimiseerde, nog bruikbare accounttoestand opleveren. |
| 10 | OefenHub backend | Docentstructuurservice | Verwerkt eigenaarschap van docentniveaus. | Zonder collaborator wordt niveau inactief/historisch; met één collaborator wordt eigenaarschap overgedragen; met gekozen opvolger wordt eigenaarschap overgedragen. | Geldt alleen voor niveaus waarvan de gebruiker actuele eigenaar is. |
| 11 | OefenHub backend | Relatieservice | Beëindigt actieve relaties en maakt openstaande uitnodigingen niet langer bruikbaar. | Relatie- en uitnodigingscontext kan niet meer leiden tot nieuwe toegang of acceptatie. | Relaties worden niet hard verwijderd maar historisch herleidbaar beëindigd. |
| 12 | OefenHub backend | Autorisatie- en toegangservices | Beëindigt afhankelijke toegang, zoals niveauautorisaties en relatiegebonden toegang. | De verwijderde gebruiker kan geen rolgebonden domeinfuncties meer gebruiken en andere gebruikers krijgen geen toegang meer op basis van deze accountrelaties. | Toegang wordt server-side ingetrokken of genegeerd op basis van beëindigde context. |
| 13 | OefenHub backend | Oefenrunservice | Maakt open oefenruns niet hervatbaar. | Niet-afgeronde runs blijven administratief niet-afgerond maar verdwijnen uit normale geschiedenis- en statistiekweergaven. | IsCompleted = false mag blijven staan; hervatten wordt geblokkeerd. |
| 14 | OefenHub backend | Accountservice / database | Anonimiseert Users en blokkeert reguliere toegang. | Zichtbare identiteit wordt vervangen door geanonimiseerde waarden en het account wordt niet langer actief bruikbaar. | FirstName = Anoniem, MiddleName = #, LastName = <systeemcode>, Email = anoniem.<code>@verwijderd.acc; IsActive = false. |
| 15 | OefenHub backend | Accountlogkanaal / domeinhistorie | Legt de verwijdering, anonimisering en belangrijkste afhankelijkheidsacties vast. | De lifecycle-actie is herleidbaar zonder wachtwoorden, tokens of secrets te loggen. | Accountlogger en relevante domeinhistorie. |
| 16 | OefenHub backend / frontend | Sessiebeheer | Beëindigt de OefenHub-sessie van de gebruiker. | De gebruiker wordt uitgelogd of naar een publieke route geleid. | De geanonimiseerde gebruiker krijgt geen geautoriseerde OefenHub-context meer. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 1 | De gebruiker annuleert vóór de definitieve bevestiging. | De flow stopt en de gebruiker blijft in het profiel of de accountinstellingen. | Geen of sluiting van POP-GEN-ACC-DELETE-CONFIRM. | Geen. |
| ALT-002 | 3 | De sessie is verlopen of ongeldig. | OefenHub voert geen verwijdering uit en start opnieuw de loginflow of toont toegangafhandeling. | Generieke routeguard-/login-afhandeling buiten popupregister. | Geen. |
| ALT-003 | 3 | De request probeert een ander account dan het eigen account te verwijderen. | Backend blokkeert de actie en registreert een autorisatie-incident. | POP-GEN-ACC-DELETE-BLOCKED of generieke toegangafhandeling. | Technische/securitylogging; geen accountmutatie. |
| ALT-004 | 3 | Het account is inmiddels al gedeactiveerd of geanonimiseerd. | OefenHub voert de verwijderflow niet opnieuw regulier uit en leidt naar toegangafhandeling. | Generieke accountstatusafhandeling. | Geen of idempotente technische logging. |
| ALT-005 | 5 | Een docent is eigenaar van een niveau zonder actieve collaborator. | Het niveau wordt bij definitieve verwerking historisch/inactief gemaakt. | Geen aparte popup nodig buiten de verwijderbevestiging. | Update op niveau bij stap 10. |
| ALT-006 | 5 | Een docent is eigenaar van een niveau met precies één actieve collaborator. | De collaborator wordt bij definitieve verwerking automatisch nieuwe eigenaar. | Geen aparte popup nodig buiten de verwijderbevestiging. | Update op niveau-eigenaarschap bij stap 10. |
| ALT-007 | 5 | Een docent is eigenaar van een niveau met twee of meer actieve collaborators. | OefenHub vraagt binnen de flow per relevant niveau om een opvolgende eigenaar. Definitieve verwijdering kan pas verder na geldige keuze. | Componentgedrag; geen popupregister-popup vereist. | Geen mutatie totdat de definitieve flow wordt bevestigd. |
| ALT-008 | 6 | Gekozen opvolger is geen actieve collaborator meer. | OefenHub weigert de keuze en vraagt een geldige actuele opvolger. | Inline validatie binnen de account-verwijderen-flow. | Geen. |
| ALT-009 | 9 | De transactionele verwerking faalt vóór anonimisering. | OefenHub stopt de flow en behoudt de bestaande accounttoestand. | POP-GEN-ACC-DELETE-FAILED. | Geen afgeronde mutaties of rollback. |
| ALT-010 | 10-14 | De verwerking faalt nadat deelmutaties zijn voorbereid. | OefenHub rolt terug of herstelt naar een consistente toestand volgens transactionele inrichting. | POP-GEN-ACC-DELETE-FAILED. | Geen half bruikbare verwijdertoestand. |
| ALT-011 | 11 | Een relatie of uitnodiging is intussen al beëindigd of afgehandeld. | OefenHub behandelt dit idempotent en verwerkt alleen nog actuele open of actieve afhankelijkheden. | Geen. | Geen extra mutatie voor reeds afgehandelde records. |
| ALT-012 | 13 | Er bestaat een actieve live meekijksessie of actieve oefencontext. | OefenHub beëindigt de context als gevolg van accountverwijdering; open run blijft niet hervatbaar. | Eventuele meekijkafhandeling volgt het live-meekijkdomein. | Open run en sessiecontext worden niet hervatbaar. |
| ALT-013 | 14 | Anonimiseringscode botst met een bestaande geanonimiseerde identiteit. | OefenHub genereert een andere niet-voorspelbare systeemcode en probeert opnieuw binnen dezelfde verwerking. | Geen. | Alleen definitieve unieke geanonimiseerde waarde wordt opgeslagen. |
| ALT-014 | 15 | Accountlogging kan niet veilig worden uitgevoerd. | OefenHub blokkeert de verwijdering of rolt terug, omdat account lifecycle-herleidbaarheid verplicht is. | POP-GEN-ACC-DELETE-FAILED. | Geen afgeronde accountverwijdering zonder lifecycle-logging. |
| ALT-015 | 16 | Uitloggen of sessiebeëindiging faalt client-side. | Backend heeft het account al geblokkeerd; vervolgrequests krijgen geen geautoriseerde context meer. | Generieke toegangafhandeling. | Geen extra domeinmutatie. |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Een gebruiker mag via deze flow uitsluitend het eigen interne OefenHub-account verwijderen. |
| BR-002 | Accountverwijdering door een eindgebruiker leidt direct tot anonimisering; er is geen zichtbaar tussenstation “verwijderd maar nog niet geanonimiseerd”. |
| BR-003 | De externe identity provider blijft bronhouder voor authenticatie, wachtwoorden, credentials, e-mailverificatie en primaire sessie. |
| BR-004 | OefenHub vraagt of valideert geen wachtwoord binnen de accountverwijderen-flow. |
| BR-005 | Na accountverwijdering mag dezelfde ExternalId niet stilzwijgend leiden tot een nieuw regulier OefenHub-account. |
| BR-006 | Een geanonimiseerd account krijgt geen reguliere OefenHub-applicatietoegang. |
| BR-007 | Zichtbare persoonsgegevens worden vervangen door de vastgestelde geanonimiseerde waarden: Anoniem, #, een niet-voorspelbare systeemcode en een geanonimiseerd e-mailadres. |
| BR-008 | De systeemwaarde # voor MiddleName is gereserveerd voor systeemgebruik en mag niet via normale gebruikersinvoer worden opgeslagen. |
| BR-009 | Actieve relaties van het account worden beëindigd of niet langer bruikbaar gemaakt; zij worden niet hard verwijderd wanneer historische herleidbaarheid nodig is. |
| BR-010 | Openstaande relatie-uitnodigingen die door of naar het account lopen mogen na accountverwijdering niet meer accepteerbaar zijn. |
| BR-011 | Accountverwijdering mag geen afgeronde oefengeschiedenis hard verwijderen wanneer die geschiedenis functioneel of historisch nodig blijft. |
| BR-012 | Bestaande geschiedenis wordt na accountverwijdering alleen nog onder geanonimiseerde identiteit getoond. |
| BR-013 | Open oefenruns van het verwijderde account mogen niet meer hervatbaar zijn en tellen niet mee in normale geschiedenis- of statistiekweergaven. |
| BR-014 | Wanneer een verwijderende docent eigenaar is van een niveau zonder actieve collaborator, wordt dat niveau historisch/inactief gemaakt. |
| BR-015 | Wanneer een verwijderende docent eigenaar is van een niveau met precies één actieve collaborator, wordt eigenaarschap automatisch aan die collaborator overgedragen. |
| BR-016 | Wanneer een verwijderende docent eigenaar is van een niveau met twee of meer actieve collaborators, moet vóór definitieve verwijdering een geldige opvolgende eigenaar gekozen worden. |
| BR-017 | Accountverwijdering moet technisch en auditbaar herleidbaar zijn via het accountlogkanaal en relevante domeinhistorie. |
| BR-018 | Account lifecycle-logging mag geen wachtwoorden, tokens, secrets of vergelijkbare authenticatiegegevens bevatten. |
| BR-019 | Falen van de verwijderflow mag niet leiden tot een half geanonimiseerd account dat nog reguliere toegang heeft. |
| BR-020 | Beheerderdeactivering en beheerderverwijdering van andere accounts zijn aparte beheerflows en vallen niet onder deze selfservice-usecase. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| Sessiecontext | Moet geldig zijn en gekoppeld zijn aan precies één intern Users.Id. |
| Te verwijderen account | Moet gelijk zijn aan het account van de ingelogde gebruiker. Routeparameters of formulierwaarden mogen dit niet overschrijven. |
Users.IsActive | Moet true zijn bij het starten van de reguliere selfservice-verwijderflow. |
| Verwijderbevestiging | Moet expliciet door de gebruiker zijn gegeven via de bevestigingsactie. |
Users.ExternalId | Blijft geschikt om latere reprovisioning met dezelfde externe identiteit te blokkeren of veilig af te handelen volgens de account lifecycle-regels. |
| Geanonimiseerde systeemcode | Moet niet-voorspelbaar en uniek genoeg zijn om zichtbare identiteit niet tot de oorspronkelijke gebruiker te herleiden. |
| Geanonimiseerd e-mailadres | Moet voldoen aan het patroon anoniem.<code>@verwijderd.acc en mag niet botsen met een bestaand actief e-mailadres. |
MiddleName | De waarde # mag alleen door systeemprocessen worden gezet. |
| Niveau-opvolger | Moet een actieve collaborator zijn op het betreffende niveau. |
| Relaties | Alleen actieve relaties van of naar de gebruiker worden beëindigd; reeds inactieve relaties blijven historisch ongewijzigd. |
| Relatie-uitnodigingen | Alleen openstaande uitnodigingen die door of naar het account lopen worden niet langer accepteerbaar gemaakt. |
| Open oefenruns | Alleen niet-afgeronde runs van de gebruiker worden niet-hervatbaar gemaakt; afgeronde runs blijven historisch raadpleegbaar onder geanonimiseerde identiteit. |
| Accountlog | Moet de lifecycle-actie kunnen vastleggen zonder credentialgegevens, tokens of secrets. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 3 | Read | Users | Leest en valideert het eigen actieve account op basis van de sessiecontext. |
| 4 | Read | Afhankelijke domeinrecords | Leest relaties, uitnodigingen, berichtencontext, meldingencontext, oefenruns, gedeelde oefeningen, niveauautorisaties en docentstructuurafhankelijkheden. |
| 5 | Read | Levels, LevelCollaborators | Bepaalt of de gebruiker eigenaar is van niveaus en hoeveel actieve collaborators beschikbaar zijn. |
| 7 | Read | Popupregister | Gebruikt POP-GEN-ACC-DELETE-CONFIRM voor de definitieve bevestiging. |
| 9 | Technisch event | AccountDeletionRequested | Legt vast dat de definitieve verwijderflow is bevestigd en gestart. |
| 10 | Update | Levels | Maakt niveau historisch/inactief wanneer de verwijderende eigenaar geen actieve collaborator heeft. |
| 10 | Update | Levels | Draagt eigenaarschap over aan één actieve collaborator of aan de gekozen geldige opvolger. |
| 10 | Event / history | LevelOwnershipTransferredDueToAccountDeletion | Legt eigendomsoverdracht door accountverwijdering historisch vast. |
| 11 | Update | UserRelationships | Beëindigt actieve relaties van of naar het account via administratieve deactivering. |
| 11 | Create | RelationshipEvents | Legt relatiebeëindiging door accountverwijdering vast. |
| 11 | Update | RelationshipInvitations | Maakt openstaande uitnodigingen van of naar het account niet langer accepteerbaar. |
| 12 | Update | LevelAuthorizations | Beëindigt of neutraliseert niveauautorisaties die afhankelijk zijn van het verwijderde account. |
| 12 | Update | PrivateMessageThreadParticipants | Beëindigt de zichtbaarheid of deelname van het verwijderde account volgens berichtendomeinregels. |
| 12 | Update | SharedExercises | Maakt openstaande gedeelde-oefeningafhankelijkheden van het verwijderde account niet langer bruikbaar waar dat nodig is. |
| 12 | Update | Tickets / ticketcontext | Beëindigt open gebruikersactie voor meldingen van het verwijderde account en toont betrokken identiteit voortaan geanonimiseerd. |
| 13 | Update | ExerciseRuns | Open runs blijven administratief niet-afgerond maar worden niet meer hervatbaar en niet zichtbaar in normale geschiedenis/statistiek. |
| 14 | Update | Users | Zet zichtbare identiteit om naar geanonimiseerde waarden en blokkeert reguliere toegang, minimaal via IsActive = false. |
| 14 | Update | UserSettings | Maakt instellingen niet langer actief toepasbaar voor reguliere gebruikersflows of laat ze alleen historisch gekoppeld aan het geanonimiseerde account bestaan. |
| 14 | Technisch event | AccountAnonymized | Legt vast dat het interne account is geanonimiseerd. |
| 15 | Log | Accountlogkanaal | Legt oude en nieuwe identiteit afgeschermd vast volgens accountloggerregels. |
| 15 | Technisch event | AccountDependenciesCleaned | Legt vast dat afhankelijke domeincontext is opgeruimd of beëindigd. |
| 16 | Technisch | Applicatiesessie | Beëindigt of ongeldig maakt de actuele OefenHub-sessiecontext. |
| ALT-003 | Technisch event | AccountDeletionDeniedForDifferentUser | Legt geblokkeerde poging tot verwijderen van een ander account vast. |
| ALT-009 / ALT-010 / ALT-014 | Technisch event | AccountDeletionBlocked | Legt vast dat de verwijderflow niet is afgerond door validatie-, transactie- of loggingprobleem. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
| Identity-provideraccount | OefenHub beheert de externe identity-providergebruiker niet binnen deze usecase. |
| Wachtwoorden / credentials | OefenHub bewaart, controleert of wijzigt geen wachtwoorden of credentialgegevens. |
| Identity-provider-sessies | Primaire sessieafhandeling bij de identity provider valt buiten OefenHub-domeinmutaties. |
Roles | Accountverwijdering wijzigt de rolcatalogus niet. |
ProfileAvatars | De vaste avatarset wordt niet gewijzigd. |
Afgeronde ExerciseRuns | Afgeronde runs worden niet hard verwijderd; de zichtbare gebruiker wordt geanonimiseerd. |
| Audit- en historyrecords | Bestaande historie wordt niet hard verwijderd wanneer deze nodig blijft voor functionele of technische herleidbaarheid. |
| Privéberichtinhoud van andere deelnemers | De mailboxzichtbaarheid en retentie van andere deelnemers volgt het berichtendomein; deze usecase verwijdert niet generiek hun threadinhoud. |
SiteNotifications | Accountverwijdering maakt, wijzigt of sluit geen systeemnotificaties. |
SiteFeatureToggles | Featuretoggles worden niet gewijzigd. |
| Nieuwe accountstatus-entiteit | Accountverwijdering gebruikt bestaande accountvelden, anonimisering en logging; er wordt geen aparte accountstatus- of verwijderaanvraagtabel geïntroduceerd. |
| Sessie-entiteit | Er is geen aparte OefenHub-sessietabel; sessiebeëindiging is technische applicatielogica. |
13. State diagram
Er is geen los accountstatusmodel naast bestaande accountvelden en lifecyclelogica. Omdat deze usecase de functionele accounttoestand wel definitief verandert, toont het onderstaande diagram de afgeleide accountlifecycle rond verwijdering.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Succesvolle selfservice-accountverwijdering
16.2 Verwijdering met docentniveau-overdracht
16.3 Verwijdering geblokkeerd
17. Popupverwijzingen
| PopupKey | Moment | Variant | Doel |
|---|---|---|---|
POP-GEN-ACC-DELETE-CONFIRM | Vóór definitieve verwijdering na afhankelijkheidsanalyse en eventuele opvolgerkeuze. | Confirm | Laat de gebruiker de accountverwijdering expliciet bevestigen. |
POP-GEN-ACC-DELETE-BLOCKED | Wanneer de gebruiker de actie niet mag uitvoeren of de huidige context verwijderen blokkeert. | InfoOnly | Legt uit dat accountverwijdering niet kan worden uitgevoerd vanuit deze context. |
POP-GEN-ACC-DELETE-FAILED | Wanneer de gecontroleerde verwijder- en anonimiseerflow niet veilig kon worden afgerond. | InfoOnly | Geeft aan dat het account niet is verwijderd en dat de bestaande toestand behouden blijft. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Beschrijf accountverwijdering als selfserviceflow vanuit het eigen profiel of accountinstellingen met expliciete bevestiging. |
| Functioneel Ontwerp | Beschrijft dat selfservice-accountverwijdering direct leidt tot interne anonimisering en geen aparte eindgebruikersstatus “verwijderd maar nog niet geanonimiseerd” kent. |
| Functioneel Ontwerp | Beschrijf de zichtbare gevolgen: gebruiker verliest toegang, relaties worden beëindigd, open runs zijn niet hervatbaar en historie blijft alleen geanonimiseerd zichtbaar. |
| Functioneel Ontwerp | Beschrijf de docentregel voor eigenaarschap van niveaus bij accountverwijdering: geen collaborator betekent historisch/inactief, één collaborator betekent automatische overdracht, meerdere collaborators betekent opvolger kiezen. |
| Functioneel Ontwerp | Beschrijft dat Keycloak/identity provider bronhouder blijft voor credentials en dat OefenHub geen wachtwoord vraagt of wijzigt in deze flow. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, logging en foutafhandeling | Beschrijft de verwijder- en anonimiseerflow transactioneel of herstelbaar zodat geen half geanonimiseerde bruikbare accounttoestand ontstaat. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, logging en foutafhandeling | Beschrijft de volgorde uit voor afhankelijkhedenanalyse, niveau-eigenaarschap, relatiebeëindiging, autorisatiebeëindiging, open runs, anonimisering, logging en sessiebeëindiging. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, logging en foutafhandeling | Beschrijft dat ExternalId niet mag leiden tot stille reprovisioning na accountverwijdering. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, logging en foutafhandeling | Werk account lifecycle-logging uit in een afgeschermd accountlogkanaal zonder wachtwoorden, tokens of secrets. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, logging en foutafhandeling | Werk popupkeys voor accountverwijdering uit in het popupregister en koppel ze aan het popupbeheer. |
| Software Requirements Specification | Bevat requirements voor selfservice-accountverwijdering, directe anonimisering, dependency cleanup, docentniveau-overdracht, blokkade van reprovisioning en veilige foutafhandeling. |
| Database-informatie | Werk Users, UserSettings, UserRelationships, RelationshipInvitations, ExerciseRuns, docentniveau-eigenaarschap, accountlogging en historygevolgen uit. |
| Architectuur | Leg de grens vast tussen interne OefenHub-accountverwijdering en externe identity-provideraccount lifecycle. |
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-GEN-ACC-004-001 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 AC-AUTH-001 AC-ACC-002 AC-ACC-004 | Een ingelogde gebruiker de mogelijkheid bieden om het eigen OefenHub-account te verwijderen vanuit een geautoriseerde eigen-accountcontext |
REQ-UC-GEN-ACC-004-002 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 AC-AUTH-001 AC-ACC-002 AC-ACC-004 | Server-side afdwingen dat een gebruiker via deze flow uitsluitend het eigen account kan verwijderen |
REQ-UC-GEN-ACC-004-003 | SRS-ACC-002 SRS-ACC-004 SRS-POP-001 AC-ACC-002 AC-ACC-004 AC-POP-001 | Vóór definitieve accountverwijdering een expliciete bevestiging vragen via het popupregister |
REQ-UC-GEN-ACC-004-004 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-SEC-001 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-NFR-SEC-001 AC-NFR-PRV-001 | Binnen OefenHub geen wachtwoord of credentialgegevens vragen, opslaan of valideren voor accountverwijdering |
REQ-UC-GEN-ACC-004-005 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-NFR-PRV-001 | Accountverwijdering direct verwerken als gecontroleerde anonimiseer- en opruimflow zonder apart eindgebruikers-tussenstation |
REQ-UC-GEN-ACC-004-006 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 | Zichtbare persoonsgegevens van het interne account vervangen door vastgestelde geanonimiseerde waarden |
REQ-UC-GEN-ACC-004-007 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 AC-AUTH-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 | Reguliere OefenHub-toegang blokkeren voor het geanonimiseerde account |
REQ-UC-GEN-ACC-004-008 | SRS-ACC-001 SRS-ACC-004 AC-ACC-001 AC-ACC-004 | Voorkomen dat dezelfde externe identiteit na accountverwijdering stilzwijgend opnieuw als regulier nieuw account wordt geprovisioneerd |
REQ-UC-GEN-ACC-004-009 | SRS-ACC-002 SRS-ACC-004 SRS-REL-003 SRS-REL-006 AC-ACC-002 AC-ACC-004 AC-REL-003 AC-REL-006 | Actieve relaties van of naar het verwijderde account beëindigen of niet langer bruikbaar maken |
REQ-UC-GEN-ACC-004-010 | SRS-ACC-002 SRS-ACC-004 SRS-REL-002 AC-ACC-002 AC-ACC-004 AC-REL-002 | Openstaande relatie-uitnodigingen van of naar het verwijderde account niet langer accepteerbaar maken |
REQ-UC-GEN-ACC-004-011 | SRS-AUTH-001 SRS-ACC-002 SRS-REL-003 SRS-REL-006 SRS-CAT-001 AC-AUTH-001 AC-ACC-002 AC-REL-003 AC-REL-006 AC-CAT-001 | Afhankelijke niveauautorisaties en relatiegebonden toegang beëindigen of niet langer toepassen |
REQ-UC-GEN-ACC-004-012 | SRS-ACC-002 SRS-ACC-004 SRS-LRN-002 SRS-LRN-007 SRS-NFR-AUD-001 AC-ACC-002 AC-ACC-004 AC-LRN-002 AC-LRN-007 AC-NFR-AUD-001 | Open oefenruns van het verwijderde account niet langer hervatbaar maken en buiten normale geschiedenis- en statistiekweergaven houden |
REQ-UC-GEN-ACC-004-013 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 SRS-NFR-AUD-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 AC-NFR-AUD-001 | Afgeronde geschiedenis waar nodig historisch beschikbaar houden onder geanonimiseerde identiteit |
REQ-UC-GEN-ACC-004-014 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-006 SRS-CAT-005 SRS-TCH-006 AC-ACC-002 AC-ACC-004 AC-ACC-006 AC-CAT-005 AC-TCH-006 | Bij verwijdering van een docent die eigenaar is van een niveau zonder actieve collaborator het niveau historisch of inactief maken |
REQ-UC-GEN-ACC-004-015 | SRS-ACC-002 SRS-ACC-004 SRS-CAT-001 SRS-TCH-006 AC-ACC-002 AC-ACC-004 AC-CAT-001 AC-TCH-006 | Bij verwijdering van een docent die eigenaar is van een niveau met precies één actieve collaborator het eigenaarschap automatisch aan die collaborator overdragen |
REQ-UC-GEN-ACC-004-016 | SRS-ACC-002 SRS-ACC-004 SRS-CAT-001 SRS-TCH-006 AC-ACC-002 AC-ACC-004 AC-CAT-001 AC-TCH-006 | Bij verwijdering van een docent die eigenaar is van een niveau met meerdere actieve collaborators vóór definitieve verwijdering een geldige opvolgende eigenaar laten kiezen |
REQ-UC-GEN-ACC-004-017 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-PRV-001 SRS-NFR-AUD-001 AC-ACC-002 AC-ACC-004 AC-NFR-PRV-001 AC-NFR-AUD-001 | Accountverwijdering, anonimisering en de belangrijkste afhankelijkheidsmutaties technisch herleidbaar vastleggen in een accountlogkanaal |
REQ-UC-GEN-ACC-004-018 | SRS-ACC-002 SRS-NFR-SEC-001 SRS-NFR-LOG-001 AC-ACC-002 AC-NFR-SEC-001 AC-NFR-LOG-001 | Wachtwoorden, tokens, secrets of vergelijkbare authenticatiegegevens niet opnemen in account lifecycle-logging |
REQ-UC-GEN-ACC-004-019 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-007 AC-ACC-002 AC-ACC-004 AC-ACC-007 | De actieve OefenHub-sessie beëindigen nadat accountverwijdering succesvol is afgerond |
REQ-UC-GEN-ACC-004-020 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-SEC-001 SRS-NFR-PRV-001 AC-AUTH-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-SEC-001 AC-NFR-PRV-001 | Falende accountverwijdering veilig afhandelen zonder half geanonimiseerde accounttoestand met reguliere toegang |