UC-BEH-MOD-008 — Modulemigratie globaal uitvoeren
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-BEH-MOD-008 |
| Naam | Modulemigratie globaal uitvoeren |
| Domein | Beheerder / Modules beheren |
| Primaire actor | Beheerder |
| Secundaire actor(en) | Frontend, backend, database, autorisatiecomponent, modulebeheercomponent, historiecomponent, strategy-interface |
| Rolcontext | Actieve beheerdercontext; server-side bepaald vanuit de ingelogde gebruiker |
| Betrokken schermen | Content > Modules beheren |
| Gerelateerde usecases | UC-BEH-MOD-001, UC-BEH-MOD-002, UC-BEH-MOD-003, UC-BEH-MOD-004, UC-BEH-MOD-005, UC-BEH-MOD-006, UC-BEH-MOD-007, UC-BEH-MOD-009, UC-BEH-MOD-010 |
| Primaire entiteiten | ExerciseModules, Exercises, ExerciseHistory, ExerciseModuleMigrations, ExerciseRuns, Users |
| Secundaire entiteiten / events | TeacherLevels, TeacherLevelCategories, TeacherLevelCategoryExercises, UserRoles, modulebeheer-readmodels, strategy-interface |
| Gerelateerde popups | POP-BEH-MOD-MIGRATION-GLOBAL-CONFIRM |
| Popupregister | Ontwerpbronnen — Popup-register |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een beheerder vanuit Migreren - alles alle actieve concrete oefeningen die de geopende bronmodule gebruiken migreert naar een actieve doelmodule.
Globale migratie is een zware onderhoudsactie. De beheerder kiest een doelmodule, ziet de volledige impact op hoofdlijnen en bevestigt met een verplichte reden.
De migratie werkt administratief vooruit op Exercises. Historische ExerciseRuns, resultaten, geschiedenis en gedeelde oefening-snapshots blijven onveranderd en blijven herleidbaar naar de modulecontext die gold bij uitvoering.
Uitgangspunten
- Technische modules worden administratief beheerd in ExerciseModules en niet runtime ontdekt uit assemblies of codepaden.
- Een concrete oefening verwijst altijd naar precies één ExerciseModules-record.
- Modulebeheer wijzigt centrale modulemetadata en onderhoudsacties, niet de inhoudelijke docentconfiguratie van oefeningen.
- Historische runs behouden hun oorspronkelijke modulecontext.
- Popupinhoud blijft bronhoudend in het centrale popupregister.
3. Scope
Deze usecase beschrijft:
- Doelmodule kiezen voor globale migratie.
- Bepalen van alle actieve Exercises die de bronmodule gebruiken.
- Tonen van impact op aantallen oefeningen, docenten en leerlingtoegang.
- Transactioneel wijzigen van ExerciseModuleId voor de globale scope.
- Vastleggen van ExerciseModuleMigrations met scope Global.
- Vastleggen van ExerciseHistory per gemigreerde oefening.
Deze usecase beschrijft niet:
- Concrete docent-oefeningen configureren of de modulespecifieke configuratiepayload bewerken; dat blijft bronhoudend in docentflows of docentondersteuning.
- Leerlingruns, resultaten, geschiedenis of gedeelde oefeningen herschrijven; historische runs behouden hun oorspronkelijke modulecontext.
- Nieuwe technische modulecode leveren of implementeren; modulecode blijft onderdeel van de technische codebase.
- Popupteksten, knopteksten of inputlabels specificeren; usecases verwijzen uitsluitend naar PopupKey.
- Docentgerichte scope; dit hoort bij UC-BEH-MOD-007.
- Proefmigratie op één oefening; dit hoort bij UC-BEH-MOD-009.
- Backwards compatibility hard afdwingen.
- Historische runs converteren naar de nieuwe module.
3.1 Afbakening met aangrenzende domeinen
| Onderdeel | Afbakening |
|---|---|
| Docent / Oefeningen configureren | Docenten kiezen en configureren concrete oefeningen op basis van beschikbare modules; centrale technische module-identiteit wordt hier beheerd. |
| Beheerder / Docentondersteuning | Support kan concrete docentstructuren en oefeningen inspecteren, maar centrale modulemetadata en migraties worden hier beheerd. |
| Leerling / Oefenen en resultaten | Leerlingruns blijven historische uitvoeringen en worden niet herschreven door modulebeheer. |
| Database-informatie | ExerciseModules, ExerciseModuleMigrations en ExerciseHistory dragen de technische module-identiteit, migratieaudit en oefeninghistorie. |
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is succesvol ingelogd in OefenHub. |
| PRE-002 | De backend heeft server-side vastgesteld dat de gebruiker een actieve beheerderrol heeft. |
| PRE-003 | De beheerder bevindt zich binnen de beheeromgeving via Content > Modules beheren. |
| PRE-004 | De pagina gebruikt actuele serverdata; clientstate, routeparameters of verborgen formuliervelden bepalen geen autorisatie of module-identiteit. |
| PRE-005 | De beheerder heeft de detailweergave van de bronmodule geopend. |
| PRE-006 | De sectie Migreren - alles is zichtbaar. |
| PRE-007 | Er bestaat minimaal één actieve doelmodule die verschilt van de bronmodule. |
| PRE-008 | Er bestaan actieve concrete oefeningen op de bronmodule of de flow toont een lege scope. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Alle actieve concrete oefeningen op de bronmodule verwijzen naar de doelmodule wanneer de migratie slaagt. |
| POST-002 | ExerciseModuleMigrations bevat bronmodule, doelmodule, scope Global, actor, tijdstip, reden en snapshots. |
| POST-003 | ExerciseHistory bevat per gemigreerde oefening een modulemigratieregel. |
| POST-004 | Historische ExerciseRuns en bestaande resultaten blijven ongewijzigd. |
| POST-005 | Bij fout wordt geen onherleidbare gedeeltelijke migratie achtergelaten. |
6. Trigger
De usecase start wanneer de beheerder in Migreren - alles een doelmodule kiest en de globale migratie bevestigt.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Beheerder | Migreren - alles | Kiest actieve doelmodule. | De frontend valideert dat doelmodule verschilt van bronmodule. | TargetExerciseModuleId. |
| 2 | Backend | MigratieService | Bepaalt globale scope. | Alle actieve concrete oefeningen op bronmodule worden geselecteerd. | Exercises. |
| 3 | Backend | Impactreadmodel | Berekent impact. | Aantal oefeningen, docenten en unieke leerlingen wordt getoond. | Exercises, docentstructuur, niveauautorisaties. |
| 4 | Frontend | Popup | Toont bevestiging met verplichte reden. | De beheerder bevestigt bewust de globale migratie. | PopupKey POP-BEH-MOD-MIGRATION-GLOBAL-CONFIRM. |
| 5 | Beheerder | Popup | Bevestigt met reden. | De backend start transactionele verwerking. | Reason verplicht. |
| 6 | Backend | Autorisatiecomponent | Controleert beheerdercontext opnieuw. | Alleen beheerder mag globale migratie uitvoeren. | Server-side autorisatie. |
| 7 | Backend | MigratieService | Valideert bron en doel opnieuw. | Scope wordt opnieuw server-side berekend. | Source en target. |
| 8 | Backend | MigratieService | Update Exercises. | ExerciseModuleId wordt voor alle scope-oefeningen aangepast. | Exercises.ExerciseModuleId. |
| 9 | Backend | MigratieService | Schrijft ExerciseModuleMigrations. | Scope Global wordt vastgelegd met snapshots. | ExerciseModuleMigrations. |
| 10 | Backend | HistorieService | Schrijft ExerciseHistory per oefening. | ActionType MODULE_MIGRATION_SOURCE_TO_TARGET. | ExerciseHistory. |
| 11 | Frontend | Migreren - alles | Toont resultaat en bijgewerkte impact. | De bronmodule-impact wordt herberekend. | Readmodel. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 1 | Doelmodule is gelijk aan bronmodule. | De doelkeuze wordt geweigerd. | Niet van toepassing. | Geen. |
| ALT-002 | 1 | Geen actieve doelmodule beschikbaar. | De globale migratie kan niet worden uitgevoerd. | Niet van toepassing. | Geen. |
| ALT-003 | 2 | Globale scope is leeg. | De pagina toont dat er geen actieve oefeningen te migreren zijn; definitieve actie blijft uitgeschakeld. | Niet van toepassing. | Geen. |
| ALT-004 | 4 | Beheerder annuleert. | Geen migratie wordt uitgevoerd. | POP-BEH-MOD-MIGRATION-GLOBAL-CONFIRM. | Geen. |
| ALT-005 | 5 | Reden ontbreekt. | De bevestiging wordt geweigerd. | POP-BEH-MOD-MIGRATION-GLOBAL-CONFIRM. | Geen. |
| ALT-006 | 7 | Scope wijzigt tussen impactweergave en bevestiging. | De backend herberekent scope; bij materiële afwijking wordt actuele bevestiging gevraagd. | Niet van toepassing. | Geen. |
| ALT-007 | 8 | Fout tijdens update. | De transactie wordt teruggedraaid of volledig herleidbaar afgehandeld. | Niet van toepassing. | Geen onherleidbare gedeeltelijke migratie. |
9. Business rules
| ID | Business rule |
|---|---|
| BR-001 | Globale migratie werkt vanuit één geopende bronmodule. |
| BR-002 | Alleen actieve modules zijn selecteerbaar als doelmodule. |
| BR-003 | Migreren naar dezelfde module is niet toegestaan. |
| BR-004 | Globale migratie raakt alle actieve concrete oefeningen op de bronmodule. |
| BR-005 | De beheerder moet impact zien voordat definitieve uitvoering plaatsvindt. |
| BR-006 | Een verplichte reden is vereist. |
| BR-007 | Historische runs, resultaten, PDF-export en gedeelde oefeningen worden niet herschreven. |
| BR-008 | OefenHub dwingt backwards compatibility niet hard af; dit is een expliciet beheerdersrisico. |
| BR-009 | Per gemigreerde oefening moet ExerciseHistory worden geschreven. |
10. Datavalidatie
| ID | Validatie |
|---|---|
| VAL-001 | SourceExerciseModuleId is de geopende module. |
| VAL-002 | TargetExerciseModuleId is verplicht, actief en verschillend van bronmodule. |
| VAL-003 | Globale scope wordt server-side bepaald. |
| VAL-004 | Reason is verplicht en maximaal 500 tekens. |
| VAL-005 | De beheerderrol wordt vlak vóór uitvoering gevalideerd. |
| VAL-006 | Alle te migreren Exercises moeten op dat moment nog naar de bronmodule verwijzen. |
| VAL-007 | Migratieverwerking moet transactioneel of volledig herleidbaar zijn. |
11. Datamutaties en events
| ID | Mutatie / event | Toelichting |
|---|---|---|
| MUT-001 | Update Exercises | ExerciseModuleId wordt voor alle actieve scope-oefeningen aangepast naar de doelmodule. |
| MUT-002 | Insert ExerciseModuleMigrations | Migratieheader met bron, doel, scope Global, snapshots, actor, tijdstip en reden. |
| MUT-003 | Insert ExerciseHistory | Per gemigreerde oefening een MODULE_MIGRATION_SOURCE_TO_TARGET-regel. |
12. Geen datamutaties
| ID | Geen mutatie | Reden |
|---|---|---|
| NO-001 | ExerciseRuns | Historische runs blijven ongewijzigd. |
| NO-002 | ExerciseRunProgress | Vraagvoortgang blijft ongewijzigd. |
| NO-003 | SharedExercises | Gedeelde oefenrecords en snapshots blijven ongewijzigd. |
| NO-004 | Users en UserRoles | Geen rol- of accountwijzigingen. |
| NO-005 | ModuleConfigurationJsonBase64 | Geen automatische conversie van payloads tenzij door afzonderlijke technische migratielogica expliciet ondersteund. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
17. Popupverwijzingen
| PopupKey | Gebruik |
|---|---|
| POP-BEH-MOD-MIGRATION-GLOBAL-CONFIRM | Bevestiging van globale modulemigratie met verplichte reden. |
De popupinhoud, knopteksten, inputlabels en themakeuze blijven bronhoudend in het popupregister en popup-themes.
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Document | Afleiding |
|---|---|
| Functioneel Ontwerp | Globale modulemigratie migreert alle actieve concrete oefeningen van bronmodule naar doelmodule. |
| Technisch Ontwerp | Technisch Ontwerp: oefencatalogus, oefenmodulecontract, background jobs en teststrategie beschrijven de technische uitwerking. Migratie schrijft ExerciseModuleMigrations met scope Global en ExerciseHistory per oefening. |
| Software Requirements Specification | SRS moet impactweergave, doelmodulevalidatie, verplichte reden en historische non-mutatie afdwingen. |
| Database | Gebruikt ExerciseModules, Exercises, ExerciseModuleMigrations en ExerciseHistory. |
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-BEH-MOD-008-001 | SRS-ADM-004 SRS-ADM-001 SRS-MOD-004 AC-ADM-004 AC-ADM-001 AC-MOD-004 | Globale modulemigratie ondersteunen vanuit een geopende bronmodule |
REQ-BEH-MOD-008-002 | SRS-ADM-004 SRS-ADM-001 SRS-MOD-003 AC-ADM-004 AC-ADM-001 AC-MOD-003 | Alleen actieve doelmodules toestaan |
REQ-BEH-MOD-008-003 | SRS-AUTH-001 SRS-ADM-004 SRS-ADM-001 SRS-MOD-003 AC-AUTH-001 AC-ADM-004 AC-ADM-001 AC-MOD-003 | Migreren naar dezelfde module blokkeren |
REQ-BEH-MOD-008-004 | SRS-AUTH-001 SRS-ADM-001 AC-AUTH-001 AC-ADM-001 | De globale migratiescope server-side bepalen |
REQ-BEH-MOD-008-005 | SRS-ADM-001 AC-ADM-001 | Impact tonen vóór definitieve uitvoering |
REQ-BEH-MOD-008-006 | SRS-ADM-001 AC-ADM-001 | Een verplichte reden vragen |
REQ-BEH-MOD-008-007 | SRS-ADM-004 SRS-ADM-001 SRS-MOD-003 SRS-NFR-AUD-001 AC-ADM-004 AC-ADM-001 AC-MOD-003 AC-NFR-AUD-001 | ExerciseModuleMigrations met scope Global vastleggen |
REQ-BEH-MOD-008-008 | SRS-LRN-009 SRS-ADM-001 SRS-NFR-AUD-001 AC-LRN-009 AC-ADM-001 AC-NFR-AUD-001 | Per gemigreerde oefening ExerciseHistory vastleggen |
REQ-BEH-MOD-008-009 | SRS-LRN-009 SRS-SHR-001 SRS-ADM-001 AC-LRN-009 AC-SHR-001 AC-ADM-001 | Historische ExerciseRuns, resultaten en gedeelde oefeningen niet herschrijven |