O Forum Alura é um projeto para o desafio Challenge ONE Back End, que consiste em criar uma API REST, usando Spring
com Java e JPA
com o Hibernate
, com o banco de dados MySQL
, aonde permite o usuário criar, mostrar, atualizar e deletar um tópico, ou seja, um CRUD.
A API REST contém os seguintes recursos:
- Criar um novo tópico
- Mostrar todos os tópicos criados
- Mostrar um tópico específico
- Atualizar um tópico
- Eliminar um tópico
E no final da implementação, a API terá as seguintes funcionalidades:
- API com rotas implementadas seguindo as melhores práticas do modelo REST;
- Validações realizadas seguindo as regras de negócio;
- Implementação de uma base de dados para a persistência da informação;
- Serviço de autenticação/autorização para restringir o acesso à informação usando JWT.
Antes de poder manipular os tópicos, é necessário gerar um JWT fornecendo um usuário e senha válidos como JSON no corpo da requisição:
POST /login
{
"usuario": "[email protected]",
"senha": "12345678"
}
Retorna um JWT Token
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBUEkgZm9ydW0uY29tIiwic3ViIjoidXN1YXJpb0BhZG1pbi5jb20iLCJleHAiOjE2ODc0NDE4MzJ9.U5OKCOiYquc_Cdhd5EQlNCP1EenkpskU0EZrGt0nFcM"
}
O token tem que ser passado no Cabeçalho/Header de todas as requisições, usando o Cabeçalho Authorization
, exemplo:
GET /topico
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJBUEkgZm9ydW0uY29tIiwic3ViIjoidXN1YXJpb0BhZG1pbi5jb20iLCJleHAiOjE2ODc0NDE4MzJ9.U5OKCOiYquc_Cdhd5EQlNCP1EenkpskU0EZrGt0nFcM
Por padrão, o token tem a duração de 2 horas.
GET /topico
status 200
Retorna uma página de tópico, mostrando apenas os 10 primeiros tópico em ordem de data de criação.
{
"content": [
{
"id": 3,
"titulo": "Test",
"mensagem": "Testando 1234566",
"autor": "Eu",
"curso": "nenhum",
"dataCriacao": "2023-06-19T12:47:24",
"estado": "ABERTO"
},
{
"id": 6,
"titulo": "Test",
"mensagem": "Testando 12345667",
"autor": "Eu",
"curso": "",
"dataCriacao": "2023-06-19T12:57:09",
"estado": "ABERTO"
},
...
{
"id": 25,
"titulo": "Test2",
"mensagem": "asdf",
"autor": "Euu",
"curso": "",
"dataCriacao": "2023-06-19T13:11:01",
"estado": "ABERTO"
}
],
"pageable": {
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"offset": 0,
"pageNumber": 0,
"pageSize": 10,
"paged": true,
"unpaged": false
},
"last": true,
"totalElements": 5,
"totalPages": 1,
"size": 10,
"number": 0,
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
"first": true,
"numberOfElements": 5,
"empty": false
}
É possível customizar como será o retorno dos tópicos, fornecendo parâmetros pela URL., por exemplo:
GET /topico?size=2
Mostrando apenas 2 tópicos.
{
"content": [
{
"id": 3,
"titulo": "Test",
"mensagem": "Testando 1234566",
"autor": "Eu",
"curso": "nenhum",
"dataCriacao": "2023-06-19T12:47:24",
"estado": "ABERTO"
},
{
"id": 6,
"titulo": "Test",
"mensagem": "Testando 12345667",
"autor": "Eu",
"curso": "",
"dataCriacao": "2023-06-19T12:57:09",
"estado": "ABERTO"
}
],
"pageable": {
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
...
}
GET /topico?page=1
Retornando a segunda página.
{
"content": [
{
"id": 7,
"titulo": "Test",
"mensagem": "",
"autor": "Eu",
"curso": "",
"dataCriacao": "2023-06-19T12:58:55",
"estado": "ABERTO"
},
{
"id": 15,
"titulo": "Test",
"mensagem": "asdf",
"autor": "Euu",
"curso": "",
"dataCriacao": "2023-06-19T13:01:46",
"estado": "ABERTO"
}
],
"pageable": {
"sort": {
"empty": false,
"sorted": true,
"unsorted": false
},
...
GET /topico/{id}
status 200
Retorna o tópico pelo id.
{
"id": 7,
"titulo": "Test",
"mensagem": "",
"autor": "Eu",
"curso": "",
"dataCriacao": "2023-06-19T12:58:55",
"estado": "ABERTO"
}
POST /topico
status 201
Cria um novo tópico, sendo as chaves titulo
, mensagem
, autor
e curso
obrigatórios.
{
"titulo": "Test",
"mensagem": "Testando 123456",
"autor": "Eu",
"curso": "nenhum"
}
PUT /topico/{id}
status 200
Atualiza um tópico fornecido pelo id na URL, podendo atualizar o titulo, a mensagem ou o estado (podendo ser ABERTO ou FECHADO) do tópico, sendo todos eles opcionais.
{
"titulo": "Titulo atualizado"
}
DELETE /topico/{id}
status 204
Deleta o tópico fornecido pelo id na URL.
400
- Possível erro ao enviar o JSON como resposta, retornando uma mensagem de erro descrevendo o possível problema;403
- Acesso proibido, sendo o Token JWT inválido, expirado ou inexistente;404
- Não foi encontrado nenhum recurso no lado do servidor;5xx
- Erro no lado do servidor.
O projeto usa o Gradle para fazer a build, verifique se a sua IDE é compativel com o Gradle e faça a build.
Depois, inicie a classe ForumAluraApplication
.
- Adicionar um cadastro de usuário;
- Implementar sistema de respostas no tópico.
- Java 17;
- Spring Boot 3.1.0;
- Spring Security - fornece recursos e funcionalidades que facilitam a implementação de autenticação (autenticação de usuários) e autorização (controle de acesso) em aplicativos baseados em Spring;
- Lombok - Reduz boilerplate na criação de classes;
- Flyway - Controle de versão para o Banco de Dados;
- MySQL - Banco de dados SQL;
- Spring Boot Starter Data JPA - Interface usada para implementar o Mapeamento Objeto-Relacional (ORM);
- Bean Validation - Oferece anotações para validar os dados, reduzindo o boilerplate e garantindo a integridade dos dados;
- Java JWT 4.4.0 - Manipulação dos tokens JWT;