Skip to main content

UC-GEN-MSG-002 — Privébericht opstellen en verzenden

1. Kerngegevens

VeldWaarde
Usecase-IDUC-GEN-MSG-002
NaamPrivébericht opstellen en verzenden
DomeinBerichten
Primaire actorIngelogde gebruiker
Secundaire actor(en)Systeem, beoogde ontvanger, relatie- en autorisatieservice, realtime notificatiecomponent
RolcontextIedere ingelogde rolcontext waarvoor privéberichten beschikbaar zijn; verzenden wordt server-side beperkt tot ontvangers waarmee de gebruiker op verzendmoment een geldige relatie-, vriendschaps- of expliciet toegestane deelnemerscontext heeft
Betrokken schermenSCH-GEN-02 — Berichtenoverzicht, SCH-GEN-03 — Nieuw privébericht, SCH-GEN-04 — Open bericht
Gerelateerde usecasesUC-GEN-MSG-001 — Berichtenoverzicht bekijken; UC-GEN-MSG-003 — Bericht openen; UC-GEN-MSG-004 — Bericht beantwoorden
Primaire entiteitenPrivateMessageThreads, PrivateMessageThreadParticipants, PrivateMessages, participant-readstate
Secundaire entiteiten / eventsUsers, UserRelationships, SiteFeatureToggles, PrivateMessageCreated, PrivateThreadReadStateChanged, MessageUnreadCountChanged, PrivateMessageSendFailed
Gerelateerde popupsPOP-GEN-MSG-NO-RELATION, POP-GEN-MSG-SEND-FAILED
PopupregisterOntwerpbronnen — Popup-register
MoSCoWMust have

2. Omschrijving

De gebruiker stelt vanuit het berichtenoverzicht een nieuw privébericht op voor een ontvanger die binnen de actuele relatiecontext bereikbaar is. De gebruiker kiest een ontvanger, vult een onderwerp en berichtinhoud in en verzendt het bericht. Het systeem controleert zowel bij het openen van het opstelproces als opnieuw op verzendmoment of privéberichten sitebreed beschikbaar zijn, of de gebruiker de ontvanger mag berichten en of de ingevoerde inhoud geldig en veilig verwerkbaar is.

Na succesvol verzenden ontstaat een nieuwe privéberichtthread of wordt een door de berichtenservice bepaalde geldige threadcontext gebruikt. In beide gevallen wordt het eerste bericht als PrivateMessages-record opgeslagen, worden de deelnemers vastgelegd of bijgewerkt via PrivateMessageThreadParticipants, en wordt de readstate zo ingesteld dat het bericht voor de verzender gelezen is en voor de ontvanger als nieuwe ongelezen activiteit meetelt.

Wanneer de ontvanger vóór verzending geen ongelezen berichten had, wordt de ongelezenbadge bij de eerstvolgende toegestane UI-update zichtbaar. Wanneer de ontvanger al ongelezen berichten had, wordt de teller opnieuw bepaald of opgehoogd volgens dezelfde server-side ongelezenlogica als het berichtenoverzicht. Voor leerlingen geldt dat deze badge tijdens een actieve oefenrun visueel verborgen of uitgesteld blijft; de onderliggende ongelezenstatus wordt wel normaal geregistreerd en na afronden of verlaten van de oefenrun opnieuw zichtbaar gemaakt wanneer het aantal groter is dan nul.

3. Scope

Deze usecase beschrijft:

  • het starten van de nieuw-privéberichtflow vanuit het berichtenoverzicht;
  • het opbouwen van de lijst met toegestane ontvangers;
  • het selecteren van één ontvanger binnen een geldige relatie-, vriendschaps- of deelnemerscontext;
  • het invoeren van onderwerp en berichtinhoud;
  • het annuleren van het opstellen zonder opslag;
  • het server-side valideren van ontvanger, relatiecontext, featurestatus, onderwerp en berichtinhoud;
  • het server-side sanitizen van rich-textinhoud;
  • het transactioneel aanmaken of gebruiken van de juiste privéthreadcontext;
  • het opslaan van het nieuwe privébericht;
  • het vastleggen of bijwerken van threaddeelnemers en readstate;
  • het actualiseren van de ongelezenstatus en teller voor de ontvanger;
  • het tijdelijk verborgen blijven van de leerlingbadge tijdens een actieve oefenrun;
  • foutpaden voor ontbrekende relatie, ongeldige invoer, vervallen ontvangercontext en technische verzendfouten;
  • popupverwijzingen naar centrale popupkeys.

