Skip to content
This repository has been archived by the owner on Oct 19, 2024. It is now read-only.

Latest commit

 

History

History
256 lines (162 loc) · 13.9 KB

README.md

File metadata and controls

256 lines (162 loc) · 13.9 KB

BOPE

Restaurant Management System

Microsserviço de Pedidos

Deploy to Amazon EKS Quality Gate Status Coverage

Microsserviço de Pedidos do Sistema de Gestão de Restaurantes (RMS) desenvolvido pelo grupo "BOPE" G03 da turma 4SOAT para o Tech Challenge da Pós Tech em Software Architecture da FIAP.

▶️Clique aqui para assistir à apresentação no YouTube!

O PROBLEMA

Há uma lanchonete de bairro que está expandindo 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. 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. Os pedidos podem ser perdidos, mal interpretados ou esquecidos, levando à insatisfação dos clientes e a 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, expandir a lanchonete pode acabar não dando certo, resultando em clientes insatisfeitos e impactando os negócios de forma negativa.

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.

— Fonte: FIAP

Stack

NodeJS NestJS TypeScript Postgres Docker Kubernetes Terraform


overview-microsservicos

Executar a aplicação

  1. Baixe e instale o Node.js em https://nodejs.org/en/download
  2. Instale o CLI do NestJS através do comando npm i -g @nestjs/cli
  3. Navegue até a pasta raiz do projeto usando o Terminal;
  4. Faça uma cópia do arquivo .env.template com o nome .env e preencha as variáveis de ambiente dentro dele;
  5. Execute o comando npm install para instalar os pacotes npm;
  6. Execute o comando docker-compose up -d db-pedidos para iniciar o container do banco de dados;
  7. Execute o comando docker-compose up -d localstack para iniciar o localstack;
  8. Use o comando npm run start para iniciar a aplicação.
  9. Acesse o Swagger em http://localhost:3002/swagger/
Como executar a aplicação usando o Docker Compose?

Executar a aplicação usando o Docker Compose

  1. Clone este repositório;
  2. Navegue até a pasta raiz do projeto usando o Terminal;
  3. Faça uma cópia do arquivo .env.template com o nome .env e preencha as variáveis de ambiente dentro dele;
  4. Execute o comando docker-compose up -d --build --force-recreate
  5. Acesse o Swagger em http://localhost:3002/swagger/
Como executar a aplicação usando o Kubernetes do Docker Desktop?

Executar a aplicação usando o Kubernetes do Docker Desktop

  1. Clone este repositório;
  2. Navegue até a pasta raiz do projeto usando o Terminal;
  3. Use o comando docker build -t rms-api-pedidos:latest . para gerar a imagem de container da aplicação;
  4. Use o comando kubectl apply -f k8s/development/postgres/namespace.yaml -f k8s/development/postgres/pvc-pv.yaml -f k8s/development/postgres/config.yaml -f k8s/development/postgres/secrets.yaml -f k8s/development/postgres/deployment.yaml -f k8s/development/postgres/service.yaml para fazer deploy do banco de dados;
  5. Use o comando kubectl apply -f k8s/development/api/namespace.yaml -f k8s/development/api/config.yaml -f k8s/development/api/secrets.yaml -f k8s/development/api/deployment.yaml -f k8s/development/api/service.yaml -f k8s/development/api/hpa.yaml para fazer deploy da aplicação;
  6. Acesse o Swagger em http://localhost:3002/swagger/

Para remover a aplicação do Kubernetes, use o comando kubectl delete namespace rms

Sobre os Secrets do Kubernetes

Em seu ambiente de desenvolvimento, por questão de segurança, abra os arquivos /k8s/development/postgres/secrets.yaml e /k8s/development/api/secrets.yaml na pasta /k8s/development e preencha os valores sensíveis manualmente.

No ambiente de produção os Secrets do Kubernetes são gerenciados pelo AWS Secrets Manager.

Para mais informações visite a página Boas práticas para secrets do Kubernetes.

Como testar o pagamento de pedidos através do QR Code do Mercado Pago?

