Skip to content

Commit

Permalink
Merge pull request #130 from FIAP-3SOAT-G15/update-phase-4
Browse files Browse the repository at this point in the history
Update (phase 4)
  • Loading branch information
wellyfrs authored May 21, 2024
2 parents dc7a261 + c176bd4 commit 3dbf66b
Show file tree
Hide file tree
Showing 135 changed files with 45 additions and 5,153 deletions.
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
name: Provisioning
name: Provision

on:
push:
branches:
- main
paths:
- .github/workflows/provisioning.yml
- .github/workflows/provision.yml
- 'terraform/**'
pull_request:
branches:
- main
paths:
- .github/workflows/provisioning.yml
- .github/workflows/provision.yml
- 'terraform/**'

jobs:
provisioning:
provision:
runs-on: ubuntu-latest
defaults:
run:
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2023 Bleno Claus, Giovanni di Luca, Mateus Albino, Wellyson Freitas
Copyright (c) 2023 Bleno Claus, Giovanni di Luca, Lucas Gabriel, Mateus Albino, Wellyson Freitas

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
154 changes: 13 additions & 141 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# FIAP 3SOAT Tech Challenge - G15

> **Para o avaliador da Fase 3**
> **Para o avaliador da Fase 4**
>
> Queira encontrar todos os entregáveis nos outros repositórios desta organização no GitHub, todos com branches principais protegidas, pipelines para Continuous Integration (CI) e Continuous Delivery (CD) usando GitHub actions, com provisionamento de Infrastructure as Code (IaC) usando Terraform. A justificativa para a escolha do banco de dados foi documentada como Architecture Decision Record (ADR) em [`/docs/adr`](/docs/adr).
> Queira encontrar todos os entregáveis nos outros repositórios desta organização no GitHub incluindo **microsserviços** de [pagamentos](https://github.com/FIAP-3SOAT-G15/payments-api), [pedidos](https://github.com/FIAP-3SOAT-G15/orders-api), e [estoque](https://github.com/FIAP-3SOAT-G15/orders-api) (com testes usando **BDD / Cucumber**).
>
> Os microsserviços possuem seu próprio banco de dados isolado, sendo **NoSQL (DynamoDB)** no caso do microsserviço de [pagamentos](https://github.com/FIAP-3SOAT-G15/payments-api), e relacional (RDS / Postgres) nos demais. A comunicação é realizada de forma síncrona.
>
> Todos os repositórios têm branches principais protegidas, pipelines CI/CD usando GitHub Actions, com provisionamento de Infrastructure as Code (IaC) usando Terraform, e análise estática usando **SonarCloud** garantindo **80% de cobertura de testes**.
>
> Outros repositórios criados nas fases anteriores para o resto da infraestrutura também continuam ativos.
Este projeto do curso de Pós-graduação em Arquitetura de Software da FIAP compreende uma solução possível para uma especificação referente a um sistema de autoatendimento de restaurante (do tipo fast-food), com quiosques ou terminais de autoatendimento.

Expand Down Expand Up @@ -37,166 +43,32 @@ DDD foi a abordagem utilizada para o desenvolvimento, com as seguintes saídas d

## Arquitetura

O sistema expõe uma RESTful API para aplicações front-end, como terminais de autoatendimento para clientes e interfaces para administradores. Tem com dependência um provedor externo de pagamento, o Mercado Pago. As decisões de arquitetura foram devidamente documentadas como Architecture Decision Records (ADRs) em [`/docs/adr`](docs/adr).
O sistema expõe RESTful APIs para aplicações front-end, como terminais de autoatendimento para clientes e interfaces para administradores. Tem com dependência um provedor externo de pagamento, como o Mercado Pago. As decisões de arquitetura foram devidamente documentadas como Architecture Decision Records (ADRs) em [`/docs/adr`](docs/adr).

![Diagrama de Container C4](docs/diagrams/c4-container.png)

[Arquitetura Hexagonal](https://alistair.cockburn.us/hexagonal-architecture) (Ports and Adapters) e Clean Architecture são estritamente adotados no projeto, seguindo o princípio de Separation of Concerns.

## Tecnologia

Este é um projeto para JVM. Foi implementado em [Kotlin](https://kotlinlang.org) usando o [Maven](https://maven.apache.org) como gerenciador de dependências. Fora da camada de domínio algumas bibliotecas foram utilizadas, incluindo:

- [Spring Framework](https://spring.io) como base do projeto
- [MapStruct](https://mapstruct.org) para mapeamento entre objetos (ex.: entity para model)
- [Flyway](https://flywaydb.org) para migrações de BD, permitindo [design evolutivo](https://martinfowler.com/articles/evodb.html)
- [Hibernate](https://hibernate.org) para mapeamento objeto-relacional
[Arquitetura Hexagonal](https://alistair.cockburn.us/hexagonal-architecture) (Ports and Adapters) e Clean Architecture são estritamente adotados no projeto.

## Mercado Pago

Essa aplicação está integrada com o Mercado Pago, um provedor de pagamento. Com a realização do pedido, um QR code é criado num ponto de venda ("Point of Sale" ou "POS") da loja para ser pago pelo cliente através do aplicativo do Mercado Pago. Após o pagamento, o Mercado Pago notifica a aplicação através de um endpoint funcionando como webhook.

O fluxo de pagamento pode ser esquematizado no seguinte diagrama de sequência:

![](docs/diagrams/payment-sequence.png)

[Consulte a documentação](/docs/mercado-pago.md) para saber mais sobre a integração.

## Banco de Dados

O seguinte modelo de Entidade Relacionamento foi desenvolvido:

![](docs/diagrams/db-er-diagram.png)

## Infraestrutura

Amazon Web Services (AWS) é usado como Cloud Provider e o Terraform é usado para provisionar Infrastructure as Code (IaC) hospedado neste repositório em [`/terraform`](terraform) e nos demais repositórios desta organização no GitHub.

Os recursos incluem:

- repositório privado no Amazon Elastic Container Registry (ECR)
- repositórios privados no Amazon Elastic Container Registry (ECR)
- cluster do Amazon Elastic Kubernetes Service (EKS)
- instância do Relational Database Service (RDS) for PostgreSQL
- instâncias do Relational Database Service (RDS) for PostgreSQL
- tabela do DynamoDB
- secrets (de banco de dados e Mercado Pago) no Secrets Manager
- parâmetros de sistema no SSM Parameter Store
- API Gateway (Load Balancer no EKS como target)
- user pool de clientes no Cognito
- funções Lambda para autenticação

Além de dependências como recursos do Virtual Private Cloud (VPC).

![](docs/diagrams/aws.jpeg)

## CI / CD

Pipelines foram configuradas usando o [GitHub Actions](https://github.com/features/actions).

Neste repositório existem as seguintes pipelines:

- **app:** build, verificação, publicação da imagem no ECR
- **docs:** geração e publicação do website de documentação com [MkDocs](https://www.mkdocs.org/)
- **openapi:** geração OpenAPI em JSON e sincronização com Postman API
- **provisioning:** provisionamento de IaC na AWS com Terraform

As imagens e containers Docker utilizados para implementação das pipelines podem ser verificados no [Makefile](Makefile).

## Documentação

Consulte a documentação em [`/docs`](docs) ou acesse:

[http://fiap-3soat-g15.s3-website-us-east-1.amazonaws.com](http://fiap-3soat-g15.s3-website-us-east-1.amazonaws.com/)

A especificação **OpenAPI (Swagger)** em formato JSON também é publicado:

[http://fiap-3soat-g15.s3-website-us-east-1.amazonaws.com/openapi.json](http://fiap-3soat-g15.s3-website-us-east-1.amazonaws.com/openapi.json)

Com a aplicação em execução, você tambem pode acessar o Swagger UI:

[http://localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html)

Preview:

![Swagger UI](docs/img/swagger-ui.png)

## Postman collection

Acesse a API sincronizada no Postman:

[Postman API](https://fiap-3soat-g15.postman.co/workspace/tech-challenge~febf1412-7ce2-4cb4-8bca-50f4fdd3a479/api/c77ec61d-c410-443e-92f7-c204be16083b?action=share&creator=12986472)

Uma collection sincronizada também fica disponível em:

[docs/postman-collection.json](docs/postman-collection.json)

Use o seguinte token como header `x-admin-token` para testar endpoints `/admin/**`:

```
token
```

## Como executar localmente

A forma mais simples é utilizando o [Docker Compose](https://docs.docker.com/compose):

```bash
docker compose up
```

## Desenvolvimento

### Mappers

[MapStruct](https://mapstruct.org) é usado para mapear entities e models e implementaçōes para os mappers anotados com `@Mapper` são geradas em tempo de compilação:

```
mvn clean compile
```

### Testes

```
mvn clean verify
```

Para incluir os testes de integração:

```
mvn clean verify -DskipITs=false
```

### ktlint

```
mvn antrun:run@ktlint-format
```

### Kubernetes local

```
minikube start
```

Consulte: https://kubernetes.io/docs/tasks/tools

### Imagem no Minikube

Crie a imagem local com o mesmo nome da imagem remota.

Exemplo com macOS:

```
eval $(minikube docker-env)
docker build -t 202062340677.dkr.ecr.us-east-1.amazonaws.com/tech-challenge:latest .
```

Consulte: https://minikube.sigs.k8s.io/docs/handbook/pushing

### ngrok

Para expor a aplicação local externalmente:

```
ngrok http http://localhost:8080
```

Acesse o endereço de redirecionamento ("forwarding").
Binary file modified docs/diagrams/c4-container.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 0 additions & 2 deletions docs/mercado-pago.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

Essa aplicação está integrada com o Mercado Pago, um provedor de pagamento. Com a realização do pedido, um QR code é criado num ponto de venda ("Point of Sale" ou "POS") da loja para ser pago pelo cliente através do aplicativo do Mercado Pago. Após o pagamento, o Mercado Pago notifica a aplicação através de um endpoint funcionando como webhook.

![](diagrams/payment-sequence.png)

O webhook exposto é `/payments/notifications/{orderNumber}`, e aceita notificações do Mercado Pago do tipo Instant Payment Notification (IPN), assinadas com header `x-signature`. A validação da assinatura, conforme documentação do Mercado Pago, não foi implementada por simplificação.

## Configuração e testes
Expand Down
32 changes: 26 additions & 6 deletions docs/puml/container.puml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,38 @@
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

LAYOUT_LEFT_RIGHT()
LAYOUT_WITH_LEGEND()

title Diagrama de Container C4

System_Boundary(self_order_system, "Sistema de Autoatendimento de Restaurante") {
Container(api, "API", "Spring Boot")
ContainerDb(db, "Banco de Dados", "Postgres")
System_Boundary(payment_system, "Pagamentos") {
Container(payment_api, "Pagamentos API", "Spring Boot")
ContainerDb(payment_db, "Pagamentos DB", "DynamoDB")
}

System_Boundary(order_system, "Pedidos") {
Container(orders_api, "Pedidos API", "Spring Boot")
ContainerDb(orders_db, "Pedidos DB", "Postgres")
}

System_Boundary(stock_system, "Estoque") {
Container(stock_api, "Estoque API", "Spring Boot")
ContainerDb(stock_db, "Estoque DB", "Postgres")
}
}

System_Ext(payment_system, "Mercado Pago", "sistema de pagamento")
System_Ext(payment_provider_system, "Provedor de Pagamento", "ex.: Mercado Pago")

Rel(orders_api, orders_db, "read / write", "JDBC")
Rel(orders_api, stock_api, "acessa", "HTTP")
Rel(orders_api, payment_api, "acessa", "HTTP")

Rel(stock_api, stock_db, "read / write", "JDBC")

Rel(api, db, "read / write", "JDBC")
Rel(api, payment_system, "usa", "HTTP")
Rel(payment_system, api, "notifica", "HTTP")
Rel(payment_api, payment_db, "read / write", "JDBC")
Rel(payment_api, payment_provider_system, "usa", "HTTP")
Rel(payment_api, orders_api, "notifica", "HTTP")
Rel(payment_provider_system, payment_api, "notifica", "HTTP")

@enduml
2 changes: 1 addition & 1 deletion docs/puml/context.puml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Person_Ext(customer, "Cliente", "cliente do restaurante,\ncom ou sem cadastro")
Person(admin, "Administrador", "administrador do restaurante")
System(system, "Sistema de Autoatendimento de Restaurante", "permite fazer e acompanhar pedidos, além de gerenciar pedidos, clientes, produtos, estoque, etc")

System_Ext(payment_system, "Mercado Pago", "Sistema de pagamento")
System_Ext(payment_system, "Provedor de Pagamento", "ex.: Mercado Pago")

Rel(customer, system, "usa")
Rel(customer, payment_system, "paga")
Expand Down

This file was deleted.

This file was deleted.

Loading

0 comments on commit 3dbf66b

Please sign in to comment.