Deze usecase beschrijft niet:

  • het beantwoorden van een bestaande privéberichtthread;
  • het openen van een systeembericht of privéthreaddetail;
  • het markeren als gelezen of ongelezen vanuit het berichtenoverzicht;
  • het verwijderen van privéthreads uit de eigen mailbox;
  • het aanmaken of verwerken van systeemberichten;
  • het doorsturen of namens iemand versturen vanuit meldingenbeheer;
  • conceptopslag, bijlagen, groepsgesprekken of uitgebreid bijlagenbeleid;
  • het beheren van relaties, vriendschappen, featuretoggles, systeemberichtsjablonen of popupdefinities;
  • retentie, cleanup of archivering van privéberichten.

4. Pre-condities

IDVoorwaarde
PRE-001De gebruiker is ingelogd.
PRE-002De privéberichtenfunctionaliteit is sitebreed beschikbaar.
PRE-003De gebruiker opent de nieuw-privéberichtflow vanuit het berichtenoverzicht of via een route die naar dezelfde opstelpagina leidt.
PRE-004De backend kan bepalen welke gebruikers de ingelogde gebruiker op dat moment mag berichten.
PRE-005De ontvangerlijst wordt uitsluitend opgebouwd uit actieve relatie-, vriendschaps- of expliciet toegestane deelnemerscontexten.
PRE-006De gebruiker heeft minimaal één toegestane ontvanger of krijgt een niet-verzendbare toestand te zien.
PRE-007Onderwerp en berichtinhoud kunnen server-side gevalideerd, gesanitized en veilig opgeslagen worden.
PRE-008De berichtenservice kan transactioneel een threadcontext, deelnemersregels, berichtrecord en readstate verwerken.
PRE-009De realtime notificatiecomponent of een gelijkwaardig readmodel kan de ongelezenstatus na succesvolle opslag opnieuw laten bepalen.

5. Post-condities

IDResultaat
POST-001Bij annuleren is geen nieuwe privéthread, geen nieuw privébericht en geen nieuwe readstate-mutatie aangemaakt.
POST-002Bij succesvol verzenden bestaat een geldige PrivateMessageThreads-context voor de verzender en ontvanger.
POST-003Bij succesvol verzenden zijn de relevante PrivateMessageThreadParticipants-regels aanwezig voor verzender en ontvanger.
POST-004Bij succesvol verzenden is precies één nieuw PrivateMessages-record opgeslagen met de ingelogde gebruiker als reguliere verzender.
POST-005De leespositie van de verzender is bijgewerkt zodat het eigen verzonden bericht niet ongelezen blijft voor de verzender.
POST-006De ontvanger krijgt de nieuwe threadactiviteit als ongelezen in de eigen participant-readstate of in het daarvan afgeleide readmodel.
POST-007De ongelezenteller van de ontvanger kan opnieuw worden bepaald en wordt zichtbaar of bijgewerkt wanneer UI-context dat toestaat.
POST-008Wanneer de ontvanger leerling is en actief in een oefenrun zit, blijft de badge/teller visueel verborgen terwijl de ongelezenstatus server-side bewaard blijft.
POST-009Er wordt geen systeembericht aangemaakt voor een regulier nieuw privébericht.
POST-010Bij ontbrekende, vervallen of onvoldoende relatiecontext wordt geen thread en geen bericht opgeslagen.
POST-011Bij validatiefout wordt geen thread en geen bericht opgeslagen.
POST-012Bij technische verzendfout blijft de ingevoerde berichtinhoud beschikbaar in het formulier, zodat de gebruiker opnieuw kan proberen.
POST-013Er worden geen gegevens van niet-geautoriseerde gebruikers of niet-betrokken threads gelezen, gewijzigd of getoond.

6. Trigger

De gebruiker kiest in SCH-GEN-02 — Berichtenoverzicht de actie Nieuw privébericht of opent een gelijkwaardige route waarmee de opstelpagina voor een nieuw privébericht wordt gestart.

7. Normale processtroom

