Skip to main content

Messagerie — détails techniques

Fiche fonctionnelle

Description et fonctionnalités de ce module : Messagerie.

Couverture de tests

6 scénario(s) e2e couvrent ce module — dossier apps/open-ent-e2e/src/modules/26_messagerie.

6 test(s) e2e dans 6 scénario(s) — voir le détail

Messagerie 01_acces_au_module.spec.ts

  • accès au module

Messagerie 02_envoi_message.spec.ts

  • envoi de message

Messagerie — conversation enseignant ↔ élève 03_conversation_prof_eleve.spec.ts

  • échange en 3 messages sur un devoir non rendu

Messagerie — signaler un abus 04_signalement_abus.spec.ts

  • signaler un message reçu comme abusif (modération ADML dans le dashboard)

Messagerie — horaires (lecture seule) 05_horaires_lecture_seule.spec.ts

  • hors plage, l'élève voit le bandeau de fermeture et le bouton « Envoyer » est désactivé

Messagerie — envoi différé 06_envoi_differe.spec.ts

  • programmer un envoi de message (composer → Programmer l'envoi → date/heure → dossier Programmés)

➡️ Statut dans le dashboard E2E · Résultats détaillés

Restrictions de communication (exclusion élève · coupure justice)

Deux mesures d'encadrement ciblées, administrées depuis le dashboard et appliquées côté serveur.

Exclusion temporaire d'un élève

  • Stockage : collection Mongo messaging.exclusions, un document par exclusion { _id: "<structureId>:<userId>", userId, userName, structureId, blockedUntil (epoch ms), reason, createdBy, createdByName, createdAt }.
  • Backend conversation : util StudentMessagingExclusions (cache rafraîchi, isExcluded(userId, now)) + StudentMessagingExclusionsController. L'envoi est refusé dans ConversationController#send (403 conversation.error.messaging.excluded) et le worker ScheduledMessageSender retient les messages programmés d'un élève exclu.
  • Backend chat-nats : util miroir StudentMessagingExclusions (même collection, lecture seule) ; blocage dans ChatWebSocketHandler (trame {event:error, code:"messaging-excluded"}).
  • API (routes AUTHENTICATED + contrôle manuel) : GET|POST /conversation/messaging-exclusions/:structureId, DELETE /conversation/messaging-exclusions/:structureId/:userId, GET /conversation/messaging-exclusions (statut/bandeau).

Coupure de communication ciblée (justice)

  • Graphe : relation Neo4j bidirectionnelle (:User)-[:BLOCKED_COMMUNICATION {reason, createdBy, structureId, createdAt}]-(:User).
  • Backend communication (DefaultCommunicationService) : la clause AND NOT (n)-[:BLOCKED_COMMUNICATION]-(m) est ajoutée aux requêtes de visibilité (visibleUsersForShare, visibleUsers) et verify() renvoie canCommunicate=false pour une paire bloquée. Les deux personnes disparaissent mutuellement des destinataires (l'envoi est alors refusé par VisiblesFilter).
  • API (routes AUTHENTICATED + contrôle manuel) : GET|POST /communication/block/:structureId, DELETE /communication/block/:structureId/:userA/:userB.

Sécurité & délégation

Les contrôleurs autorisent SUPER_ADMIN, l'ADML de la structure, ou un personnel possédant l'action workflow communication.restriction.manage (déléguée par le chef via les rôles d'application). Côté dashboard, l'accès est ouvert par les sujets CASL messaging-exclusion / communication-block (super-admin + ADML), et /api/me expose canManageCommunicationRestrictions pour les personnels délégués.

Conformité

Évaluation au référentiel Open ENT NG (module conversation).

Maillon de la chaîne qualitéRéférence
🎯 Fonctionnalités attenduesfiche fonctionnelle
🧪 Tests réaliséscouverture e2e
✅ Tests de conformitétableau de conformité