Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/fabianogoes/fiap-tech-challenge-restaurant-api
It is the main microservices of fiap-tech-challenge-restaurant project
https://github.com/fabianogoes/fiap-tech-challenge-restaurant-api
clean-architecture clean-code coverage-report docker docker-compose gin-gonic ginkgo go golang gomega hexagonal-architecture kubernetes postgresql sonarqube testify-mocking testing
Last synced: about 1 month ago
JSON representation
It is the main microservices of fiap-tech-challenge-restaurant project
- Host: GitHub
- URL: https://github.com/fabianogoes/fiap-tech-challenge-restaurant-api
- Owner: fabianogoes
- Created: 2024-02-25T22:25:10.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2024-09-10T01:05:17.000Z (2 months ago)
- Last Synced: 2024-10-02T09:10:25.873Z (about 1 month ago)
- Topics: clean-architecture, clean-code, coverage-report, docker, docker-compose, gin-gonic, ginkgo, go, golang, gomega, hexagonal-architecture, kubernetes, postgresql, sonarqube, testify-mocking, testing
- Language: Go
- Homepage:
- Size: 9.29 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# FIAP Tech Challenge - Restaurant
[![CI](https://github.com/fabianogoes/fiap-tech-challenge-restaurant-api/actions/workflows/ci-cd.yml/badge.svg)](https://github.com/fabianogoes/fiap-tech-challenge-restaurant-api/actions/workflows/ci-cd.yml)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=fabianogoes_fiap-tech-challenge-restaurant-api&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=fabianogoes_fiap-tech-challenge-restaurant-api)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=fabianogoes_fiap-tech-challenge-restaurant-api&metric=coverage)](https://sonarcloud.io/summary/new_code?id=fabianogoes_fiap-tech-challenge-restaurant-api)## Project Architecture by Clean Architecture
- `app/web`: diretório para os principais pontos de entrada, injeção dependência ou comandos do aplicativo. O subdiretório ‘web’ contém o ponto de entrada principal a API REST.
- `domain/entities`: diretório que contém modelos/entidades de domínio que representam os principais conceitos de negócios.
- `domain/usecases`: diretório que contém Serviços de Domínio ou Use Cases.
- `domain/ports`: diretório que contém ‘interfaces’ ou contratos definidos que os adaptadores devem seguir.
- `adapters/payment`: adaptador para meio de pagamento externo.
- `adapters/delivery`: adaptador para meio de entrega externo.
- `frameworks/rest`: diretório que contém os controllers e manipulador de requisições REST.
- `frameworks/rest/dto`: diretório que contém objetos/modelo de request e response.
- `frameworks/repository`: diretório que contém adaptadores de banco de dados exemplo para PostgreSQL.
- `frameworks/repository/dbo`: diretório que contém objetos/entidades de banco de dados.
- `.infra`: diretório que contém arquivos de infrainstrutura
- `.infra/kubernetes`: diretório que contém os manifestos kubernetes
- `.infra/terraform`: diretório que contém os arquivos terraform para provisionar a infra do projeto## Stack
- [x] [Go][0]
- [x] [Domain-Driven Design][6]
- [x] [Hexagonal Architecture][5]
- [x] [Gin Web Framework][1] - Routes, JSON validation, Error management, Middleware support
- [x] [PostgreSQL][3] - Database persistence
- [x] [GORM ORM library for Golang][2]
- [x] [Slog](https://pkg.go.dev/log/slog) - Package slog provides structured logging, in which log records include a message, a severity level, and various other attributes expressed as key-value pairs.
- [x] [GoDotEnv](https://github.com/joho/godotenv) - A Go (golang) port of dotenv project (which loads env vars from a .env file).
- [x] [Criptografia Simétrica AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)## Desafios
- Implementação da Arquitetura Hexagonal
- Implementação de Conteinerização usando Docker e Docker Compose
- Implementação de Orquestração de Containers usando Kubernetes e AWS EKS
- Implementação de CI/CD usando Github Actions
- Implementação da Arquitetura de Microservices com comunicação Assincrôna usando mensageria
- Implementação de API Gateway AWS Gateway com Autenticação e Autorização usando AWS Lambda
- Implementação de Autenticação usando JWT
- Implementação de qualidade de código usando SonarLint, SonarQube e SonarCloud
- Implementação de Transações distribuídas usando o Padrão SAGA
- Distribuição de processos usando AWS Lambda
- Uso de IaaS(Infrastructure as a Service) usando Terraform## Motivações
Boas práticas e padrões usados para resolver os desafios
### Justificativa do Padrão SAGA com Coreografia
Na implementação do padrão SAGA optei por usar a estratégia de Coreografia para fazer uso dos seguintes benefícios:
1. **Desacoplamento e Autonomia dos Serviços**
Para que os serviços fiquem mais independentes uns dos outros e não dependam de um orquestrador central o que adicionaria outro ponto de falha. A ideia é que cada serviço conhece apenas sua própria lógica e como reagir a eventos específicos, permitindo maior autonomia no desenvolvimento e evolução dos serviços.2. **Escalabilidade**
Como não há um ponto central de controle, o sistema pode escalar melhor horizontalmente, já que o aumento na carga de trabalho passa ser distribuído entre os serviços, sem sobrecarregar um único orquestrador.3. **Resiliência**
A falha de um serviço não impede necessariamente que outros serviços continuem a operar. Cada serviço foi projetado para lidar com falhas de maneira mais isolada, aumentando a resiliência geral do sistema.4. **Flexibilidade e Evolução do Sistema**
Adicionar, modificar ou remover serviços é mais fácil e menos impactante, pois não há necessidade de alterar um orquestrador central. Isso tornou a arquitetura mais adaptável a mudanças de requisitos de negócios ou novas funcionalidades. Cada serviço pode ser desenvolvido e implantado de forma independente, o que facilita a adoção de novas tecnologias ou padrões sem impactar o sistema como um todo.5. **Melhor Alinhamento com Arquiteturas Orientadas a Eventos**
A coreografia alinhou bem com arquiteturas orientadas a eventos, onde os eventos dirigem o fluxo das operações, facilitando a implementação de arquiteturas reativas e altamente responsivas.## Instruções para rodar a aplicação local, usando `docker-compose`
> Pré-requisitos: Ter docker, docker-compose e postman
1. Usando um terminal/powershell no diretório raiz da aplicação rodar `docker-compose up`
2. Importar no Postman a [collection](./.utils/FIAP-Tech-Challenge.postman_collection.json)
3. Verificar se os serviços estão UP executando os endpoints:
1. `Health restaurant-api`
2. `Health payment-api`
3. `Health kitchen-api`
4. Executar os endpoints na sequencia para criar o fluxo de pedidos:
1. `Orders/Start New Order`
2. `Orders/Add Item`
3. `Orders/Confirmation Order`
4. `Orders/Send Order to Payment`
5. `Payment/Paid by Order Id`
6. `Kitchen/Ready`
7. `Orders/Sent for Delivery Order`
8. `Orders/Delivered Order`---
## Setup Development
Dependencies
- [Go Installation](https://go.dev/doc/install)
Check for go version 1.21.3
```shell
go version
```Preparing app
```shell
git clone [email protected]:fabianogoes/fiap-tech-challenge-restaurant-api.git
cd fiap-tech-challenge-restaurant-api
go mod tidy
````### Running to development
```shell
docker-compose up -d postgres && go run app/web/main.go
```## Testing using Docker/Docker Compose
```shell
docker-compose up -dcurl --request GET --url http://localhost:8080/health
## response
{"status":"UP"}
```### Pre-registered data
Quando a ‘app’ subir será inserido dados necessários para testar a criação de pedidos
Para verificar a **lista de produtos** pode ser usado a API:
```shell
http://localhost:8080/products
```Para verificar a **lista de clientes** pode ser usado a API:
```shell
http://localhost:8080/customers
```Para verificar a **lista de Atendentes** pode ser usado a API:
```shell
http://localhost:8080/attendants
```[Collection](./.utils/fiap-tech-challenge-Insomnia.json)
## Docker Commands
```shell
docker login -u=fabianogoes
docker build -t fabianogoes/restaurant-api:latest .
docker tag fabianogoes/restaurant-api:latest fabianogoes/restaurant-api:latest
docker push fabianogoes/restaurant-api:latest
```## Run Coverage
```shell
clear && go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out
```[0]: https://go.dev/
[1]: https://gin-gonic.com/
[2]: https://gorm.io/index.html
[3]: https://www.postgresql.org/
[5]: https://alistair.cockburn.us/hexagonal-architecture/
[6]: https://www.amazon.com/dp/0321125215?ref_=cm_sw_r_cp_ud_dp_0M66DHP14SJ5GBBJCRNP