Code Monkey home page Code Monkey logo

desafioxp's Introduction

Desafio Técnico - TurmaXP - Trybe

Resumo

Tendo como base o dia a dia da XP, foi desenvolvida a parte de back-end para um aplicativo de investimentos em ações. Por meio deste aplicativo, um cliente da XP é capaz de realizar seu login para comprar e vender ações, consultar sua carteira de ativos, realizar depósitos e saques em sua conta e consultar seu saldo.

Explicação da decisão na abordagem do desafio

  • Decidi fazer o projeto em JavaScript, por ser a linguagem que tenho mais familiaridade e também por ser adequada ao tipo de projeto. Para o token de autenticação foi utilizado o JWT (JSON Web Token). Para o banco de dados foi utilizado o MySQL. Foi construída uma base de dados com 3 clientes cadastrados, cada um com sua carteira de ativos e saldo em conta digital. Além disso, foi feita uma lista de ativos existentes, cada um com suas quantidades e preços disponíveis para compra e venda.

Link Postman

Run in Postman

Obs.:

Instruções de como compilar e executar o projeto

Execute os comandos na ordem em que seguem abaixo:

  1. docker-compose up -d Para inicializar os containers do docker.
  2. docker exec -it desafio_xp bash Para acesso ao terminal interativo do container criado pelo compose.
  3. npm install Para instalar as dependências.
  4. npm run restore Para restaurar o banco de dados.
  5. npm start Para executar o projeto.

Endpoints

  • POST (/login)
  • POST (/investimentos/comprar)
  • POST (/investimentos/vender)
  • GET (/ativos/{codCliente})
  • GET (/ativos/{codAtivo})
  • POST (/conta/deposito)
  • POST (/conta/saque)
  • GET (/conta/{codCliente})

Detalhes

Endpoint POST (/login)

  • Ao acessar este endpoint, o usuário deve ser capaz de realizar seu login e, assim, ter seu acesso autorizado aos demais endpoits.
  • O corpo da requisição deverá ter o seguinte formato:
    {
        "codCliente": 1,
        "senha": "Caroline"
    }
  • Caso o login seja realizado com sucesso, será retornado conforme abaixo. Obs. O token está sendo retornado para que seja possível copiá-lo para passar como o parâmetro authorization no Header do Postman nos demais endpoints. Desta forma, o usuário logado terá autorização para requisitar somente suas próprias informações:
    {
        "message": "Login realizado com sucesso.",
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjb2RDbGllbnRlIjoxLCJzZW5oYSI6IkNhcm9saW5lIiwiaWF0IjoxNjU4NDM0NzA5LCJleHAiOjE2NTg0Nzc5MDl9.3F9UCKVD-5tS4KocG7bfoSWv2DwDUem2TKbld-ZA16s"
    }
Possíveis retornos em caso de erro:
  • Caso usuário ou senha estejam incorretos, será retornado:
    {
        "message": "Usuário ou senha incorretos. Favor verificar seu dados."
    }

