80 lines
3.5 KiB
Markdown
80 lines
3.5 KiB
Markdown
# FASE 0 — Bootstrap do monorepo
|
|
|
|
## Objetivo
|
|
|
|
Estrutura completa do monorepo, ambiente Docker subindo, CI verde. Nenhuma regra de negócio ainda — apenas o esqueleto onde tudo será construído.
|
|
|
|
## Pré-requisitos
|
|
|
|
Ler `docs/01-ARQUITETURA.md` (§3 estrutura do monorepo) e `docs/05-INFRA-DOCKER.md` (compose completo).
|
|
|
|
## Tarefas
|
|
|
|
### 1. Raiz do Gradle
|
|
|
|
`settings.gradle.kts` incluindo `:shared` e `:backend`. Version catalog em `gradle/libs.versions.toml` com: Kotlin 2.1+, Spring Boot 3.4+, jOOQ, Flyway, PostGIS driver, Testcontainers, ShedLock, Resilience4j, LiveKit server SDK, kotlinx.serialization, kotlinx.datetime.
|
|
|
|
JDK 21. Toolchain configurado explicitamente.
|
|
|
|
### 2. Módulo `shared/`
|
|
|
|
KMP com targets `jvm()`, `androidTarget()`, `iosArm64()`, `iosSimulatorArm64()`. Pacote base `br.com.portaria.shared`. Apenas kotlinx.serialization e kotlinx.datetime como dependências — **este módulo não conhece Spring, Android nem iOS**.
|
|
|
|
Pacotes vazios criados: `model/`, `dto/`, `state/`, `validation/`.
|
|
|
|
### 3. Módulo `backend/`
|
|
|
|
Spring Boot 3 + Kotlin, estrutura hexagonal conforme `01-ARQUITETURA.md` §3. Perfis `local`, `test`, `prod`. Actuator com `health`, `prometheus`, `info` expostos. OpenAPI via springdoc em `/v3/api-docs`.
|
|
|
|
Um controller `GET /api/v1/health` devolvendo `{"status":"UP"}`, só para provar a esteira ponta a ponta.
|
|
|
|
### 4. `web/` com pnpm workspaces
|
|
|
|
`pnpm-workspace.yaml` com `visitor`, `admin`, `shared-ui`. Vite + React 19 + TS em ambos os apps. `visitor` configurado como PWA.
|
|
|
|
`shared-ui` exporta `tokens.json` e o `tokens.css` gerado. Script `pnpm tokens:build` que gera `tokens.css` e `Theme.kt` a partir do JSON — ver `docs/04-DESIGN-SYSTEM-UX.md` §2.
|
|
|
|
### 5. `apps/` Compose Multiplatform
|
|
|
|
`composeApp` (comum), `androidApp`, `iosApp`. Depende de `:shared`. Uma tela "Hello Portaria" em ambas as plataformas, apenas para validar o build.
|
|
|
|
### 6. `infra/`
|
|
|
|
`docker-compose.yml` exatamente como em `docs/05-INFRA-DOCKER.md` §2, mais `docker-compose.observability.yml` e `.env.example`. Configs em `livekit/livekit.yaml`, `traefik/`, `postgres/init/01-extensions.sql` (`CREATE EXTENSION postgis; CREATE EXTENSION pgcrypto;`) e `postgres/init/02-roles.sh` (cria o papel `portaria_app`, sem ownership, com a senha de `POSTGRES_APP_PASSWORD` — ver `02-MODELO-DE-DADOS.md` §8).
|
|
|
|
### 7. CI — GitHub Actions
|
|
|
|
```
|
|
.github/workflows/ci.yml
|
|
├─ gradle build (backend + shared, com Testcontainers)
|
|
├─ pnpm lint && test && build
|
|
├─ gate de bundle: visitor > 200KB gzip → FALHA
|
|
├─ docker compose config
|
|
└─ verificação de contraste dos tokens
|
|
```
|
|
|
|
O gate de bundle não é opcional — a escolha de React em vez de Wasm foi motivada por TTI, e sem gate automático essa vantagem se perde em poucas sprints.
|
|
|
|
### 8. Documentação de arranque
|
|
|
|
`README.md` na raiz com pré-requisitos, `docker compose up`, como rodar cada app, e o mapa de portas.
|
|
|
|
## Critérios de aceite
|
|
|
|
- [ ] `./gradlew build` verde
|
|
- [ ] `pnpm -r build` verde
|
|
- [ ] `docker compose -f infra/docker-compose.yml config` sem erro
|
|
- [ ] `docker compose up -d` sobe tudo; todos os healthchecks passam
|
|
- [ ] `GET /api/v1/health` responde via Traefik com TLS
|
|
- [ ] `/actuator/prometheus` expõe métricas
|
|
- [ ] App Android e iOS compilam e abrem a tela de teste
|
|
- [ ] `pnpm tokens:build` gera `tokens.css` e `Theme.kt`
|
|
- [ ] CI verde no primeiro push
|
|
|
|
## Não faça nesta fase
|
|
|
|
- Nenhuma tabela de negócio (é a FASE 1)
|
|
- Nenhum endpoint além do health
|
|
- Nenhuma tela real
|
|
- Nenhuma integração com LiveKit, FCM ou APNs
|