diff --git a/Autenticacao-e-Sessao.-.md b/Autenticacao-e-Sessao.-.md index edc6e2f..ce92a5a 100644 --- a/Autenticacao-e-Sessao.-.md +++ b/Autenticacao-e-Sessao.-.md @@ -53,7 +53,7 @@ O fragmento nao e enviado ao servidor HTTP. O frontend: 4. limpa a URL; 5. navega para `/home`. -## Armazenamento da sessao +## Armazenamento da sessao O frontend salva: @@ -62,23 +62,35 @@ sessionStorage.authToken sessionStorage.authUser ``` -Nao usa mais `localStorage` para token ou usuario. +Nao usa mais `localStorage` para token ou usuario. Motivo: - a sessao nao fica persistida apos fechar o navegador; - reduz risco de reaproveitar sessao antiga; -- evita mocks locais antigos de perfil. +- evita mocks locais antigos de perfil. + +## Validade do JWT + +Antes de considerar o usuario autenticado, o frontend decodifica o payload do JWT e valida o campo `exp`. + +Se o token estiver ausente, invalido ou expirado: + +- `authToken` e `authUser` sao removidos; +- a rota protegida redireciona para `/login`; +- chamadas API que retornam `401` tambem limpam a sessao. -## Bearer token +## Bearer token O arquivo `src/shared/services/authFetch.js` instala um interceptador global de `fetch`. -Para chamadas feitas contra `VITE_API_URL`, ele adiciona: +Para chamadas feitas contra `VITE_API_URL`, ele adiciona: ```http -Authorization: Bearer -``` +Authorization: Bearer +``` + +Se o backend responder `401`, o interceptador limpa a sessao e envia o usuario para `/login`. ## Logout diff --git a/Chat-e-WhatsApp.md b/Chat-e-WhatsApp.md index ec0cee2..5e08760 100644 --- a/Chat-e-WhatsApp.md +++ b/Chat-e-WhatsApp.md @@ -13,6 +13,14 @@ HTTP e usado para: - baixar midia; - consultar status. +As chamadas HTTP do chat ficam centralizadas em: + +```text +src/modules/chat/services/whatsappChatService.js +``` + +Esse service usa `src/shared/services/apiClient.js`, entao herda parse de resposta, tratamento padronizado de erro e Bearer Token via interceptor global. + Socket.IO e usado para: - receber QR Code; @@ -75,6 +83,26 @@ message O hook `useWhatsappSocket` armazena a ultima mensagem recebida para o chat atualizar a conversa. +## Hook de chat + +Arquivo: + +```text +src/modules/chat/hooks/useChat.js +``` + +Responsavel por: + +- normalizar chats e mensagens para a UI; +- manter conversa ativa, rascunho e anexos; +- aplicar permissao visual de fila/area/perfil; +- impedir resposta quando o atendimento nao esta assumido; +- impedir nova mensagem quando aguarda resposta do cliente; +- orquestrar assumir, liberar, fechar e transferir atendimento; +- hidratar midia sob demanda. + +O hook mantem regra de tela e estado local. A borda HTTP fica em `whatsappChatService.js`. + ## Observacao Mesmo com Socket.IO, as acoes sensiveis continuam acontecendo por HTTP protegido com Bearer token. diff --git a/Gerenciamento-de-Estado.md b/Gerenciamento-de-Estado.md index 6c0591a..20ef730 100644 --- a/Gerenciamento-de-Estado.md +++ b/Gerenciamento-de-Estado.md @@ -65,6 +65,30 @@ O modulo `management` usa estado local por tela/componente. Servicos em `src/modules/management/services` fazem a comunicacao com a API e retornam dados normalizados. +## Services HTTP + +Arquivo principal: + +```text +src/shared/services/apiClient.js +``` + +Responsavel por: + +- montar URL a partir de `VITE_API_URL`; +- aplicar `Content-Type: application/json` quando necessario; +- fazer parse de JSON/texto; +- padronizar mensagens de erro; +- preservar `status` e `payload` no erro. + +O Bearer Token nao fica espalhado pelos services. Ele e anexado pelo interceptor: + +```text +src/shared/services/authFetch.js +``` + +Quando a API retorna `401`, a sessao e limpa e o usuario volta para `/login`. + ## Diretriz Antes de adicionar uma ferramenta global de estado, prefira: diff --git a/Rotas-e-Protecao.md b/Rotas-e-Protecao.md index 652dbc3..31801a0 100644 --- a/Rotas-e-Protecao.md +++ b/Rotas-e-Protecao.md @@ -10,17 +10,17 @@ src/routes/router.jsx Rotas: -| Rota | Tela | Protegida | -|---|---|---| -| `/` | redireciona para `/login` | nao | -| `/login` | LoginPage | nao | -| `/home` | ProfileHomePage | sim | -| `/chat` | ChatPage | sim | -| `/call` | CallPage | sim | -| `/new-attendance` | AgentNewAttendancePage | sim | -| `/mass-message` | AgentMassMessagePage | sim | -| `/contacts` | ContactsPage | sim | -| `/admin/whatsapp` | WhatsappAdminPage | sim | +| Rota | Tela | Protegida | Perfis | +|---|---|---|---| +| `/` | redireciona para `/login` | nao | publico | +| `/login` | LoginPage | nao | publico | +| `/home` | ProfileHomePage | sim | autenticado | +| `/chat` | ChatPage | sim | autenticado | +| `/call` | CallPage | sim | autenticado | +| `/new-attendance` | AgentNewAttendancePage | sim | autenticado | +| `/mass-message` | AgentMassMessagePage | sim | autenticado | +| `/contacts` | ContactsPage | sim | autenticado | +| `/admin/whatsapp` | WhatsappAdminPage | sim | admin | ## ProtectedRoute @@ -33,7 +33,10 @@ src/routes/ProtectedRoute.jsx Responsabilidade: - verificar se existe `authToken` e `authUser` em `sessionStorage`; +- validar se o JWT ainda esta dentro do prazo pelo campo `exp`; - redirecionar para `/login` quando nao houver sessao; +- preservar a rota de origem em `state.from` para voltar apos login; +- redirecionar para `/home` quando a rota exigir um perfil que o usuario nao tem; - impedir que `/home` renderize telas mockadas sem login. ## Resolucao de perfil