Endpoint POST (/investimentos/comprar)

  • Ao acessar este endpoint, o usuário poderá realizar a compra de um ativo.
  • O corpo da requisição deverá ter o seguinte formato:
    {
        "codCliente": 1,
        "codAtivo": "BBDC4",
        "qtdeAtivo": 5
    }
  • Caso a compra do ativo seja realizada com sucesso, o retorno será:
    {
        "message": "Ativo inserido com sucesso. Seu saldo atual é de ${saldo_atual}."
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição solicite informações de outro usuário, o retorno será:
    {
        "message": "Acesso negado."
    }
  • Caso o usuário tente comprar um ativo inexistente na base de ativos da XP, o retorno será:
    {
        "message": "Ativo não encontrado."
    }
  • Caso o usuário tente comprar uma quantidade maior do ativo que a existente, o retorno será:
    {
        "message": "Quantidade de ativo disponível menor que a desejada."
    }
  • Caso o usuário não tenha saldo suficiente para a compra da quantidade desejada do ativo, o retorno será:
    {
        "message": "Saldo insuficiente."
    }

Endpoint POST (/investimentos/vender)

  • Ao acessar este endpoint, o usuário poderá realizar a venda de um ativo.
  • O corpo da requisição deverá ter o seguinte formato:
    {
        "codCliente": 1,
        "codAtivo": "BBDC4",
        "qtdeAtivo": 5
    }
  • Caso a venda do ativo seja realizada com sucesso, o retorno será:
    {
        "message": "Ativo removido com sucesso. Seu saldo atual é de ${saldo_atual}."
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição solicite informações de outro usuário, o retorno será:
    {
        "message": "Acesso negado."
    }
  • Caso o usuário tente vender um ativo inexistente em sua carteira, o retorno será:
    {
        "message": "Ativo inexistente na carteira."
    }
  • Caso o usuário tente vender uma quantidade maior do ativo que a existente em sua carteira, o retorno será:
    {
        "message": "Quantidade de ativo disponível em carteira menor que a desejada para venda."
    }

Endpoint GET (/ativos/{codCliente})

  • Ao acessar este endpoint, o usuário poderá consultar sua carteira de ativos, com informações de quantidade e preço unitário de cada ativo.
  • Em caso de sucesso na requisição, segue um exemplo de retorno, que dependerá da carteira do cliente selecionado:
    [
        {
            "codCliente": 1,
            "codAtivo": "BBDC4",
            "qtdeAtivo": 40,
            "valor": "16.35"
        },
        {
            "codCliente": 1,
            "codAtivo": "PETR4",
            "qtdeAtivo": 1,
            "valor": "27.66"
        }
    ]
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição solicite informações de outro usuário, o retorno será:
    {
        "message": "Acesso negado."
    }

Endpoint GET (/ativos/{codAtivo})

  • Ao acessar este endpoint, o usuário poderá consultar os ativos disponíveis para compra na XP, com informações de quantidade e preço unitário de cada ativo.
  • Em caso de sucesso na requisição, segue um exemplo de retorno, que dependerá do ativo escolhido:
    {
        "codAtivo": "PETR4",
        "qtdeAtivo": 14300,
        "precoAtivo": "27.66"
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }

Endpoint POST (/conta/deposito)

  • Ao acessar este endpoint, o usuário poderá realizar um depósito em sua conta digital.
  • O corpo da requisição deverá ter o seguinte formato:
    {
        "codCliente": 1,
        "valor": 44
    }
  • Caso o depósito seja realizado com sucesso, o retorno será:
    {
        "message": "Depósito realizado com sucesso."
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição tente realizar o depósito na conta de outro cliente, o retorno será:
    {
        "message": "Acesso negado."
    }
  • Caso o usuário da requisição tente realizar um depósito com valor igual ou inferior a zero, o retorno será:
    {
        "message": "Valor deve ser maior que zero."
    }

Endpoint POST (/conta/saque)

  • Ao acessar este endpoint, o usuário poderá realizar um saque em sua conta digital.
  • O corpo da requisição deverá ter o seguinte formato:
    {
        "codCliente": 1,
        "valor": 150
    }
  • Caso o saque seja realizado com sucesso, o retorno será:
    {
        "message": "Saque realizado com sucesso."
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição tente realizar o saque na conta de outro cliente, o retorno será:
    {
        "message": "Acesso negado."
    }
  • Caso o usuário da requisição tente realizar um saque de valor maior que o saldo disponível em sua conta digital, o retorno será:
    {
        "message": "Saldo insuficiente."
    }
  • Caso o usuário da requisição tente realizar um saque com valor igual ou inferior a zero, o retorno será:
    {
        "message": "Valor deve ser maior que zero."
    }

Endpoint GET (/conta/{codCliente})

  • Ao acessar este endpoint, o usuário poderá consultar seu saldo em sua conta digital.
  • Caso a requisição seja realizado com sucesso, segue um exemplo de retorno, que dependerá do cliente escolhido:
    {
        "codCliente": "1",
        "saldo": "372060.40"
    }
Possíveis retornos em caso de erro:
  • Caso o usuário da requisição não esteja logado, o retorno será:
    {
        "message": "Usuário não logado."
    }
  • Caso a sessão do usuário da requisição esteja expirada (após 12h do login), o retorno será:
    {
        "message": "Sessão expirada. Realize login novamente para continuar."
    }
  • Caso o usuário da requisição tente acessar o saldo da conta de outro cliente, o retorno será:
    {
        "message": "Acesso negado."
    }

desafioxp's People

Contributors

carolcabralm 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.