Desafio proposto pela Cubos Academy para a construção de uma API RESTful para um Banco Digital. A API possuí certas funcionalidades como listar conta, criar, atualizar e deletar. Também possuí operações bancárias como depositar, sacar, transferir, ver saldo e extrato. Fazer esse desafio foi de grande aprendizado e futuramente pretendo fazer mais melhorias nele como forma de medir minha evolução!
Seu papel é construir uma RESTful API que permita:
- Criar conta bancária
- Atualizar os dados do usuário da conta bancária
- Depósitar em uma conta bancária
- Sacar de uma conta bancária
- Transferir valores entre contas bancárias
- Consultar saldo da conta bancária
- Emitir extrato bancário
- Excluir uma conta bancária
- Sua API deve seguir o padrão REST
- Seu código deve estar organizado, delimitando as responsabilidades de cada arquivo adequadamente. Ou seja, é esperado que ele tenha, no mínimo:
- Um arquivo index.js
- Um arquivo servidor.js
- Um arquivo de rotas
- Um pasta com controladores
- Qualquer valor (dinheiro) deverá ser representado em centavos (Ex.: R$ 10,00 reais = 1000)
- Evite códigos duplicados. Antes de copiar e colar, pense se não faz sentido esse pedaço de código estar centralizado numa função.
Os dados serão persistidos em memória, no objeto existente dentro do arquivo bancodedados.js
. Todas as transações e contas bancárias deverão ser inseridas dentro deste objeto, seguindo a estrutura que já existe.
{
banco: {
nome: "Cubos Bank",
numero: "123",
agencia: "0001",
senha: "Cubos123Bank",
},
contas: [
// array de contas bancárias
],
saques: [
// array de saques
],
depositos: [
// array de depósitos
],
transferencias: [
// array de transferências
],
}
Abaixo, listamos os possíveis status code
esperados como resposta da API.
// 200 = requisição bem sucedida
// 201 = requisição bem sucedida e algo foi criado
// 400 = o servidor não entendeu a requisição pois está com uma sintaxe/formato inválido
// 404 = o servidor não pode encontrar o recurso solicitado
Esse endpoint deverá listar todas as contas bancárias existentes.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se a senha do banco foi informada (passado como query params na url)
- Validar se a senha do banco está correta
-
Entrada (query params)
- Senha do banco
-
Saída
- listagem de todas as contas bancárias existentes
// 2 contas encontradas
[
{
numero: "1",
saldo: 0,
usuario: {
nome: 'Foo Bar',
cpf: '00011122233',
data_nascimento: '2021-03-15',
telefone: '71999998888',
email: 'foo@bar.com',
senha: '1234'
}
},
{
numero: "2",
saldo: 1000,
usuario: {
nome: 'Foo Bar 2',
cpf: '00011122234',
data_nascimento: '2021-03-15',
telefone: '71999998888',
email: 'foo@bar2.com',
senha: '12345'
}
}
]
// nenhuma conta encontrada
[]
Esse endpoint deverá criar uma conta bancária, onde será gerado um número único para identificação da conta (número da conta).
-
Você deverá, OBRIGATORIAMENTE:
- Criar uma nova conta cujo número é único
- CPF deve ser um campo único.
- E-mail deve ser um campo único.
- Verificar se todos os campos foram informados (todos são obrigatórios)
- Definir o saldo inicial da conta como 0
-
Entradas
- Nome
- Cpf
- Data Nascimento
- Telefone
- Senha
-
Saída
- Dados usuário
- Número da conta
- Saldo
function criarConta(...) {
//
}
// HTTP Status 201
{
numero: "1",
saldo: 0,
usuario: {
nome: 'Foo Bar',
cpf: '00011122233',
data_nascimento: '2021-03-15',
telefone: '71999998888',
email: 'foo@bar.com',
senha: '1234'
}
}
// HTTP Status 400, 404
{
mensagem: 'Mensagem do erro!'
}
Esse endpoint deverá atualizar apenas os dados do usuário de uma conta bancária.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se foi passado, ao menos, um campo no body da requisição
- Verificar se o numero da conta passado como parametro na URL é válida
- Se o CPF for informado, verificar se já existe outro registro com o mesmo CPF
- Se o E-mail for informado, verificar se já existe outro registro com o mesmo E-mail
- Atualizar um ou mais campos dos dados do usuário de uma conta bancária
-
Entradas
- Nome
- Cpf
- Data Nascimento
- Telefone
- Senha
-
Saída
- Sucesso ou erro
function atualizarUsuarioConta(...) {
//
}
// HTTP Status 200
{
mensagem: "Conta atualizada com sucesso!"
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
Esse endpoint deve excluir uma conta bancária existente.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta passado como parametro na URL é válida
- Permitir excluir uma conta bancária apenas se o saldo for 0 (zero)
- Remover a conta do objeto de persistência de dados.
-
Entradas
- Numero da conta bancária (passado como parâmetro na rota)
-
Saida
- Sucesso ou erro
function excluirConta(...) {
//
}
// HTTP Status 200
{
mensagem: "Conta excluída com sucesso!"
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
Esse endpoint deverá somar o valor do depósito ao saldo de uma conta válida e registrar essa transação.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta e o valor do deposito foram informados no body
- Verificar se a conta bancária informada existe
- Não permitir depósitos com valores negativos ou zerados
- Somar o valor de depósito ao saldo da conta encontrada
-
Entrada
- Número da conta
- Valor
-
Saida
- Sucesso ou erro
function depositar(...) {
//
}
// HTTP Status 200
{
mensagem: "Depósito realizado com sucesso!"
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
{
data: "2021-08-10 23:40:35",
numero_conta: "1",
valor: 10000
}
Esse endpoint deverá realizar o saque de um valor em uma determinada conta bancária e registrar essa transação.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta, o valor do saque e a senha foram informados no body
- Verificar se a conta bancária informada existe
- Verificar se a senha informada é uma senha válida para a conta informada
- Verificar se há saldo disponível para saque
- Subtrair o valor sacado do saldo da conta encontrada
-
Entrada
- Número da conta
- Valor
- Senha
-
Saída
- Sucesso ou erro
function sacar(...) {
//
}
// HTTP Status 200
{
mensagem: "Saque realizado com sucesso!"
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
{
data: "2021-08-10 23:40:35",
numero_conta: "1",
valor: 10000
}
Esse endpoint deverá permitir a transferência de recursos (dinheiro) de uma conta bancária para outra e registrar essa transação.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o número da conta de origem, de destino, senha da conta de origem e valor da transferência foram informados no body
- Verificar se a conta bancária de origem informada existe
- Verificar se a conta bancária de destino informada existe
- Verificar se a senha informada é uma senha válida para a conta de origem informada
- Verificar se há saldo disponível na conta de origem para a transferência
- Subtrair o valor da transfência do saldo na conta de origem
- Somar o valor da transferência no saldo da conta de destino
-
Entrada
- Número da conta (origem)
- Senha da conta (origem)
- Valor
- Número da conta (destino)
-
Saída
- Sucesso ou erro
function tranferir(...) {
//
}
// HTTP Status 200
{
mensagem: "Transferência realizada com sucesso!"
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
{
data: "2021-08-10 23:40:35",
numero_conta_origem: "1",
numero_conta_destino: "2",
valor: 10000
}
Esse endpoint deverá retornar o saldo de uma conta bancária.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta e a senha foram informadas (passado como query params na url)
- Verificar se a conta bancária informada existe
- Verificar se a senha informada é uma senha válida
- Exibir o saldo da conta bancária em questão
-
Entrada (query params)
- Número da conta
- Senha
-
Saída
- Saldo da conta
function saldo(...) {
//
}
// HTTP Status 200
{
saldo: 13000
}
// HTTP Status 400, 404
{
mensagem: "Mensagem do erro!"
}
Esse endpoint deverá listar as transações realizadas de uma conta específica.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta e a senha foram informadas (passado como query params na url)
- Verificar se a conta bancária informada existe
- Verificar se a senha informada é uma senha válida
- Retornar a lista de transferências, depósitos e saques da conta em questão.
-
Entrada (query params)
- Número da conta
- Senha
-
Saída
- Relatório da conta
function extrato(...) {
//
}
// HTTP Status 200
{
depositos: [
{
data: "2021-08-18 20:46:03",
numero_conta: "1",
valor: 10000
},
{
data: "2021-08-18 20:46:06",
numero_conta: "1",
valor: 10000
}
],
saques: [
{
data: "2021-08-18 20:46:18",
numero_conta: "1",
valor: 1000
}
],
transferenciasEnviadas: [
{
data: "2021-08-18 20:47:10",
numero_conta_origem: "1",
numero_conta_destino: "2",
valor: 5000
}
],
transferenciasRecebidas: [
{
data: "2021-08-18 20:47:24",
numero_conta_origem: "2",
numero_conta_destino: "1",
valor: 2000
},
{
data: "2021-08-18 20:47:26",
numero_conta_origem: "2",
numero_conta_destino: "1",
valor: 2000
}
]
}
// HTTP Status 400, 404
{
mensagem: 'Mensagem do erro!'
}
LEMBRE-SE: é melhor feito do que perfeito!!!