HelloBank

Projeto final da capacitação If Black, Then Code (IBM & Gama Academy).

Sobre o Desafio

Criar uma aplicação para o banco fictício HelloBank, utilizando conhecimentos em Java, Banco de dados e AWS. O sistema deve permitir cadastro de novos clientes, incluindo dados pessoais e dados para contato, sendo que cada cliente registrado no sistema deve ser atrelado à respectiva conta bancária. Além disso, o sistema deve registrar histórico de transações entre as contas.

Equipe Black Eyed Devs

Amanda da Rocha Pitta
Amanda da Rocha Pitta

Cristhiane da Cruz
Cristhiane da Cruz

José Ricardo Pereira Junior
José Ricardo Pereira Junior

Marcus Vinicius Lameu Lima
Marcus Vinicius Lameu Lima

Natanael Queiroz
Natanael Queiroz

Thiago Conceição de Oliveira
Thiago Conceição de Oliveira

Walderney Oliveira Azevedo
Walderney Oliveira Azevedo

Wesner Souza Carvalho Filho
Wesner Souza Carvalho Filho

Tecnologias, Stacks e Ferramentas

  • Java
  • Maven
  • MySQL
  • Spring Framework (Spring Boot, Spring Data JPA)
  • Thymeleaf
  • HTML
  • CSS
  • Bootstrap
  • Jenkins
  • Docker
  • Deploy na AWS (EC2)
  • Metodologia Ágil Kanban
  • Trello (para organização, definição e controle de tarefas e prazos). Nosso workspace do Trello pode ser visto aqui.

Banco de dados

Clique aqui para visualizar o Script SQL.

Diagrama EER:

image

Como executar a aplicação

Antes de iniciar a aplicação, é necessário criar um banco de dados no MySQL chamado hellobank na porta 3306, no localhost. Configure seus usuário e senha no arquivo src\main\resources\application.properties, e execute os Scripts SQL para criação e população das tabelas. A seguir, torne os scripts shell executáveis com o comando chmod +x e execute a aplicação com o comando ./start.sh

Para visualizar o front-end da aplicação, basta digitar a seguinte URL no navegador: http://localhost:8080/hellobank/view/login

Os endpoints da API serão tratados nos tópicos a seguir.

Endpoints

A documentação completa dos Endpoints da aplicação podem ser visualizada aqui .

Classe Conta

A entidade Conta possui os seguintes atributos:

public class Conta {
    private Integer id;
    private TipoConta tipo;
    private Float saldo;
    private Cliente cliente;
    private Integer numeroConta;

Listar Contas

