Files
manoel freitas 7a858b52af feat: implement CMS for content management (WEB-02/03/04/06)
Introduces Filament management for site settings, services, portfolio cases, and testimonials with admin-only policies, validated media uploads, and deterministic seeding. Includes comprehensive design and task documentation for the implementation.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 06:18:42 -03:00

6.4 KiB
Raw Permalink Blame History

Context

Repositório greenfield: contém SPEC.md (especificação normativa aprovada), scaffold OpenSpec e um commit inicial. Não existe aplicação Laravel, banco, CI ou contêiner.

Versões-alvo confirmadas no Packagist (jul/2026): Laravel 13.23, Filament 5.7, Livewire 4.3, Pest 4.7, Larastan 3.10, Pint 1.29. Ambiente local: PHP 8.5.8, Composer 2.9.5, Node 22, Docker 29 + Compose v5.3.

ADRs ADR-001..ADR-010 do SPEC §21 são aceitas e serão registradas em docs/adr/ sem reabertura de decisões.

Goals / Non-Goals

Goals:

  • Entregar esqueleto Laravel funcional com Filament autenticado, Livewire/Tailwind configurados e Postgres local.
  • Estabelecer gates de qualidade (Pint, Larastan, Pest, arch tests) e scripts Composer padronizados.
  • Produzir imagem Docker FrankenPHP reproduzível com healthcheck e processos web/queue/scheduler.
  • CI verde nos 5 jobs bloqueantes antes de avançar para Fase 1.
  • Design tokens mínimos e layout público placeholder para validar pipeline visual futuro.

Non-Goals:

  • Implementar requisitos funcionais das Fases 15 (site, CRM, eventos, financeiro, documentos).
  • Deploy em staging ou produção (adiado).
  • FrankenPHP worker mode, Redis, S3 em produção, integração de e-mail transacional.
  • Qualquer item listado em SPEC §4.2 "Fora do MVP".

Decisions

1. Bootstrap via composer create-project em diretório temporário

Decisão: Instalar Laravel 13 com composer create-project laravel/laravel em diretório temporário e mover arquivos para a raiz, preservando SPEC.md, openspec/ e .codex/.

Alternativas: Instalar na raiz (conflita com arquivos existentes); copiar skeleton manualmente (mais erro-prone).

Rationale: Padrão Laravel garante estrutura correta; evita sobrescrever artefatos de spec.

2. PostgreSQL 17 via Docker Compose local

Decisão: Serviço postgres:17 no Compose com volume nomeado, healthcheck e credenciais em .env.example.

Alternativas: SQLite local (proibido pelo SPEC §14.2 para integração); Postgres instalado no host (sem psql no ambiente).

Rationale: Alinha dev local com CI; evita diferenças SQLite/Postgres.

3. Sessão, cache e fila em database

Decisão: SESSION_DRIVER=database, CACHE_STORE=database, QUEUE_CONNECTION=database.

Alternativas: Redis (fora do MVP, ADR-008); file/cookie session (menos alinhado com deploy containerizado).

Rationale: ADR-008; sem dependência extra; migrations padrão Laravel cobrem tabelas.

4. Papéis via enum UserRole na coluna users.role

Decisão: Enum PHP UserRole: admin|assistant + coluna is_active boolean. Filament canAccessPanel() nega inativos.

Alternativas: Spatie Permission (proibido pelo SPEC §3.4); flags booleanas separadas.

Rationale: YAGNI; atende ADM-01 e §12.2 sem complexidade.

5. Design tokens como CSS custom properties + Tailwind theme extension

Decisão: Arquivo resources/css/tokens.css com custom properties; tailwind.config.js referencia tokens via theme.extend.

Alternativas: SCSS variables espalhadas; JSON tokens com build step extra.

Rationale: Centraliza SPEC §6.3; Tailwind consome nativamente; sem dependência extra.

6. Isolamento visual: layout público separado do painel Filament

Decisão: Layout Blade público em resources/views/layouts/public.blade.php com tokens próprios; Filament usa tema padrão do painel.

Alternativas: Tema Filament customizado para site (mistura concerns); component library compartilhada prematura.

Rationale: Mitiga conflito Tailwind 4 / Filament 5 / tema público premium.

7. FrankenPHP regular mode, multi-stage Dockerfile

Decisão: Dockerfile com stages composer, frontend, runtime (FrankenPHP). PHP fixado conforme suporte Laravel 13 no momento da instalação (8.4 ou 8.5). config:cache apenas no entrypoint/deploy, nunca em stage sem env final.

Alternativas: Nginx + PHP-FPM (SPEC exige FrankenPHP); worker mode (ADR-006 proíbe no MVP).

Rationale: ADR-006; imagem única para web/queue/scheduler (§15.2).

8. CI em GitHub Actions com PostgreSQL service container

Decisão: Workflow .github/workflows/ci.yml com jobs static, unit, feature, browser, container. Feature tests usam Postgres service; browser job builda imagem e roda Pest Browser com locale pt-BR, TZ America/Fortaleza, animações desabilitadas.

Alternativas: GitLab CI; CircleCI (remote já é GitHub).

Rationale: Remote manoel-freitas/amore-site; SPEC §14.1.

9. Estrutura de diretórios modular preparada, não populada

Decisão: Criar apenas diretórios quando primeiro arquivo for adicionado (SPEC §9.4). Na Fase 0, garantir tests/Architecture/ e namespace base; não criar app/Application/, app/Domain/ vazios.

Rationale: YAGNI; arch tests validam boundary quando Domain existir na Fase 2+.

Risks / Trade-offs

Risco Mitigação
Conflito Tailwind 4 + Filament 5 + tema público Layouts separados; Vite entries distintos se necessário
Snapshots visuais instáveis no CI Imagem Linux fixa, fontes instaladas, relógio congelado, seed determinístico (preparação na Fase 1)
config:cache congela env incorreto Cache apenas no entrypoint com env final do deploy
PHP 8.5 muito novo para alguma extensão Fixar versão PHP no Dockerfile conforme matriz Laravel 13; testar build no job container
Filament panel + Livewire 4 coexistência Seguir docs oficiais de instalação Filament 5; testes feature de login

Migration Plan

  1. Bootstrap Laravel em diretório temp → mover para raiz.
  2. Configurar .env / .env.example com Postgres e locale.
  3. Instalar Filament, Pest, Larastan, Pint; configurar scripts Composer.
  4. Adicionar Compose, Dockerfile, CI workflow.
  5. Seed admin local; documentar credenciais apenas para dev.
  6. Validar composer quality e jobs CI no PR.

Rollback: Reverter commit da Fase 0; repo volta ao estado spec-only.

Open Questions

  • Staging target: VPS próprio, Fly.io, Render ou Railway — decisão adiada; change futura para deploy.
  • Registry de imagem: GitHub Container Registry vs Docker Hub — definir na change de deploy.
  • Provedor S3-compatible: necessário na Fase 1+ para mídia pública; local usa storage/app/public ou MinIO opcional no Compose.
  • Provedor de e-mail: necessário na Fase 2 (notificação de leads); Fase 0 usa log driver ou Mailpit no Compose opcional.