Move 39 documentation files from top-level docs/ into each module's docs/ folder, accessible via symlinks from docs/modules/. Create data-model.md files for 10 modules with full schema documentation. Replace originals with redirect stubs. Remove empty guide stubs. Modules migrated: tenancy, billing, loyalty, marketplace, orders, messaging, cms, catalog, inventory, hosting, prospecting. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
8.0 KiB
Messaging System Implementation
This document describes the messaging system that enables threaded conversations between different platform participants.
Overview
The messaging system supports three communication channels:
- Admin <-> Store: Platform administrators communicate with store users
- Store <-> Customer: Stores communicate with their customers
- Admin <-> Customer: Platform administrators communicate with customers
Architecture
Database Models
Located in models/database/message.py:
| Model | Description |
|---|---|
Conversation |
Threaded conversation container with subject, type, and status |
ConversationParticipant |
Links participants to conversations with unread tracking |
Message |
Individual messages within a conversation |
MessageAttachment |
File attachments for messages |
Enums
| Enum | Values | Description |
|---|---|---|
ConversationType |
admin_store, store_customer, admin_customer |
Defines conversation channel |
ParticipantType |
admin, store, customer |
Type of participant |
Polymorphic Participants
The system uses polymorphic relationships via participant_type + participant_id:
adminandstoretypes referenceusers.idcustomertype referencescustomers.id
Multi-Tenant Isolation
Conversations involving customers include a store_id to ensure proper data isolation. Store users can only see conversations within their store context.
Services
MessagingService (app/services/messaging_service.py)
Core business logic for conversations and messages:
| Method | Description |
|---|---|
create_conversation() |
Create a new conversation with participants |
get_conversation() |
Get conversation with access validation |
list_conversations() |
Paginated list with filters |
send_message() |
Send message with automatic unread updates |
mark_conversation_read() |
Mark all messages read for participant |
get_unread_count() |
Get total unread count for header badge |
close_conversation() |
Close a conversation thread |
reopen_conversation() |
Reopen a closed conversation |
MessageAttachmentService (app/services/message_attachment_service.py)
File upload handling:
| Method | Description |
|---|---|
validate_and_store() |
Validate file type/size and store to disk |
get_max_file_size_bytes() |
Get limit from platform settings |
delete_attachment() |
Remove files from storage |
Allowed file types:
- Images: JPEG, PNG, GIF, WebP
- Documents: PDF, Office documents
- Archives: ZIP
- Text: Plain text, CSV
Storage path pattern: uploads/messages/YYYY/MM/conversation_id/uuid.ext
API Endpoints
Admin API (/api/v1/admin/messages)
| Endpoint | Method | Description |
|---|---|---|
/messages |
GET | List conversations |
/messages |
POST | Create conversation |
/messages/unread-count |
GET | Get unread badge count |
/messages/recipients |
GET | Get available recipients |
/messages/{id} |
GET | Get conversation detail |
/messages/{id}/messages |
POST | Send message (with attachments) |
/messages/{id}/close |
POST | Close conversation |
/messages/{id}/reopen |
POST | Reopen conversation |
/messages/{id}/read |
PUT | Mark as read |
/messages/{id}/preferences |
PUT | Update notification preferences |
Store API (/api/v1/store/messages)
Same structure as admin, but with store context filtering. Stores can only:
- See their own store_customer and admin_store conversations
- Create store_customer conversations with their customers
- Not initiate admin_store conversations (admins initiate those)
Frontend
Admin Interface
- Template:
app/templates/admin/messages.html - JavaScript:
static/admin/js/messages.js
Features:
- Split-panel conversation list + message thread
- Filters by type (stores/customers) and status (open/closed)
- Compose modal for new conversations
- File attachment support
- 30-second polling for new messages
- Header badge with unread count
Store Interface
- Template:
app/templates/store/messages.html - JavaScript:
static/store/js/messages.js
Similar to admin but with store-specific:
- Only store_customer and admin_store channels
- Compose modal for customer conversations only
Pydantic Schemas
Located in models/schema/message.py:
ConversationCreate- Create requestConversationSummary- List item with unread countConversationDetailResponse- Full thread with messagesConversationListResponse- Paginated listMessageResponse- Single message with attachmentsAttachmentResponse- File metadata with download URLUnreadCountResponse- For header badge
Configuration
Platform Setting
The attachment size limit is configurable via platform settings:
- Key:
message_attachment_max_size_mb - Default: 10
- Category: messaging
Storefront (Customer) Interface
API Endpoints (/api/v1/storefront/messages)
| Endpoint | Method | Description |
|---|---|---|
/messages |
GET | List customer's conversations |
/messages/unread-count |
GET | Get unread badge count |
/messages/{id} |
GET | Get conversation detail |
/messages/{id}/messages |
POST | Send reply message |
/messages/{id}/read |
PUT | Mark as read |
/messages/{id}/attachments/{att_id} |
GET | Download attachment |
Frontend
- Template:
app/templates/storefront/account/messages.html - Page Route:
/storefront/account/messagesand/storefront/account/messages/{conversation_id}
Features:
- Conversation list with unread badges
- Filter by status (open/closed)
- Thread view with message history
- Reply form with file attachments
- 30-second polling for new messages
- Link from account dashboard with unread count
Limitations
Customers can only:
- View their
store_customerconversations - Reply to existing conversations (cannot initiate)
- Cannot close conversations
Future Enhancements
Email Notifications (Requires Email Infrastructure)
The messaging system is designed to support email notifications, but requires email infrastructure to be implemented first:
Prerequisites:
- SMTP configuration in settings (host, port, username, password)
- Email service (
app/services/email_service.py) - Email templates (
app/templates/emails/) - Background task queue for async sending
Planned Implementation:
-
MessageNotificationService (
app/services/message_notification_service.py)notify_new_message()- Send email to participants on new message- Respect per-conversation
email_notificationspreference - Include message preview and reply link
-
Email Template (
app/templates/emails/new_message.html)- Subject: "New message: {conversation_subject}"
- Body: Sender name, message preview, link to reply
-
Integration Points:
- Call
notify_new_message()frommessaging_service.send_message() - Skip notification for sender (only notify other participants)
- Rate limit to prevent spam on rapid message exchanges
- Call
Database Support:
The email_notifications field on ConversationParticipant is already in place to store per-conversation preferences.
WebSocket Support (Optional)
Real-time message delivery instead of 30-second polling:
- Would require WebSocket infrastructure (e.g., FastAPI WebSocket, Redis pub/sub)
- Significant infrastructure changes
Migration
The messaging tables are created by migration e3f4a5b6c7d8_add_messaging_tables.py:
# Apply migration
alembic upgrade head
# Rollback
alembic downgrade -1
Navigation
Admin Sidebar
Messages is available under "Platform Administration" section.
Store Sidebar
Messages is available under "Sales" section.
Storefront Account Dashboard
Messages card is available on the customer account dashboard with unread count badge.
Header Badge
Both admin and store headers show an unread message count badge next to the messages icon.