StapActorScherm / componentActieSysteemresponsData / regel
1GebruikerSCH-GEN-02 — BerichtenoverzichtKiest Nieuw privébericht.Het systeem start de nieuw-privéberichtflow.Actie is alleen functioneel bruikbaar wanneer privéberichten beschikbaar zijn.
2SysteemBackendControleert authenticatie en featurestatus.Alleen bij geldige sessie en actieve privéberichtenfeature wordt de opstelpagina voorbereid.Frontendzichtbaarheid is geen autorisatiebewijs.
3SysteemBackendBepaalt de toegestane ontvangers voor de gebruiker.Alleen gebruikers binnen geldige relatie-, vriendschaps- of deelnemerscontext komen beschikbaar.UserRelationships, relatietype, rolcontext en active-status zijn server-side leidend.
4SysteemSCH-GEN-03 — Nieuw privéberichtToont het formulier met ontvangerselectie, onderwerp, berichtveld en acties.De gebruiker kan een ontvanger kiezen en inhoud invoeren.Alle zichtbare namen en voorbeeldwaarden zijn dynamische data.
5GebruikerSCH-GEN-03 — Nieuw privéberichtSelecteert een ontvanger.Het systeem bewaart de selectie in de schermstaat.Selectie wordt bij verzenden opnieuw server-side gecontroleerd.
6GebruikerSCH-GEN-03 — Nieuw privéberichtVult onderwerp en berichtinhoud in.Het formulier bewaart de invoer client-side tot verzenden of annuleren.Niet-verzonden berichten worden binnen deze flow niet tussentijds opgeslagen.
7GebruikerSCH-GEN-03 — Nieuw privéberichtKiest Verstuur bericht.Het systeem start de server-side verzendactie.Frontendvalidatie is ondersteunend maar niet leidend.
8SysteemBackendControleert opnieuw authenticatie, featurestatus, ontvanger, relatie-/deelnemerscontext en verzendrecht.Alleen wanneer alle controles slagen gaat de mutatie door.Controle vindt plaats op verzendmoment.
9SysteemBackendValideert onderwerp en berichtinhoud.Lege of ongeldige invoer blokkeert verzenden.Na sanitizing moet berichtinhoud overblijven.
10SysteemBackendSanitized rich text en encodeert displaywaarden veilig.Actieve inhoud wordt verwijderd of geweigerd volgens de veilige invoerregels.Vrije HTML, JavaScript en inline eventhandlers zijn niet toegestaan.
11SysteemBackendBepaalt de threadcontext voor het nieuwe privébericht.Er wordt een nieuwe privéthread aangemaakt of een geldige bestaande context gebruikt volgens de berichtenservice.Threadcontext bevat uitsluitend de verzender en toegestane ontvanger(s) binnen deze flow.
12SysteemBackendLegt deelnemers vast of werkt de participantcontext bij.De verzender en ontvanger hebben elk een eigen PrivateMessageThreadParticipants-regel.Participantstatus bepaalt eigen mailboxzichtbaarheid en readstate.
13SysteemBackendSlaat het privébericht op.Nieuw PrivateMessages-record ontstaat binnen de threadcontext.SenderUserId is de ingelogde gebruiker; geen namens-verzending in deze flow.
14SysteemBackendWerkt threadmetadata en leespositie van de verzender bij.Het bericht geldt niet als ongelezen voor de verzender.LastMessageAtUtc, preview/readmodel en eigen participant-readstate worden bijgewerkt.
15SysteemBackend / readmodelBepaalt ongelezenstatus voor de ontvanger.De ontvanger krijgt nieuwe activiteit als ongelezen.De ongelezenlogica is gebruikergebonden.
16SysteemRealtime notificatiecomponentPubliceert relevante update voor de ontvanger.De ontvangerbadge wordt zichtbaar of de bestaande teller wordt opnieuw bepaald/opgehoogd wanneer UI-context dat toestaat.Voor leerlingen tijdens actieve oefenrun blijft de badge visueel verborgen.
17SysteemSCH-GEN-04 — Open bericht of bevestigde navigatieToont de verzonden context of navigeert naar de geopende thread.De verzender ziet dat het bericht succesvol is verzonden.Vervolgweergave toont uitsluitend geautoriseerde threadinhoud.

8. Alternatieve en exceptionele processtromen

IDVanaf stapSituatieSysteemgedragPopup / meldingDatamutatie
ALT-0011-2De gebruiker is niet ingelogd.Het systeem weigert toegang of leidt naar de loginflow.Generieke autorisatiemelding of loginflow.Geen.
ALT-0022Privéberichtenfunctionaliteit is sitebreed uitgeschakeld.De opstelpagina wordt niet geopend of het formulier wordt niet verzendbaar gemaakt.Functionele melding; geen specifieke popupkey in deze usecase.Geen.
ALT-0033Er zijn geen toegestane ontvangers.Het systeem toont een niet-verzendbare toestand met uitleg dat er geen geldige ontvangers beschikbaar zijn.Geen verzendpopup vereist.Geen.
ALT-0044-5De ontvangerlijst bevat door timing een gebruiker die inmiddels niet meer bereikbaar is.De backend blokkeert definitief op verzendmoment.POP-GEN-MSG-NO-RELATION.Geen thread, geen bericht.
ALT-0055De gebruiker selecteert geen ontvanger.Verzenden wordt geblokkeerd met veldvalidatie.Inline validatie.Geen.
ALT-0066-9Onderwerp is leeg of ongeldig.Verzenden wordt geblokkeerd; invoer blijft zichtbaar.Inline validatie.Geen.
ALT-0076-9Berichtinhoud is leeg of na sanitizing leeg.Verzenden wordt geblokkeerd; invoer blijft zichtbaar.Inline validatie.Geen.
ALT-0088De relatie, vriendschap of deelnemerscontext is vervallen sinds openen van het formulier.Het systeem weigert verzenden.POP-GEN-MSG-NO-RELATION.Geen.
ALT-0098De verzender mag de gekozen ontvanger niet meer berichten door gewijzigde rolcontext of autorisatie.Het systeem weigert verzenden.POP-GEN-MSG-NO-RELATION.Geen.
ALT-01010Berichtinhoud bevat niet-toegestane actieve inhoud.De inhoud wordt veilig gesanitized; als geen geldige inhoud overblijft wordt verzenden geblokkeerd.Inline validatie of functionele melding.Geen bij blokkade.
ALT-01111-14Databasefout tijdens thread-, participant-, bericht- of readstate-mutatie.De volledige transactie wordt teruggedraaid.POP-GEN-MSG-SEND-FAILED.Geen gedeeltelijke mutatie.
ALT-01216Realtime notificatie kan niet direct worden afgeleverd.Het bericht blijft opgeslagen; ongelezenstatus blijft via database/readmodel correct.Geen blocking popup voor verzender; technische logging.Berichtmutatie blijft bestaan.
ALT-01316Ontvanger is leerling en zit in een actieve oefenrun.Het systeem registreert ongelezenstatus normaal, maar toont de badge visueel niet zolang de oefenrun actief is.Geen popup.Ongelezenstatus blijft bestaan.
ALT-01417De verzender verlaat de pagina direct na succesvol verzenden.Het verzonden bericht blijft opgeslagen.Geen.Geen aanvullende mutatie.
ALT-0156De gebruiker kiest Annuleren.De opstelpagina wordt verlaten zonder opslag.Geen popup vereist.Geen thread, geen bericht, geen readstate-mutatie.

