
Complete rewrite from task management to full-featured chat system: Core Features: - Real-time WebSocket messaging with connection management - Direct messages and group chats with admin controls - Message types: text, images, videos, audio, documents - Message status tracking: sent, delivered, read receipts - Typing indicators and user presence (online/offline) - Message replies, editing, and deletion Security & Encryption: - End-to-end encryption with RSA + AES hybrid approach - JWT authentication for API and WebSocket connections - Secure file storage with access control - Automatic RSA key pair generation per user Media & File Sharing: - Multi-format file upload (images, videos, audio, documents) - Automatic thumbnail generation for images/videos - File size validation and MIME type checking - Secure download endpoints with permission checks Notifications & Alerts: - Real-time WebSocket notifications - Push notifications via Firebase integration - @username mention alerts with notification history - Unread message and mention counting - Custom notification types (message, mention, group invite) Advanced Features: - Group chat management with roles (member, admin, owner) - User search and chat member management - Message pagination and chat history - Last seen timestamps and activity tracking - Comprehensive API documentation with WebSocket events Architecture: - Clean layered architecture with services, models, schemas - WebSocket connection manager for real-time features - Modular notification system with multiple channels - Comprehensive error handling and validation - Production-ready with Docker support Technologies: FastAPI, WebSocket, SQLAlchemy, SQLite, Cryptography, Firebase, Pillow
509 lines
14 KiB
Markdown
509 lines
14 KiB
Markdown
# Real-time Chat API
|
|
|
|
A comprehensive real-time chat API built with FastAPI, WebSocket, and advanced features including media sharing, end-to-end encryption, and push notifications. Perfect for building modern chat applications.
|
|
|
|
## 🚀 Features
|
|
|
|
### Core Chat Features
|
|
- **Real-time Messaging**: WebSocket-based instant messaging
|
|
- **Direct Messages**: Private one-on-one conversations
|
|
- **Group Chats**: Multi-user chat rooms with admin controls
|
|
- **Message Types**: Text, images, videos, audio, documents
|
|
- **Message Status**: Sent, delivered, read receipts
|
|
- **Typing Indicators**: Real-time typing status
|
|
- **Message Replies**: Reply to specific messages
|
|
- **Message Editing**: Edit and delete messages
|
|
|
|
### Media & File Sharing
|
|
- **Image Sharing**: Upload and share images with automatic thumbnail generation
|
|
- **Video Support**: Share video files with metadata extraction
|
|
- **Document Support**: PDF, Word, Excel, PowerPoint, and more
|
|
- **Audio Messages**: Voice recordings and audio file sharing
|
|
- **File Validation**: Size limits and type restrictions
|
|
- **Secure Storage**: Files stored securely with access control
|
|
|
|
### Security & Encryption
|
|
- **End-to-End Encryption**: RSA + AES hybrid encryption for messages
|
|
- **JWT Authentication**: Secure token-based authentication
|
|
- **Key Management**: Automatic RSA key pair generation
|
|
- **Message Encryption**: Client-side encryption capabilities
|
|
- **Secure File Storage**: Protected media file access
|
|
|
|
### Notifications & Alerts
|
|
- **Push Notifications**: Firebase-based mobile notifications
|
|
- **Mention Alerts**: @username notifications
|
|
- **Real-time Notifications**: WebSocket-based instant alerts
|
|
- **Notification History**: Persistent notification storage
|
|
- **Custom Notification Types**: Message, mention, group invites
|
|
|
|
### Advanced Features
|
|
- **User Presence**: Online/offline status tracking
|
|
- **Last Seen**: User activity timestamps
|
|
- **Chat Management**: Admin/owner roles and permissions
|
|
- **Member Management**: Add/remove users, role assignment
|
|
- **Message Search**: Find messages across chats
|
|
- **Unread Counts**: Track unread messages per chat
|
|
|
|
## Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.8+
|
|
- pip
|
|
|
|
### Installation
|
|
|
|
1. Install dependencies:
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
2. Run database migrations:
|
|
```bash
|
|
alembic upgrade head
|
|
```
|
|
|
|
3. Start the application:
|
|
```bash
|
|
uvicorn main:app --reload
|
|
```
|
|
|
|
The API will be available at `http://localhost:8000`
|
|
|
|
### API Documentation
|
|
|
|
- Swagger UI: `http://localhost:8000/docs`
|
|
- ReDoc: `http://localhost:8000/redoc`
|
|
- OpenAPI JSON: `http://localhost:8000/openapi.json`
|
|
|
|
### WebSocket Connection
|
|
|
|
Connect to the WebSocket endpoint for real-time messaging:
|
|
|
|
```javascript
|
|
const ws = new WebSocket('ws://localhost:8000/ws/{access_token}');
|
|
|
|
// Send a message
|
|
ws.send(JSON.stringify({
|
|
type: 'send_message',
|
|
chat_id: 1,
|
|
content: 'Hello, world!',
|
|
message_type: 'text'
|
|
}));
|
|
|
|
// Listen for messages
|
|
ws.onmessage = (event) => {
|
|
const data = JSON.parse(event.data);
|
|
console.log('Received:', data);
|
|
};
|
|
```
|
|
|
|
## 📡 API Endpoints
|
|
|
|
### Authentication (`/api/auth`)
|
|
- `POST /register` - Register a new user
|
|
- `POST /login` - Login with username and password
|
|
- `GET /me` - Get current user information
|
|
- `PUT /me` - Update user profile
|
|
- `POST /device-token` - Update device token for push notifications
|
|
|
|
### Chats (`/api/chats`)
|
|
- `GET /` - Get user's chat list
|
|
- `POST /direct` - Create or get direct chat with another user
|
|
- `POST /group` - Create a new group chat
|
|
- `GET /{chat_id}` - Get chat details and members
|
|
- `PUT /{chat_id}` - Update chat information (admin/owner only)
|
|
- `POST /{chat_id}/members` - Add member to chat
|
|
- `DELETE /{chat_id}/members/{user_id}` - Remove member from chat
|
|
|
|
### Messages (`/api/messages`)
|
|
- `GET /{chat_id}` - Get chat messages with pagination
|
|
- `PUT /{message_id}` - Edit a message
|
|
- `DELETE /{message_id}` - Delete a message
|
|
- `POST /{message_id}/read` - Mark message as read
|
|
|
|
### Media (`/api/media`)
|
|
- `POST /upload/{message_id}` - Upload media files for a message
|
|
- `GET /{media_id}` - Download media file
|
|
- `GET /{media_id}/thumbnail` - Get media thumbnail
|
|
- `GET /{media_id}/info` - Get media file information
|
|
- `DELETE /{media_id}` - Delete media file
|
|
|
|
### Notifications (`/api/notifications`)
|
|
- `GET /` - Get user notifications
|
|
- `GET /mentions` - Get unread mentions
|
|
- `POST /{notification_id}/read` - Mark notification as read
|
|
- `POST /mentions/{mention_id}/read` - Mark mention as read
|
|
- `POST /read-all` - Mark all notifications as read
|
|
- `GET /count` - Get unread notification count
|
|
|
|
### Encryption (`/api/encryption`)
|
|
- `POST /generate-keys` - Generate new RSA key pair
|
|
- `GET /public-key` - Get current user's public key
|
|
- `GET /public-key/{user_id}` - Get another user's public key
|
|
- `POST /encrypt` - Encrypt a message for a user
|
|
- `POST /decrypt` - Decrypt a message
|
|
- `PUT /public-key` - Update user's public key
|
|
|
|
### System
|
|
- `GET /` - API information and features
|
|
- `GET /health` - Health check endpoint
|
|
- `GET /api/status` - System status and statistics
|
|
|
|
## 🏗️ Data Models
|
|
|
|
### User
|
|
- `id`: Unique identifier
|
|
- `username`: Username (unique, required)
|
|
- `email`: Email address (unique, required)
|
|
- `full_name`: Optional full name
|
|
- `avatar_url`: Profile picture URL
|
|
- `bio`: User biography
|
|
- `is_active`: Account status
|
|
- `is_online`: Current online status
|
|
- `last_seen`: Last activity timestamp
|
|
- `public_key`: RSA public key for E2E encryption
|
|
- `device_token`: Firebase device token for push notifications
|
|
|
|
### Chat
|
|
- `id`: Unique identifier
|
|
- `name`: Chat name (null for direct messages)
|
|
- `description`: Chat description
|
|
- `chat_type`: "direct" or "group"
|
|
- `avatar_url`: Chat avatar image
|
|
- `is_active`: Active status
|
|
|
|
### Message
|
|
- `id`: Unique identifier
|
|
- `chat_id`: Associated chat
|
|
- `sender_id`: Message sender
|
|
- `reply_to_id`: Replied message ID (optional)
|
|
- `content`: Message content (encrypted)
|
|
- `content_type`: "text", "image", "video", "audio", "file", "system"
|
|
- `status`: "sent", "delivered", "read", "failed"
|
|
- `is_edited`: Edit status
|
|
- `is_deleted`: Deletion status
|
|
- `created_at`: Send timestamp
|
|
|
|
### Media
|
|
- `id`: Unique identifier
|
|
- `message_id`: Associated message
|
|
- `filename`: Stored filename
|
|
- `original_filename`: Original upload name
|
|
- `file_size`: Size in bytes
|
|
- `mime_type`: File MIME type
|
|
- `media_type`: "image", "video", "audio", "document", "other"
|
|
- `width/height`: Image/video dimensions
|
|
- `duration`: Audio/video duration
|
|
- `thumbnail_path`: Thumbnail file path
|
|
|
|
### Chat Member
|
|
- `id`: Unique identifier
|
|
- `chat_id`: Associated chat
|
|
- `user_id`: User ID
|
|
- `role`: "member", "admin", "owner"
|
|
- `nickname`: Chat-specific nickname
|
|
- `is_muted`: Mute status
|
|
- `joined_at`: Join timestamp
|
|
- `last_read_message_id`: Last read message for unread count
|
|
|
|
### Notification
|
|
- `id`: Unique identifier
|
|
- `user_id`: Recipient user
|
|
- `notification_type`: "message", "mention", "group_invite"
|
|
- `title`: Notification title
|
|
- `body`: Notification content
|
|
- `data`: Additional JSON data
|
|
- `is_read`: Read status
|
|
- `created_at`: Creation timestamp
|
|
|
|
## 🔧 Environment Variables
|
|
|
|
Set the following environment variables for production:
|
|
|
|
```bash
|
|
# Required
|
|
SECRET_KEY="your-super-secret-key-change-in-production"
|
|
|
|
# Optional - Firebase Push Notifications
|
|
FIREBASE_CREDENTIALS_PATH="/path/to/firebase-credentials.json"
|
|
# OR
|
|
FIREBASE_CREDENTIALS_JSON='{"type": "service_account", ...}'
|
|
|
|
# Optional - Redis for caching (if implemented)
|
|
REDIS_URL="redis://localhost:6379"
|
|
```
|
|
|
|
## 💾 Database
|
|
|
|
The application uses SQLite by default with the database file stored at `/app/storage/db/chat.sqlite`. The database is automatically created when the application starts.
|
|
|
|
**File Storage Structure:**
|
|
```
|
|
/app/storage/
|
|
├── db/
|
|
│ └── chat.sqlite # Main database
|
|
├── media/ # Uploaded media files
|
|
│ ├── image_file.jpg
|
|
│ └── document.pdf
|
|
└── thumbnails/ # Generated thumbnails
|
|
└── thumb_image_file.jpg
|
|
```
|
|
|
|
## 🔐 Authentication & Security
|
|
|
|
### JWT Authentication
|
|
1. Register a new user or login with existing credentials
|
|
2. Include the access token in the Authorization header: `Authorization: Bearer <token>`
|
|
3. For WebSocket connections, pass the token in the URL: `/ws/{access_token}`
|
|
|
|
### End-to-End Encryption
|
|
1. **Key Generation**: Each user gets an RSA key pair on registration
|
|
2. **Message Encryption**: Messages encrypted with recipient's public key
|
|
3. **Hybrid Encryption**: Uses RSA + AES for large messages
|
|
4. **Client-Side**: Encryption/decryption can be done client-side
|
|
|
|
Example encryption workflow:
|
|
```python
|
|
# Get recipient's public key
|
|
GET /api/encryption/public-key/{user_id}
|
|
|
|
# Encrypt message client-side
|
|
POST /api/encryption/encrypt
|
|
{
|
|
"message": "Hello, this is encrypted!",
|
|
"recipient_user_id": 123
|
|
}
|
|
|
|
# Send encrypted message via WebSocket
|
|
ws.send({
|
|
"type": "send_message",
|
|
"chat_id": 1,
|
|
"content": "encrypted_content_here"
|
|
})
|
|
```
|
|
|
|
## 📱 WebSocket Events
|
|
|
|
### Client → Server Events
|
|
```javascript
|
|
// Send message
|
|
{
|
|
"type": "send_message",
|
|
"chat_id": 1,
|
|
"content": "Hello!",
|
|
"message_type": "text",
|
|
"reply_to_id": null
|
|
}
|
|
|
|
// Typing indicators
|
|
{
|
|
"type": "typing_start",
|
|
"chat_id": 1
|
|
}
|
|
|
|
{
|
|
"type": "typing_stop",
|
|
"chat_id": 1
|
|
}
|
|
|
|
// Mark message as read
|
|
{
|
|
"type": "message_read",
|
|
"message_id": 123,
|
|
"chat_id": 1
|
|
}
|
|
|
|
// Join/leave chat room
|
|
{
|
|
"type": "join_chat",
|
|
"chat_id": 1
|
|
}
|
|
```
|
|
|
|
### Server → Client Events
|
|
```javascript
|
|
// New message received
|
|
{
|
|
"type": "new_message",
|
|
"message": {
|
|
"id": 123,
|
|
"chat_id": 1,
|
|
"sender_id": 456,
|
|
"sender_username": "john_doe",
|
|
"content": "Hello!",
|
|
"created_at": "2024-12-20T12:00:00Z"
|
|
}
|
|
}
|
|
|
|
// User status updates
|
|
{
|
|
"type": "user_status",
|
|
"user_id": 456,
|
|
"username": "john_doe",
|
|
"status": "online"
|
|
}
|
|
|
|
// Typing indicators
|
|
{
|
|
"type": "typing_start",
|
|
"chat_id": 1,
|
|
"user_id": 456,
|
|
"username": "john_doe"
|
|
}
|
|
|
|
// Notifications
|
|
{
|
|
"type": "mention_notification",
|
|
"title": "Mentioned by john_doe",
|
|
"body": "You were mentioned in a message",
|
|
"chat_id": 1
|
|
}
|
|
```
|
|
|
|
## 🔧 Development
|
|
|
|
### Code Quality
|
|
```bash
|
|
# Lint and format code
|
|
ruff check . --fix
|
|
ruff format .
|
|
```
|
|
|
|
### Database Migrations
|
|
```bash
|
|
# Create new migration
|
|
alembic revision --autogenerate -m "Description of changes"
|
|
|
|
# Apply migrations
|
|
alembic upgrade head
|
|
|
|
# Check current migration
|
|
alembic current
|
|
```
|
|
|
|
### Testing WebSocket Connection
|
|
```bash
|
|
# Install websocat for testing
|
|
pip install websockets
|
|
|
|
# Test WebSocket connection
|
|
python -c "
|
|
import asyncio
|
|
import websockets
|
|
import json
|
|
|
|
async def test():
|
|
uri = 'ws://localhost:8000/ws/your_jwt_token_here'
|
|
async with websockets.connect(uri) as websocket:
|
|
# Send a test message
|
|
await websocket.send(json.dumps({
|
|
'type': 'send_message',
|
|
'chat_id': 1,
|
|
'content': 'Test message'
|
|
}))
|
|
|
|
# Listen for response
|
|
response = await websocket.recv()
|
|
print(json.loads(response))
|
|
|
|
asyncio.run(test())
|
|
"
|
|
```
|
|
|
|
## 🏗️ Architecture
|
|
|
|
### Technology Stack
|
|
- **FastAPI**: Modern, fast web framework with WebSocket support
|
|
- **SQLAlchemy**: Python ORM for database operations
|
|
- **Alembic**: Database migration management
|
|
- **Pydantic**: Data validation using Python type annotations
|
|
- **WebSocket**: Real-time bidirectional communication
|
|
- **JWT**: JSON Web Tokens for authentication
|
|
- **SQLite**: Lightweight database for development
|
|
- **Cryptography**: RSA + AES encryption for E2E security
|
|
- **Firebase Admin**: Push notification service
|
|
- **Pillow**: Image processing and thumbnail generation
|
|
|
|
### Project Structure
|
|
```
|
|
app/
|
|
├── api/ # API route handlers
|
|
│ ├── auth.py # Authentication endpoints
|
|
│ ├── chats.py # Chat management
|
|
│ ├── messages.py # Message operations
|
|
│ ├── media.py # File upload/download
|
|
│ ├── notifications.py # Notification management
|
|
│ └── encryption.py # E2E encryption utilities
|
|
├── core/ # Core utilities
|
|
│ ├── deps.py # Dependency injection
|
|
│ └── security.py # Security functions
|
|
├── db/ # Database configuration
|
|
│ ├── base.py # SQLAlchemy base
|
|
│ └── session.py # Database session management
|
|
├── models/ # SQLAlchemy models
|
|
│ ├── user.py # User model
|
|
│ ├── chat.py # Chat model
|
|
│ ├── message.py # Message model
|
|
│ └── ...
|
|
├── schemas/ # Pydantic schemas
|
|
│ ├── user.py # User schemas
|
|
│ ├── chat.py # Chat schemas
|
|
│ └── ...
|
|
├── services/ # Business logic services
|
|
│ ├── media_service.py # File handling
|
|
│ ├── encryption_service.py # Encryption logic
|
|
│ ├── notification_service.py # Notification management
|
|
│ └── push_notification_service.py
|
|
├── websocket/ # WebSocket handling
|
|
│ ├── connection_manager.py # Connection management
|
|
│ └── chat_handler.py # Message handling
|
|
└── utils/ # Utility functions
|
|
```
|
|
|
|
### Design Patterns
|
|
- **Repository Pattern**: Data access abstraction
|
|
- **Service Layer**: Business logic separation
|
|
- **Dependency Injection**: Loose coupling
|
|
- **Event-Driven**: WebSocket event handling
|
|
- **Clean Architecture**: Separation of concerns
|
|
|
|
## 📊 Performance Considerations
|
|
|
|
- **Connection Pooling**: SQLAlchemy connection management
|
|
- **File Storage**: Local storage with direct file serving
|
|
- **Memory Management**: Efficient WebSocket connection tracking
|
|
- **Thumbnail Generation**: Automatic image thumbnail creation
|
|
- **Message Pagination**: Efficient large chat history loading
|
|
- **Real-time Optimization**: WebSocket connection pooling
|
|
|
|
## 🚀 Deployment
|
|
|
|
### Production Checklist
|
|
- [ ] Set strong `SECRET_KEY` environment variable
|
|
- [ ] Configure Firebase credentials for push notifications
|
|
- [ ] Set up proper file storage (S3, etc.) for production
|
|
- [ ] Configure reverse proxy (nginx) for WebSocket support
|
|
- [ ] Set up SSL/TLS certificates
|
|
- [ ] Configure database backups
|
|
- [ ] Set up monitoring and logging
|
|
- [ ] Configure CORS for your frontend domain
|
|
|
|
### Docker Deployment
|
|
```dockerfile
|
|
FROM python:3.11-slim
|
|
|
|
WORKDIR /app
|
|
|
|
COPY requirements.txt .
|
|
RUN pip install -r requirements.txt
|
|
|
|
COPY . .
|
|
|
|
EXPOSE 8000
|
|
|
|
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
```
|
|
|
|
This comprehensive chat API provides a solid foundation for building modern messaging applications with real-time communication, security, and scalability in mind.
|