/exchangeAPI

API para criação de ordens de compra de moeda estrangeira

Primary LanguageJava

Exchange API 💰

🖇️ Sobre

A Exchange API é um projeto desenvolvido como parte do curso Back-end Java da Ada no módulo "Arquitetura de Software Ágil I".
A proposta é implementar uma API que permita ao cliente realizar a compra de moedas estrangeiras, como o dólar (USD) e o euro (EUR), de forma simples e eficiente.

📌 Funcionalidades principais

  • Cadastro de Clientes: Os clientes podem se cadastrar no sistema fornecendo informações essenciais, como nome, CPF, data de nascimento, estado civil e sexo. Após o cadastro bem-sucedido, o sistema gera um ID de cliente único para cada usuário. Além disso, é possível consultar um cliente por meio do seu CPF.

  • Registro de Ordem de Compra: Após o cadastro, os clientes podem registrar ordens de compra de moeda estrangeira. Cada ordem de compra inclui informações como CPF do cliente, tipo de moeda desejada (USD ou EUR), valor em moeda estrangeira e número da agência onde a retirada ocorrerá.

  • Cálculo da Cotação da Moeda: A API calcula o valor total com base na cotação da moeda, multiplicando-a pelo valor desejado de compra. Para isso, faz uma chamada à API externa economia.awesomeapi.com.br com a sigla da moeda desejada (USD ou EUR). Caso o cliente tente comprar outra moeda que não seja USD ou EUR, a API lançará uma exceção.

👨‍💻 Conhecimentos aplicados

  • Linguagem de Programação: Java
  • Framework: Spring Boot
  • Banco de Dados: PostgreSQL
  • Arquitetura: O projeto segue os princípios de SOLID e adota o padrão de arquitetura MVC (Model-View-Controller).
  • Metodologia de Desenvolvimento: Scrum
  • Gerenciamento do Projeto: Trello

⚙️ Como Executar

  1. Clone o repositório em uma pasta de preferência
git@github.com:nataliagiacobo/exchangeAPI.git
  1. Entre na pasta que você acabou de clonar e instale as dependências
mvn install
  1. Visualize a interface da API utilizando o Thunder Client, Postman, Insomnia ou outra plataforma de sua preferência

Acesso ao Swagger UI (Opcional)
Se preferir, você pode explorar e testar os endpoints da API acessando o Swagger UI.
Certifique-se de que o projeto esteja em execução e acesse a URL abaixo pelo seu navegador:
http://localhost:8080/swagger-ui/index.html#/

📚 Documentação (endpoints)

👩‍💻 Login

Autenticação (POST)
Método Funcionalidade URL
POST Realiza o login de um cliente cadastrado http://localhost:8080/login
A estrutura do body da requisição deverá seguir o padrão abaixo:
{
  "cpf": "String",
  "password": "String"
}
Um exemplo de resposta bem-sucedida com status 200 é:
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjp7ImlkIjo1LCJkaXNwbGF5TmFtZSI6InVzdWFyaW8gZGUgdGVzdGUiLCJlbWFpbCI6InRlc3RlQGVtYWlsLmNvbSIsImltYWdlIjoibnVsbCJ9LCJpYXQiOjE2MjAyNDQxODcsImV4cCI6MTYyMDY3NjE4N30.Roc4byj6mYakYqd9LTCozU1hd9k_Vw5IWKGL4hcCVG8"
}

❌  A requisição irá falhar se as informações do usuário estiverem incorretas ou não houver cadastro prévio.
O endpoint retornará um erro 401 com a mensagem: { "Authentication failed. Please check your login information and try again." }

👤 Customer

Cadastro (POST)
Método Funcionalidade URL
POST Realiza o cadastro do cliente no sistema http://localhost:8080/customer

⚠️   Os atributos "maritalStatus" e "sex" aceitam somente valores pré-estabelecidos

A estrutura do body da requisição deverá seguir o padrão abaixo:
{
  "name": "String",
  "cpf": "String", // 11 dígitos do CPF sem os separadores '12345678901'
  "birthDate": "Date", // Seguir o padrão 'YYYY-MM-DD'
  "maritalStatus": "MaritalStatus", // Valores possíveis: "SINGLE", "MARRIED", "DIVORCED", "WIDOWED"
  "sex": "Sex" // Valores possíveis: "MALE", "FEMALE", "OTHER"
  "password": "String"
}
Um exemplo de resposta bem-sucedida com status 200 é:
{
  "id": 1
}

