UC-GEN-MSG-001 — Berichtenoverzicht bekijken
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-GEN-MSG-001 |
| Naam | Berichtenoverzicht bekijken |
| Domein | Berichten |
| Primaire actor | Ingelogde gebruiker |
| Secundaire actor(en) | Systeem, andere deelnemers aan privéberichtthreads, broncomponenten die systeemberichten hebben aangemaakt |
| Rolcontext | Iedere ingelogde rolcontext; zichtbaarheid wordt server-side beperkt tot eigen systeemberichten en eigen privéberichtthread-deelname |
| Betrokken schermen | SCH-GEN-02 — Berichtenoverzicht, SCH-GEN-04 — Open bericht als vervolgcontext |
| Gerelateerde usecases | UC-GEN-MSG-002 — Nieuw privébericht opstellen en verzenden; UC-GEN-MSG-003 — Bericht openen; UC-GEN-MSG-004 — Bericht beantwoorden; UC-GEN-MSG-005 — Privéberichtthread verwijderen |
| Primaire entiteiten | SystemMessages, PrivateMessageThreads, PrivateMessageThreadParticipants, PrivateMessages |
| Secundaire entiteiten / events | PrivateMessageThreadEvents, Users, SystemSettings, SiteFeatureToggles, MessageUnreadCountChanged, SystemMessageReadStateChanged, PrivateThreadReadStateChanged, PrivateMessageThreadRemovedFromMailbox |
| Gerelateerde popups | POP-GEN-MSG-DELETED |
| Popupregister | Ontwerpbronnen — Popup-register |
| MoSCoW | Must have |
2. Omschrijving
De gebruiker opent het centrale berichtenoverzicht om eigen systeemberichten en eigen privéberichtthreads te bekijken. Het overzicht combineert beide berichtsoorten in één mailboxweergave, maar behoudt technisch en functioneel het onderscheid tussen systeemberichten en privéberichten.
De usecase beschrijft het laden van de mailbox, het toepassen van zoek- en filtercriteria, het bepalen van ongelezenstatus, het tonen van dynamische samenvattingswaarden, het direct wijzigen van leesstatus en het starten van de verwijderflow voor een privéberichtthread uit de eigen mailboxweergave. De usecase beschrijft niet de inhoudelijke detailafhandeling van een geopend bericht of het opstellen van een nieuw privébericht.
Bouwfasering: Feature 11 Batch 4 bouwt de mailboxbasis, readmodels, routes, readstate en badgebasis. De muterende privéthreadflows voor opstellen, beantwoorden en participantgebonden verwijderen blijven Batch 6, ook wanneer het overzicht de latere capability conceptueel kent.
3. Scope
Deze usecase beschrijft:
- het openen van het berichtenoverzicht vanuit het berichtenicoon of een functioneel gelijkwaardige berichtenroute;
- het samenstellen van één gecombineerd overzicht met systeemberichten en privéberichtthreads;
- het tonen van één overzichtregel per zichtbare private thread, niet per individueel privébericht;
- het group-ready samenvatten van private threads met 2+ deelnemers;
- de server-side zichtbaarheid van eigen berichten en eigen threaddeelname;
- sortering op meest recente bericht- of threadactiviteit;
- typefilter, statusfilter, zoekterm en paginering;
- dynamische aantallen voor ongelezen items, systeemberichten, privéberichtthreads en bewaartermijn;
- het direct markeren als gelezen of ongelezen vanuit de lijst;
- het tonen van toegestane acties op basis van het actuele capabilitycontract;
- het niet-actief tonen of verbergen van muterende privéthreadacties zolang
UC-GEN-MSG-005nog niet is gebouwd; - de disabled of afwezige verwijderactie voor systeemberichten;
- lege staten, foutstaten en timing rond ongelezenindicatoren.
Deze usecase beschrijft niet:
- het opstellen, verzenden of beantwoorden van privéberichten;
- het participantgebonden verwijderen van privéthreads wanneer Batch 4 wordt gebouwd; dit hoort bij
UC-GEN-MSG-005; - de volledige detailweergave van een geopend bericht of thread;
- het accepteren of afwijzen van relatie-uitnodigingen vanuit een systeembericht;
- het behandelen van meldingen of tickets waarnaar een systeembericht kan verwijzen;
- het beheren van systeemberichtsjablonen of systeeminstellingen;
- het uitvoeren van geplande retentie-cleanup van privéberichten.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is ingelogd. |
| PRE-002 | Het systeem kan de actuele gebruiker en actieve frontendcontext bepalen. |
| PRE-003 | Het centrale berichtendomein is beschikbaar. |
| PRE-004 | Het systeem kan systeemberichten, privéberichtthreads, deelnemersregels, laatste berichtactiviteit en gebruikersgebonden leesstatus ophalen. |
| PRE-005 | De systeeminstelling voor de bewaartermijn van privéberichten is uitleesbaar of er is een geldige fallback volgens systeeminstellingenbeleid. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De gebruiker ziet uitsluitend systeemberichten waarvan de gebruiker ontvanger is. |
| POST-002 | De gebruiker ziet uitsluitend privéberichtthreads waarin de gebruiker deelnemer is en die niet voor deze gebruiker uit de mailbox zijn verwijderd. |
| POST-003 | De lijst is samengesteld op basis van actuele zoek-, filter- en pagineringscriteria. |
| POST-004 | Ongelezenstatus en samenvattingsaantallen zijn gebruikergebonden berekend. |
| POST-005 | Bij alleen laden, zoeken, filteren of pagineren worden geen berichten, threads, thread-events of systeemberichten aangemaakt. |
| POST-006 | Wanneer de gebruiker een item als gelezen of ongelezen markeert, is alleen de eigen leesstatus gewijzigd. |
| POST-007 | Wanneer de gebruiker een privéberichtthread verwijdert, is alleen de eigen participant-/mailboxzichtbaarheid gewijzigd; andere deelnemers behouden hun eigen threadzichtbaarheid. |
| POST-008 | Systeemberichten blijven niet-verwijderbaar. |
6. Trigger
De gebruiker klikt op het berichtenicoon in de header, kiest een berichtenroute of wordt vanuit een andere functionele context naar het centrale berichtenoverzicht genavigeerd.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Gebruiker | Header of navigatie | Opent Berichten. | Het systeem opent SCH-GEN-02 — Berichtenoverzicht. | Alleen ingelogde gebruikers mogen het overzicht openen. |
| 2 | Systeem | Backend | Bepaalt actuele gebruiker en context. | Het systeem bereidt de mailboxquery voor. | Frontendnavigatie is geen autorisatie. |
| 3 | Systeem | Backend | Laadt eigen systeemberichten. | Alleen SystemMessages met RecipientUserId van de gebruiker worden opgenomen. | Systeemberichten van andere gebruikers zijn uitgesloten. |
| 4 | Systeem | Backend | Laadt eigen privéberichtthread-mailboxitems. | Alleen threads met een participantregel voor de gebruiker en zonder DeletedAtUtc worden opgenomen. | Zichtbaarheid van privéthreads is per deelnemer. |
| 5 | Systeem | Backend / readmodel | Bepaalt per item type, afzenderweergave, onderwerp, preview, datum/tijd, leesstatus en laatste relevante activiteit. | Het systeem bouwt een gecombineerd mailbox-readmodel. | Thread-events kunnen bijdragen aan ongelezenstatus. |
| 6 | Systeem | Backend / readmodel | Past standaardfilters toe. | Bij openen staan typefilter Alles en statusfilter Alle statussen actief. | Sortering is aflopend op meest recente bericht- of threadactiviteit. |
| 7 | Systeem | Backend / readmodel | Berekent samenvattingswaarden. | Ongelezen, systeemberichten, privéberichten en bewaartermijn worden getoond. | Waarden zijn dynamisch; mockupwaarden zijn voorbeelddata. |
| 8 | Systeem | Berichtenoverzicht | Toont berichtenlijst, filters, zoekveld, paginering en samenvattingen. | De gebruiker ziet alleen toegestane mailboxitems. | Technische identifiers worden niet getoond. Paginagroottes komen uit OefenHub:Messages:PageSizes, standaard 5, 10 en 15. |
| 9 | Gebruiker | Zoek- en filterbalk | Past typefilter, statusfilter of zoekterm aan. | Het systeem ververst de lijst binnen de eigen mailboxcontext. | Zoeken werkt binnen actieve filters en binnen de geautoriseerde mailboxdataset; bij privéberichtthreads mag de zoekindex zichtbare threadinhoud omvatten, waaronder afzendernaam, onderwerp, laatste preview en functioneel doorzoekbare tekstfragmenten binnen de thread. |
| 10 | Gebruiker | Paginering | Wijzigt pagina of aantal zichtbare berichten. | Het systeem toont de bijbehorende subset. | Toegestane page sizes zijn 5, 10 en 15. |
| 11 | Gebruiker | Berichtregel | Kiest Markeer als gelezen. | Het systeem wijzigt de eigen leesstatus naar gelezen en actualiseert tellerwaarden. | Mutatie op SystemMessages.ReadAtUtc of participant-readstate. |
| 12 | Gebruiker | Berichtregel | Kiest Markeer als ongelezen. | Het systeem wijzigt de eigen leesstatus naar ongelezen en actualiseert tellerwaarden. | Mutatie is gebruikergebonden. |
| 13 | Gebruiker | Berichtregel | Klikt op een berichtregel. | Het systeem opent de detailweergave of threadcontext en markeert het item functioneel als gelezen. | Verdere detailafhandeling valt onder de bericht-openenusecase. |
| 14 | Gebruiker | Privéberichtregel | Kiest Gesprek verlaten. | Het systeem start de aparte verwijderflow voor privéberichtthreads. Na bevestiging en succesvolle verwerking verdwijnt de thread uit de eigen mailboxweergave en kan POP-GEN-MSG-DELETED worden getoond. | De feitelijke mutatie valt onder UC-GEN-MSG-005. |
| 15 | Gebruiker | Introblok | Kiest Nieuw privébericht. | Het systeem start de vervolgflow voor een nieuw privébericht wanneer de feature en ontvangercontext dit toestaan. | Uitvoering valt onder UC-GEN-MSG-002. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 1 | De gebruiker is niet ingelogd. | Het systeem weigert toegang en leidt de gebruiker naar de login- of toegangsflow. | Generieke autorisatiemelding buiten deze usecase. | Geen. |
| ALT-002 | 3-4 | De gebruiker heeft geen zichtbare berichten. | Het systeem toont een lege mailboxstaat. | Inline lege staat. | Geen. |
| ALT-003 | 9 | De actieve zoek- en filterselectie levert geen resultaat op. | Het systeem toont een lege filter-/zoekstaat en behoudt de actieve filterkeuze. | Inline lege staat. | Geen. |
| ALT-004 | 3-4 | Een deel van de mailboxdata kan niet worden geladen. | Het systeem toont een foutstaat voor het betrokken deel of blokkeert de lijstweergave wanneer de gegevens niet betrouwbaar kunnen worden samengesteld. | Inline foutstaat. | Geen gedeeltelijke statusmutatie. |
| ALT-005 | 11 | Het item is al gelezen. | Het systeem laat de actie niet zien of verwerkt de actie idempotent zonder extra functionele wijziging. | Geen popup. | Geen of dezelfde gelezenstatus blijft behouden. |
| ALT-006 | 12 | Het item is al ongelezen. | Het systeem laat de actie niet zien of verwerkt de actie idempotent zonder extra functionele wijziging. | Geen popup. | Geen of dezelfde ongelezenstatus blijft behouden. |
| ALT-007 | 11-13 | Het item hoort niet bij de ingelogde gebruiker. | Het systeem weigert de actie server-side. | Autorisatiefout of inline melding. | Geen. |
| ALT-008 | 14 | De gebruiker probeert een systeembericht te verwijderen. | De verwijderactie is disabled; wanneer toch een request wordt gedaan weigert de backend de actie. | Tooltip of autorisatiefout. | Geen. |
| ALT-009 | 14 | De privéthread is al uit de eigen mailbox verwijderd. | Het systeem toont het item niet meer of verwerkt de actie idempotent. | Geen popup of actuele staat. | DeletedAtUtc blijft gevuld. |
| ALT-010 | 14 | De thread bestaat, maar de gebruiker is geen deelnemer. | Het systeem weigert de verwijderactie server-side. | Autorisatiefout of inline melding. | Geen. |
| ALT-011 | 11-14 | De mutatie mislukt technisch. | Het systeem houdt de vorige status zichtbaar of herlaadt de actuele serverstatus. | Inline foutmelding. | Geen succesvolle mutatie registreren. |
| ALT-012 | 7 | De bewaartermijninstelling kan niet worden geladen. | Het systeem toont geen hardcoded waarde als waarheid en gebruikt alleen een toegestane fallback of foutstaat. | Inline foutstaat of fallbacklabel. | Geen. |
| ALT-013 | 15 | Privéberichten zijn sitebreed uitgeschakeld of er is geen toegestane ontvanger. | Het systeem verbergt of disablet Nieuw privébericht en voorkomt de vervolgflow server-side. | Inline uitleg of disabled state. | Geen. |
| ALT-014 | 7 | De actor is een leerling met een actieve oefenrun. | Headerbadge, tellerupdates en andere afleidende berichtindicaties blijven tijdelijk verborgen of uitgesteld; de mailboxdata en ongelezenstatus blijven server-side normaal bestaan. | Geen popup. | Geen extra datamutatie door de zichtbaarheid van de badge. |
8.1 Privéthreadregels in het overzicht
Voor privéthreads toont het overzicht één regel per thread, niet één regel per individueel bericht. Het type-label is dynamisch:
- Privégesprek wanneer de zichtbare actieve threadcontext uit twee deelnemers bestaat;
- Groepsgesprek wanneer de zichtbare actieve threadcontext uit meer dan twee deelnemers bestaat.
De previewtekst wordt per ingelogde gebruiker bepaald:
- als er nieuwe activiteit is sinds de eigen participant-readstate, toont de preview het eerste nieuwe bericht of de eerste nieuwe threadgebeurtenis;
- als er geen nieuwe activiteit is, toont de preview de laatste zichtbare activiteit in de thread.
De threadregel toont het stabiele threadicoon en de threadkleur die bij het aanmaken van de thread zijn gekozen. Deze presentatie is voor alle deelnemers gelijk. De preview, ongelezenstatus en acties blijven user-scoped.
9. Business rules
| ID | Regel |
|---|---|
| BR-UC-GEN-MSG-001-001 | Het berichtenoverzicht toont uitsluitend mailboxitems die bij de ingelogde gebruiker horen. |
| BR-UC-GEN-MSG-001-002 | Systeemberichten worden technisch apart opgeslagen van privéberichtthreads, maar worden in dezelfde mailboxweergave getoond. |
| BR-UC-GEN-MSG-001-003 | Systeemberichten zijn niet verwijderbaar door de gebruiker. |
| BR-UC-GEN-MSG-001-004 | Privéberichtthreads kunnen alleen uit de eigen mailboxweergave worden verwijderd; de thread en berichten blijven voor andere deelnemers bestaan. |
| BR-UC-GEN-MSG-001-005 | Gelezen- en ongelezenstatus is gebruikergebonden. |
| BR-UC-GEN-MSG-001-006 | Het openen van een bericht of thread geldt als leesactie voor de ingelogde gebruiker. |
| BR-UC-GEN-MSG-001-007 | Eén privéthreadregel kan meerdere ongelezen berichten of thread-events vertegenwoordigen. |
| BR-UC-GEN-MSG-001-008 | Thread-events zijn geen systeemberichten en geen gewone privéberichten, maar kunnen wel meetellen voor de ongelezenstatus van de thread. |
| BR-UC-GEN-MSG-001-009 | De ongelezenbadge en de samenvatting Ongelezen gebruiken dezelfde server-side ongelezenlogica. |
| BR-UC-GEN-MSG-001-010 | Tijdens een actieve leerling-oefenrun kan de headerbadge visueel verborgen worden zonder de onderliggende berichtstatus te wijzigen. |
| BR-UC-GEN-MSG-001-011 | Previewteksten worden opgebouwd uit veilig gesanitized of veilig geëncodeerde inhoud en mogen geen actieve HTML of JavaScript renderen. |
| BR-UC-GEN-MSG-001-012 | De bewaartermijn voor privéberichten wordt uit systeeminstellingen afgeleid en mag niet als vaste schermwaarde worden hardcoded. |
| BR-UC-GEN-MSG-001-013 | Systeemberichten vallen niet onder de privéberichtenretentie van de initiële scope. |
| BR-UC-GEN-MSG-001-014 | Zoek-, filter- en pagineringsacties mogen de objectautorisatie nooit verruimen. |
| BR-UC-GEN-MSG-001-015 | Bij privéberichtthreads mag zoeken alleen plaatsvinden binnen voor de gebruiker zichtbare threadinhoud; niet-zichtbare, verwijderde of niet-geautoriseerde threadinhoud mag geen zoekhit opleveren. |
| BR-UC-GEN-MSG-001-016 | Technische identifiers zoals GUID’s, message-id’s, thread-id’s en entity-id’s worden niet zichtbaar in het berichtenoverzicht getoond. |
Centrale business rules die hierbij horen:
| BusinessRule-ID | Toepassing |
|---|---|
BR-GEN-SEC-001 | Alle mailboxacties vereisen server-side rol-, relatie- of objectcontrole. |
BR-GEN-MSG-001 | Het berichtenoverzicht is gebruikergebonden en toont alleen eigen mailboxitems. |
BR-GEN-MSG-002 | Systeemberichten zijn niet verwijderbaar door gebruikers. |
BR-GEN-MSG-003 | Verwijderen van een privéthread is participantgebonden en verwijdert de thread niet voor anderen. |
BR-GEN-MSG-004 | Gelezen- en ongelezenstatus wordt gebruiker- of participantgebonden bepaald. |
BR-GEN-MSG-005 | Headerbadge en samenvatting gebruiken dezelfde ongelezenlogica. |
BR-GEN-MSG-006 | Preview- en rich-textinhoud wordt veilig verwerkt voordat deze wordt weergegeven. |
BR-GEN-MSG-007 | De bewaartermijn van privéberichten komt uit systeeminstellingen. |
BR-GEN-MSG-008 | Een privéthread verschijnt als één mailboxitem, ook als er meerdere berichten of replies in dezelfde thread zitten. |
BR-GEN-MSG-013 | Private threads zijn group-ready; deelnemersweergave, readstate en acties mogen niet uitgaan van exact twee deelnemers. |
BR-LLN-EXE-001 | Tijdens een actieve oefenrun worden afleidende tellerindicaties voor leerlingen tijdelijk verborgen. |
10. Datavalidatie
Autorisatie en server-side controles
| Controle | Regel |
|---|---|
| Pagina openen | Alleen ingelogde gebruikers mogen het berichtenoverzicht openen. |
| Systeemberichten laden | Server-side filter op SystemMessages.RecipientUserId = huidige gebruiker. |
| Privéthreads laden | Server-side filter op PrivateMessageThreadParticipants.UserId = huidige gebruiker en DeletedAtUtc is null. |
| Bericht openen | Alleen toegestaan wanneer het systeembericht of de thread bij de gebruiker hoort. |
| Markeren als gelezen | Alleen toegestaan voor eigen systeembericht of eigen participant-readstate. |
| Markeren als ongelezen | Alleen toegestaan voor eigen systeembericht of eigen participant-readstate. |
| Privéthread verwijderen | Vanuit het overzicht mag alleen de verwijderflow voor de eigen participantregel bij een privéthread worden gestart; de bevestiging en mutatie vallen onder UC-GEN-MSG-005. |
| Systeembericht verwijderen | Niet toegestaan; backend weigert ook wanneer de frontendactie gemanipuleerd wordt. |
| Nieuw privébericht starten | Alleen routeerbaar wanneer privéberichten beschikbaar zijn en server-side minimaal één toegestane ontvanger bestaat. |
| Zoek/filter/paginering | Mag alleen werken binnen de al geautoriseerde mailboxdataset van de gebruiker. Zoekterm, status, type, pagina en paginagrootte worden server-side genormaliseerd en begrensd. |
| Samenvattingsaantallen | Worden berekend met dezelfde objectautorisatie als de lijst of met expliciet beschreven mailboxbrede gebruikercontext. |
Veld- en objectvalidatie
| Veld / object | Validatie |
|---|---|
SystemMessages.RecipientUserId | Moet overeenkomen met de ingelogde gebruiker voor tonen, openen of leesstatusmutatie. |
SystemMessages.ReadAtUtc | null betekent ongelezen; gevuld betekent gelezen. Bij markeren als gelezen wordt een actueel UTC-moment vastgelegd. |
SystemMessages.EntityType | Wanneer gevuld alleen een toegestane verwijzing, zoals RelationshipInvitation, Ticket of PrivateMessageThread. |
SystemMessages.EntityId | Wanneer gevuld altijd in combinatie met EntityType; routing wordt in applicatielogica gevalideerd. |
PrivateMessageThreadParticipants.UserId | Moet overeenkomen met de ingelogde gebruiker voor zichtbaarheid, openen, leesstatusmutatie en mailboxverwijdering. |
PrivateMessageThreadParticipants.DeletedAtUtc | Threads met gevulde waarde worden niet meer in de eigen mailboxlijst getoond. |
PrivateMessageThreadParticipants.LastReadMessageId | Wanneer gevuld moet de waarde horen bij dezelfde thread. |
PrivateMessageThreadParticipants.LastReadAtUtc | Wordt gebruikt voor leespositie en ongelezenbepaling, inclusief thread-events. |
PrivateMessages.Body | Mag alleen veilig gesanitized of veilig geëncodeerd als preview worden gebruikt. |
PrivateMessages.SendAsUserId | Moet de afwijkende afzenderweergave ondersteunen wanneer een bericht namens een gebruiker is verzonden. |
PrivateMessageThreadEvents.EventType | Alleen ondersteunde eventtypes tellen mee in threadweergave en ongelezenbepaling. |
| Typefilter | Alleen toegestane waarden All, System en Private. |
| Statusfilter | Alleen toegestane waarden All en Unread. |
| Page size | Alleen toegestane waarden 5, 10 en 15. |
| Zoekterm | Invoer veilig behandelen; zoektekst nooit als HTML renderen. De zoekterm wordt uitsluitend toegepast binnen de geautoriseerde mailboxdataset en, bij privéberichtthreads, binnen zichtbaar toegestane threadinhoud. |
| Datumweergave | UTC-bronwaarden worden lokaal en consistent weergegeven. |
| Bewaartermijn | Afgeleid uit systeeminstelling, niet uit mockupwaarde of hardcoded tekst. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 1-10 | Read | SystemMessages, PrivateMessageThreads, PrivateMessageThreadParticipants, PrivateMessages, PrivateMessageThreadEvents, Users, SystemSettings | Alleen lezen en samenstellen van het mailbox-readmodel. |
| 11 | Database | SystemMessages | Bij systeembericht: ReadAtUtc wordt gevuld met actueel UTC-moment. |
| 11 | Database | PrivateMessageThreadParticipants | Bij privéthread: LastReadMessageId en/of LastReadAtUtc worden bijgewerkt voor de eigen participantregel. |
| 11 | Event | SystemMessageReadStateChanged of PrivateThreadReadStateChanged | Leesstatus is gewijzigd naar gelezen. |
| 11 | Event | MessageUnreadCountChanged | Ongelezenteller wordt opnieuw bepaald en gecommuniceerd waar van toepassing. |
| 12 | Database | SystemMessages | Bij systeembericht: ReadAtUtc wordt geleegd of functioneel teruggezet naar ongelezen. |
| 12 | Database | PrivateMessageThreadParticipants | Bij privéthread: leespositie wordt zodanig aangepast dat de thread voor deze gebruiker weer ongelezen is. |
| 12 | Event | SystemMessageReadStateChanged of PrivateThreadReadStateChanged | Leesstatus is gewijzigd naar ongelezen. |
| 12 | Event | MessageUnreadCountChanged | Ongelezenteller wordt opnieuw bepaald en gecommuniceerd waar van toepassing. |
| 13 | Database | SystemMessages of PrivateMessageThreadParticipants | Openen van een item kan dezelfde leesstatusmutatie uitvoeren als markeren als gelezen. |
| 14 | Vervolgflow | UC-GEN-MSG-005 | Het overzicht start de aparte verwijderflow. De bevestiging, participantgebonden mutatie en telleractualisatie worden daar uitgevoerd. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
SystemMessages bij alleen laden, zoeken, filteren of pagineren | Het overzicht samenstellen wijzigt geen systeembericht. |
PrivateMessageThreads | Het bekijken of uit eigen mailbox verwijderen wijzigt de threadcontainer niet. |
PrivateMessages | Het overzicht wijzigt geen berichtinhoud en verwijdert geen berichten hard. |
PrivateMessageThreadEvents | Thread-events worden niet aangemaakt door het bekijken van het overzicht. |
PrivateMessageThreadParticipants bij alleen laden, zoeken, filteren of pagineren | Alleen expliciete leesstatus- of verwijderacties wijzigen de participantregel. |
SystemMessages bij verwijderactie | Systeemberichten blijven niet-verwijderbaar. |
Users | Het overzicht wijzigt geen gebruikersprofielen of relaties. |
SystemSettings | De bewaartermijn wordt alleen gelezen. |
RelationshipInvitations, Tickets, UserRelationships | Eventuele doorklikacties naar onderliggende domeinobjecten worden niet binnen deze overzichtsusecase verwerkt. |
13. State diagram — mailboxitemstatus
14. Decision flow — filteren, autoriseren en tonen
15. Data lifecycle diagram — overzicht en lichte mailboxmutaties
16. Sequence diagrammen
Berichtenoverzicht laden
Leesstatus wijzigen
Verwijderflow starten vanuit overzicht
17. Popupverwijzingen
| PopupKey | Moment | Variant | Doel |
|---|---|---|---|
POP-GEN-MSG-DELETED | Na succesvol verwijderen van een privéberichtthread uit de eigen mailboxweergave. | InfoOnly | Bevestigt dat de thread voor de gebruiker uit het overzicht is verwijderd. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Beschrijft het berichtenoverzicht als centrale mailboxflow met gecombineerde weergave van systeemberichten en privéberichtthreads, inclusief zoek/filter/paginering, ongelezenstatus, eigen mailboxverwijdering en dynamische samenvattingen. |
| Technisch Ontwerp | Technisch Ontwerp: berichten, systeemberichten, notificaties en privéthreads en Technisch Ontwerp: readmodels, tellers, badges, caching en materialisatie beschrijven het mailbox-readmodel, server-side objectautorisatie, ongelezenlogica over SystemMessages, participant-readstate en thread-events, lichte commands voor readstate en mailboxverwijdering, realtime tellerupdates en veilige previewopbouw. |
| Software Requirements Specification | Destilleert requirements over gebruikergebonden mailboxinzage, niet-verwijderbare systeemberichten, participantgebonden privéthreadverwijdering, dynamische tellerwaarden, veilige contentweergave, retentieafleiding en fout-/leegstaten. |
| Database-informatie | De actuele database-informatie dekt de hoofdentiteiten. De usecase introduceert geen nieuwe tabel, maar bevestigt het gebruik van SystemMessages.ReadAtUtc, PrivateMessageThreadParticipants en PrivateMessageThreadEvents als bron voor overzicht en ongelezenstatus. |
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-MSG-001-001 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Voor iedere ingelogde gebruiker een centraal berichtenoverzicht kunnen tonen |
REQ-UC-GEN-MSG-001-002 | SRS-AUTH-003 SRS-MSG-001 AC-AUTH-003 AC-MSG-001 | Systeemberichten en privéberichtthreads in één gecombineerde mailboxweergave kunnen tonen |
REQ-UC-GEN-MSG-001-003 | SRS-MSG-002 SRS-SHR-002 SRS-SHR-005 AC-MSG-002 AC-SHR-002 AC-SHR-005 | Alleen systeemberichten tonen waarvan de ingelogde gebruiker ontvanger is |
REQ-UC-GEN-MSG-001-004 | SRS-MSG-003 AC-MSG-003 | Alleen privéberichtthreads tonen waarin de ingelogde gebruiker deelnemer is en die niet voor die deelnemer uit de mailbox zijn verwijderd |
REQ-UC-GEN-MSG-001-005 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Mailboxitems standaard sorteren op meest recente bericht- of threadactiviteit |
REQ-UC-GEN-MSG-001-006 | SRS-AUTH-001 SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-AUTH-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Zoeken op afzender, onderwerp, laatste preview en functioneel doorzoekbare tekstfragmenten binnen zichtbare privéthreadinhoud ondersteunen binnen de geautoriseerde mailboxdataset |
REQ-UC-GEN-MSG-001-007 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Typefiltering ondersteunen op alles, systeemberichten en privéberichten |
REQ-UC-GEN-MSG-001-008 | SRS-RDM-001 SRS-MSG-006 AC-RDM-001 AC-MSG-006 | Statusfiltering ondersteunen op alle statussen en ongelezen |
REQ-UC-GEN-MSG-001-009 | SRS-RDM-001 SRS-MSG-001 AC-RDM-001 AC-MSG-001 | Zoekterm, typefilter en statusfilter gecombineerd toepassen |
REQ-UC-GEN-MSG-001-010 | SRS-RDM-001 SRS-MSG-001 SRS-NFR-PER-001 AC-RDM-001 AC-MSG-001 AC-NFR-PER-001 | Paginering ondersteunen met de page sizes 5, 10 en 15 |
REQ-UC-GEN-MSG-001-011 | SRS-MSG-006 AC-MSG-006 | Ongelezenstatus gebruikergebonden bepalen |
REQ-UC-GEN-MSG-001-012 | SRS-MSG-006 AC-MSG-006 | Thread-events na de laatst gelezen positie kunnen meenemen in de ongelezenstatus van een privéthread |
REQ-UC-GEN-MSG-001-013 | SRS-MSG-007 AC-MSG-007 | Het openen van een bericht of thread moet het item voor de ingelogde gebruiker als gelezen kunnen markeren |
REQ-UC-GEN-MSG-001-014 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-006 AC-RDM-001 AC-RDM-007 AC-MSG-006 | De gebruiker moet een eigen ongelezen mailboxitem direct vanuit het overzicht als gelezen kunnen markeren |
REQ-UC-GEN-MSG-001-015 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-006 AC-RDM-001 AC-RDM-007 AC-MSG-006 | De gebruiker moet een eigen gelezen mailboxitem direct vanuit het overzicht als ongelezen kunnen markeren |
REQ-UC-GEN-MSG-001-016 | SRS-RDM-001 SRS-RDM-002 SRS-MSG-006 AC-RDM-001 AC-RDM-002 AC-MSG-006 | Bij readstatewijzigingen de ongelezenteller opnieuw kunnen bepalen |
REQ-UC-GEN-MSG-001-017 | SRS-MSG-003 AC-MSG-003 | Systeemberichten niet-verwijderbaar maken voor gebruikers |
REQ-UC-GEN-MSG-001-018 | SRS-AUTH-001 SRS-MSG-003 AC-AUTH-001 AC-MSG-003 | De verwijderactie voor systeemberichten server-side weigeren |
REQ-UC-GEN-MSG-001-019 | SRS-MSG-003 AC-MSG-003 | De gebruiker moet een privéberichtthread uit de eigen mailboxweergave kunnen verwijderen |
REQ-UC-GEN-MSG-001-020 | SRS-MSG-003 AC-MSG-003 | Het verwijderen van een privéberichtthread uit de eigen mailbox mag de thread of berichten voor andere deelnemers niet verwijderen |
REQ-UC-GEN-MSG-001-021 | SRS-MSG-003 AC-MSG-003 | Na succesvolle eigen mailboxverwijdering POP-GEN-MSG-DELETED kunnen tonen |
REQ-UC-GEN-MSG-001-022 | SRS-RDM-001 SRS-RDM-002 SRS-RDM-007 SRS-MSG-004 AC-RDM-001 AC-RDM-002 AC-RDM-007 AC-MSG-004 | Dynamische samenvattingswaarden tonen voor ongelezen items, systeemberichten, privéberichten en bewaartermijn |
REQ-UC-GEN-MSG-001-023 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-004 AC-RDM-001 AC-RDM-007 AC-MSG-004 | De bewaartermijn voor privéberichten moet uit systeeminstellingen worden afgeleid en mag niet hardcoded uit mockupwaarden komen |
REQ-UC-GEN-MSG-001-024 | SRS-MSG-004 AC-MSG-004 | Systeemberichten moeten buiten de privéberichtenretentie vallen zolang geen aparte retentie voor systeemberichten is vastgesteld |
REQ-UC-GEN-MSG-001-025 | SRS-MSG-001 SRS-NFR-SEC-001 AC-MSG-001 AC-NFR-SEC-001 | Previewteksten veilig opbouwen zonder actieve HTML of JavaScript te renderen |
REQ-UC-GEN-MSG-001-026 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | UTC-brondatums lokaal en consistent tonen in het berichtenoverzicht |
REQ-UC-GEN-MSG-001-027 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Technische identifiers niet zichtbaar tonen in het berichtenoverzicht |
REQ-UC-GEN-MSG-001-028 | SRS-RDM-001 SRS-RDM-007 SRS-MSG-001 AC-RDM-001 AC-RDM-007 AC-MSG-001 | Een lege staat tonen wanneer de gebruiker geen berichten heeft of wanneer de actieve zoek-/filterselectie geen resultaten oplevert |
REQ-UC-GEN-MSG-001-029 | SRS-MSG-001 SRS-NFR-LOG-001 AC-MSG-001 AC-NFR-LOG-001 | Technische fouten bij laden of lichte mailboxmutaties tonen zonder de gebruiker ten onrechte een succesvolle verwerking te suggereren |
REQ-UC-GEN-MSG-001-030 | SRS-RDM-001 SRS-RDM-002 SRS-RDM-005 SRS-RDM-006 SRS-MSG-006 SRS-LRN-005 AC-RDM-001 AC-RDM-002 AC-RDM-005 AC-RDM-006 AC-MSG-006 AC-LRN-005 | De ongelezenbadge voor leerlingen tijdens een actieve oefenrun kunnen verbergen zonder de onderliggende ongelezenstatus te wijzigen |
8.2 Openen met #new/#latest
Vanuit het overzicht navigeert een privéthreadregel via de /open-route. Die route bepaalt vóór het markeren als gelezen of de gebruiker naar de marker Nieuwe berichten of naar het laatste zichtbare timeline-item moet springen. De redirect gebruikt een hash-anker (#new of #latest). Omdat browser-/Blazor-enhanced navigation fragments kan verliezen bij redirects, moet de overzichtlink gewone browsernavigatie gebruiken wanneer dat nodig is voor betrouwbare anchor-scroll.
De previewtekst in het overzicht volgt dezelfde readstate: bij ongelezen threads wordt het eerste nieuwe bericht of eerste nieuwe thread-event getoond; bij gelezen threads de laatste zichtbare activiteit.