Skip to content

fiap-8soat-tc-one/tc-backend-s3

 
 

Repository files navigation

Tech Challenge Backend API

O Desafio 🚩

Uma lanchonete de bairro está em expansão devido ao seu grande sucesso. Entretanto, com essa expansão e a ausência de um sistema de controle de pedidos, o atendimento aos clientes pode tornar-se caótico e confuso. Por exemplo, imagine que um cliente faça um pedido complexo, como um hambúrguer personalizado com ingredientes específicos, acompanhado de batatas fritas e uma bebida. O atendente pode anotar o pedido em um papel e entregá-lo à cozinha, mas não há garantia de que o pedido será preparado corretamente.

Sem um sistema de controle de pedidos, pode haver confusão entre os atendentes e a cozinha, resultando em atrasos na preparação e entrega dos pedidos. Pedidos podem ser perdidos, mal interpretados ou esquecidos, levando à insatisfação dos clientes e à perda de negócios.

Em resumo, um sistema de controle de pedidos é essencial para garantir que a lanchonete possa atender os clientes de maneira eficiente, gerenciando seus pedidos e estoques de forma adequada. Sem ele, a expansão da lanchonete pode não ser bem-sucedida, resultando em clientes insatisfeitos e impactando negativamente os negócios.

Para solucionar o problema, a lanchonete irá investir em um sistema de autoatendimento de fast food, composto por uma série de dispositivos e interfaces que permitem aos clientes selecionar e fazer pedidos sem precisar interagir com um atendente, com as seguintes funcionalidades:

  1. Pedido
    • Os clientes são apresentados a uma interface de seleção na qual podem optar por se identificarem via CPF, se cadastrarem com nome e e-mail, ou não se identificar. A montagem do combo segue a sequência a seguir, sendo todas as etapas opcionais:
      • Lanche
      • Acompanhamento
      • Bebida
      • Sobremesa

Em cada etapa, são exibidos o nome, descrição e preço de cada produto.

  1. Pagamento

    • O sistema deverá possuir uma opção de pagamento integrada para o MVP, sendo a forma de pagamento oferecida via QRCode do Mercado Pago.
    • Nesse MVP, será realizado um fake checkout para o fluxo de pagamento, sem integração direta com o Mercado Pago.
  2. Acompanhamento

    • Uma vez que o pedido é confirmado e pago, ele é enviado para a cozinha para ser preparado. Simultaneamente, deve aparecer em um monitor para o cliente acompanhar o progresso do seu pedido com as seguintes etapas:
      • Recebido
      • Em preparação
      • Pronto
      • Finalizado
  3. Entrega

    • Quando o pedido estiver pronto, o sistema deverá notificar o cliente que ele está disponível para retirada. Ao ser retirado, o pedido deve ser atualizado para o status finalizado.

Além das etapas do cliente, o estabelecimento precisa de um acesso administrativo:

  1. Gerenciar clientes

    • Com a identificação dos clientes, o estabelecimento pode trabalhar em campanhas promocionais.
  2. Gerenciar produtos e categorias

    • Os produtos dispostos para escolha do cliente serão gerenciados pelo estabelecimento, definindo nome, categoria, preço, descrição e imagens. Para esse sistema, teremos categorias fixas:
      • Lanche
      • Acompanhamento
      • Bebida
      • Sobremesa
  3. Acompanhamento de pedidos

    • Deve ser possível acompanhar os pedidos em andamento e o tempo de espera de cada pedido.

As informações dispostas no sistema de pedidos precisarão ser gerenciadas pelo estabelecimento através de um painel administrativo.

Equipe 👷

  • Myller Lobo
  • Jean Carlos
  • Caio Isikawa
  • Vanderly
  • Thiago

Pré-Requisitos ❗

  • Maven 3
  • Java 17 (Open JDK 17)
  • Postgres 15
  • Docker Desktop
  • IntelliJ IDEA
  • DBeaver SQL Client
  • Postman
  • k6

Clean Architecture

