Référence FT : FT343 (NENE2-FT/threadlog) — Système de commentaires en fil à deux niveaux avec suppression par tombstone (contenu remplacé par [deleted]), enforcement de profondeur de réponse, isolation scopée au post, et prévention de réponse à un commentaire supprimé, 14 tests / 40+ assertions PASS.
Ce guide montre comment construire un système de commentaires avec un niveau de réponses : les commentaires racine peuvent recevoir des réponses, mais les réponses ne peuvent pas être répondues (profondeur maximale = 1). Les commentaires supprimés sont tombstonés, préservant la structure du fil.
CREATE TABLE comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, post_id TEXT NOT NULL, -- identifiant opaque du post parent_id INTEGER REFERENCES comments(id), -- NULL = commentaire racine author TEXT NOT NULL, content TEXT NOT NULL, deleted INTEGER NOT NULL DEFAULT 0, deleted_at TEXT, created_at TEXT NOT NULL);
1 2 3 4 5 6 7 8 9 10
parent_id IS NULL = commentaire racine ; parent_id IS NOT NULL = réponse.
POST /posts/post-1/comments/1/replies{"author": "bob", "content": "My reply"}→ 201{ "id": 2, "parent_id": 1, "author": "bob", "content": "My reply"}// Répondre à une réponse est rejeté (la profondeur serait 2)POST /posts/post-1/comments/2/replies {"author": "charlie", "content": "Deep reply"}→ 409 // limite de profondeur dépassée// Répondre à un commentaire inexistantPOST /posts/post-1/comments/999/replies {"author": "bob", "content": "X"}→ 404// Répondre à un commentaire supprimé// (commentaire 1 déjà supprimé)POST /posts/post-1/comments/1/replies {"author": "bob", "content": "X"}→ 409 // impossible de répondre à un commentaire supprimé// Champs manquants → 422
public function canReceiveReply(int $commentId): bool{ $row = $this->findById($commentId); if ($row === null) { throw new CommentNotFoundException($commentId); } if ($row['deleted']) { throw new CommentDeletedException($commentId); } // Seuls les commentaires racines (parent_id = null) peuvent avoir des réponses return $row['parent_id'] === null;}
1 2 3 4 5 6 7 8 9 10 11 12
Retourner 409 quand canReceiveReply() retourne false.
How-to : API de commentaires en fil
Ce guide montre comment construire un système de commentaires avec un niveau de réponses : les commentaires racine peuvent recevoir des réponses, mais les réponses ne peuvent pas être répondues (profondeur maximale = 1). Les commentaires supprimés sont tombstonés, préservant la structure du fil.
Schéma
2
3
4
5
6
7
8
9
10
parent_id IS NULL= commentaire racine ;parent_id IS NOT NULL= réponse.Endpoints
POST/posts/{postId}/commentsGET/posts/{postId}/commentsGET/posts/{postId}/comments/{id}POST/posts/{postId}/comments/{id}/repliesDELETE/posts/{postId}/comments/{id}Créer un commentaire racine
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Lister les commentaires
2
3
4
5
6
7
8
9
10
11
12
13
14
Les commentaires sont scopés à
post_id. Les commentaires depost-1n'apparaissent jamais dans la liste depost-2.Obtenir un commentaire unique
2
3
4
5
6
7
8
9
10
11
12
Ajouter une réponse (profondeur max = 1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Implémentation de la vérification de profondeur
2
3
4
5
6
7
8
9
10
11
12
Retourner 409 quand
canReceiveReply()retourne false.Suppression par tombstone
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Le tombstoning préserve la structure du fil. Les réponses restent visibles même après la suppression du parent.
2
3
4
5
6
7
SQL de tombstone
2
3
4
5
Ce qu'il ne faut PAS faire
detailclair est mieuxpost_iddans les requêtes