Você acabou de ser contratado pela melhor empresa de tecnologia do mundo: a CUBOS. Sua primeira tarefa como desenvolvedor é criar uma API para um Banco Digital. Esse será um projeto piloto, ou seja, no futuro outras funcionalidades serão implementadas, portanto, dados do banco (nome, agência, etc.) serão imutáveis.
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: '[email protected]',
senha: '1234'
}
},
{
numero: "2",
saldo: 1000,
usuario: {
nome: 'Foo Bar 2',
cpf: '00011122234',
data_nascimento: '2021-03-15',
telefone: '71999998888',
email: '[email protected]',
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: '[email protected]',
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
- Dados usuário
- Número da conta
- Saldo
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!'
}
$ cd cubos-bank
$ npm i
$ npm run dev
LEMBRE-SE: é melhor feito do que perfeito!!!