diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
new file mode 100644
index 0000000..69d4152
--- /dev/null
+++ b/.github/workflows/main.yaml
@@ -0,0 +1,25 @@
+name: main
+on: push
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ repo: [relacionamentos, icones, cms, imersaofc, intencoes, maonamassa, niveis, ]
+ permissions:
+ contents: write
+ container:
+ image: structurizr/cli:latest
+ steps:
+ - name: Install git
+ run: apt-get update && apt-get install -y git
+ - name: Mark directory as safe for git
+ run: git config --global --add safe.directory /__w/modeloC4/modeloC4
+ - uses: actions/checkout@v4
+ - name: Generate diagrams
+ run: |
+ bash scripts/gerar-diagramas.sh ${{ matrix.repo }}
+ - name: Commit changes
+ uses: stefanzweifel/git-auto-commit-action@v5
+ with:
+ commit_message: "Diagramas gerados automaticamente para o repositório ${{ matrix.repo }}"
diff --git a/.gitignore b/.gitignore
index 6fbf0b2..6c2e740 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
out
.structurizr
*/export-diagrams.js
+*.mmd
diff --git a/cms/diagramas.md b/cms/diagramas.md
new file mode 100644
index 0000000..5e4030f
--- /dev/null
+++ b/cms/diagramas.md
@@ -0,0 +1,65 @@
+## Containers
+
+```mermaid
+graph LR
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["CMS - Containers"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1["
Leitor
[Person]
Pessoa que consome as
notícias do site.
"]
+ style 1 fill:#08427b,stroke:#052e56,color:#ffffff
+ 2["Editor
[Person]
Pessoa que escreve conteúdo
para o site.
"]
+ style 2 fill:#08427b,stroke:#052e56,color:#ffffff
+
+ subgraph 3 [CMS]
+ style 3 fill:#ffffff,stroke:#0b4884,color:#0b4884
+
+ 4("Portal de Notícias
[Container: Python and Django]
Site que fornece as notícias
e conteúdos. Possui área
acessível somente para
editores.
")
+ style 4 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 5[("Banco de Dados
[Container: Postgresql]
Armazena notícias e
informações sobre usuários.
")]
+ style 5 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 6["Armazenamento de imagens
[Container: Bucket S3]
Armazena imagens que serão
utilizadas nas notícias e no
conteúdo do portal.
"]
+ style 6 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 7["Aplicativo móvel
[Container: Android/iOS]
Aplicativo que permite o
acesso ao conteúdo e às
notícias do portal.
"]
+ style 7 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 8["Fila de processamento em segundo plano
[Container: RabbitMQ]
Recebe eventos de criação de
imagem para serem consumidos
pelo processador.
"]
+ style 8 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 9("Processador de Imagens
[Container: Python]
Processa imagens
otimizando-as e gerando
thumbnails.
")
+ style 9 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ end
+
+ 1-. "Consome notícias e conteúdo
em
" .->4
+ 1-. "Consome notícias e conteúdo
em
" .->7
+ 2-. "Escreve conteúdo em
" .->4
+ 7-. "Consome notícias e conteúdo
em
[HTTPS/JSON]
" .->4
+ 4-. "Lê de e escreve em
[Postgresql Protocol]
" .->5
+ 4-. "Lê de e escreve em
[HTTPS/JSON]
" .->6
+ 4-. "Envia evento de adição de
nova imagem para
[AMQP]
" .->8
+ 9-. "Consome eventos de
[AMQP]
" .->8
+ 9-. "Escreve imagens em
[HTTPS/JSON]
" .->6
+ 4-. "Consome conteúdo estático de
[HTTPS/JSON]
" .->6
+ end
+```
+
+## SystemContext
+
+```mermaid
+graph TB
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["CMS - System Context"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1["Leitor
[Person]
Pessoa que consome as
notícias do site.
"]
+ style 1 fill:#08427b,stroke:#052e56,color:#ffffff
+ 2["Editor
[Person]
Pessoa que escreve conteúdo
para o site.
"]
+ style 2 fill:#08427b,stroke:#052e56,color:#ffffff
+ 3("CMS
[Software System]
Sistema de gerenciamento de
conteúdo.
")
+ style 3 fill:#1168bd,stroke:#0b4884,color:#ffffff
+
+ 1-. "Consome notícias e conteúdo
em
" .->3
+ 2-. "Escreve conteúdo em
" .->3
+ end
+```
+
diff --git a/icones/diagramas.md b/icones/diagramas.md
new file mode 100644
index 0000000..6a4e0d7
--- /dev/null
+++ b/icones/diagramas.md
@@ -0,0 +1,23 @@
+## Icones
+
+```mermaid
+graph TB
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["Exemplos de Ícones"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1["Título 2
[tecnologia]
Descrição de um elemento.
"]
+ style 1 fill:#dddddd,stroke:#9a9a9a,color:#000000
+ 2["Título 3
[tecnologia]
Descrição de um elemento.
"]
+ style 2 fill:#dddddd,stroke:#9a9a9a,color:#000000
+ 3["Título 4
[tecnologia]
Descrição de um elemento.
"]
+ style 3 fill:#dddddd,stroke:#9a9a9a,color:#000000
+ 4["Título 5
[tecnologia]
Descrição de um elemento.
"]
+ style 4 fill:#dddddd,stroke:#9a9a9a,color:#000000
+ 5["Título 6
[tecnologia]
Descrição de um elemento.
"]
+ style 5 fill:#dddddd,stroke:#9a9a9a,color:#000000
+
+ end
+```
+
diff --git "a/imers\303\243o-full-cycle/ContainerDiagram-key.png" b/imersaofc/ContainerDiagram-key.png
similarity index 100%
rename from "imers\303\243o-full-cycle/ContainerDiagram-key.png"
rename to imersaofc/ContainerDiagram-key.png
diff --git "a/imers\303\243o-full-cycle/ContainerDiagram.png" b/imersaofc/ContainerDiagram.png
similarity index 100%
rename from "imers\303\243o-full-cycle/ContainerDiagram.png"
rename to imersaofc/ContainerDiagram.png
diff --git "a/imers\303\243o-full-cycle/ContextDiagram-key.png" b/imersaofc/ContextDiagram-key.png
similarity index 100%
rename from "imers\303\243o-full-cycle/ContextDiagram-key.png"
rename to imersaofc/ContextDiagram-key.png
diff --git "a/imers\303\243o-full-cycle/ContextDiagram.png" b/imersaofc/ContextDiagram.png
similarity index 100%
rename from "imers\303\243o-full-cycle/ContextDiagram.png"
rename to imersaofc/ContextDiagram.png
diff --git "a/imers\303\243o-full-cycle/LiveDeployment-key.png" b/imersaofc/LiveDeployment-key.png
similarity index 100%
rename from "imers\303\243o-full-cycle/LiveDeployment-key.png"
rename to imersaofc/LiveDeployment-key.png
diff --git "a/imers\303\243o-full-cycle/LiveDeployment.png" b/imersaofc/LiveDeployment.png
similarity index 100%
rename from "imers\303\243o-full-cycle/LiveDeployment.png"
rename to imersaofc/LiveDeployment.png
diff --git "a/imers\303\243o-full-cycle/imersaofc.dsl" b/imersaofc/imersaofc.dsl
similarity index 100%
rename from "imers\303\243o-full-cycle/imersaofc.dsl"
rename to imersaofc/imersaofc.dsl
diff --git "a/imers\303\243o-full-cycle/imersaofc.json" b/imersaofc/imersaofc.json
similarity index 100%
rename from "imers\303\243o-full-cycle/imersaofc.json"
rename to imersaofc/imersaofc.json
diff --git "a/imers\303\243o-full-cycle/imersaofc.puml" b/imersaofc/imersaofc.puml
similarity index 100%
rename from "imers\303\243o-full-cycle/imersaofc.puml"
rename to imersaofc/imersaofc.puml
diff --git "a/imers\303\243o-full-cycle/structurizr.properties" b/imersaofc/structurizr.properties
similarity index 100%
rename from "imers\303\243o-full-cycle/structurizr.properties"
rename to imersaofc/structurizr.properties
diff --git "a/inten\303\247\303\265es/IntencoesAntes-key.png" b/intencoes/IntencoesAntes-key.png
similarity index 100%
rename from "inten\303\247\303\265es/IntencoesAntes-key.png"
rename to intencoes/IntencoesAntes-key.png
diff --git "a/inten\303\247\303\265es/IntencoesAntes.png" b/intencoes/IntencoesAntes.png
similarity index 100%
rename from "inten\303\247\303\265es/IntencoesAntes.png"
rename to intencoes/IntencoesAntes.png
diff --git "a/inten\303\247\303\265es/IntencoesDepois-key.png" b/intencoes/IntencoesDepois-key.png
similarity index 100%
rename from "inten\303\247\303\265es/IntencoesDepois-key.png"
rename to intencoes/IntencoesDepois-key.png
diff --git "a/inten\303\247\303\265es/IntencoesDepois.png" b/intencoes/IntencoesDepois.png
similarity index 100%
rename from "inten\303\247\303\265es/IntencoesDepois.png"
rename to intencoes/IntencoesDepois.png
diff --git "a/inten\303\247\303\265es/hidden.puml" b/intencoes/hidden.puml
similarity index 100%
rename from "inten\303\247\303\265es/hidden.puml"
rename to intencoes/hidden.puml
diff --git "a/inten\303\247\303\265es/intencoes.dsl" b/intencoes/intencoes.dsl
similarity index 100%
rename from "inten\303\247\303\265es/intencoes.dsl"
rename to intencoes/intencoes.dsl
diff --git "a/inten\303\247\303\265es/intencoes.json" b/intencoes/intencoes.json
similarity index 100%
rename from "inten\303\247\303\265es/intencoes.json"
rename to intencoes/intencoes.json
diff --git "a/inten\303\247\303\265es/show.puml" b/intencoes/show.puml
similarity index 100%
rename from "inten\303\247\303\265es/show.puml"
rename to intencoes/show.puml
diff --git "a/inten\303\247\303\265es/structurizr.properties" b/intencoes/structurizr.properties
similarity index 100%
rename from "inten\303\247\303\265es/structurizr.properties"
rename to intencoes/structurizr.properties
diff --git a/maonamassa/diagramas.md b/maonamassa/diagramas.md
new file mode 100644
index 0000000..439b7af
--- /dev/null
+++ b/maonamassa/diagramas.md
@@ -0,0 +1,58 @@
+## ContainerDiagram
+
+```mermaid
+graph LR
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["Mão na Massa CMS - Containers"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1["Usuário
[Person]
Consumidor de conteúdo.
"]
+ style 1 fill:#08427b,stroke:#052e56,color:#ffffff
+ 2["Admin
[Person]
Administrador de conteúdo.
"]
+ style 2 fill:#08427b,stroke:#052e56,color:#ffffff
+
+ subgraph 3 [Mão na Massa CMS]
+ style 3 fill:#ffffff,stroke:#0b4884,color:#0b4884
+
+ 4("Plataforma WEB - SPA
[Container: Vue.js]
Prover conteúdo para usuarios
e acesso administrativo ao
CMS.
")
+ style 4 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 5("Mobile
[Container: Flutter]
Prover conteúdo para usuarios
e acesso administrativo ao
CMS.
")
+ style 5 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 6("Backend
[Container: NestJS, Typescript]
Gerenciar e prover conteúdos
da plataforma e controle de
acesso.
")
+ style 6 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 7("Banco de dados SQL
[Container: PostgreSQL]
Armazenar informações dos
usuários e de conteúdo.
")
+ style 7 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ end
+
+ 1-. "Acessa o conteúdo do
[HTTPS]
" .->5
+ 2-. "Acessa painel administrativo
da
[HTTPS]
" .->4
+ 2-. "Acessa painel administrativo
do
[HTTPS]
" .->5
+ 4-. "Realiza chamadas de api no
[HTTPS, JSON]
" .->6
+ 5-. "Realiza chamadas de api no
[HTTPS, JSON]
" .->6
+ 6-. "Lê e escreve no
" .->7
+ 1-. "Acessa o conteúdo da
[HTTPS]
" .->4
+ end
+```
+
+## ContextDiagram
+
+```mermaid
+graph TB
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["Mão na Massa CMS - System Context"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1["Usuário
[Person]
Consumidor de conteúdo.
"]
+ style 1 fill:#08427b,stroke:#052e56,color:#ffffff
+ 2["Admin
[Person]
Administrador de conteúdo.
"]
+ style 2 fill:#08427b,stroke:#052e56,color:#ffffff
+ 3("Mão na Massa CMS
[Software System]
")
+ style 3 fill:#1168bd,stroke:#0b4884,color:#ffffff
+
+ 2-. "Acessa painel administrativo
da
[HTTPS]
" .->3
+ 1-. "Acessa o conteúdo da
[HTTPS]
" .->3
+ end
+```
+
diff --git a/relacionamentos/diagramas.md b/relacionamentos/diagramas.md
new file mode 100644
index 0000000..b32053f
--- /dev/null
+++ b/relacionamentos/diagramas.md
@@ -0,0 +1,46 @@
+## RelacionamentosAntes
+
+```mermaid
+graph LR
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["Relacionamentos Antes"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1("Sistema de Dados Comerciais
[Software System]
Um sistema de dados
comerciais.
")
+ style 1 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 2("Sistema de Risco Financeiro
[Software System]
Um sistema de risco
financeiro.
")
+ style 2 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 5("Aplicativo de Página Única
[Container: NestJS]
Fornece acesso a páginas web.
")
+ style 5 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 6("Aplicativo API
[Container: Python e FastAPI]
Fornece API de dados.
")
+ style 6 fill:#438dd5,stroke:#2e6295,color:#ffffff
+
+ 1-. "Dados Comerciais
" .->2
+ 5-. "Usa
" .->6
+ end
+```
+
+## RelacionamentosDepois
+
+```mermaid
+graph LR
+ linkStyle default fill:#ffffff
+
+ subgraph diagram ["Relacionamentos Depois"]
+ style diagram fill:#ffffff,stroke:#ffffff
+
+ 1("Sistema de Dados Comerciais
[Software System]
Um sistema de dados
comerciais.
")
+ style 1 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 2("Sistema de Risco Financeiro
[Software System]
Um sistema de risco
financeiro.
")
+ style 2 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 5("Aplicativo de Página Única
[Container: NestJS]
Fornece acesso a páginas web.
")
+ style 5 fill:#438dd5,stroke:#2e6295,color:#ffffff
+ 6("Aplicativo API
[Container: Python e FastAPI]
Fornece API de dados.
")
+ style 6 fill:#438dd5,stroke:#2e6295,color:#ffffff
+
+ 1-. "Envia dados comerciais para
" .->2
+ 5-. "Faz chamadas de API
utilizando
" .->6
+ end
+```
+
diff --git a/scripts/gerar-diagramas.sh b/scripts/gerar-diagramas.sh
new file mode 100644
index 0000000..73e6c5e
--- /dev/null
+++ b/scripts/gerar-diagramas.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+function _gerar_markdown() {
+ arquivo_mmd="$1"
+ conteudo_mmd=$(cat "$arquivo_mmd")
+
+ arquivo_sem_extensao="${arquivo_mmd%.*}"
+ echo "## ${arquivo_sem_extensao##*-}"
+ echo ""
+ echo "\`\`\`mermaid"
+ echo "$conteudo_mmd"
+ echo "\`\`\`"
+ echo ""
+}
+
+nome=$1
+
+/usr/local/structurizr-cli/structurizr.sh export \
+ -format mermaid \
+ -workspace "$nome"/"$nome".dsl
+
+[ -f "$nome"/diagramas.md ] && rm "$nome"/diagramas.md
+for arquivo_mmd in "$nome"/*.mmd; do
+ _gerar_markdown "$arquivo_mmd" >>"$nome"/diagramas.md
+done