8.1 Threadpresentatie bij aanmaken

Bij het starten van een nieuwe privéthread genereert het systeem naast de thread en participants ook de vaste threadpresentatie:

  • een threadkleur uit een veilige, beperkte palette;
  • een IconKey uit een beheerde iconenset;
  • een threadspecifieke participantkleur voor iedere deelnemer.

De threadkleur en IconKey horen bij de thread en worden door alle deelnemers hetzelfde gezien. De participantkleur hoort bij de deelnemer binnen deze thread en mag verschillen van de globale profiel- of avatarkleur. De gebruiker kan deze waarden in Batch 6 nog niet zelf aanpassen; het threadmenu wordt wel voorbereid op latere opties zoals onderwerp wijzigen, mensen toevoegen en afbeelding/icoon aanpassen.

Het onderwerp aanpassen bij bestaande threads hoort niet als vrij veld in elke replyflow te blijven hangen. De detailpagina krijgt een threadmenu waarmee onderwerpwijziging als aparte actie kan worden uitgevoerd en als thread-event zichtbaar wordt in de timeline.

9. Business rules

IDRegel
BR-UC-GEN-MSG-002-001Een nieuw privébericht mag alleen worden opgesteld door een ingelogde gebruiker.
BR-UC-GEN-MSG-002-002Privéberichten moeten sitebreed beschikbaar zijn op het moment dat de opstelpagina wordt gebruikt en op het moment van verzenden.
BR-UC-GEN-MSG-002-003De ontvangerlijst mag alleen gebruikers bevatten die de verzender volgens actuele relatie-, vriendschaps- of deelnemersregels mag berichten.
BR-UC-GEN-MSG-002-004De backend controleert op verzendmoment opnieuw of de gekozen ontvanger nog geldig en bereikbaar is.
BR-UC-GEN-MSG-002-005Een gebruiker mag geen privébericht sturen aan een willekeurige gebruiker buiten een geldige relatiecontext.
BR-UC-GEN-MSG-002-006Verzenden mag niet slagen zonder gekozen ontvanger, onderwerp en geldige berichtinhoud.
BR-UC-GEN-MSG-002-007Rich-textinhoud wordt server-side gesanitized voordat deze wordt opgeslagen of gerenderd.
BR-UC-GEN-MSG-002-008Een regulier nieuw privébericht wordt opgeslagen als PrivateMessages-record binnen een privéthreadcontext.
BR-UC-GEN-MSG-002-009De verzender en ontvanger krijgen elk een eigen participantcontext voor mailboxzichtbaarheid en readstate.
BR-UC-GEN-MSG-002-010De leespositie van de verzender wordt na succesvol verzenden bijgewerkt zodat het eigen bericht niet ongelezen blijft voor de verzender.
BR-UC-GEN-MSG-002-011Het nieuwe bericht telt voor de ontvanger als ongelezen activiteit totdat de ontvanger de thread opent of expliciet als gelezen markeert.
BR-UC-GEN-MSG-002-012De ongelezenteller van de ontvanger wordt na succesvol verzenden opnieuw bepaald of geactualiseerd.
BR-UC-GEN-MSG-002-013Wanneer het ongelezenaantal van de ontvanger van nul naar groter dan nul gaat, moet de badge zichtbaar kunnen worden zodra de UI-context dat toestaat.
BR-UC-GEN-MSG-002-014Voor leerlingen tijdens een actieve oefenrun blijft de badge/teller visueel verborgen, terwijl de onderliggende ongelezenstatus server-side behouden blijft.
BR-UC-GEN-MSG-002-015Alle mutaties voor threadcontext, participants, bericht, threadmetadata en readstate worden transactioneel verwerkt.
BR-UC-GEN-MSG-002-016Annuleren maakt geen thread, bericht of readstate-mutatie aan.
BR-UC-GEN-MSG-002-017Gewone nieuwe privéberichten maken geen systeembericht aan.
BR-UC-GEN-MSG-002-018Technische identifiers, stacktraces en interne foutdetails worden niet zichtbaar getoond bij verzendfouten of autorisatieblokkades.
BR-UC-GEN-MSG-002-019Doorsturen, namens iemand versturen, bijlagen en conceptopslag vallen buiten deze reguliere nieuw-privéberichtflow.

