Files
orion/docs/implementation/messaging-system.md
Samir Boulahtit d648c921b7
Some checks failed
CI / ruff (push) Successful in 10s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled
docs: add consolidated dev URL reference and migrate /shop to /storefront
- Add Development URL Quick Reference section to url-routing overview
  with all login URLs, entry points, and full examples
- Replace /shop/ path segments with /storefront/ across 50 docs files
- Update file references: shop_pages.py → storefront_pages.py,
  templates/shop/ → templates/storefront/, api/v1/shop/ → api/v1/storefront/
- Preserve domain references (orion.shop) and /store/ staff dashboard paths
- Archive docs left unchanged (historical)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 13:23:44 +01:00

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:

  1. Admin <-> Store: Platform administrators communicate with store users
  2. Store <-> Customer: Stores communicate with their customers
  3. 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:

  • admin and store types reference users.id
  • customer type references customers.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 request
  • ConversationSummary - List item with unread count
  • ConversationDetailResponse - Full thread with messages
  • ConversationListResponse - Paginated list
  • MessageResponse - Single message with attachments
  • AttachmentResponse - File metadata with download URL
  • UnreadCountResponse - 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/messages and /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_customer conversations
  • 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:

  1. MessageNotificationService (app/services/message_notification_service.py)

    • notify_new_message() - Send email to participants on new message
    • Respect per-conversation email_notifications preference
    • Include message preview and reply link
  2. Email Template (app/templates/emails/new_message.html)

    • Subject: "New message: {conversation_subject}"
    • Body: Sender name, message preview, link to reply
  3. Integration Points:

    • Call notify_new_message() from messaging_service.send_message()
    • Skip notification for sender (only notify other participants)
    • Rate limit to prevent spam on rapid message exchanges

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.