The Chat module provides multi-channel messaging with channels, members, threaded messages, mentions, read markers, and file attachments. It follows the same port/adapter pattern as other modules.
Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/chat/channels | POST | Create channel |
/api/chat/channels | GET | List channels |
/api/chat/channels/{id}/members | POST | Add member |
/api/chat/channels/{id}/messages | POST | Send message |
/api/chat/channels/{id}/messages | GET | Paginated messages |
/api/chat/channels/{id}/read | POST | Mark as read |
/api/chat/messages/{id} | PATCH | Edit message |
Architecture
ChatEndpoints (Minimal API) │ ▼ChatService │ ├── IChatRepository → SqlSugarChatRepository ├── IChatEventPublisher → NullChatEventPublisher ├── IChatRealtimeAdapter → NullChatRealtimeAdapter (roadmap: SignalR) └── IChatAttachmentAccessService → FileAssetChatAttachmentAccessServiceEntities
| Entity | Purpose |
|---|---|
ChatChannelEntity | Channel definition (name, type, tenant) |
ChatMemberEntity | Channel membership (user + role) |
ChatMessageEntity | Messages (content, sender, edited flag) |
ChatAttachmentEntity | Message file attachments |
ChatMentionEntity | @mention tracking |
ChatReadMarkerEntity | Per-user read position |
Permissions
Chat uses attribute-based permissions via ChatPermissions:
public static class ChatPermissions{ public const string ChannelCreate = "chat.channel.create"; public const string ChannelManage = "chat.channel.manage"; public const string MessageSend = "chat.message.send"; public const string MessageEdit = "chat.message.edit"; public const string MemberManage = "chat.member.manage";}Message pagination
public class ChatMessagePage{ public IReadOnlyList<ChatMessage> Messages { get; } public int TotalCount { get; } public bool HasMore { get; }}Messages are loaded in reverse chronological order with cursor-based pagination.
Realtime adapter (roadmap)
public interface IChatRealtimeAdapter{ Task MessageCreatedAsync(ChatMessage message, CancellationToken ct); Task MessageEditedAsync(ChatMessage message, CancellationToken ct); Task MemberJoinedAsync(ChatMember member, CancellationToken ct);}Planned implementations: SignalR hub, Server-Sent Events, WebSocket adapter.
See also
- Files module — File attachment support
- Notifications module — Chat mention notifications