blob: e2b6df7cfa0de4b264b0ab7eff538cfeb009a3be (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# Histórico de Contexto (Sessão Atual)
Este arquivo documenta as regras de negócio, correções e funcionalidades implementadas na última sessão, para que futuros agentes saibam exatamente o que foi feito no projeto (Helpdesk).
## 1. Regras de Negócio e UX (Interface)
- **Chat em Tempo Real**:
- Implementado Server-Sent Events (SSE) para atualização em tempo real de novos chamados, mudança de status e novas mensagens no chat.
- O `EventSource` no frontend envia o token de autenticação via *query string* (`?token=...`), e o backend (`auth.plugin.ts`) foi ajustado para validar esse token com o `@fastify/jwt` adequadamente.
- **Nomes Reais no Chat**: As mensagens na interface não exibem mais os placeholders "Agente #1". Elas mostram o nome real do autor da mensagem, baseado nos dados do banco (tabela `users`).
- **Dashboard e Cache**:
- Havia um bug onde o Dashboard não atualizava em tempo real porque o cache nativo do navegador para o `fetch` estava devolvendo respostas oxidadas.
- Isso foi resolvido adicionando `cache: 'no-store'` no cliente HTTP base em `web/src/lib/api.ts`.
## 2. Permissões e Visibilidade (Requesters vs Agents/Admins)
- **Zona de Perigo e Alteração de Status**:
- Solicitantes (`requesters`) NÃO veem a aba para alterar o status do chamado e NÃO veem a "Zona de Perigo" (deletar chamados).
- A opção de alterar o status de um chamado só aparece se o chamado já tiver um `assigneeId` (já tiver sido assumido por um agente).
- **Bloqueio de Chat**:
- Existe uma configuração de sistema (`system_settings.allowRequesterChat`) que pode ser alterada na aba de Configurações por admins.
- Se estiver desativada, a caixa de "Adicionar Resposta" fica escondida para os usuários com a role `requester`.
- Se o chamado for fechado ou resolvido, também ocorre um bloqueio automático no chat para os solicitantes.
## 3. Notas Internas no Chat
- **Segurança Reforçada**:
- Agentes podem enviar mensagens como "Notas Internas".
- A rota `GET /tickets/:id/comments` (`listCommentsHandler`) filtra comentários onde `isInternal === true` caso quem esteja fazendo a requisição seja um `requester`. Dessa forma, o backend jamais envia dados restritos para quem não deveria ver.
- Para que a comunicação funcione da equipe para o solicitante com o chat bloqueado, os agentes devem enviar suas mensagens com a opção "Nota Interna" **desmarcada**. Assim ela será classificada como pública e repassada via SSE ao solicitante.
---
**Nota para futuros agentes**:
Qualquer alteração na comunicação entre a API e o React Query precisa respeitar as tags de invalidação configuradas no webhook SSE (`useTicketEvents.ts`). Não use cache agressivo no frontend com o React Query, pois o SSE já gerencia a invalidação ativa de chaves como `['tickets']` e `['stats']`.
|