Desafio Módulo 2 - Back-end
Como entregar?
- Faça o fork desse repositório para o seu GitHub
- Clone o seu repositório em sua máquina
- Desenvolva seu projeto, fazendo commits a cada alteração e push
- Crie um PR (pull request)
- Envie o link do pull request que você criou na plataforma da Cubos
⚠️ Importante: Se o pull request não for criado e enviado na plataforma o feedback não será fornecido e constará como não entregue
Descrição do desafio
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
- Listar contas bancárias
- Atualizar os dados do usuário da conta bancária
- Excluir uma 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
Importante: Sempre que a validação de uma requisição falhar, responda com código de erro e mensagem adequada à situação, ok?
Exemplo:
// Quando é informado um número de conta que não existe:
// HTTP Status 404
{
"mensagem": "Conta bancária não encontada!"
}
Persistências dos dados
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.
bancodedados.js
Estrutura do objeto no arquivo {
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
],
}
Requisitos obrigatórios
- 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 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.
Status Code
Abaixo, listamos os possíveis status code esperados como resposta da API.
Obs.: A lista abaixo é para consulta, não significa que todos os status codes precisam necessariamente ser utilizados.
// 200 (OK) = requisição bem sucedida
// 201 (Created) = requisição bem sucedida e algo foi criado
// 204 (No Content) = requisição bem sucedida, sem conteúdo no corpo da resposta
// 400 (Bad Request) = o servidor não entendeu a requisição pois está com uma sintaxe/formato inválido
// 401 (Unauthorized) = o usuário não está autenticado (logado)
// 403 (Forbidden) = o usuário não tem permissão de acessar o recurso solicitado
// 404 (Not Found) = o servidor não pode encontrar o recurso solicitado
// 500 (Internal Server Error) = falhas causadas pelo servidor
Endpoints
Listar contas bancárias
GET
/contas?senha_banco=Cubos123Bank
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
-
Requisição - query params (respeitando este nome)
- senha_banco
-
Resposta
- listagem de todas as contas bancárias existentes
Exemplo de resposta
// HTTP Status 200 / 201 / 204
// 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
[]
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "A senha do banco informada é inválida!"
}
Criar conta bancária
POST
/contas
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
-
Requisição - O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):
- nome
- cpf
- data_nascimento
- telefone
- senha
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Requisição
// POST /contas
{
"nome": "Foo Bar 2",
"cpf": "00011122234",
"data_nascimento": "2021-03-15",
"telefone": "71999998888",
"email": "foo@bar2.com",
"senha": "12345"
}
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "Já existe uma conta com o cpf ou e-mail informado!"
}
Atualizar usuário da conta bancária
PUT
/contas/:numeroConta/usuario
Esse endpoint deverá atualizar apenas os dados do usuário de uma conta bancária.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se foi passado todos os campos 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 os dados do usuário de uma conta bancária
-
Requisição - O corpo (body) deverá possuir um objeto com todas as seguintes propriedades (respeitando estes nomes):
- nome
- cpf
- data_nascimento
- telefone
- senha
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Requisição
// PUT /contas/:numeroConta/usuario
{
"nome": "Foo Bar 3",
"cpf": "99911122234",
"data_nascimento": "2021-03-15",
"telefone": "71999998888",
"email": "foo@bar3.com",
"senha": "12345"
{
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "O CPF informado já existe cadastrado!"
}
Excluir Conta
DELETE
/contas/:numeroConta
Esse endpoint deve excluir uma conta bancária existente.
-
Você deverá, OBRIGATORIAMENTE:
- Verificar se o numero da conta passado como parametro na URL é válido
- Permitir excluir uma conta bancária apenas se o saldo for 0 (zero)
- Remover a conta do objeto de persistência de dados.
-
Requisição
- Numero da conta bancária (passado como parâmetro na rota)
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "A conta só pode ser removida se o saldo for zero!"
}
Depositar
POST
/transacoes/depositar
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
-
Requisição - O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):
- numero_conta
- valor
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Requisição
// POST /transacoes/depositar
{
"numero_conta": "1",
"valor": 1900
}
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "O número da conta e o valor são obrigatórios!"
}
Exemplo do registro de um depósito
{
"data": "2021-08-10 23:40:35",
"numero_conta": "1",
"valor": 10000
}
Sacar
POST
/transacoes/sacar
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
-
Requisição - O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):
- numero_conta
- valor
- senha
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Requisição
// POST /transacoes/sacar
{
"numero_conta": "1",
"valor": 1900,
"senha": "123456"
}
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "O valor não pode ser menor que zero!"
}
Exemplo do registro de um saque
{
"data": "2021-08-10 23:40:35",
"numero_conta": "1",
"valor": 10000
}
Tranferir
POST
/transacoes/transferir
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
-
Requisição - O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):
- numero_conta_origem
- numero_conta_destino
- valor
- senha
-
Resposta
Em caso de sucesso, não deveremos enviar conteúdo no corpo (body) da resposta.
Em caso de falha na validação, a resposta deverá possuir status code apropriado, e em seu corpo (body) deverá possuir um objeto com uma propriedade mensagem que deverá possuir como valor um texto explicando o motivo da falha.
Exemplo de Requisição
// POST /transacoes/transferir
{
"numero_conta_origem": "1",
"numero_conta_destino": "2",
"valor": 200,
"senha": "123456"
}
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
// Sem conteúdo no corpo (body) da resposta
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "Saldo insuficiente!"
}
Exemplo do registro de uma transferência
{
"data": "2021-08-10 23:40:35",
"numero_conta_origem": "1",
"numero_conta_destino": "2",
"valor": 10000
}
Saldo
GET
/contas/saldo?numero_conta=123&senha=123
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
-
Requisição - query params
- numero_conta
- senha
-
Resposta
- Saldo da conta
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
{
"saldo": 13000
}
// HTTP Status 400 / 401 / 403 / 404
{
"mensagem": "Conta bancária não encontada!"
}
Extrato
GET
/contas/extrato?numero_conta=123&senha=123
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.
-
Requisição - query params
- numero_conta
- senha
-
Resposta
- Relatório da conta
Exemplo de Resposta
// HTTP Status 200 / 201 / 204
{
"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 / 401 / 403 / 404
{
"mensagem": "Conta bancária não encontada!"
}
LEMBRE-SE: Feito é melhor do que perfeito, mas não faça mal feito!!!