❌  A requisição irá falhar se algum dos atributos não for preenchido corretamente ou esteja ausente.
O endpoint retornará um erro 400 com uma mensagem referente. Exemplo: { "Name is required" }

Consultas (GET)
Método Funcionalidade URL
GET Consulta todos os clientes cadastrados http://localhost:8080/customer
Um exemplo de resposta bem-sucedida com status 200 é:
   [
     {
       "id": 1,
      "name": "Ana",
      "birthDate": "1990-05-15",
      "maritalStatus": "MARRIED",
      "sex": "FEMALE"
     },
     // Outros clientes...
   ]
❌  A requisição irá falhar se não houver, pelo menos, um cliente cadastrado.
O endpoint retornará um erro 400 com a mensagem: { "You must save a new customer first" }

Método Funcionalidade URL
GET Realiza a consulta do cliente pelo seu cpf http://localhost:8080/customer/cpf/{cpf}
Um exemplo de resposta bem-sucedida com status 200 é:
{
  "id": 1,
  "name": "Ana",
  "birthDate": "1990-05-15",
  "maritalStatus": "MARRIED",
  "sex": "FEMALE"
}

❌  A requisição irá falhar se o CPF utilizado para consulta não estiver associado a nenhum cliente cadastrado.
O endpoint retornará um erro 404 com a mensagem: { "CPF not found" }

Atualização (PUT)
Método Funcionalidade URL
PUT Atualiza as informações de um cliente existente http://localhost:8080/customer/{id}

⚠️   Qualquer atributo pode ser atualizado, porém todos devem ser escritos, mesmo quando não houver alteração

A estrutura do body da requisição deve seguir o padrão do exemplo abaixo:
{
  "name": "Novo Nome da Cliente",
  "birthDate": "1990-05-15",
  "maritalStatus": "MARRIED",
  "sex": "FEMALE"
}
Um exemplo de resposta bem-sucedida com status 200 é:
{
  "id": 1,
  "name": "Maria",
  "birthDate": "1990-05-15",
  "maritalStatus": "MARRIED",
  "sex": "FEMALE"
}

❌   A requisição irá falhar se algum dos atributos não for preenchido corretamente ou esteja ausente.
O endpoint retornará um erro 400 com uma mensagem referente. Exemplo: { "Cpf is required" }

Exclusão (DELETE)
Método Funcionalidade URL
DELETE Remove um cliente existente http://localhost:8080/customer/{id}

-   Para deletar um cliente, especifique o id desejado na URL, conforme mostrado acima. Não é necessário incluir um corpo de requisição, pois a ação de exclusão é baseada no id fornecido.

❌  A requisição irá falhar se o ID não estiver associado a nenhum cliente cadastrado.
O endpoint retornará um erro 404

💱 Order

Cadastro (POST)
Método Funcionalidade URL
POST Realiza a ordem de compra da moeda desejada http://localhost:8080/order

⚠️   O atributo "currency" aceita somente valores pré-estabelecidos

A estrutura do body da requisição deverá seguir o padrão abaixo:
  {
    "cpf": "String",
    "currency": "String", // Valores possíveis: "USD" ou "EUR"
    "exchangeAmount": "BigDecimal",
    "bankBranch": "String"
  }
Um exemplo de resposta bem-sucedida com status 201 é:
  {
    "orderId": 1,
    "customerId": 1,
    "cpf": "43488428095",
    "currency": "EUR",
    "exchangeAmount": 100.0,
    "quotation": 6.5857,
    "operationCost": 658.57,
    "bankBranch": "7057"
    "orderTimestamp": "2021-08-27T16:11:23.866",
  }

❌  A requisição irá falhar se o campo "currency" não for um dos valores válidos ("USD" ou "EUR").
O endpoint retornará um erro 400 com a mensagem: { "Currency must be USD or EUR" }

Consulta (GET)
Método Funcionalidade URL
GET Realiza a consulta das ordens de compra pelo cpf do cliente http://localhost:8080/order/cpf/{cpf}
Um exemplo de resposta bem-sucedida com status 200 é:
{
  "id": 1,
  "name": "Ana",
  "birthDate": "1990-05-15",
  "maritalStatus": "MARRIED",
  "sex": "FEMALE"
}

❌  A requisição irá falhar se o CPF utilizado para consulta não estiver associado a nenhum cliente cadastrado.
O endpoint retornará um erro 404 com a mensagem: { "CPF not found" }


O desenvolvimento da Exchange API foi um esforço colaborativo realizado por Dayane, Juliana, Karen, Natalia, Raquel e Thaís.