Skip to content

pedrogamedev/ExpenseTracker-API

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PT-BR

Visão Geral

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.

Tecnologias usadas

  • Java
  • Maven
  • Intellij IDEA
  • Springboot
  • JUnit
  • Mockito
  • PostgreSQL
  • JWT

Arquitetura

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.

Segurança

Os filtros e as configurações de autenticação e autorização foram configurados através do SecurityConfiguration. Os filtros atuam em endpoints correspondentes.

secfilter rep

Autenticação e Autorização

O caminho percorrido pela requisição é composto pelo controller, diversos serviços, incluindo a implementação do UserDetailsService, e repositório.

2

CRUD

O caminho percorrido pela requisição é composto pelo controller, serviço e repositório.

1

Tratamento de Exceções

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.

Demonstração

Autenticação e Autorização

Registro -> (POST) /auth/register
Cadastre um usuário inserindo email e password (json). Retorna código 200 (Ok).
Login -> (POST) /auth/login
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.
Refresh -> (POST) /auth/refresh
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.

CRUD

Os seguintes endpoints requerem o token de autenticação no header como um bearer token.

Criar item de gasto -> (POST) /api/tracker
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".

Pegar item -> (GET) /api/tracker
Pega um item, inserindo seu id como um parâmetro de URL. Retorna código 200 (Ok), o item desejado e links HATEOAS.
Pegar todos items -> (GET) /api/tracker/all
Pega todos os items, sem a necessidade de um body ou um id. Retorna código 200 (Ok), todos items criados e links HATEOAS.
Atualizar informação de item -> (PUT) /api/tracker
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.
Remoção de item -> (DELETE) /api/tracker
Deleta item, inserindo seu id como um parâmetro de URL. Retorna código 204 (No Content)

Como rodar:

Manualmente 💻

Pré-Requisitos
  • Java 21
  • PostgreSQL
  • Download do .jar do projeto
Passo a passo
  1. Inicialize o servidor PostgreSQL.
  2. Crie um DB chamado "tracker".
  3. Abra o terminal numa pasta contendo o projeto.
  4. Configure as seguintes variaveis do ambiente: DB_USERNAME, DB_PASSWORD, DB_URL, DB_PORT e SALT.
  5. 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 🐳

Pré-Requisitos
  • Docker
  • Download do projeto com docker
Passo a passo
  1. Inicialize o docker.
  2. Abra o terminal numa pasta contendo o projeto.
  3. 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.

Testes

Foi-se implementado testes de unidade, slice tests e testes de integração.

Nomenclatura

Arquivos

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.
Testes

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.

Arquitetura de diretórios

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.

About

JWT + Hateoas CRUD + PostgreSQl + Docker

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages