diff options
| author | zwlucas <lucas.fariamo08@gmail.com> | 2026-07-25 21:23:29 +0000 |
|---|---|---|
| committer | zwlucas <lucas.fariamo08@gmail.com> | 2026-07-25 21:23:29 +0000 |
| commit | ef55d9bb24430610b60c1b77821307cd72c08c55 (patch) | |
| tree | e6935a810b34370b0a4c821e55f6397aac50c832 /GEMINI.md | |
| download | helpdesk-master.tar.gz helpdesk-master.zip | |
Signed-off-by: zwlucas <lucas.fariamo08@gmail.com>
Diffstat (limited to 'GEMINI.md')
| -rw-r--r-- | GEMINI.md | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..e2b6df7 --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,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']`. |