Centrale business rules die hierbij horen:

BusinessRule-IDToepassing
BR-GEN-SEC-001Alle berichtacties vereisen server-side rol-, relatie- of objectcontrole.
BR-GEN-MSG-004Gelezen- en ongelezenstatus wordt gebruiker- of participantgebonden bepaald.
BR-GEN-MSG-006Berichtinhoud en rich text worden veilig verwerkt voordat deze worden opgeslagen of weergegeven.
BR-GEN-MSG-015Een verzendactie voor een privébericht wordt transactioneel verwerkt.
BR-GEN-MSG-016Nieuwe privéberichten mogen alleen naar ontvangers binnen een geldige relatie-, vriendschaps- of deelnemerscontext worden verzonden.
BR-GEN-MSG-017Nieuwe privéberichten actualiseren de ongelezenstatus van de ontvanger, maar de leerlingbadge blijft tijdens een actieve oefenrun visueel verborgen.

10. Datavalidatie

Veld / objectValidatie
Route naar nieuw privéberichtMag nooit als autorisatiebewijs worden gebruikt; server-side controle blijft verplicht.
SiteFeatureToggles.PrivateMessagingEnabledMoet actief zijn bij openen en bij verzenden.
OntvangerselectieVerplicht; ontvanger moet bestaan en op verzendmoment bereikbaar zijn voor de verzender.
ReceiverUserIdMag niet willekeurig worden opgegeven; moet overeenkomen met een server-side toegestane ontvanger.
Relatie- of deelnemerscontextMoet op verzendmoment privécommunicatie tussen verzender en ontvanger toestaan.
Rolcontext verzenderMoet passen bij de relatie- of deelnemerscontext waarmee de ontvanger bereikbaar is.
OnderwerpVerplicht bij verzenden; veilig encoden bij weergave; lengtebegrenzing moet in TO/SRS technisch worden vastgelegd.
BerichtinhoudVerplicht; na sanitizing moet inhoud overblijven.
Rich-text opmaakAlleen veilige, beperkte opmaak is toegestaan; actieve inhoud wordt verwijderd of geweigerd.
PrivateMessageThreadsThreadcontext mag alleen deelnemers bevatten die volgens deze flow betrokken zijn.
PrivateMessageThreadParticipantsMoet per betrokken gebruiker een eigen participantregel hebben voor mailboxzichtbaarheid en readstate.
PrivateMessages.ThreadIdMoet verwijzen naar de aangemaakte of gebruikte threadcontext.
PrivateMessages.SenderUserIdMoet de ingelogde gebruiker zijn voor reguliere nieuwe privéberichten.
PrivateMessages.BodyWordt uitsluitend opgeslagen na server-side validatie en sanitizing.
Verzender-readstateMag alleen voor de eigen participantregel worden bijgewerkt.
Ontvanger-readstateMag nieuwe activiteit als ongelezen laten meetellen, maar niet namens de ontvanger als gelezen markeren.
OngelezentellerWordt afgeleid uit dezelfde server-side ongelezenlogica als het berichtenoverzicht.
Leerlingbadge tijdens actieve oefenrunAlleen de zichtbaarheid van de badge wordt onderdrukt; de readstate en tellerbron blijven intact.
Datum- en tijdwaardenWorden in UTC opgeslagen en lokaal weergegeven.
FoutmeldingenMogen geen technische identifiers, stacktraces of interne databasenaamgeving bevatten.

11. Datamutaties en events

