Direct messages: role/family-scoped 1:1 messaging with presence (FAB + drawer) #767

Closed
opened 2026-07-21 03:57:49 +00:00 by spikerj · 2 comments
Owner

Text-only 1:1 direct messaging (Instagram/FB-DM style), surfaced via a new bottom-right FAB next to the System Activity gear and book-processing icons, with an unread-count badge and a slide-in drawer.

Visibility / permission rules

  • admin/staff: see everyone currently online, can message anyone
  • parents: always see their linked children (with online status) and can message them; cannot see staff in the roster
  • children: see only their parent(s), nobody else (no other children, no staff)
  • Anyone may reply within a conversation that was legitimately initiated with them (covers staff→child / staff→parent outreach)

Implementation shape (investigated 2026-07-21)

  • Existing ChatHub/MultiTenantChatHub are Redis-only (TTL'd) and org-scoped, not family-aware → new durable Mongo collections (direct-conversations, direct-messages) + Messaging domain (CQRS) in the API; real-time delivery reuses the existing /hubs/notifications pipeline (user-{sub} groups), no new hub.
  • Presence: Redis keys keyed by Keycloak sub, heartbeat via NotificationsHub (ChatHub's 3-min TTL has no refresh — not reused).
  • Frontend: messaging FAB + drawer at app shell root following book-processing-notifications drawer pattern; unread matBadge; contacts/conversations via httpResource, mutations imperative.

Backend + frontend PRs to follow.

Text-only 1:1 direct messaging (Instagram/FB-DM style), surfaced via a new bottom-right FAB next to the System Activity gear and book-processing icons, with an unread-count badge and a slide-in drawer. **Visibility / permission rules** - admin/staff: see everyone currently online, can message anyone - parents: always see their linked children (with online status) and can message them; cannot see staff in the roster - children: see only their parent(s), nobody else (no other children, no staff) - Anyone may reply within a conversation that was legitimately initiated with them (covers staff→child / staff→parent outreach) **Implementation shape (investigated 2026-07-21)** - Existing ChatHub/MultiTenantChatHub are Redis-only (TTL'd) and org-scoped, not family-aware → new durable Mongo collections (direct-conversations, direct-messages) + Messaging domain (CQRS) in the API; real-time delivery reuses the existing /hubs/notifications pipeline (user-{sub} groups), no new hub. - Presence: Redis keys keyed by Keycloak sub, heartbeat via NotificationsHub (ChatHub's 3-min TTL has no refresh — not reused). - Frontend: messaging FAB + drawer at app shell root following book-processing-notifications drawer pattern; unread matBadge; contacts/conversations via httpResource, mutations imperative. Backend + frontend PRs to follow.
Author
Owner

Implementation up for review: spikersoft-backend PR #440 (Mongo persistence, api/messaging endpoints, permission matrix, NotificationsHub presence + ReceiveDirectMessage fan-out) and spikersoft-angular PR #505 (FAB + drawer, unread badge, heartbeat presence). Backend data layer smoke-tested against live Mongo 8.2.6. Leaving open until both PRs merge.

Implementation up for review: spikersoft-backend PR #440 (Mongo persistence, api/messaging endpoints, permission matrix, NotificationsHub presence + ReceiveDirectMessage fan-out) and spikersoft-angular PR #505 (FAB + drawer, unread badge, heartbeat presence). Backend data layer smoke-tested against live Mongo 8.2.6. Leaving open until both PRs merge.
Author
Owner

Feature complete and live: backend #440/#441/#442 + angular #505/#506/#507 all merged and deployed. Verified in prod: role/family-scoped DMs, live badge+ding, presence, roster incl. admin-parent overlap, avatars from MinIO. Closing.

Feature complete and live: backend #440/#441/#442 + angular #505/#506/#507 all merged and deployed. Verified in prod: role/family-scoped DMs, live badge+ding, presence, roster incl. admin-parent overlap, avatars from MinIO. Closing.
Sign in to join this conversation.