Banco de dadosTables
dm_requests
Pedidos de DM entre não-amigos — caixa de "Solicitações" antes de virar conversa real.
Quando alguém que NÃO é seu amigo te manda uma DM pela primeira vez, o sistema cria um DM request em vez de criar conversa direta. Vai pra "Solicitações" do destinatário, que escolhe aceitar ou rejeitar.
Aceitar cria a conversa real (ou abre uma já existente) e seta conversation_id no request. Rejeitar marca status='rejected' e o sender não pode tentar de novo (a unique constraint impede).
Colunas
| Coluna | Tipo | Nullable | Default |
|---|---|---|---|
| id ● | uuid | NOT NULL | gen_random_uuid() |
| sender_id | uuid | NOT NULL | — |
| receiver_id | uuid | NOT NULL | — |
| status | enumcolumn | NOT NULL | pending |
| conversation_id | uuid | NULL ok | — |
| created_at | timestamp | NOT NULL | now() |
| updated_at | timestamp | NOT NULL | now() |
● primary key ◆ unique
Funcionalidade dos campos
id— UUID, PKsender_id— quem mandou. Cascade.receiver_id— quem recebeu. Cascade.status—pending | accepted | rejected. Imutável apósaccepted/rejected(decisão final).conversation_id— set quando aceitar (FK praconversations). Set null se conversa for deletada.created_at/updated_at— managed.
Foreign keys
| Coluna(s) | Referência | ON DELETE | ON UPDATE |
|---|---|---|---|
| sender_id | users.id | cascade | no action |
| receiver_id | users.id | cascade | no action |
| conversation_id | conversations.id | set null | no action |
Índices
| Nome | Único | Colunas | WHERE (parcial) |
|---|---|---|---|
| dm_requests_unique | sim | sender_id, receiver_id | — |
Unique dm_requests_unique em (sender_id, receiver_id) impede spam — se já existe request pendente OU rejected, novo INSERT falha. Aceito retorna 409 no controller (DUPLICATE_REQUEST).
Constraints
PRIMARY KEY (id)
Fluxo
[non-friend manda DM]
↓
INSERT dm_requests (status=pending)
↓
Notification 'dm_request_received' pro receiver
↓
Receiver vê em /chat/requests
↓
┌─────────────┴──────────────┐
[Accept] [Reject]
↓ ↓
Cria/abre conversation UPDATE status=rejected
Insere message original (sender não pode tentar de novo)
status=accepted
conversation_id setPadrões de uso
- Criar (auto) — disparado quando
sender(não-amigo) tentaPOST /chat/messagesdireto a um destinatário. Backend detecta a não-amizade e criadm_requestem vez de message direta. - Aceitar —
POST /chat/requests/:id/accept→ cria conversa + insere message original + atualiza status - Rejeitar —
POST /chat/requests/:id/reject
Tabelas relacionadas
users— sender + receiver (cascade)conversations— vinculada após aceitenotifications—dm_request_received