Repositório para o desafio do Tech Challenge da Pós-gradução em Software Architecture pela FIAP.
Uma lanchonete de bairro que está expandido sua operação devido seu grande sucesso. Porém, com a expansão e sem um sistema de controle de pedidos, o atendimento aos clientes pode ser caótico e confuso. Para solucionar o problema, a lanchonete irá investir em um sistema de autoatendimento de fast food, que é composto por uma série de dispositivos e interfaces que permitem aos clientes selecionar e fazer pedidos sem precisar interagir com um atendente.
Fizemos o mapeamento do fluxo de forma evolutiva, pensando a partir dos eventos passados, incrementando com os pontos de atenção para na sequência adicionar os comandos, modelos de leitura, políticas e sistemas externos, conforme o que foi aprendido em aula.
Antes de iniciar, certifique-se de que sua máquina atenda aos seguintes requisitos:
JDK 11 instalado:
Certifique-se de ter o JDK 11 instalado em sua máquina.
Para verificar a versão do JDK instalada, execute o seguinte comando no terminal:
java -version
Maven >= 3 instalado:
Verifique se você tem o Maven instalado em sua máquina. Para verificar a versão do Maven instalada, execute o seguinte comando no terminal:
mvn -version
Docker desktop instalado:
Verifique se você tem o Docker instalado em sua máquina. Para verificar a versão do Docker instalada, execute o seguinte comando no terminal:
docker -v
Se o Docker não estiver instalado, faça o download e siga as instruções de instalação do site oficial do Docker ou de outra fonte confiável.
Clonando o projeto:
Clone o repositório do projeto em seu ambiente local.
git clone https://github.com/FIAP-6SOAT-G10/tech-challenge.git
Na raiz do projeto, execute o seguinte comando para criar o container com o banco de dados Postgres:
docker run --name=postgres -p 5432:5432 -e POSTGRES_USER=tech -e POSTGRES_PASSWORD=tech_passwd -d postgres
Após a criação do container do Postgres, você deve realizar o build do projeto utilizando o Maven:
mvn clean install -DskipTests -Plocal -q
Após a criação do container do Postgres, você pode iniciar o projeto.
mvn spring-boot:run
Na raiz do projeto, execute o seguinte comando para criar os containers com o banco de dados Postgres, e realizar o build da aplicação via Docker:
docker-compose up -d
A documentação da API pode ser acessada através do Swagger em: http://localhost:8080/api/swagger-ui.html
Para executar os testes unitários, basta executar o comando abaixo:
mvn test
application.yml
contém as configurações de conexão com o banco de dados. Caso seja necessário alterar a porta do banco de dados, basta alterar a propriedade spring.datasource.url
no arquivo application.yml
.Abaixo está descrito todas as rotas fornecidas da aplicação, bem como seu objetivo e possíveis códigos de retorno:
GET /categorias
: Retorna a lista de categorias de produtos cadastradas no sistema. Atualmente, temos as categorias LANCHE, ACOMPANHAMENTO, BEBIDA e SOBREMESA.POST /clientes
: Cria um novo cliente. Retorna 201 se for bem-sucedido, 400 se houver uma solicitação ruim e 500 para erros internos do servidor.GET /clientes
: Retorna uma lista de todos os clientes. Retorna 200 se for bem-sucedido, 204 se nenhum conteúdo for encontrado e 500 para erros internos do servidor.PATCH /clientes
: Atualiza os dados do cliente. Retorna 200 se for bem-sucedido, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.PUT /clientes
: Atualiza um cliente. Retorna 204 se for bem-sucedido, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.POST /produtos
: Cria um novo produto. Retorna 201 se for bem-sucedido, 400 se houver uma solicitação ruim e 500 para erros internos do servidor.GET /produtos
: Retorna uma lista de todos os produtos. Retorna 200 se for bem-sucedido, 204 se nenhum conteúdo for encontrado e 500 para erros internos do servidor.PATCH /produtos/{id}
: Atualiza os dados do produto. Retorna 200 se for bem-sucedido, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.PUT /produtos/{id}
: Atualiza um produto. Retorna 204 se for bem-sucedido, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.DELETE /produtos/{id}
: Exclui um produto. Retorna 200 se for bem-sucedido, 204 se nenhum conteúdo for encontrado, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.GET /produtos/categoria/{categoria}
: Retorna uma lista de produtos por categoria. Retorna 200 se for bem-sucedido, 204 se nenhum conteúdo for encontrado, 400 se houver uma solicitação ruim, 404 se não for encontrado e 500 para erros internos do servidor.GET /pedidos/{id}
: Retorna um pedido específico. Retorna 200 se for bem-sucedido, 404 se não for encontrado e 500 para erros internos do servidor.GET /pedidos
: Retorna uma lista de todos os pedidos. Retorna 200 se for bem-sucedido, 204 se nenhum conteúdo for encontrado e 500 para erros internos do servidor.POST /pedidos/{id}/checkout
: Realiza o checkout de um pedido. Retorna 201 se for bem-sucedido, 400 se houver uma solicitação ruim e 500 para erros internos do servidor.PATCH /pedidos/{id}/status
: Atualiza o status de um pedido. Retorna 200 se for bem-sucedido, 400 se houver algum problema na solicitação e 500 para erros internos do servidor.PATCH /pedidos/{id}/pagamento
: Atualiza o status de pagamento de um pedido. Retorna 200 se for bem-sucedido, 400 se houver algum problema na solicitação e 500 para erros internos do servidor.GET /pedidos/status/{status}
: Retorna todos os pedidos em um determinado status. Os status disponíveis são: Recebido (recebido), Em Preparação (preparacao), Pronto (pronto) e Finalizado (finalizado). Retorna 200 se for bem-sucedido, 400 se houver algum problema na solicitação e 500 para erros internos do servidor.Para o funcionamento correto das APIs, a ordem abaixo deverá ser seguida à depender do cenário desejado:
POST http://localhost:8080/api/clientes
{
"cpf": "52001817983",
"email": "rafaela-almada91@imail.com",
"nome": "Rafaela Lorena Almada"
}
GET http://localhost:8080/api/clientes?page=0&size=10
PATCH http://localhost:8080/api/clientes
{
"cpf": "52001817983",
"email": "rafaela-almada91@imail.com",
"nome": "Rafaela Lorena Almada"
}
PUT http://localhost:8080/api/clientes
{
"cpf": "52001817983",
"email": "rafaela-almada91@imail.com",
"nome": "Rafaela Lorena Almada"
}
POST http://localhost:8080/api/produtos
{
"nome": "Bebida Láctea de Morango",
"descricao": "Bebida Láctea de Morango 500ml",
"categoria": "BEBIDA",
"preco": 19.9,
"imagem": "CDN:imagem"
}
GET http://localhost:8080/api/produtos?pageIndex=0&pageSize=10&nome=string&descricao=string&preco=string
PATCH http://localhost:8080/api/produtos/:id
[
{
"op": "replace",
"path": "/nome",
"value": "Novo Nome do Produto"
}
]
PUT http://localhost:8080/api/produtos/:id
{
"nome": "Bebida Láctea de Morango",
"descricao": "Bebida Láctea de Morango 500ml",
"categoria": "BEBIDA",
"preco": 19.9,
"imagem": "CDN:imagem"
}
DELETE http://localhost:8080/api/produtos/:id
GET http://localhost:8080/api/produtos/categoria/:categoria
:categoria
- LANCHE
- BEBIDA
- ACOMPANHAMENTO
- SOBREMESA
GET http://localhost:8080/api/pedidos/:id
GET http://localhost:8080/api/pedidos?page=0&size=10
POST http://localhost:8080/api/pedidos/:id/checkout
PATCH http://localhost:8080/api/pedidos/:id/status
[
{
"op": "replace",
"path": "/status",
"value": "preparacao|pronto|finalizado"
}
]
PATCH http://localhost:8080/api/pedidos/:id/pagamento
[
{
"op": "replace",
"path": "/statusPagamento",
"value": "pendente|pago|recusado"
}
]
GET http://localhost:8080/api/pedidos/status/:status
001
: Parâmetro obrigatório não foi enviado.
100
: Categoria inválida.
200
: O nome do produto é obrigatório.201
: A descrição do produto é obrigatória.202
: O preço do produto é obrigatório.203
: A imagem do produto é obrigatória.204
: Identificador de produto inválido.205
: O identificador fornecido não está relacionado a nenhum produto existente.206
: Erro durante a atualização do produto no banco de dados.207
: Erro genérico ao atualizar o produto.208
: A categoria do produto é obrigatória.209
: Não existem produtos registrados para a categoria informada.
300
: CPF inválido.301
: O cliente com o CPF informado já existe.302
: O email do cliente é obrigatório.303
: O CPF do cliente é obrigatório.304
: O campo CPF é obrigatório ao atualizar um cliente.305
: O nome do cliente é obrigatório.
400
: O pedido informado não foi localizado.401
: Erro durante a atualização do status do pedido no banco de dados.402
: O identificador do pedido é inválido.403
: O status à ser atualizado é obrigatório.404
: Não é possível atualizar o pedido para o status informado.405
: Pedidos no status 'Recebido' só podem avançar para o status 'Em preparação'.406
: Pedidos no status 'Em preparação' só podem avançar para o status 'Pronto'.407
: Pedidos no status 'Pronto' só podem avançar para o status 'Finalizado'.408
: Pedidos no status 'Finalizado' não podem ser alterados.499
: Erro genérico ao atualizar o status do pedido.