Coder Social home page Coder Social logo

api-cubosbank's Introduction

Desenvolvimento da API do Cubos Bank

No ambiente desafiador da Cubos Academy, a minha experiência no desenvolvimento da API para o Cubos Bank foi um marco significativo. Este projeto proporcionou a oportunidade de aprofundar conhecimentos em arquitetura RESTful, validação de dados e gerenciamento complexo de recursos.

Desafios Enfrentados

Estruturação da API
O início do projeto envolveu a definição da estrutura da API, alinhada aos princípios RESTful. Foi necessário criar endpoints claros e funcionais para gerenciar diversas operações bancárias, como listagem de contas, criação de novas contas, depósitos, saques e transferências.

Validação de Dados
A validação dos dados fornecidos pelos usuários era crucial para garantir segurança e integridade. Implementei técnicas rigorosas para assegurar que todos os dados fossem precisos e protegidos, minimizando vulnerabilidades e erros no processamento.

Persistência de Dados
Como os dados bancários precisam ser persistentes e seguros, trabalhei para garantir a integridade e consistência das informações armazenadas. A manipulação cuidadosa do banco de dados foi essencial para assegurar o correto registro e manutenção das transações e contas.

Organização do Código
Manter o código limpo e modular foi fundamental para enfrentar a complexidade do projeto. Adotei práticas recomendadas de arquitetura de software para facilitar a manutenção e a expansão futura da API.

Conclusão

A conclusão do desenvolvimento da API do Cubos Bank foi um desafio gratificante. A experiência não apenas ampliou meu conhecimento técnico sobre APIs, mas também destacou a importância da organização e segurança dos dados em um contexto financeiro.

Estou confiante de que a API desenvolvida atende aos mais altos padrões de qualidade e segurança, e estou pronto para os próximos desafios na minha jornada na Cubos Academy.

Especificações do Projeto:

Desafio | Back-end - Módulo 2

Você acabou de ser contratado pela melhor empresa de tecnologia do mundo: a CUBOS. Sua primeira tarefa como desenvolvedor é criar uma API para o banco digital Cubos Bank.
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:

  • Listagem de contas bancárias
  • Criar conta bancária
  • Atualizar os dados do usuário da conta bancária
  • Excluir uma conta bancária
  • Depositar 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 não encontrada"
}

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.

Estrutura do objeto no arquivo bancodedados.js

{
    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
    ],
}

IMPORTANTE: Este arquivo não pode ser alterado ou removido do projeto.
Portanto, a nomenclatura das propriedades banco, contas, saques, depositos, transferencias, assim como os valores atribuídos as propriedades nome, numero, agencia e senha não devem ser alterados.


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 servidor.js
    • Um arquivo de rotas
    • Uma 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.

// 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) = erro inesperado do servidor

Endpoints

Listar contas bancárias

GET /contas?senha_banco=123

Essa é a rota que será utilizada para listar todas as contas bancárias existentes.

  • Requisição

    Parâmetro do tipo query senha_banco.
    Não deverá possuir conteúdo no corpo (body) da requisição.

  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um array dos objetos (contas) encontradas.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Verificar se o parâmetro de query senha_banco foi informado na requisição
    • Validar se a senha informada confere com a senha do banco, que temos armazenada no arquivo bancodedados.js

Exemplo de requisição

// GET /contas?senha_banco=senha-do-banco
// Sem conteúdo no corpo (body) da requisição

Exemplos de resposta

// HTTP Status 200 / 201
// 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'
        }
    }
]

// HTTP Status 200 / 201
// nenhuma conta encontrada
[]

Criar conta bancária

POST /contas

Essa é a rota que será utilizada para criar uma conta bancária, onde será gerado um número único para identificação de cada conta.

  • Requisição

    Sem parâmetros de rota ou de query.
    O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):

    • nome
    • cpf
    • data_nascimento
    • telefone
    • email
    • senha
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade numero que deverá possuir o número gerado exclusivamente para a conta em questão criada, a propriedade saldo que deverá possuir valor inicial zerado e a propriedade usuario que deverá possuir as informações do usuário da conta.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Validar os campos obrigatórios:
      • nome
      • cpf
      • data_nascimento
      • telefone
      • email
      • senha
    • CPF deve ser um campo único.
    • E-mail deve ser um campo único.
    • Definir o saldo inicial da conta como 0
    • Criar uma nova conta cujo número seja único

Exemplo de requisição

// POST /contas
{
    "nome": "Foo Bar",
    "email": "[email protected]",
    "cpf": "00011122233",
    "data_nascimento": "15/03/2001",
    "telefone": "11999998888",
    "senha": "1234"
}

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao cadastrar
{
    numero:  "1",
    saldo: 0,
    usuario: {
        nome: "Foo Bar",
        cpf: "00011122233",
        data_nascimento: "2001-03-15",
        telefone: "11999998888",
        email: "[email protected]",
        senha: "1234"
    }
}