Clique aqui para ser redirecionado a documentação sobre clean-architecture aplicada nesse projeto


Configuração de Ambiente de Desenvolvimento Local ✔️

Clique aqui para ser redirecionado para a wiki de configuração do ambiente de desenvolvimento local

Configuração do Ambiente Docker/Docker Compose ✔️

  • A aplicação está configurada para o Flyway gerar as tabelas no PostgreSQL. Abra o DBeaver ou a ferramenta de sua escolha e verifique se as tabelas do sistema foram criadas.

Clique aqui para ser redirecionado para a wiki de configuração do ambiente Docker

Detalhamento sobre Stress Testing e Smoke Testing ✔️

  • Dentro da pasta scripts/tests contém todos os scripts k6 para efetuar a execução os cenários de smoke-test e stress-test que foram realizados para configurar de maneira efetiva o os requests/limits da aplicação juntamente com o HPA

Clique aqui para ser redirecionado para a wiki de testes

Manual/Documentação de Funcionalidades (Swagger/Open API) ✔️

  • Para todos os endpoints privados, é necessário gerar o token via endpoint login(POST /oauth/token)

  • É possível acessar o Swagger/Open API da aplicação pela seguinte URL: http://localhost:8080/swagger-ui/index.html

Workflow de Execução das APIs

Segue abaixo o descritivo simplificado da jornada das APIs dentro do sistema, esses diagramas servem apenas para materializar a jornada do ClienteXTerminalxSistemaXCozinha, mas em nenhum momento substitui o detalhamento/especificação realizados no Domain Storytelling e Event Storming criados, favor utiliza-los como fonte da verdade

1 - Criação do Pedido a partir de um cliente identificado

sequenceDiagram
    Cliente->>+Terminal de Autoatendimento: 1 - Informa CPF para identificação.
    Terminal de Autoatendimento->>+Sistema: 2 - [GET] http://localhost:8080/api/public/v1/customers/{cpf}
    Sistema-->>-Terminal de Autoatendimento: Retorna dados do cliente identificado.
    Terminal de Autoatendimento-->>-Cliente: Exibir dados do cliente.
    Cliente->>+Terminal de Autoatendimento: 3 - Buscar produtos para montar o pedido.
    Terminal de Autoatendimento->>+Sistema: 4 - [GET] http://localhost:8080/api/public/v1/products/categories/{categoryId}
    Sistema-->>-Terminal de Autoatendimento: Retorna dados dos produtos.
   Terminal de Autoatendimento-->>-Cliente: Exibir dados do produto.

    Cliente->>+Terminal de Autoatendimento: 5 - Escolhe produtos e realiza pedido.
    Terminal de Autoatendimento->>+Sistema: 6 - [POST] http://localhost:8080/api/public/v1/orders
    Sistema-->>-Terminal de Autoatendimento: Retorna dados do pedido cadastrado/recebido.
    Terminal de Autoatendimento-->>-Cliente: Exibir tela de pagamento.
Loading

Observação:

  • Os fluxos de 1 a 2 são opicionais.
  • Não é necessário informar campo id_customer no payload do POST v1/orders uma vez que esse campo é opcional com base na escolha do usuário se identificar ou não.

3 - Pagamento do Pedido

sequenceDiagram
    Fake Pagamento->>+Sistema: 1 - [POST] http://localhost:8080/api/public/v1/hook/orders/payments
    Sistema-->>-Fake Pagamento: Return Status Code 200 and result SUCCESS/ERROR
Loading

4 - Acompanhamento e Preparação de Pedido na Cozinha

