Comunicação, API e autenticação¶
Este documento registra como as partes do KeepUnB se comunicam no ambiente local, quais URLs são usadas durante o desenvolvimento, quais rotas principais compõem a API e como funciona o fluxo de autenticação com JWT.
Protocolos de comunicação¶
O KeepUnB é organizado como uma aplicação web com três camadas principais:
| Camada | Tecnologia | Comunicação |
|---|---|---|
| Frontend | Next.js / React | Envia requisições HTTP para a API |
| Backend | FastAPI / Python | Expõe endpoints REST e responde em JSON |
| Banco de dados | PostgreSQL | Acessado somente pelo backend via SQLAlchemy |
O frontend não acessa o banco de dados diretamente. Toda ação do usuário passa pela API do backend, que valida dados, aplica regras de negócio, consulta ou altera o PostgreSQL e devolve uma resposta para a interface.
As comunicações principais são:
| Origem | Destino | Protocolo/formato | Uso |
|---|---|---|---|
| Navegador | Frontend | HTTP local | Acesso à aplicação web |
| Frontend | Backend | HTTP + REST + JSON | Login, cadastro, chamados, técnicos e usuário atual |
| Frontend | Backend | HTTP + multipart/form-data | Criação de chamado com foto |
| Backend | Banco PostgreSQL | Conexão PostgreSQL via asyncpg/SQLAlchemy |
Persistência dos dados |
| Backend | Arquivos estáticos | HTTP | Servir uploads em /uploads |
Em ambiente local, as URLs usam http. A documentação de arquitetura descreve o uso de HTTPS para o cenário de produção ou implantação segura.
URLs locais¶
As URLs locais são definidas principalmente pelo docker-compose.yml e pelos arquivos .env.example.
| Serviço | URL local | Observação |
|---|---|---|
| Frontend | http://localhost:3000 |
Interface Next.js usada pelos perfis do sistema |
| Backend | http://localhost:8000 |
Aplicação FastAPI |
| Base da API | http://localhost:8000/api/v1 |
Valor padrão de NEXT_PUBLIC_API_URL |
| Swagger UI | http://localhost:8000/docs |
Documentação interativa da API |
| ReDoc | http://localhost:8000/redoc |
Documentação alternativa da API |
| Health check | http://localhost:8000/api/v1/health |
Verifica se o backend está respondendo |
| Uploads | http://localhost:8000/uploads/... |
Arquivos servidos pelo backend |
| PostgreSQL dev | localhost:5432 |
Banco principal do ambiente local |
| PostgreSQL teste | localhost:5433 |
Banco isolado para testes |
No frontend, quando NEXT_PUBLIC_API_URL não está definido, o cliente usa:
http://localhost:8000/api/v1
No backend, a conexão local via Docker usa o host interno db:
postgresql+asyncpg://keepunb:changeme@db:5432/keepunb_dev
Rotas principais da API¶
A API segue o prefixo /api/v1 para os recursos principais.
Autenticação¶
| Método | Rota | Acesso | Função |
|---|---|---|---|
POST |
/api/v1/auth/login |
Público | Recebe email e senha, valida credenciais e retorna um token JWT |
POST |
/api/v1/auth/register |
Público | Cadastra solicitantes e técnicos, conforme regras de validação |
Usuários¶
| Método | Rota | Acesso | Função |
|---|---|---|---|
GET |
/api/v1/users/me |
Usuário autenticado | Retorna os dados do usuário identificado pelo token |
Chamados¶
| Método | Rota | Acesso | Função |
|---|---|---|---|
POST |
/api/v1/tickets |
Solicitante | Cria um chamado; aceita JSON e também multipart/form-data com foto |
GET |
/api/v1/tickets/me |
Solicitante | Lista os chamados do solicitante logado |
GET |
/api/v1/tickets/open/others |
Solicitante | Lista chamados abertos por outros solicitantes |
GET |
/api/v1/tickets/open |
Gerente | Lista chamados abertos |
GET |
/api/v1/tickets/in-progress |
Gerente | Lista chamados em andamento |
GET |
/api/v1/tickets |
Gerente | Lista todos os chamados |
GET |
/api/v1/tickets/public |
Usuário autenticado | Lista chamados em formato público |
GET |
/api/v1/tickets/assigned-to-me |
Técnico | Lista chamados atribuídos ao técnico logado |
GET |
/api/v1/tickets/{ticket_id} |
Solicitante, técnico ou gerente | Retorna detalhes do chamado e histórico |
PATCH |
/api/v1/tickets/{ticket_id}/assign |
Gerente | Atribui um técnico ao chamado |
PATCH |
/api/v1/tickets/{ticket_id}/status |
Técnico | Atualiza o status de um chamado atribuído |
Técnicos¶
| Método | Rota | Acesso | Função |
|---|---|---|---|
GET |
/api/v1/technicians/available |
Gerente | Lista técnicos disponíveis |
GET |
/api/v1/technicians/pending |
Gerente ou administrador | Lista técnicos com cadastro pendente |
PATCH |
/api/v1/technicians/{id}/approve |
Gerente ou administrador | Aprova o cadastro de um técnico |
PATCH |
/api/v1/technicians/{id}/reject |
Gerente ou administrador | Reprova o cadastro de um técnico |
Comentários¶
| Método | Rota | Acesso | Função |
|---|---|---|---|
POST |
/api/v1/comments?ticket_id={id} |
Solicitante | Cria comentário em um chamado |
GET |
/api/v1/comments/me |
Solicitante | Lista comentários do usuário logado |
GET |
/api/v1/comments/user?target_user_id={matricula} |
Solicitante | Lista comentários de um usuário específico |
GET |
/api/v1/comments/ticket?ticket_id={id} |
Solicitante | Lista comentários de um chamado |
PATCH |
/api/v1/comments/{comment_id}/ocultar |
Administrador ou gerente | Oculta um comentário |
PATCH |
/api/v1/comments/{comment_id}/revelar |
Administrador ou gerente | Revela um comentário oculto |
Rotas consumidas pelo frontend que exigem atenção¶
O serviço de gerente no frontend também chama:
GET /api/v1/manager/dashboard-stats
Na estrutura de backend analisada, não há um roteador /api/v1/manager correspondente. Essa rota deve ser confirmada antes de ser tratada como contrato estável da API.
Fluxo de autenticação com JWT¶
O login do KeepUnB usa JWT com esquema Bearer.
- O usuário informa
emailesenhana tela de login. - O frontend envia
POST /api/v1/auth/loginpara a API. - O backend busca o usuário pelo e-mail.
- A senha enviada é comparada com o hash salvo usando
passlibebcrypt. - Se as credenciais forem válidas e a conta estiver apta a entrar, o backend cria um JWT.
- O JWT contém a matrícula do usuário no campo
sube uma data de expiração no campoexp. - O backend retorna:
{
"access_token": "token.jwt.assinado",
"token_type": "bearer"
}
- O frontend salva o token em
localStoragecom a chavekeepunb_token. - Em seguida, o frontend chama
GET /api/v1/users/mepara buscar os dados do usuário autenticado. - O frontend salva informações auxiliares em
localStorage, como perfil, e-mail, matrícula e nome. - As próximas requisições protegidas enviam o cabeçalho:
Authorization: Bearer token.jwt.assinado
- O backend decodifica o token com a
SECRET_KEY, lê osub, busca o usuário pela matrícula e valida se a conta está ativa. - Para rotas restritas por perfil, o backend aplica
require_role, permitindo apenas os papéis autorizados para aquela operação.
Papéis e autorização¶
O sistema trabalha com os seguintes papéis:
| Papel | Uso principal |
|---|---|
SOLICITANTE |
Cria chamados, acompanha seus chamados e consulta chamados públicos |
TECNICO |
Visualiza chamados atribuídos e atualiza status |
GERENTE |
Consulta filas, atribui técnicos e gerencia aprovações |
ADMIN |
Atua em operações administrativas, incluindo aprovação/reprovação de técnicos |
Quando uma rota exige autenticação e o token não é enviado, é inválido ou expirou, a API retorna 401 Unauthorized. Quando o token é válido, mas o perfil não tem permissão para a operação, a API retorna 403 Forbidden.
Observações de operação local¶
Para o login funcionar em ambiente local, o banco precisa ter as tabelas e os usuários esperados. O fluxo usual é:
docker compose up --build
docker compose exec backend alembic upgrade head
docker compose exec backend python scripts/seed_test_users.py
Depois disso, os usuários de teste podem ser usados conforme a seed do projeto.