StapTypeEntiteit / eventMutatie
2-3ReadSiteFeatureToggles, Users, UserRelationshipsOphalen van featurestatus en toegestane ontvangers voor de ingelogde gebruiker.
4-6Geen opslagFormulierstaatInvoer wordt alleen in de schermstaat bewaard tot verzenden of annuleren.
8ReadUserRelationships, ontvangercontext, featurestatusControleren of verzenden op dit moment toegestaan is.
11DatabasePrivateMessageThreadsNieuwe threadcontext aanmaken of geldige threadcontext bepalen volgens de berichtenservice.
12DatabasePrivateMessageThreadParticipantsParticipantregels voor verzender en ontvanger aanmaken of actualiseren voor mailboxzichtbaarheid en readstate.
13DatabasePrivateMessagesNieuw privébericht opslaan met verzender, thread, onderwerp-/threadcontext, body en verzendmoment.
13EventPrivateMessageCreatedNieuw privébericht is succesvol opgeslagen.
14DatabasePrivateMessageThreadsThreadmetadata zoals laatste activiteit en preview/readmodelgegevens bijwerken.
14DatabasePrivateMessageThreadParticipantsLeespositie van de verzender bijwerken.
14EventPrivateThreadReadStateChangedVerzender-readstate is bijgewerkt na verzenden.
15Database / readmodelPrivateMessageThreadParticipants of afgeleid readmodelOntvanger krijgt nieuwe activiteit als ongelezen.
16EventMessageUnreadCountChangedOngelezenteller van de ontvanger kan realtime worden geactualiseerd.
ALT-008Event / loggingPrivateMessageSendFailedVerzending is functioneel geblokkeerd door vervallen relatie- of deelnemerscontext.
ALT-011Event / loggingPrivateMessageSendFailedVerzending is technisch mislukt; transactie is teruggedraaid.

12. Geen datamutaties

EntiteitReden
SystemMessagesGewone nieuwe privéberichten maken of wijzigen geen systeemberichten.
SystemMessageTemplatesDe nieuw-privéberichtflow gebruikt geen systeemberichtsjabloon.
PrivateMessageThreadEventsIn deze usecase wordt geen onderwerpwijziging binnen een bestaande thread verwerkt; thread-events horen bij andere flows zoals beantwoorden.
PrivateMessages bestaande recordsBestaande berichten worden niet gewijzigd.
PrivateMessageThreadParticipants van niet-betrokken gebruikersAlleen deelnemers aan de nieuwe of gebruikte threadcontext worden geraakt.
UsersGebruikersgegevens worden alleen gelezen voor ontvangerselectie en display.
UserRelationshipsRelaties worden alleen gecontroleerd; deze usecase maakt, wijzigt of beëindigt geen relatie.
TicketsEen nieuw privébericht maakt geen melding of ticket aan.
RelationshipInvitationsEen nieuw privébericht verwerkt geen relatie-uitnodiging.
SiteFeatureTogglesFeaturestatus wordt alleen gelezen.
Concept- of bijlage-entiteitenConceptopslag en bijlagen vallen buiten de eerste reguliere privéberichtflow.

13. State diagram — nieuw privébericht en ongelezenstatus

14. Decision flow — privébericht opstellen en verzenden

15. Data lifecycle diagram — nieuw privébericht

16. Sequence diagrammen

16.1 Opstelpagina openen

16.2 Nieuw privébericht succesvol verzenden

16.3 Verzenden geblokkeerd door ontbrekende relatiecontext

16.4 Ontvanger is leerling tijdens actieve oefenrun

17. Popupverwijzingen

PopupKeyMomentVariantDoel
POP-GEN-MSG-NO-RELATIONVerzenden wordt geblokkeerd omdat de gekozen ontvanger niet langer binnen een geldige relatie- of deelnemerscontext valt.InfoOnlyUitleggen dat het bericht niet verstuurd kan worden omdat de gebruiker de gekozen persoon niet meer mag berichten.
POP-GEN-MSG-SEND-FAILEDVerzenden mislukt door een technische of transactionele fout.InfoOnlyUitleggen dat het bericht niet is verzonden en dat de gebruiker opnieuw kan proberen zonder de ingevoerde tekst kwijt te raken.

18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification

