# 🔍 Audit Initial - Message Search, History Pagination, and Offline Sync **Date**: 2025-12-05 **Objectif**: Analyser l'Ă©tat actuel avant implĂ©mentation des fonctionnalitĂ©s P1 --- ## 1. AUDIT DES FONCTIONNALITÉS EXISTANTES ### 1.1 Recherche de messages **❌ N'EXISTE PAS** - Aucune fonction dans `MessageRepository` pour rechercher des messages - Aucune route WebSocket ou REST pour la recherche - Aucun index de recherche textuelle sur la colonne `content` ### 1.2 Pagination de l'historique **⚠ PARTIELLEMENT EXISTANT** - `MessageRepository::get_conversation_messages()` existe mais : - Ne supporte que `LIMIT` (pas de cursors `before`/`after`) - Ne retourne pas `has_more_before`/`has_more_after` - Tri toujours `DESC` sans possibilitĂ© de tri `ASC` pour `after` - Aucune route WebSocket pour `FetchHistory` ### 1.3 Synchronisation hors ligne **❌ N'EXISTE PAS** - Aucune fonction pour rĂ©cupĂ©rer les messages depuis un timestamp - Aucune route WebSocket pour `SyncMessages` - Pas de mĂ©canisme pour tracker le dernier timestamp de sync --- ## 2. AUDIT DES INDEX SQL ### 2.1 Index existants sur `messages` ```sql -- Migration 001 idx_messages_conversation_id ON messages(conversation_id) idx_messages_sender_id ON messages(sender_id) idx_messages_created_at ON messages(created_at) -- Migration 005 idx_messages_deleted_at ON messages(deleted_at) WHERE deleted_at IS NOT NULL idx_messages_edited_at ON messages(edited_at) WHERE edited_at IS NOT NULL ``` ### 2.2 Index manquants (REQUIS) **❌ Index composite pour pagination** ```sql CREATE INDEX idx_messages_conv_created_at ON messages(conversation_id, created_at DESC); ``` **❌ Index GIN pour recherche textuelle** ```sql -- Option 1: Index GIN avec tsvector (recherche avancĂ©e) ALTER TABLE messages ADD COLUMN tsv tsvector; CREATE INDEX idx_messages_tsv ON messages USING GIN(tsv); -- Option 2: Index trigram pour recherche ILIKE (plus simple) CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX idx_messages_content_trgm ON messages USING GIN(content gin_trgm_ops); ``` --- ## 3. AUDIT DES CHAMPS DE TIMESTAMPS ### 3.1 Format stockĂ© dans la table `messages` - ✅ `edited_at`: `TIMESTAMP WITH TIME ZONE` (Option> en Rust) - ✅ `deleted_at`: `TIMESTAMP WITH TIME ZONE` (Option> en Rust) - ✅ `created_at`: `TIMESTAMP WITH TIME ZONE` (DateTime en Rust) - ✅ `updated_at`: `TIMESTAMP WITH TIME ZONE` (DateTime en Rust) ### 3.2 Format stockĂ© dans les tables sĂ©parĂ©es - ✅ `read_at`: Dans `read_receipts` table (Migration 003) - ✅ `delivered_at`: Dans `delivered_status` table (Migration 004) **Note**: Les statuts `read` et `delivered` sont dans des tables sĂ©parĂ©es, pas dans `messages`. Pour la sync offline, il faudra joindre ces tables ou les inclure dans la rĂ©ponse. --- ## 4. AUDIT DES TYPES WEBSOCKET ### 4.1 IncomingMessage (src/websocket/mod.rs) **Types existants**: - `SendMessage` - `JoinConversation` - `LeaveConversation` - `MarkAsRead` - `Typing` - `Delivered` - `EditMessage` - `DeleteMessage` - `Ping` **Types manquants**: - ❌ `FetchHistory` - ❌ `SearchMessages` - ❌ `SyncMessages` ### 4.2 OutgoingMessage (src/websocket/mod.rs) **Types existants**: - `NewMessage` - `MessageRead` - `MessageDelivered` - `UserTyping` - `MessageEdited` - `MessageDeleted` - `ActionConfirmed` - `Error` - `Pong` **Types manquants**: - ❌ `HistoryChunk` - ❌ `SearchResults` - ❌ `SyncChunk` --- ## 5. AUDIT DU REPOSITORY ### 5.1 MessageRepository (src/repository/message_repository.rs) **MĂ©thodes existantes**: - ✅ `create()` - CrĂ©er un message - ✅ `get_conversation_messages()` - RĂ©cupĂ©rer messages avec LIMIT - ✅ `get_by_id()` - RĂ©cupĂ©rer un message par ID - ✅ `update()` - Mettre Ă  jour un message - ✅ `delete()` - Soft delete un message - ✅ `get_by_id_including_deleted()` - RĂ©cupĂ©rer mĂȘme si supprimĂ© **MĂ©thodes manquantes**: - ❌ `fetch_history()` - Pagination avec before/after - ❌ `search_messages()` - Recherche textuelle - ❌ `fetch_since()` - Sync depuis timestamp --- ## 6. AUDIT DES PERMISSIONS ### 6.1 PermissionService (src/security/permission.rs) **MĂ©thodes existantes** (Ă  vĂ©rifier): - `can_send_message()` - `can_read_conversation()` - `can_join_conversation()` - `can_mark_read()` **MĂ©thodes nĂ©cessaires**: - ✅ Les mĂ©thodes existantes suffisent pour les nouvelles fonctionnalitĂ©s - La recherche nĂ©cessite `can_read_conversation()` - La pagination nĂ©cessite `can_read_conversation()` - La sync nĂ©cessite `can_read_conversation()` --- ## 7. RÉSUMÉ DES ACTIONS REQUISES ### 7.1 Migration SQL 1. ✅ CrĂ©er index composite `(conversation_id, created_at DESC)` 2. ✅ CrĂ©er index GIN pour recherche textuelle (tsvector ou trigram) 3. ✅ Ajouter colonne `tsv` si choix tsvector ### 7.2 Repository 1. ✅ ImplĂ©menter `fetch_history()` avec before/after 2. ✅ ImplĂ©menter `search_messages()` avec query 3. ✅ ImplĂ©menter `fetch_since()` avec timestamp ### 7.3 WebSocket 1. ✅ Ajouter `FetchHistory`, `SearchMessages`, `SyncMessages` dans `IncomingMessage` 2. ✅ Ajouter `HistoryChunk`, `SearchResults`, `SyncChunk` dans `OutgoingMessage` 3. ✅ ImplĂ©menter handlers dans `websocket/handler.rs` ### 7.4 Tests 1. ✅ Tests unitaires pour chaque mĂ©thode repository 2. ✅ Tests d'intĂ©gration pour les handlers WebSocket 3. ✅ Tests de permissions ### 7.5 Documentation 1. ✅ CrĂ©er `docs/CHAT_HISTORY_SEARCH_SYNC.md` 2. ✅ Mettre Ă  jour `TRIAGE.md` --- ## 8. DÉCISIONS TECHNIQUES ### 8.1 Recherche textuelle **Choix**: Commencer avec `ILIKE` (plus simple), possibilitĂ© d'upgrade vers `tsvector` plus tard. **Raison**: - Plus simple Ă  implĂ©menter - Pas besoin de trigger pour maintenir `tsv` - Suffisant pour la plupart des cas d'usage ### 8.2 Pagination **Choix**: Cursors basĂ©s sur `created_at` (timestamp). **Raison**: - Plus fiable que les offsets - Meilleure performance - Supporte les insertions concurrentes ### 8.3 Sync offline **Choix**: RĂ©cupĂ©rer tous les messages depuis `since`, inclure les updates (edited, deleted). **Raison**: - Permet une vraie synchronisation fiable - Compatible avec les statuts edited/deleted - NĂ©cessaire pour les clients mobiles --- **Fin de l'audit**