Um projeto, destinado à aprendizagem pessoal, que implementa CRUD, Login e Token JWT com o objetivo de criar uma API REST HATEOAS robusta para organizar e rastrear gastos.
Durante o projeto, segui padrões para organizar commits através da especificação Conventional Commits e criei um padronizamento das pastas voltadas à seção de testes.
- Java
- Maven
- Intellij IDEA
- Springboot
- JUnit
- Mockito
- PostgreSQL
- JWT
O projeto segue o padrão REST: implementa HATEOAS e não armazena o estado do cliente. É dividido nas seguintes camadas:
- Domain: responsável pelo ORM e pelos DTOs.
- Controller: responsável pelo processamento de requisições e contém o assembler, usado para montar as respostas HTTP.
- Service: responsável pela regra de negócio e contém o mapper, necessário para abstrair dtos em models e transformar models em dtos.
- Repositório: responsável pela comunicação com o banco de dados.
- Security: Responsável pela segurança da API, implementando filtros, tokens JWT, autorização e autenticação.
Os filtros e as configurações de autenticação e autorização foram configurados através do SecurityConfiguration. Os filtros atuam em endpoints correspondentes.
O caminho percorrido pela requisição é composto pelo controller, diversos serviços, incluindo a implementação do UserDetailsService, e repositório.
O caminho percorrido pela requisição é composto pelo controller, serviço e repositório.
Grande parte das exeções lançadas são tratadas pelo GlobalControllerExceptionHandler. Entretanto, exeções que acontecem em nível de segurança, como as relacionadas a verificação de tokens, são tratadas pelos filtros auth e refresh.
Cadastre um usuário inserindo email e password (json). Retorna código 200 (Ok). Logue inserindo email e password (json). Retorna código 200 (Ok), tokens de autenticação, usados para fazer request, e tokens de refresh, usados para criar um novo token de autenticação. Crie um novo token de autenticação utilizando o token refresh no header como um bearer token. Retorna 200 (Ok) e um novo token de autenticação.Os seguintes endpoints requerem o token de autenticação no header como um bearer token.
Crie um novo item, inserindo amount, name e o ENUM category, no body. Retorna código 200 (Ok), o item criado e links HATEOAS.Valores válidos para category: "GROCERIES", "LEISURE", "ELECTRONICS", "UTILITIES", "CLOTHING", "HEALTH", "OTHERS".
Pega um item, inserindo seu id como um parâmetro de URL. Retorna código 200 (Ok), o item desejado e links HATEOAS. Pega todos os items, sem a necessidade de um body ou um id. Retorna código 200 (Ok), todos items criados e links HATEOAS. Atualiza a informação de um item, inserindo amount, name e o ENUM category, no body e, id, do item desejado, como parâmetro de URL. Retorna código 200 (Ok), o item desejado com as informações atualizadas e links HATEOAS. Deleta item, inserindo seu id como um parâmetro de URL. Retorna código 204 (No Content)- Java 21
- PostgreSQL
- Download do .jar do projeto
- Inicialize o servidor PostgreSQL.
- Crie um DB chamado "tracker".
- Abra o terminal numa pasta contendo o projeto.
- Configure as seguintes variaveis do ambiente: DB_USERNAME, DB_PASSWORD, DB_URL, DB_PORT e SALT.
- Use o comando "java -jar your-application.jar" para iniciar o projeto.
Pronto! O projeto inicializará e você conseguirá interagir com ele mandando requisições HTTP através de aplicativos como Postman.
- Docker
- Download do projeto com docker
- Inicialize o docker.
- Abra o terminal numa pasta contendo o projeto.
- Use o comando 'docker-compose up'.
Pronto! O projeto inicializará e você conseguirá interagir com ele mandando requisições HTTP através de aplicativos como Postman.
Foi-se implementado testes de unidade, slice tests e testes de integração.
Arquivos de testes iniciam com o nome do arquivo original, e terminam em:
- "Tests" são testes de unidade.
- "TestsSlice" são slice tests.
- "TestsIntegration" são testes de integração. Então um arquivo chamado SimpleController, terá arquivo com nome SimpleControllerTest.
Os testes seguem a seguinte nomenclatura para seus nomes:
nomeOriginalDaFunção_EstadoAtual_ComportamentoDesejado
Então, quando testamos, com o objetivo de averiguar o "caminho feliz", a função receberItemQuebrado, esperamos que receba ItemQuebrado e retorne ItemConsertado. Logo o teste terá o seguinte nome:
_receberItemQuebrado_RecebeItemQuebrado_RetornaItemConsertado
Em testes que averiguamos os codigos de status HTTP retornados, adicionamos o resultado ao ComportamentoDesejado.
Foi-se divido em 3 pastas principais
- Slice, para slice tests.
- Unit, para testes de unidade.
- It, para testes de integração. Cada uma contém pastas replicando a estrutura de pastas do projeto, abrangendo somente as camadas que foram testadas.