// HTTP Status 400, 404
// erro ao cadastrar
{
    mensagem: 'Mensagem de erro'
}

Atualizar usuário da conta bancária

PUT /contas/:numeroConta/usuario

Essa é a rota que será utilizada para atualizar os dados do usuário de uma conta bancária.

  • Requisição

    Parâmetro do tipo rota numeroConta.
    O corpo (body) deverá possuir um objeto contendo uma ou até mesmo todas as seguintes propriedades (respeitando estes nomes):

    -   nome
    -   cpf
    -   data_nascimento
    -   telefone
    -   email
    -   senha
    
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade mensagem que deverá possuir um texto informativo para orientar que os dados foram atualizados com sucesso.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Verificar se o parâmetro de rota numeroConta informado na requisição pertence a alguma conta
    • Verificar se foi passado, ao menos, uma propriedade no corpo (body) da requisição
    • 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;

Exemplos de requisição

// PUT /contas/1/usuario
// informando apenas um campo para atualizar
{
    "nome": "Bar Foo"
}

// informando todos os campos para atualizar
{
    "nome": "Bar Foo",
    "email": "[email protected]",
    "cpf": "33322211100",
    "data_nascimento": "03/05/2010",
    "telefone": "11988889999",
    "senha": "4321"
}

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao atualizar
{
  mensagem: "Conta atualizada com sucesso";
}

// HTTP Status 400, 404
// erro ao atualizar
{
  mensagem: "Mensagem de erro";
}

Excluir Conta

DELETE /contas/:numeroConta

Essa é a rota que será utilizada para excluir uma conta bancária existente.

  • Requisição

    Parâmetro do tipo rota numeroConta. Não deverá possuir conteúdo no corpo (body) da requisição.

  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade mensagem que deverá possuir um texto informativo para orientar que a conta foi excluída com sucesso. 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.

  • REQUISITOS OBRIGATÓRIOS

    • Verificar se o valor atribuído ao parâmetro de rota numeroConta informado na requisição pertence a alguma conta
    • Verificar se o saldo da conta bancária em questão é zero, pois, não será permitido excluir conta bancária que possua saldo em conta.
    • Remover a conta do objeto de persistência de dados.

Exemplo de requisição

// DELETE /contas/1
// Sem conteúdo no corpo (body) da requisição

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao excluir
{
  mensagem: "Conta excluída com sucesso";
}

// HTTP Status 400, 404
// erro ao excluir
{
  mensagem: "Mensagem de erro";
}

Depositar

POST /transacoes/depositar

Essa é a rota que será utilizada para somar o valor do depósito ao saldo de uma conta válida e registrar essa transação.

  • Requisição

    Sem parâmetros de rota ou de query
    O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):

    • numero_conta
    • valor
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade mensagem que deverá possuir um texto informativo para orientar que o depósito foi realizado com sucesso.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Validar os campos obrigatórios:
      • numero_conta
      • valor
    • Verificar se o valor atribuído a propriedade numero_conta informada no corpo da requisição pertence a alguma conta
    • Verificar se o valor atribuído a propriedade valor informada no corpo da requisição é negativo ou está zerado, pois, não serão permitidos depósitos com valores negativos ou zerados
    • Somar o valor de depósito ao saldo da conta encontrada

Exemplo de requisição

// POST /transacoes/depositar
{
    "numero_conta": "1",
    "valor": 10000
}

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao depositar
{
  mensagem: "Depósito realizado com sucesso";
}

// HTTP Status 400, 404
// erro ao depositar
{
  mensagem: "Mensagem de erro";
}

Exemplo do registro de um depósito

{
    data: "2021-08-10 23:40:35",
    numero_conta: "1",
    valor: 10000
}

Sacar

POST /transacoes/sacar

Essa é a rota que será utilizada para realizar o saque de um valor em uma determinada conta bancária e registrar essa transação.

  • Requisição

    Sem parâmetros de rota ou de query.
    O corpo (body) deverá possuir um objeto com as seguintes propriedades (respeitando estes nomes):

    • numero_conta
    • valor
    • senha
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade mensagem que deverá possuir um texto informativo para orientar que o saque foi realizado com sucesso.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Validar os campos obrigatórios:
      • numero_conta
      • valor
      • senha
    • Verificar se o valor atribuído a propriedade numero_conta informada no corpo da requisição pertence a alguma conta
    • Verificar se o valor atribuído a propriedade senha informada no corpo da requisição é uma senha válida para a conta informada
    • Verificar se o valor atribuído a propriedade valor informada no corpo da requisição é maior do que o saldo em conta, pois, não serão permitidos saques com valores superiores ao saldo em conta
    • Subtrair o valor sacado do saldo da conta encontrada

Exemplo de requisição

// POST /transacoes/sacar
{
    "numero_conta": "1",
    "valor": 10000,
    "senha": "1234"
}

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao sacar
{
  mensagem: "Saque realizado com sucesso";
}

