Backend Go: - Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN. - Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError). - Sécurisation de config.go, CORS, statuts de santé et monitoring. - Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles). - Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés. - Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*. Chat server (Rust): - Refonte du pipeline JWT + sécurité, audit et rate limiting avancé. - Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing). - Nettoyage des panics, gestion d’erreurs robuste, logs structurés. - Migrations chat alignées sur le schéma UUID et nouvelles features. Stream server (Rust): - Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core. - Transactions P0 pour les jobs et segments, garanties d’atomicité. - Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION). Documentation & audits: - TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services. - Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3). - Scripts de reset et de cleanup pour la lab DB et la V1. Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
6.1 KiB
🔍 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
MessageRepositorypour 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 cursorsbefore/after) - Ne retourne pas
has_more_before/has_more_after - Tri toujours
DESCsans possibilité de triASCpourafter
- Ne supporte que
- 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
-- 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
CREATE INDEX idx_messages_conv_created_at
ON messages(conversation_id, created_at DESC);
❌ Index GIN pour recherche textuelle
-- 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<DateTime> en Rust) - ✅
deleted_at:TIMESTAMP WITH TIME ZONE(Option<DateTime> 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: Dansread_receiptstable (Migration 003) - ✅
delivered_at: Dansdelivered_statustable (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:
SendMessageJoinConversationLeaveConversationMarkAsReadTypingDeliveredEditMessageDeleteMessagePing
Types manquants:
- ❌
FetchHistory - ❌
SearchMessages - ❌
SyncMessages
4.2 OutgoingMessage (src/websocket/mod.rs)
Types existants:
NewMessageMessageReadMessageDeliveredUserTypingMessageEditedMessageDeletedActionConfirmedErrorPong
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
- ✅ Créer index composite
(conversation_id, created_at DESC) - ✅ Créer index GIN pour recherche textuelle (tsvector ou trigram)
- ✅ Ajouter colonne
tsvsi choix tsvector
7.2 Repository
- ✅ Implémenter
fetch_history()avec before/after - ✅ Implémenter
search_messages()avec query - ✅ Implémenter
fetch_since()avec timestamp
7.3 WebSocket
- ✅ Ajouter
FetchHistory,SearchMessages,SyncMessagesdansIncomingMessage - ✅ Ajouter
HistoryChunk,SearchResults,SyncChunkdansOutgoingMessage - ✅ Implémenter handlers dans
websocket/handler.rs
7.4 Tests
- ✅ Tests unitaires pour chaque méthode repository
- ✅ Tests d'intégration pour les handlers WebSocket
- ✅ Tests de permissions
7.5 Documentation
- ✅ Créer
docs/CHAT_HISTORY_SEARCH_SYNC.md - ✅ 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