Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesMessages CommentsMessages + Comments — Code Map

Messages + Comments — Code Map

API

FileRole
apps/api/src/messages/messages.module.tsDI wiring; brings in R2, Redis, Users, Uploads, Push
apps/api/src/messages/messages.controller.tsREST endpoints — DMs + workout-anchored comments + program summaries
apps/api/src/messages/messages.service.tsCore service: createMessage, listConversations, getConversationMessages, markRead, markConversationRead, deleteMessage, createWorkoutComment, workout-comment readers, verifyCanMessage, attachment helpers
apps/api/src/messages/messages.gateway.tsSocket.io gateway at /ws. Clerk-auth handshake; presence; typing; broadcast message:new and announcement:new
apps/api/src/messages/messages.service.driver.ts + .unit.spec.tsTests
apps/api/src/conversations/conversations.controller.tsStaff unified-inbox routes used by member email, including GET …/member-email-status/:userId
apps/api/src/conversations/conversations.service.tsMember email preference gate, contact-scoped thread lookup, outbound send, and inbound reply persistence
apps/api/src/conversations/conversations.consent-gate.unit.spec.ts + member-email-status.unit.spec.tsMember preference and reachability coverage
apps/api/src/messages/dto/messages.dto.tsAll DTOs

DB

FileRole
libs/db/src/lib/schema/messaging.tsmessages, message_attachments, enums sender_role, attachment_type
libs/db/src/lib/schema/comments.tsexercise_comments — pinned to workout_movement
libs/db/src/lib/schema/conversations.tsShared lead/member email threads (contact_user_id) and threaded messages
libs/db/src/lib/schema/notification-prefs.tsMember category × channel preferences; newMessage.email controls staff email

Web

FileRole
apps/web/src/components/messages/desk/messages-desk.tsxStaff /dashboard/messages desk: list, member timeline, member panel (sheet below xl)
apps/web/src/components/messages/desk/desk-conversation-list.tsxNeeds reply / Waiting on them / Quiet rows with channel marks
apps/web/src/components/messages/desk/member-thread.tsx + email-slip.tsxUnified app + email timeline; emails drawn as letter slips
apps/web/src/components/messages/desk/desk-composer.tsxApp | Email composer; member email reachability mirror
apps/web/src/components/messages/desk/member-panel.tsxMember facts and channel reach
apps/web/src/components/messages/desk/messages-desk.int.spec.tsx + driverGrouping, merged timeline, email routing, opt-out block, email-off
apps/web/src/hooks/messages/use-desk-conversations.ts / use-member-timeline.tsDM list + member email threads merged per person; DMs + email thread merged per timeline
apps/web/src/components/messages/chat-window.tsx + conversation-list.tsxMember-facing (member)/messages chat
apps/web/src/components/messages/message-bubble.tsxSingle app message (shared by desk, member chat, workout comments)
apps/web/src/components/messages/date-separator.tsxDate dividers (member chat, workout comments)
apps/web/src/components/messages/file-upload-area.tsxAttachment picker
apps/web/src/components/messages/new-conversation-dialog.tsxStart a new DM
apps/web/src/components/messages/workout-comments-panel.tsx + sheet variant + .int.spec.tsxWorkout-anchored thread surface
  • Push: apps/api/src/push-notifications/push-notifications.service.ts .notifyUser invoked from messages service.
  • Uploads: apps/api/src/uploads/uploads.service.ts .createPresignedUpload.
  • Event tracking: apps/api/src/event-tracking/event-tracking.service.ts — no direct hook in messages today.
  • Unified email inbox: apps/web/src/components/inbox/conversation-thread.tsx; member and lead threads share send/reply rendering.
  • Shared contracts: libs/shared/src/lib/schemas/conversation.schema.ts (MEMBER_EMAIL_OPTED_OUT, member status response, contact filter).