Code Monkey home page Code Monkey logo

backend-challenge's Introduction

ME

Back-end Challenge

Bem-vindo(a) ao nosso teste para desenvolvedores(as) back-end.

🎯 O que vamos avaliar? O que buscamos?

Queremos entender como você modela um problema e o transforma em código, como você estrutura, como você testa. Enviar uma aplicação funcionando é o ideal, mas mesmo que não esteja 100 % envie o código para que possamos analisar até onde você chegou.

O problema que vamos apresentar não tem uma lógica complexa, mas implemente seu código pensando em um sistema extensível e de alta concorrência no uso, é muito importante que você aplique SOLID em tudo que fizer.

💻 Tecnologias

  1. Nossa stack de desenvolvimento é predominantemente C# e Java, então nossa sugestão é que você utilize .NET Core para C# ou Spring para Java.
  2. Teste seu código, crie Unit tests e/ou Integration tests.
  3. A aplicação deve ser self contained, use um database em memória, por exemplo o H2 no caso do Spring.

⚡ O Desafio

Você deve construir uma API que terá dois endpoints:

Endpoint – Pedido

Sua aplicação deve expor em http://localhost:{porta}/api/pedido uma API RESTful. (GET, POST, PUT, DELETE)

O conteúdo de um Pedido possui o seguinte payload:

{
  "pedido":"123456",
  "itens": [
  {
    "descricao": "Item A",
    "precoUnitario": 10,
    "qtd": 1
  },
  {
    "descricao": "Item B",
    "precoUnitario": 5,
    "qtd": 2
  }
  ]
}

O conteúdo desse Pedido e Itens deverá ser persistido em banco de dados. Fique à vontade para criar as validações que você considerar necessárias.

Endpoint – Mudança de Status de Pedido

Sua aplicação deve receber um POST em http://localhost:{porta}/api/status com o seguinte payload:

{
  "status":"XXX",
  "itensAprovados":0,
  "valorAprovado":0,
  "pedido":"XXX"
}

E terá o seguinte response, baseado nas regras detalhadas a seguir:

{
  "pedido":"123456",
  "status": ["STATUS_1", "STATUS_2", "STATUS_...n"]
}

O status não precisa ser persistido em banco de dados, basta retornar na API.

Exemplos de requests e responses baseados no payload do pedido descrito anteriormente:

#1

request

{
  "status":"APROVADO",
  "itensAprovados": 3,
  "valorAprovado": 20,
  "pedido":"123456"
}

response

{
  "pedido":"123456",
  "status": ["APROVADO"]
}

#2

request

{
  "status":"APROVADO",
  "itensAprovados": 3,
  "valorAprovado": 10,
  "pedido":"123456"
}

response

{
  "pedido":"123456",
  "status": ["APROVADO_VALOR_A_MENOR"]
}

#3

request

{
  "status":"APROVADO",
  "itensAprovados": 4,
  "valorAprovado": 21,
  "pedido":"123456"
}

response

{
  "pedido":"123456",
  "status": ["APROVADO_VALOR_A_MAIOR", "APROVADO_QTD_A_MAIOR"]
}

#4

request

{
  "status":"APROVADO",
  "itensAprovados": 2,
  "valorAprovado": 20,
  "pedido":"123456"
}

response

{
  "pedido":"123456",
  "status": ["APROVADO_QTD_A_MENOR"]
}

#5

request

{
  "status":"REPROVADO",
  "itensAprovados": 0,
  "valorAprovado": 0,
  "pedido":"123456"
}

response

{
  "pedido":"123456",
  "status": ["REPROVADO"]
}

#6

request

{
  "status":"APROVADO",
  "itensAprovados": 3,
  "valorAprovado": 20,
  "pedido":"123456-N"
}

response

{
  "pedido":"123456",
  "status": ["CODIGO_PEDIDO_INVALIDO"]
}

📝 Lógica de Negócio

Dado (Given) o status Quando (When)

pedido não for localizado no banco de dados.

Então (Then) retorne

{
  "status": "CODIGO_PEDIDO_INVALIDO"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

status for igual a REPROVADO

Então (Then) retorne

{
  "status": "REPROVADO"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

itensAprovados for igual a quantidade de itens do pedido.

valorAprovado for igual o valor total do pedido.

status for igual a APROVADO.

Então (Then) retorne

{
  "status": "APROVADO"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

valorAprovado for menor que o valor total do pedido

status for igual a APROVADO

Então (Then) retorne

{
  "status": "APROVADO_VALOR_A_MENOR"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

itensAprovados for menor que a quantidade de itens do pedido.

status for igual a APROVADO

Então (Then) retorne

{
  "status": "APROVADO_QTD_A_MENOR"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

valorAprovado for maior que o valor total do pedido

status for igual a APROVADO

Então (Then) retorne

{
  "status": "APROVADO_VALOR_A_MAIOR"
}

Dado (Given) o status Quando (When)

pedido for localizado no banco de dados.

itensAprovados for maior que a quantidade de itens do pedido.

status for igual a APROVADO

Então (Then) retorne

{
  "status": "APROVADO_QTD_A_MAIOR"
}

Informações finais

Uma tentativa de mudança de status deverá passar por todas essas regras descritas e a API deverá retornar todos os status gerados, observe que as validações são compartilhadas entre as regras, reutilize código (DRY).

Observe que:

  1. O valor total do pedido é composto pela somatória do valor calculado de cada item (precoUnitario * qtd).

  2. A quantidade total de itens do pedido é composta pela somatória da qtd de cada item.

🚀 Entrega

Crie um arquivo chamado instructions.md com todas as informações necessárias para executar sua aplicação.

Para enviar seu código, você pode:

  • Enviar a URL do seu repositório para a pessoa responsável pelo seu processo seletivo dentro do ME.
  • Fazer um fork deste repositório, criar uma branch com o seu nome, enviar um pull request e nos notificar.

backend-challenge's People

Contributors

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