sequenceDiagram
    Cozinha->>+Terminal interno: 1 - Buscar pedidos com status "Confirmado" para iniciar os preparos.
    Terminal interno->>+Sistema: 2 - [GET] http://localhost:8080/api/private/v1/orders
    Sistema-->>-Terminal interno: Retorna pedidos com status "Confirmado", "Pendente para Preparo" ou "Pronto para Retirada".
    Terminal interno-->>-Cozinha: Exibir dados para cozinha iniciar os preparos.

    Cozinha->>+Terminal interno: 3 - Seleciona pedido e altera status para "Em Preparação" (PREPARING)
    Terminal interno->>+Sistema: 4 - [PUT] http://localhost:8080/api/private/v1/orders/status
    Sistema-->>-Terminal interno: Retorna status do pedido alterado com sucesso.
    Terminal interno-->>-Cozinha: Exibir mudança de status do pedido.
    Cozinha->>+Terminal interno: 5 - Seleciona pedido e altera status para "Pronto para Retirada" (READY)
    Terminal interno->>+Sistema: 6 - [PUT] http://localhost:8080/api/private/v1/orders/status
    Sistema-->>-Terminal interno: Retorna status do pedido alterado com sucesso.
    Terminal interno-->>-Cozinha: Exibir mudança de status do pedido.
Loading

5 - Finalização do pedido

sequenceDiagram
    Atendente->>+Terminal interno: 1 - Seleciona pedido e altera status para "Finalizado" após retirada do cliente (FINISHED)
    Terminal interno->>+Sistema: 2 - [PUT] http://localhost:8080/api/private/v1/orders/status
    Sistema-->>-Terminal interno: Retorna status do pedido alterado com sucesso.
    Terminal interno-->>-Atendente: Exibir mudança de status do pedido.
Loading

Clique aqui para ser redirecionado para a documentação das APIs e suas funcionalidades

Domain Storytelling ✔️

Clique aqui para ser redirecionado para a documentação do domain storytelling

Dicionário de Linguagem Onipresente/Ubíqua

Palavra Descrição
Lanchonete Estabelecimento onde a solução/sistema será aplicado.
Cliente Pessoa que realiza pedidos na lanchonete.
Cozinha Setor da lanchonete responsável por preparar todos os produtos do combo.
Administrador/Usuário Sistêmico Pessoa que cadastra produtos no sistema.
Sistema de Controle de Pedidos Sistema que soluciona o problema da lanchonete, automatizando a coleta de pedidos, pagamento e comunicação com a cozinha.
Monitor/Terminal No Contexto da Cozinha: Display onde são exibidos os pedidos na cozinha pendentes de preparo. No Contexto do Cliente: Display onde o cliente consegue acompanhar o status dos seus pedidos.
Promoção Oferta de produtos com desconto customizada por cliente.
Pagamento Ação realizada pelo cliente ao fazer a leitura do QR code do Mercado Pago para realizar o pagamento do pedido.
Pedido Pedido de combo realizado pelo cliente.
RECEIVED/Pedido Recebido Pedido aguardando pagamento pelo cliente)
PENDING/Pedido Pendente Status do pedido após uma falha no fluxo de pagamento.
PREPARING/Pedido Em Preparação Status do pedido após a após a conclusão do pagamento e encaminhamento para a cozinha iniciar o preparo.
READY/Pedido Pronto Status do pedido após a cozinha terminar o preparo e disponibilizar para retirada pelo cliente.
FINISHED/Pedido Finalizado Status do pedido após ser retirado pelo cliente.
CANCELED/Pedido Cancelado Status do pedido após ser cancelado pelo cliente ou pela cozinha.
Acompanhamento No Contexto de Itens do Pedido: Item que acompanha o hambúrguer, como, por exemplo, batata frita. No Contexto do Pedido: Funcionalidade que permite ao cliente acompanhar o status do seu pedido no monitor.

Event Storming ✔️

Clique aqui para ser redirecionado para a documentação do event storming

Domain Mapping ✔️

image

Desenho de Arquitetura/Infraestrutura proposto ✔️

Clique aqui para ser redirecionado para o desenho de arquitetura e infraestrutura

Requisitos não funcionais a serem implementados no futuro

  • Cadastro de usuário sistêmico, hoje temos apenas um usuário sistêmico, via carga do flyway.

Packages

No packages published

Languages

  • JavaScript 90.8%
  • Java 9.2%