Instruções para testar o pagamento de pedidos através do QR Code do Mercado Pago

Para testar o pagamento de pedidos usando o QR Code do Mercado Pago siga o passo a passo disponível na documentação da api-pagamentos.

Banco de Dados

Entendemos que o modelo relacional é o que mais se adequa ao nosso problema de negócio, contexto atual e requisitos no Microsserviço de Pedidos. Leia mais sobre as motivações para adoção do modelo relacional no Architectural Decision Record (ADR).

Quais são os parâmetros da conexão e credenciais para acesso ao banco de dados PostgreSQL?

Você pode conectar-se a instância de banco de dados PostgreSQL usando o pgAdmin, o terminal através do psql, ou qualquer outra IDE ou ferramenta compatível.

Host: localhost
Porta: 5432 (padrão)
Usuário: pguser
Senha: pgpwd
DB name: rms

Documentação

A documentação do projeto está disponível no GitHub Wiki.

SAGA

Padrão implementado: Coreografia

Por que optamos por uma SAGA coreografada?

SAGA Coreografada

Nossa aplicação é relativamente simples. Dada a simplicidade da nossa aplicação, no nosso cenário não corremos o risco de enfrentar problemas de dependências cíclicas, nem tampouco enfrentamos dificuldades em fazer o entendimento e o mapeamento de todos os membros envolvidos na SAGA, já que a nossa SAGA possui poucos membros. Sabendo disso, dado o nosso contexto, optamos pela SAGA coreografada, conforme recomendado por Chris Richardson no livro "Microservices Patterns", indo de encontro também a recomendação feita pelo professor durante as aulas.

RMS_SAGA drawio Clique na imagem para ampliar.

Padrão Arquitetural

Architectural Pattern: Clean Architecture + Screaming Architecture

uml-clean-arch drawio Clique na imagem para ampliar.

Diagrama de arquitetura cloud

Cloud provider: AWS

Diagrama de arquitetura cloud drawio Clique na imagem para ampliar.

Como contribuir

Para contribuir com o projeto consulte o guia em CONTRIBUTING.md

Installation

$ npm install

Running the app

# development
$ npm run start

# watch mode
$ npm run start:dev

# production mode
$ npm run start:prod

Test

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

Métricas de código

Quality Gate Status Technical Debt Coverage Lines of Code Code Smells Maintainability Rating Security Rating Bugs Vulnerabilities Duplicated Lines (%) Reliability Rating

Projetos relacionados

API Catálogo
https://github.com/Grupo-G03-4SOAT-FIAP/rms-api-catalogo

API de Pagamentos
https://github.com/Grupo-G03-4SOAT-FIAP/rms-api-pagamentos

Amazon Cognito Lambda triggers
https://github.com/Grupo-G03-4SOAT-FIAP/rms-cognito-triggers

Infrastructure as code (IaC) com Terraform
https://github.com/Grupo-G03-4SOAT-FIAP/rms-iac

API de Privacidade
https://github.com/Grupo-G03-4SOAT-FIAP/rms-api-privacidade

OWASP ZAP

Reports OWASP ZAP API Scan

Os reports de "antes" e "depois" encontram-se na pasta /docs/zap-scanning-report
Clique aqui para acessar↗️

Como escanear a API usando o OWASP ZAP?

ZAP - API Scan

Para escanear todos os endpoints da API em busca de vulnerabilidades siga o passo a passo abaixo.

  1. Execute a aplicação usando o Docker Compose;
  2. Execute o comando abaixo:
docker run --name zap --network host -v $(pwd):/zap/wrk/:rw -t zaproxy/zap-stable zap-api-scan.py -t http://localhost:3002/swagger-json -f openapi -r report.html

Substitua os parenteses em $(pwd) por chaves ${pwd} no Windows.

O report em formato HTML será gerado no diretório atual.

Clique aqui para obter mais informações sobre o API Scan do ZAP.

Requisitos

Node.js v20.12.0 (LTS), Docker Desktop 24.0.6 e Kubernetes v1.28
Pagamentos processados por Mercado Pago.

SonarCloud