// HTTP Status 400, 404
// erro ao sacar
{
  mensagem: "Mensagem de erro";
}

Exemplo do registro de um saque

{
    data: "2021-08-10 23:40:35",
    numero_conta: "1",
    valor: 10000
}

Transferir

POST /transacoes/transferir

Essa é a rota que será utilizada para para realizar a transferência de saldo de uma conta bancária para outra e registrar essa transação.

  • Requisição

    Sem parâmetros de rota ou de query.
    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, o corpo (body) da resposta deverá possuir um objeto com a propriedade mensagem que deverá possuir um texto informativo para orientar que a t ransferência foi realizada com sucesso.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Validar os campos obrigatórios:
      • numero_conta_origem
      • numero_conta_destino
      • valor
      • senha
    • Verificar se o valor atribuído a propriedade numero_conta_origem informada no corpo da requisição pertence a alguma conta
    • Verificar se o valor atribuído a propriedade numero_conta_destino informada no corpo da requisição pertence a alguma conta
    • Verificar se o valor atribuído a propriedade senha informada no corpo da requisição é uma senha válida para a conta de origem informada
    • Verificar se o valor atribuído a propriedade valor informada no corpo da requisição é maior do que o saldo existente na conta de origem, pois, não serão permitidas transferências com valores superiores ao saldo em conta
    • Subtrair o valor da transfência do saldo na conta de origem
    • Somar o valor da transferência no saldo da conta de destino

Exemplo de requisição

// POST /transacoes/transferir
{
    "numero_conta_origem": "1",
    "numero_conta_destino": "1",
    "valor": 10000,
    "senha": "1234"
}

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao transferir
{
  mensagem: "Transferência realizado com sucesso";
}

// HTTP Status 400, 404
// erro ao transferir
{
  mensagem: "Mensagem de erro";
}

Exemplo do registro de uma transferência

{
    data: "2021-08-10 23:40:35",
    numero_conta_origem: "1",
    numero_conta_destino: "2",
    valor: 10000
}

Consultar Saldo

GET /contas/saldo?numero_conta=123&senha=123

Essa é a rota que será utilizada para retornar o saldo de uma conta bancária.

  • Requisição

    Parâmetros do tipo query:

    • numero_conta.
    • senha.
      Não deverá possuir conteúdo no corpo (body) da requisição.
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade saldo que deverá possuir o saldo em conta.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Verificar se os parâmetros de query numero_conta e senha foram informados na requisição
    • Verificar se o valor atribuído a propriedade numero_conta informada através de parâmetro de query pertence a alguma conta
    • Verificar se o valor atribuído a propriedade senha informada através de parâmetro de query é uma senha válida para a conta informada
    • Exibir o saldo da conta bancária em questão

Exemplo de requisição

// GET /contas/saldo?numero_conta=numero-da-conta&senha=senha-da-conta
// Sem conteúdo no corpo (body) da requisição

Exemplos de resposta

// HTTP Status 200 / 201
// sucesso ao obter saldo
{
  saldo: 10000;
}

// HTTP Status 400, 404
// erro ao obter saldo
{
  mensagem: "Mensagem de erro";
}

Extrato

GET /contas/extrato?numero_conta=123&senha=123

Essa é a rota que será utilizada para listar as transações realizadas de uma conta específica.

  • Requisição

    Parâmetros do tipo query:

    • numero_conta.
    • senha.
      Não deverá possuir conteúdo no corpo (body) da requisição.
  • Resposta

    Em caso de sucesso, o corpo (body) da resposta deverá possuir um objeto com a propriedade saques que deverá possuir todos os saques vinculados a conta, a propriedade depositos que deverá possuir todos os depósitos vinculados a conta, a propriedade transferenciasEnviadas que deverá possuir todas as transferências enviadas desta conta e a propriedade transferenciasRecebidas que deverá possuir todas as transferências recebidas nesta conta.
    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.

  • REQUISITOS OBRIGATÓRIOS

    • Verificar se os parâmetros de query numero_conta e senha foram informados na requisição
    • Verificar se o valor atribuído a propriedade numero_conta informada através de parâmetro de query pertence a alguma conta
    • Verificar se o valor atribuído a propriedade senha informada através de parâmetro de query é uma senha válida para a conta informada
    • Retornar a lista de saques, depósitos, transferências enviadas e transferências recebidas da conta em questão.

Exemplo de requisição

// GET /contas/extrato?numero_conta=numero-da-conta&senha=senha-da-conta
// Sem conteúdo no corpo (body) da requisição

Exemplos de resposta

// HTTP Status 200
// sucesso ao obter extrato
{
  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
// erro ao obter extrato
{
    mensagem: 'Mensagem do erro!'
}

Aulas úteis:

LEMBRE-SE: é melhor feito do que perfeito!!!

tags: back-end módulo 2 nodeJS API REST desafio

api-cubosbank's People

Contributors

luanbarradas avatar jvpy avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.