Messages + Comments — Code Map
API
| File | Role |
|---|---|
apps/api/src/messages/messages.module.ts | DI wiring; brings in R2, Redis, Users, Uploads, Push |
apps/api/src/messages/messages.controller.ts | REST endpoints — DMs + workout-anchored comments + program summaries |
apps/api/src/messages/messages.service.ts | Core service: createMessage, listConversations, getConversationMessages, markRead, markConversationRead, deleteMessage, createWorkoutComment, workout-comment readers, verifyCanMessage, attachment helpers |
apps/api/src/messages/messages.gateway.ts | Socket.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.ts | Tests |
apps/api/src/conversations/conversations.controller.ts | Staff unified-inbox routes used by member email, including GET …/member-email-status/:userId |
apps/api/src/conversations/conversations.service.ts | Member 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.ts | Member preference and reachability coverage |
apps/api/src/messages/dto/messages.dto.ts | All DTOs |
DB
| File | Role |
|---|---|
libs/db/src/lib/schema/messaging.ts | messages, message_attachments, enums sender_role, attachment_type |
libs/db/src/lib/schema/comments.ts | exercise_comments — pinned to workout_movement |
libs/db/src/lib/schema/conversations.ts | Shared lead/member email threads (contact_user_id) and threaded messages |
libs/db/src/lib/schema/notification-prefs.ts | Member category × channel preferences; newMessage.email controls staff email |
Web
| File | Role |
|---|---|
apps/web/src/components/messages/desk/messages-desk.tsx | Staff /dashboard/messages desk: list, member timeline, member panel (sheet below xl) |
apps/web/src/components/messages/desk/desk-conversation-list.tsx | Needs reply / Waiting on them / Quiet rows with channel marks |
apps/web/src/components/messages/desk/member-thread.tsx + email-slip.tsx | Unified app + email timeline; emails drawn as letter slips |
apps/web/src/components/messages/desk/desk-composer.tsx | App | Email composer; member email reachability mirror |
apps/web/src/components/messages/desk/member-panel.tsx | Member facts and channel reach |
apps/web/src/components/messages/desk/messages-desk.int.spec.tsx + driver | Grouping, merged timeline, email routing, opt-out block, email-off |
apps/web/src/hooks/messages/use-desk-conversations.ts / use-member-timeline.ts | DM list + member email threads merged per person; DMs + email thread merged per timeline |
apps/web/src/components/messages/chat-window.tsx + conversation-list.tsx | Member-facing (member)/messages chat |
apps/web/src/components/messages/message-bubble.tsx | Single app message (shared by desk, member chat, workout comments) |
apps/web/src/components/messages/date-separator.tsx | Date dividers (member chat, workout comments) |
apps/web/src/components/messages/file-upload-area.tsx | Attachment picker |
apps/web/src/components/messages/new-conversation-dialog.tsx | Start a new DM |
apps/web/src/components/messages/workout-comments-panel.tsx + sheet variant + .int.spec.tsx | Workout-anchored thread surface |
Cross-feature links
- Push:
apps/api/src/push-notifications/push-notifications.service.ts.notifyUserinvoked 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).