Adicionado doc pós refatoração
parent
1c1335a005
commit
abb90be652
@ -70,6 +70,16 @@ Motivo:
|
|||||||
- reduz risco de reaproveitar sessao antiga;
|
- 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`.
|
O arquivo `src/shared/services/authFetch.js` instala um interceptador global de `fetch`.
|
||||||
@ -80,6 +90,8 @@ Para chamadas feitas contra `VITE_API_URL`, ele adiciona:
|
|||||||
Authorization: Bearer <token>
|
Authorization: Bearer <token>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Se o backend responder `401`, o interceptador limpa a sessao e envia o usuario para `/login`.
|
||||||
|
|
||||||
## Logout
|
## Logout
|
||||||
|
|
||||||
O logout chama `clearSession()`, removendo:
|
O logout chama `clearSession()`, removendo:
|
||||||
|
|||||||
@ -13,6 +13,14 @@ HTTP e usado para:
|
|||||||
- baixar midia;
|
- baixar midia;
|
||||||
- consultar status.
|
- 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:
|
Socket.IO e usado para:
|
||||||
|
|
||||||
- receber QR Code;
|
- receber QR Code;
|
||||||
@ -75,6 +83,26 @@ message
|
|||||||
|
|
||||||
O hook `useWhatsappSocket` armazena a ultima mensagem recebida para o chat atualizar a conversa.
|
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
|
## Observacao
|
||||||
|
|
||||||
Mesmo com Socket.IO, as acoes sensiveis continuam acontecendo por HTTP protegido com Bearer token.
|
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.
|
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
|
## Diretriz
|
||||||
|
|
||||||
Antes de adicionar uma ferramenta global de estado, prefira:
|
Antes de adicionar uma ferramenta global de estado, prefira:
|
||||||
|
|||||||
@ -10,17 +10,17 @@ src/routes/router.jsx
|
|||||||
|
|
||||||
Rotas:
|
Rotas:
|
||||||
|
|
||||||
| Rota | Tela | Protegida |
|
| Rota | Tela | Protegida | Perfis |
|
||||||
|---|---|---|
|
|---|---|---|---|
|
||||||
| `/` | redireciona para `/login` | nao |
|
| `/` | redireciona para `/login` | nao | publico |
|
||||||
| `/login` | LoginPage | nao |
|
| `/login` | LoginPage | nao | publico |
|
||||||
| `/home` | ProfileHomePage | sim |
|
| `/home` | ProfileHomePage | sim | autenticado |
|
||||||
| `/chat` | ChatPage | sim |
|
| `/chat` | ChatPage | sim | autenticado |
|
||||||
| `/call` | CallPage | sim |
|
| `/call` | CallPage | sim | autenticado |
|
||||||
| `/new-attendance` | AgentNewAttendancePage | sim |
|
| `/new-attendance` | AgentNewAttendancePage | sim | autenticado |
|
||||||
| `/mass-message` | AgentMassMessagePage | sim |
|
| `/mass-message` | AgentMassMessagePage | sim | autenticado |
|
||||||
| `/contacts` | ContactsPage | sim |
|
| `/contacts` | ContactsPage | sim | autenticado |
|
||||||
| `/admin/whatsapp` | WhatsappAdminPage | sim |
|
| `/admin/whatsapp` | WhatsappAdminPage | sim | admin |
|
||||||
|
|
||||||
## ProtectedRoute
|
## ProtectedRoute
|
||||||
|
|
||||||
@ -33,7 +33,10 @@ src/routes/ProtectedRoute.jsx
|
|||||||
Responsabilidade:
|
Responsabilidade:
|
||||||
|
|
||||||
- verificar se existe `authToken` e `authUser` em `sessionStorage`;
|
- 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;
|
- 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.
|
- impedir que `/home` renderize telas mockadas sem login.
|
||||||
|
|
||||||
## Resolucao de perfil
|
## Resolucao de perfil
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user