Referência FT: FT343 (NENE2-FT/threadlog) — Sistema de comentários em thread de dois níveis com exclusão tombstone (conteúdo substituído por [deleted]), aplicação de profundidade de resposta, isolamento com escopo de postagem e prevenção de resposta a comentário excluído, 14 testes / 40+ assertivas PASS.
Este guia mostra como construir um sistema de comentários com um nível de respostas: comentários raiz podem receber respostas, mas respostas não podem ser respondidas (profundidade máxima = 1). Comentários excluídos são tombstoneados, preservando a estrutura do thread.
CREATE TABLE comments ( id INTEGER PRIMARY KEY AUTOINCREMENT, post_id TEXT NOT NULL, -- identificador opaco de postagem parent_id INTEGER REFERENCES comments(id), -- NULL = comentário raiz 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 = comentário raiz; parent_id IS NOT NULL = resposta.
public function canReceiveReply(int $commentId): bool{ $row = $this->findById($commentId); if ($row === null) { throw new CommentNotFoundException($commentId); } if ($row['deleted']) { throw new CommentDeletedException($commentId); } // Apenas comentários raiz (parent_id = null) podem ter respostas return $row['parent_id'] === null;}
1 2 3 4 5 6 7 8 9 10 11 12
Retornar 409 quando canReceiveReply() retornar false.
Como Fazer: API de Comentários em Thread
Este guia mostra como construir um sistema de comentários com um nível de respostas: comentários raiz podem receber respostas, mas respostas não podem ser respondidas (profundidade máxima = 1). Comentários excluídos são tombstoneados, preservando a estrutura do thread.
Schema
2
3
4
5
6
7
8
9
10
parent_id IS NULL= comentário raiz;parent_id IS NOT NULL= resposta.Endpoints
POST/posts/{postId}/commentsGET/posts/{postId}/commentsGET/posts/{postId}/comments/{id}POST/posts/{postId}/comments/{id}/repliesDELETE/posts/{postId}/comments/{id}Criar Comentário Raiz
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Listar Comentários
2
3
4
5
6
7
8
9
10
11
12
13
14
Comentários são escopados ao
post_id. Os comentários depost-1nunca aparecem na listagem depost-2.Obter Comentário Único
2
3
4
5
6
7
8
9
10
11
12
Adicionar Resposta (Profundidade Máxima = 1)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Implementação da Verificação de Profundidade
2
3
4
5
6
7
8
9
10
11
12
Retornar 409 quando
canReceiveReply()retornar false.Exclusão Tombstone
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Tombstoning preserva a estrutura do thread. As respostas permanecem visíveis mesmo após a exclusão do pai.
2
3
4
5
6
7
SQL de Tombstone
2
3
4
5
O Que NÃO Fazer
detailclaro é melhorpost_idnas queries