# 🔍 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.