  • Verbo HTTP GET
  • Endpoint:
localhost:8080/conta/
  • Exemplo de Request:
curl --location --request GET 'localhost:8080/conta/'
  • Exemplo de response: HTTP Status 200 ok
[{"id":1,"tipo":{"codigo":1,"nome":"Corrente"},"saldo":200,"cliente":{"id":1,"nome":"Thiago Conceicao de Oliveira","contato":"21987894321","cpfCnpj":"63720145999","endereco":"Rua A, Bairro A, CidadeA1-J","email":"thiago@teste.com","senha":"369852147","novo":false},"numeroConta":7111111},{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":0,"cliente":{"id":2,"nome":"Amanda da Rocha Pitta","contato":"71987665321","cpfCnpj":"16553786194","endereco":"Rua B, Bairro B, CidadeB2-RJ","email":"amanda@teste.com","senha":"698521473","novo":false},"numeroConta":7122222},{"id":3,"tipo":{"codigo":3,"nome":"Universitaria"},"saldo":900,"cliente":{"id":3,"nome":"Walderney Oliveira Azevedo","contato":"98984354321","cpfCnpj":"14288772230","endereco":"Rua C, Bairro C CidadeC3-RJ","email":"walderney@teste.com","senha":"985214736","novo":false},"numeroConta":7133333}]

Cadastrar Conta

  • Verbo HTTP POST
  • Parâmetros:
    • Tipo
    • Saldo
    • ID Cliente
  • Endpoint:
localhost:8080/conta
  • Exemplo de request:

curl --location --request POST 'localhost:8080/conta' \
--data-raw '{"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":null,"cliente":{"id":1,"nome":"Thiago Conceicao de Oliveira","contato":"21987894321","cpfCnpj":"63720145999","endereco":"Rua A, Bairro A, CidadeA1-RJ","email":"thiago@teste.com","senha":"369852147"},"numeroConta":null}'
  • Exemplo de response: HTTP Status 200 ok
{"id":20,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":500,"cliente":{"id":1,"nome":"Thiago Conceicao de Oliveira","contato":"21987894321","cpfCnpj":"63720145999","endereco":"Rua A, Bairro A, CidadeA1-RJ","email":"thiago@teste.com","senha":"369852147","novo":false},"numeroConta":7176142}

Buscar conta bancária por número

  • Verbo HTTP GET
  • Endpoint:
localhost:8080/conta/{numeroConta}
  • Exemplo de request:
curl --location --request GET 'localhost:8080/conta/7123503'
  • Exemplo de response: HTTP Status 200 ok
{"id":19,"tipo":{"codigo":3,"nome":"Universitaria"},"saldo":737,"cliente":{"id":1,"novo":false},"numeroConta":7123503}

Excluir conta

  • Verbo HTTP DELETE
  • Endpoint:
localhost:8080/conta/{numeroConta}
  • Exemplo de request:
curl --location --request DELETE 'localhost:8080/conta/7130353'

Transferência

  • Verbo HTTP PUT
  • Parâmetros:
  • Endpoint:
localhost:8080/transferencia/{numeroContaOrigem}/{valor}/{numeroContaDestino}
  • Exemplo de request:
curl --location --request PUT 'localhost:8080/transferencia/7111111/300/7133333' \
--data-raw ''
  • Exemplo de response: HTTP Status 200 ok
{"id":1,"tipo":{"codigo":1,"nome":"Corrente"},"saldo":347,"cliente":{"id":1,"novo":false},"numeroConta":7111111}

Depósito

  • Verbo HTTP PUT
  • Endpoint
localhost:8080/depositar/{numeroConta}/{valor}
  • Exemplo de request:
curl --location --request PUT 'localhost:8080/depositar/45/7133333'
  • Exemplo de response: HTTP Status 200 ok
{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1675,"cliente":{"id":2,"novo":false},"numeroConta":7122222}

Extrato

  • Verbo HTTP POST
  • Endpoint
localhost:8080/extrato/{numeroConta}
  • Exemplo de request:
curl --location --request POST 'localhost:8080/extrato/7122222'
  • Exemplo de response: HTTP Status 200 ok
[{"id":2,"contaOrigem":{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1175,"cliente":{"id":2,"novo":false},"numeroConta":7122222},"contaDestino":null,"data":"2022-09-20","valor":200,"tipoTransacao":{"id":2,"nome":"Saque"}},{"id":9,"contaOrigem":{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1175,"cliente":{"id":2,"novo":false},"numeroConta":7122222},"contaDestino":{"id":1,"tipo":{"codigo":1,"nome":"Corrente"},"saldo":-190,"cliente":{"id":1,"novo":false},"numeroConta":7111111},"data":"2022-09-18","valor":50,"tipoTransacao":{"id":3,"nome":"Transferencia"}},{"id":11,"contaOrigem":{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1175,"cliente":{"id":2,"novo":false},"numeroConta":7122222},"contaDestino":{"id":1,"tipo":{"codigo":1,"nome":"Corrente"},"saldo":-190,"cliente":{"id":1,"novo":false},"numeroConta":7111111},"data":"2022-09-18","valor":65,"tipoTransacao":{"id":3,"nome":"Transferencia"}}]

Saque

  • Verbo HTTP GET
  • Endpoint
localhost:8080/saque/{numeroConta}/{valor}
  • Exemplo de request:
curl --location --request POST 'localhost:8080/saque/7133333/500' \
--data-raw ''
  • Exemplo de response: HTTP Status 200 ok
{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1175,"cliente":{"id":2,"novo":false},"numeroConta":7122222}

Classe Cliente

A entidade Cliente possui os seguintes atributos:

public class Cliente {
    private Integer id;
    private String nome;
    private String contato;
    private String cpfCnpj;
    private String endereco;
    private String email;
    private String senha;

Listar Clientes

  • Verbo HTTP GET
  • Endpoint
http://localhost:8080/cliente
  • Exemplo de request
curl --location --request GET 'http://localhost:8080/cliente'
  • Exemplo de response: HTTP Status 200 ok
[{"id":4,"nome":"Cristiane Barros Cruz","contato":"21987994321","cpfCnpj":"18188223425","endereco":"Rua D, Bairro D, CidadeD4-RJ","email":"cristiane@teste.com","senha":"852014369","novo":false},{"id":5,"nome":"Natanael Carvalho de Queiroz","contato":"71980054321","cpfCnpj":"16021023765","endereco":"Rua E, Bairro E, CidadeE5-RJ","email":"natanael@gteste.com","senha":"521473698","novo":false},{"id":6,"nome":"Marcus Vinicius Lameu Lima","contato":"71987074321","cpfCnpj":"16411146144","endereco":"Rua F, Bairro F, CidadeF6-RJ","email":"marcus@teste.com","senha":"214736985","novo":false}]

Cadastrar Cliente

  • Verbo HTTP POST
  • Parâmetros:
    • nome
    • contato
    • cpfCnpj
    • endereco
    • email
    • senha
  • Endpoint
http://localhost:8080/cliente
  • Exemplo de request:
curl --location --request POST 'http://localhost:8080/cliente' \
--data-raw '{
    "nome": "Tales Pereira",
    "contato": "21987894321",
    "cpfCnpj": "98778945612",
    "endereco": "Rua A, Bairro A, CidadeA1-RJ",
    "email": "tales@teste.com",
    "senha": "12345"
}'
  • Exemplo de response: HTTP Status 200 ok
{
  "id": 68,
  "nome": "Tales Pereira",
  "contato": "21987894321",
  "cpfCnpj": "98778945612",
  "endereco": "Rua A, Bairro A, CidadeA1-RJ",
  "email": "tales@teste.com",
  "senha": "12345",
  "novo": false
}

Atualizar Cliente

  • Verbo HTTP PUT
  • Parâmetros:
    • nome
    • contato
    • cpfCnpj
    • endereco
    • email
    • senha
  • Endpoint
localhost:8080/cliente
  • Exemplo de request
curl --location --request PUT 'http://localhost:8080/cliente' \
--data-raw '{
    "id": 68,
    "nome": "Tales Silva",
    "contato": "21987894321",
    "cpfCnpj": "98778945612",
    "endereco": "Rua A, Bairro A, CidadeA1-RJ",
    "email": "tales@teste.com",
    "senha": "12345",
    "novo": false
}'
  • Exemplo de response: HTTP Status 200 ok
{
  "id": 68,
  "nome": "Tales Silva Souza",
  "contato": "21987894321",
  "cpfCnpj": "98778945612",
  "endereco": "Rua A, Bairro A, CidadeA1-RJ",
  "email": "tales@email.com",
  "senha": "12345",
  "novo": false
}

Excluir Cliente

  • Verbo HTTP DELETE
  • Endpoint
localhost:8080/cliente/{id}
  • Exemplo de request
curl --location --request DELETE 'http://localhost:8080/cliente/68' \
--data-raw ''

Buscar Cliente por Id

  • Verbo HTTP GET
  • Endpoint
localhost:8080/cliente/{id}
  • Exemplo de request
curl --location --request GET 'http://localhost:8080/cliente/68'
  • Exemplo de response: HTTP Status 200 ok
{"id":68,"nome":"Tales Silva","contato":"21987894321","cpfCnpj":"98778945612","endereco":"Rua A, Bairro A, CidadeA1-RJ","email":"tales@teste.com","senha":"12345","novo":false}

Classe Transacao

A Classe Transacao possui os seguintes atributos:

public class Transacao {
    private Integer id;
    private Conta contaOrigem;
    private Conta contaDestino;
    private LocalDate data;
    private float valor;
    private TipoTransacao tipoTransacao;
 }

Listar Transacoes

  • Verbo HTTP GET
  • Endpoint
localhost:8080/transacao
  • Exemplo de request:
curl --location --request GET 'localhost:8080/transacao'
  • Exemplo de response: HTTP Status 200 ok
[
{"id":1,"contaOrigem":{"id":1,"tipo":{"codigo":1,"nome":"Corrente"},"saldo":347,"cliente":{"id":1,"novo":false},"numeroConta":7111111},"contaDestino":null,"data":"2022-09-19","valor":100,"tipoTransacao":{"id":1,"nome":"Deposito"}},
{"id":2,"contaOrigem":{"id":2,"tipo":{"codigo":2,"nome":"Poupanca"},"saldo":1175,"cliente":{"id":2,"novo":false},"numeroConta":7122222},"contaDestino":null,"data":"2022-09-20","valor":200,"tipoTransacao":{"id":2,"nome":"Saque"}},    
{"id":3,"contaOrigem":{"id":3,"tipo":{"codigo":3,"nome":"Universitaria"},"saldo":1740,"cliente":{"id":3,"novo":false},"numeroConta":7133333},"contaDestino":{"id":4,"tipo":{"codigo":4,"nome":"Salario"},"saldo":1763.7,"cliente":{"id":4,"novo":false},"numeroConta":7144444},"data":"2022-09-21","valor":300,"tipoTransacao":{"id":3,"nome":"Transferencia"}}  
]

Nova Transacao

  • Verbo HTTP POST
  • Parâmetros
    • ID Conta Drigem
    • Saldo
    • ID Conta Destino
    • Valor
    • ID Tipo Transacao

Classe TipoTransacao

Esta classe possui os seguintes atributos:

public class TipoTransacao {
private Integer id;
private String nome;
}

No Script SQL são criados três tipos de transação:

  • Depósito
  • Saque
  • Transferência

Classe TipoConta

Esta classe possui os seguintes atributos

public class TipoConta {
private Integer codigo;
private String nome;

Front-End - Prévia das telas da aplicação

Como usar: Com a aplicação em execução, basta acessar o seguinte endereço pelo navegador: http://localhost:8080/hellobank/view/login

Tela de Login

image

Formulário de Cadastro de Cliente

image

Tela inicial

image

Saldo

image

Extrato

image

Quanto não há transações registradas para a conta selecionada, essa informação é exibida na tela: image

Saque

image

Trânsferência

image

Cadastrar conta

image

Depósito

image

Formulário de atualização de cadastro de cliente

image