DoeldocumentAfleiding
Functioneel OntwerpBeschrijft dat de actie Nieuw privébericht vanuit het berichtenoverzicht naar een zelfstandige opstelpagina leidt met ontvangerselectie, onderwerp, berichtinhoud, verzenden en annuleren.
Functioneel OntwerpBeschrijft dat de ontvangerlijst alleen toegestane gekoppelde gebruikers, vrienden of expliciet ondersteunde deelnemerscontexten bevat.
Functioneel OntwerpBeschrijft dat verzenden opnieuw server-side controleert of de ontvanger nog bereikbaar is en dat vervallen relatiecontext POP-GEN-MSG-NO-RELATION gebruikt.
Functioneel OntwerpBeschrijft dat de ongelezenteller bij de ontvanger zichtbaar wordt of wordt bijgewerkt, maar dat de leerlingbadge tijdens een actieve oefenrun tijdelijk verborgen blijft.
Technisch OntwerpTechnisch Ontwerp: berichten, systeemberichten, notificaties en privéthreads beschrijft het command SendPrivateMessage uit met server-side controle op authenticatie, featuretoggle, ontvanger, relatie-/deelnemerscontext, onderwerp en berichtinhoud.
Technisch OntwerpTechnisch Ontwerp: berichten, systeemberichten, notificaties en privéthreads beschrijft de transactionele verwerking voor threadcontext, participantregels, PrivateMessages, threadmetadata, readstate en eventpublicatie.
Technisch OntwerpTechnisch Ontwerp: berichten, systeemberichten, notificaties en privéthreads beschrijft dat rich-textinhoud server-side wordt gesanitized en dat na sanitizing geldige inhoud moet overblijven.
Technisch OntwerpTechnisch Ontwerp: readmodels, tellers, badges, caching en materialisatie beschrijft hoe het afgeleide readmodel en MessageUnreadCountChanged omgaan met het zichtbaar worden of actualiseren van de badge bij de ontvanger.
Technisch OntwerpTechnisch Ontwerp: readmodels, tellers, badges, caching en materialisatie beschrijft dat leerlingbadge-onderdrukking tijdens een actieve oefenrun uitsluitend UI-zichtbaarheid raakt en geen readstate of berichtenopslag wijzigt.
Software Requirements SpecificationNeem de requirements uit deze usecase op als testbare functionele requirements zonder acceptatiecriteria in de usecase te dupliceren.
Database-informatieBevat de datamodelbasis waarmee 04_communicatie-en-notificaties.md expliciet genoeg beschrijft hoe nieuwe privéthreads, participants, berichten, readstate en ongelezenafleiding worden opgeslagen.

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-afleidingDektUsecasecontext
REQ-UC-GEN-MSG-002-001SRS-MSG-001
AC-MSG-001
Een ingelogde gebruiker een nieuw privébericht kunnen laten opstellen wanneer privéberichten sitebreed beschikbaar zijn
REQ-UC-GEN-MSG-002-002SRS-RDM-001
SRS-RDM-007
SRS-MSG-001
AC-RDM-001
AC-RDM-007
AC-MSG-001
De actie Nieuw privébericht vanuit het berichtenoverzicht kunnen starten
REQ-UC-GEN-MSG-002-003SRS-AUTH-001
SRS-RDM-001
SRS-RDM-007
SRS-MSG-007
AC-AUTH-001
AC-RDM-001
AC-RDM-007
AC-MSG-007
Bij openen van de opstelpagina server-side controleren of de gebruiker privéberichten mag gebruiken
REQ-UC-GEN-MSG-002-004SRS-RDM-001
SRS-RDM-007
SRS-REL-001
SRS-MSG-002
SRS-SHR-001
AC-RDM-001
AC-RDM-007
AC-REL-001
AC-MSG-002
AC-SHR-001
De ontvangerlijst opbouwen uit gebruikers binnen een geldige relatie-, vriendschaps- of deelnemerscontext
REQ-UC-GEN-MSG-002-005SRS-MSG-002
SRS-SHR-001
AC-MSG-002
AC-SHR-001
Geen willekeurige gebruikers buiten de toegestane ontvangercontext beschikbaar maken als ontvanger
REQ-UC-GEN-MSG-002-006SRS-MSG-002
SRS-SHR-001
AC-MSG-002
AC-SHR-001
Een niet-verzendbare toestand tonen wanneer er geen toegestane ontvangers beschikbaar zijn
REQ-UC-GEN-MSG-002-007SRS-MSG-002
SRS-SHR-001
AC-MSG-002
AC-SHR-001
Een ontvanger, onderwerp en berichtinhoud vragen voordat verzenden mogelijk is
REQ-UC-GEN-MSG-002-008SRS-MSG-001
AC-MSG-001
Annuleren kunnen verwerken zonder thread, bericht of readstate-mutatie op te slaan
REQ-UC-GEN-MSG-002-009SRS-MSG-002
SRS-SHR-006
AC-MSG-002
AC-SHR-006
Op verzendmoment opnieuw controleren of de gekozen ontvanger nog toegestaan is
REQ-UC-GEN-MSG-002-010SRS-AUTH-001
SRS-REL-001
SRS-MSG-002
AC-AUTH-001
AC-REL-001
AC-MSG-002
Verzenden blokkeren en POP-GEN-MSG-NO-RELATION tonen wanneer de relatie- of deelnemerscontext niet meer geldig is
REQ-UC-GEN-MSG-002-011SRS-AUTH-001
SRS-MSG-001
AC-AUTH-001
AC-MSG-001
Onderwerp en berichtinhoud server-side valideren voordat een privébericht wordt opgeslagen
REQ-UC-GEN-MSG-002-012SRS-AUTH-001
SRS-MSG-001
SRS-NFR-SEC-001
AC-AUTH-001
AC-MSG-001
AC-NFR-SEC-001
Rich-text berichtinhoud server-side sanitizen voordat deze wordt opgeslagen of gerenderd
REQ-UC-GEN-MSG-002-013SRS-AUTH-001
SRS-MSG-002
AC-AUTH-001
AC-MSG-002
Verzenden blokkeren wanneer na sanitizing geen geldige berichtinhoud overblijft
REQ-UC-GEN-MSG-002-014SRS-MSG-002
AC-MSG-002
Bij succesvol verzenden een geldige privéthreadcontext aanmaken of gebruiken
REQ-UC-GEN-MSG-002-015SRS-MSG-002
SRS-SHR-001
AC-MSG-002
AC-SHR-001
Bij succesvol verzenden participantregels voor verzender en ontvanger aanmaken of actualiseren
REQ-UC-GEN-MSG-002-016SRS-MSG-002
AC-MSG-002
Bij succesvol verzenden precies één nieuw PrivateMessages-record opslaan voor het nieuwe bericht
REQ-UC-GEN-MSG-002-017SRS-MSG-001
AC-MSG-001
Reguliere nieuwe privéberichten opslaan met de ingelogde gebruiker als verzender
REQ-UC-GEN-MSG-002-018SRS-MSG-002
AC-MSG-002
Na succesvol verzenden de threadmetadata bijwerken
REQ-UC-GEN-MSG-002-019SRS-MSG-006
AC-MSG-006
Na succesvol verzenden de leespositie van de verzender bijwerken zodat het eigen bericht niet ongelezen blijft
REQ-UC-GEN-MSG-002-020SRS-MSG-006
SRS-SHR-001
AC-MSG-006
AC-SHR-001
Na succesvol verzenden de nieuwe activiteit als ongelezen laten meetellen voor de ontvanger
REQ-UC-GEN-MSG-002-021SRS-RDM-001
SRS-RDM-002
SRS-MSG-006
SRS-SHR-006
AC-RDM-001
AC-RDM-002
AC-MSG-006
AC-SHR-006
Na succesvol verzenden de ongelezenteller van de ontvanger opnieuw kunnen bepalen of actualiseren
REQ-UC-GEN-MSG-002-022SRS-RDM-001
SRS-RDM-002
SRS-MSG-006
SRS-SHR-001
AC-RDM-001
AC-RDM-002
AC-MSG-006
AC-SHR-001
De badge bij de ontvanger zichtbaar kunnen maken wanneer het ongelezenaantal van nul naar groter dan nul gaat en de UI-context dat toestaat
REQ-UC-GEN-MSG-002-023SRS-RDM-001
SRS-RDM-002
SRS-RDM-007
SRS-MSG-006
SRS-SHR-001
AC-RDM-001
AC-RDM-002
AC-RDM-007
AC-MSG-006
AC-SHR-001
De bestaande badgewaarde bij de ontvanger kunnen actualiseren wanneer de ontvanger al ongelezen berichten had
REQ-UC-GEN-MSG-002-024SRS-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
Bij leerlingen tijdens een actieve oefenrun de ongelezenbadge visueel verborgen kunnen houden
REQ-UC-GEN-MSG-002-025SRS-MSG-006
SRS-LRN-009
AC-MSG-006
AC-LRN-009
Bij leerlingen tijdens een actieve oefenrun de onderliggende ongelezenstatus normaal blijven registreren
REQ-UC-GEN-MSG-002-026SRS-MSG-006
SRS-LRN-006
AC-MSG-006
AC-LRN-006
Na afronden of verlaten van een actieve oefenrun het actuele ongelezenaantal opnieuw kunnen bepalen en tonen wanneer dit groter is dan nul
REQ-UC-GEN-MSG-002-027SRS-MSG-001
AC-MSG-001
De mutaties voor threadcontext, participantregels, privébericht, threadmetadata en readstate transactioneel verwerken
REQ-UC-GEN-MSG-002-028SRS-MSG-001
SRS-SHR-001
AC-MSG-001
AC-SHR-001
Bij technische verzendfout geen gedeeltelijke mutatie achterlaten
REQ-UC-GEN-MSG-002-029SRS-MSG-001
AC-MSG-001
Bij technische verzendfout POP-GEN-MSG-SEND-FAILED kunnen tonen
REQ-UC-GEN-MSG-002-030SRS-MSG-001
AC-MSG-001
Bij verzendfouten de ingevoerde berichtinhoud beschikbaar houden zodat de gebruiker opnieuw kan proberen
REQ-UC-GEN-MSG-002-031SRS-MSG-001
AC-MSG-001
Bij reguliere nieuwe privéberichten geen systeembericht aanmaken
REQ-UC-GEN-MSG-002-032SRS-AUTH-001
SRS-MSG-001
AC-AUTH-001
AC-MSG-001
Bij autorisatie- of verzendfouten geen technische identifiers, stacktraces of interne databasenaamgeving tonen
REQ-UC-GEN-MSG-002-033SRS-MSG-001
AC-MSG-001
UTC-bronwaarden lokaal en consistent tonen in de opstel- en vervolgweergave