Adicionado doc pós refatoração
parent
1c1335a005
commit
abb90be652
@ -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 <token>
|
||||
```
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
Se o backend responder `401`, o interceptador limpa a sessao e envia o usuario para `/login`.
|
||||
|
||||
## Logout
|
||||
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user