168 lines
5 KiB
Markdown
168 lines
5 KiB
Markdown
|
|
# 🔍 AUDIT INITIAL — Delivered Status + Typing Indicators
|
||
|
|
|
||
|
|
**Date** : 2025-01-27
|
||
|
|
**Cible** : `veza-chat-server`
|
||
|
|
**Objectif** : État actuel avant implémentation P1
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. TYPING INDICATORS — État actuel
|
||
|
|
|
||
|
|
### 1.1. Module existant : `src/typing_indicator.rs`
|
||
|
|
|
||
|
|
✅ **Structure présente** :
|
||
|
|
- `TypingIndicatorManager` existe avec :
|
||
|
|
- `typing_users: Arc<RwLock<HashMap<String, HashMap<String, DateTime<Utc>>>>>`
|
||
|
|
- `timeout_duration: Duration::seconds(3)` (hardcodé)
|
||
|
|
|
||
|
|
✅ **Méthodes disponibles** :
|
||
|
|
- `set_typing(conversation_id, user_id)` — marque un user comme "typing"
|
||
|
|
- `stop_typing(conversation_id, user_id)` — retire un user
|
||
|
|
- `get_typing_users(conversation_id)` — liste les users actifs (filtre les expirés)
|
||
|
|
- `cleanup_expired()` — nettoie les entrées expirées
|
||
|
|
|
||
|
|
❌ **Manques identifiés** :
|
||
|
|
1. **Pas de task de monitoring automatique** : `cleanup_expired()` existe mais n'est jamais appelée automatiquement
|
||
|
|
2. **Pas de broadcast automatique** : le manager ne déclenche pas de broadcast quand un timeout expire
|
||
|
|
3. **Pas intégré dans WebSocketState** : le manager n'est pas instancié dans `WebSocketState`
|
||
|
|
4. **Pas de méthode `monitor_timeouts()`** : pas de boucle de fond pour détecter les expirations
|
||
|
|
|
||
|
|
### 1.2. WebSocket Messages
|
||
|
|
|
||
|
|
❌ **IncomingMessage::Typing** : **N'EXISTE PAS**
|
||
|
|
- Seuls existent : `SendMessage`, `JoinConversation`, `LeaveConversation`, `MarkAsRead`, `Ping`
|
||
|
|
|
||
|
|
❌ **OutgoingMessage::UserTyping** : **N'EXISTE PAS**
|
||
|
|
- Seuls existent : `NewMessage`, `MessageRead`, `ActionConfirmed`, `Error`, `Pong`
|
||
|
|
|
||
|
|
### 1.3. Handler WebSocket
|
||
|
|
|
||
|
|
❌ **Pas de branchement pour Typing** dans `handle_incoming_message()` (`src/websocket/handler.rs`)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. DELIVERED STATUS — État actuel
|
||
|
|
|
||
|
|
### 2.1. Enum MessageReadStatus
|
||
|
|
|
||
|
|
✅ **Existe dans `src/read_receipts.rs`** :
|
||
|
|
```rust
|
||
|
|
pub enum MessageReadStatus {
|
||
|
|
Sent,
|
||
|
|
Delivered, // ✅ Existe mais non utilisé
|
||
|
|
Read,
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
⚠️ **Problème** : `Delivered` existe dans l'enum mais :
|
||
|
|
- `get_message_status()` retourne toujours `Sent` si pas de read receipt (ligne 230)
|
||
|
|
- Commentaire TODO : "Implémenter un système de tracking delivered si nécessaire"
|
||
|
|
|
||
|
|
### 2.2. Base de données
|
||
|
|
|
||
|
|
❌ **Table `delivered_status`** : **N'EXISTE PAS**
|
||
|
|
- Aucune migration trouvée pour cette table
|
||
|
|
- Seule table `read_receipts` existe pour les messages lus
|
||
|
|
|
||
|
|
### 2.3. Manager dédié
|
||
|
|
|
||
|
|
❌ **DeliveredStatusManager** : **N'EXISTE PAS**
|
||
|
|
- `ReadReceiptManager` gère uniquement les read receipts
|
||
|
|
- Pas de module `src/delivered_status.rs`
|
||
|
|
|
||
|
|
### 2.4. WebSocket Messages
|
||
|
|
|
||
|
|
❌ **IncomingMessage::Delivered** : **N'EXISTE PAS**
|
||
|
|
|
||
|
|
❌ **OutgoingMessage::MessageDelivered** : **N'EXISTE PAS**
|
||
|
|
|
||
|
|
### 2.5. Handler WebSocket
|
||
|
|
|
||
|
|
❌ **Pas de branchement pour Delivered** dans `handle_incoming_message()`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. PERMISSIONS — État actuel
|
||
|
|
|
||
|
|
✅ **PermissionService existe** (`src/security/permission.rs`) :
|
||
|
|
- `can_read_conversation(user_id, conversation_id)`
|
||
|
|
- `can_send_message(user_id, conversation_id)`
|
||
|
|
- `can_mark_read(user_id, conversation_id)`
|
||
|
|
|
||
|
|
✅ **Intégration dans handler** :
|
||
|
|
- `MarkAsRead` utilise déjà `can_mark_read()`
|
||
|
|
- `SendMessage` utilise déjà `can_send_message()`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. ARCHITECTURE ACTUELLE
|
||
|
|
|
||
|
|
### 4.1. WebSocketState
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct WebSocketState {
|
||
|
|
pub message_repo: Arc<MessageRepository>,
|
||
|
|
pub read_receipt_manager: Arc<ReadReceiptManager>,
|
||
|
|
pub ws_manager: Arc<WebSocketManager>,
|
||
|
|
pub jwt_manager: Arc<JwtManager>,
|
||
|
|
pub permission_service: Arc<PermissionService>,
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
❌ **TypingIndicatorManager manquant** dans `WebSocketState`
|
||
|
|
|
||
|
|
❌ **DeliveredStatusManager manquant** dans `WebSocketState`
|
||
|
|
|
||
|
|
### 4.2. Main.rs
|
||
|
|
|
||
|
|
- `ReadReceiptManager` est instancié (ligne 147)
|
||
|
|
- `PermissionService` est instancié (ligne 148)
|
||
|
|
- `TypingIndicatorManager` **n'est pas instancié**
|
||
|
|
- `DeliveredStatusManager` **n'existe pas encore**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. RÉSUMÉ DES MANQUES
|
||
|
|
|
||
|
|
### Typing Indicators
|
||
|
|
- ✅ Manager existe mais incomplet
|
||
|
|
- ❌ Pas de task de monitoring automatique
|
||
|
|
- ❌ Pas intégré dans WebSocketState
|
||
|
|
- ❌ Pas de messages WebSocket (Incoming/Outgoing)
|
||
|
|
- ❌ Pas de branchement dans handler
|
||
|
|
|
||
|
|
### Delivered Status
|
||
|
|
- ✅ Enum `Delivered` existe mais non utilisé
|
||
|
|
- ❌ Pas de table DB
|
||
|
|
- ❌ Pas de manager dédié
|
||
|
|
- ❌ Pas de messages WebSocket (Incoming/Outgoing)
|
||
|
|
- ❌ Pas de branchement dans handler
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. PLAN D'IMPLÉMENTATION
|
||
|
|
|
||
|
|
### Phase 1 : Infrastructure
|
||
|
|
1. Créer migration SQL pour `delivered_status`
|
||
|
|
2. Créer `src/delivered_status.rs` avec `DeliveredStatusManager`
|
||
|
|
3. Améliorer `TypingIndicatorManager` avec task de monitoring
|
||
|
|
|
||
|
|
### Phase 2 : WebSocket Messages
|
||
|
|
4. Ajouter `IncomingMessage::Typing` et `IncomingMessage::Delivered`
|
||
|
|
5. Ajouter `OutgoingMessage::UserTyping` et `OutgoingMessage::MessageDelivered`
|
||
|
|
|
||
|
|
### Phase 3 : Intégration
|
||
|
|
6. Ajouter managers dans `WebSocketState`
|
||
|
|
7. Brancher handlers dans `handle_incoming_message()`
|
||
|
|
8. Démarrer task de monitoring typing dans `main.rs`
|
||
|
|
|
||
|
|
### Phase 4 : Tests & Documentation
|
||
|
|
9. Tests unitaires
|
||
|
|
10. Tests d'intégration
|
||
|
|
11. Documentation complète
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Prochaine étape** : Implémentation selon le design cible.
|
||
|
|
|