http://localhost:8080/swagger-ui/index.html
Post de usuario:
curl -X POST http://localhost:8080/api/auth/register \ -H "Content-Type: application/json" \ -d '{"username":"testuser","password":"password123"}'
//Output: Usuario registrado com sucesso!
Login de usuario retornando o token JWT
curl -X POST http://localhost:8080/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"testuser","password":"password123"}'
//Output: TOKEN JWT
O principal objetivo deste pequeno projeto foi que eu podesse consolidar meu aprendizados em jwt, swagger e rabbitMQ, então criei um projeto onde tem um User, e ele pode enviar mensagens, quando ele faz login, ele recebe um token JWT, e precisa da mesma para que ele possa enviar uma mensagem e tal
O usuário envia uma requisição de registro para /api/auth/register com username e password O AuthController recebe a requisição e repassa para o AuthService O AuthService verifica se o username já existe no banco através do UserRepository Se não existir, o AuthService criptografa a senha usando o PasswordEncoder O novo usuário é salvo no banco de dados com a senha criptografada O AuthController retorna uma resposta de sucesso ao cliente O usuário envia uma requisição de login para /api/auth/login com username e password O AuthController repassa para o AuthService O AuthService usa o AuthenticationManager para autenticar o usuário Se as credenciais estiverem corretas, o JwtService gera um token JWT O token JWT é retornado ao cliente na resposta
O cliente envia uma requisição para um endpoint protegido (ex: /api/messages) incluindo o token JWT no cabeçalho Authorization: Bearer [token] O JwtAuthFilter intercepta a requisição antes que chegue ao controller O filtro extrai o token do cabeçalho da requisição O JwtService valida o token e extrai o username O UserDetailsService carrega os detalhes do usuário através do username O JwtService verifica se o token é válido para esse usuário Se for válido, cria um objeto Authentication e define no SecurityContext A requisição continua seu fluxo normal até o controller apropriado
O usuário autenticado envia uma requisição POST para /api/messages com o conteúdo da mensagem O MessageController recebe a requisição e repassa para o MessageService O MessageService extrai o usuário autenticado do SecurityContext Uma nova instância de Message é criada com o conteúdo, timestamp e usuário A mensagem é salva no banco de dados através do MessageRepository A mensagem é enviada ao RabbitMQ através do RabbitMQService O RabbitMQService utiliza o RabbitTemplate para enviar a mensagem para a exchange configurada A exchange roteia a mensagem para a fila (queue) correspondente O MessageController retorna a mensagem criada ao cliente
O método anotado com @RabbitListener no MessageService escuta a fila de mensagens Quando uma nova mensagem chega à fila, o listener é acionado O listener processa a mensagem (neste exemplo, apenas loga no console) O processamento ocorre de forma assíncrona, independente da requisição HTTP original
O usuário autenticado envia uma requisição GET para /api/messages O MessageController recebe a requisição e repassa para o MessageService O MessageService usa o MessageRepository para buscar todas as mensagens As mensagens são retornadas ao cliente na resposta
Fluxo da Documentação Swagger
O usuário acessa a URL /swagger-ui.html no navegador O OpenApiConfig fornece as configurações e metadados da API O Swagger UI é renderizado com base nas anotações dos controllers O usuário pode visualizar e testar os endpoints diretamente pela interface
Este fluxo ilustra como as diferentes partes da aplicação interagem entre si, desde a autenticação até o processamento assíncrono de mensagens via RabbitMQ.