📄 Fase 8: README e Entrega¶
Objetivo: transformar o README.md padrão do Phoenix em uma documentação de verdade e fazer o checklist final do repositório.
Por que fazemos isso? O README é a porta de entrada de qualquer repositório — o primeiro (às vezes o único) arquivo que um colega, recrutador ou avaliador vai ler. O critério de qualidade é simples: alguém conseguiria clonar e rodar seu projeto lendo apenas o README?
📝 Passo 8.1: Atualizar o README.md¶
O phx.new já gerou um README.md genérico na raiz do projeto. Vamos substituí-lo por um personalizado. Adapte o modelo (nome, links, o que quiser):
# Todo List — Elixir + Phoenix LiveView
**Aluno(a):** Seu Nome Completo Aqui
**Tutorial original:** [Como Criar um App "Todo List" com Elixir e LiveView
do Zero](https://github.com/LambdaGeo/tutoriais)
## Descrição
Aplicação de lista de tarefas (Todo List) construída de forma incremental
para estudar a arquitetura **full-stack funcional reativa** do
[Phoenix LiveView](https://hexdocs.pm/phoenix_live_view):
- **Framework:** Phoenix 1.8 + LiveView 1.1 — o estado vive no servidor e a
interface atualiza em tempo real via WebSocket, sem JavaScript manual;
- **Persistência:** [Ecto](https://hexdocs.pm/ecto) + SQLite (schema,
migrations e validação com changesets);
- **Visual:** Tailwind CSS v4 + daisyUI.
Funcionalidades: criar tarefas (com validação), listar, marcar como
concluída (toggle) e excluir — tudo com atualização instantânea.
## Pré-requisitos
| Ferramenta | Versão |
| ---------- | --------- |
| Erlang/OTP | 26+ |
| Elixir | 1.17+ |
| Node.js | 18+ (LTS) |
## Como Rodar
```bash
git clone https://github.com/SEU-USUARIO/SEU-REPO.git
cd SEU-REPO
# Instala dependências e prepara os assets
mix setup
# Cria o banco SQLite e aplica as migrations
mix ecto.create
mix ecto.migrate
# Sobe o servidor
mix phx.server
```
Depois, abra [http://localhost:4000](http://localhost:4000) no navegador.
## Estrutura Principal
| Arquivo | Papel |
| -------------------------------------------- | ----------------------------------- |
| `lib/elixir_todo_list_web/live/todo_live.ex` | O LiveView (estado, eventos e HTML) |
| `lib/elixir_todo_list/task.ex` | O schema `Task` e seu changeset |
| `lib/elixir_todo_list/repo.ex` | A conexão com o banco (Ecto.Repo) |
| `priv/repo/migrations/` | As migrations do banco |
🧪 Passo 8.2: O Teste do "Colega"¶
Faça de conta que você é outra pessoa: clone o seu repositório em uma pasta nova (ex: /tmp/teste-todo) e siga o seu próprio README, literalmente. A aplicação subiu? O CRUD funciona? Os dados persistem após reiniciar o servidor?
Esse teste revela os dois vacilos clássicos:
- Banco commitado: se
git status/a página do GitHub mostrarelixir_todo_list.db(ou.db-shm/.db-wal), o.gitignoreda Fase 0 não foi aplicado antes do commit. Corrija com:
git rm --cached elixir_todo_list.db elixir_todo_list.db-shm elixir_todo_list.db-wal
git commit -m "Remove arquivos de banco do versionamento"
- Passo de setup faltando no README (ex: esquecer o
mix ecto.migrate— sem ele, a aplicação sobe mas quebra ao carregar as tarefas).
💾 Passo 8.3: Commit Final¶
✅ Passo 8.4: Checklist Final¶
Confira o histórico:
Esperado (de cima para baixo):
Fase 8: Atualiza README com instruções de execução
Fase 7: Ajusta o tema e personaliza o visual (Tailwind/daisyUI)
Fase 6: Implementa conclusão de tarefas (toggle_complete)
Fase 5: Implementa exclusão de tarefas (delete)
Fase 4: Refatora TodoLive para usar Ecto, Repo e to_form()
Fase 3: Persistência - Configura Ecto, Repo, Migrations e Task Schema
Fase 2: Lógica em Memória - Implementa adição de tarefas
Fase 1: Prova de Vida - Substitui a rota raiz por TodoLive
Fase 0: Gera o esqueleto do Phoenix com LiveView (sem Ecto)
Fase 0: Inicializa o repositório e .gitignore
Checklist:
- [ ] O repositório no GitHub é público e o
git pushfoi feito? - [ ] Nenhum arquivo
*.db,*.db-shmou*.db-walaparece no GitHub? - [ ] As pastas
_build/edeps/também não aparecem? - [ ] O README tem nome, link do tutorial, descrição e instruções que funcionam?
- [ ] O CRUD completo funciona e os dados sobrevivem ao restart do servidor?
🚀 Tutorial Concluído!¶
Parabéns! 🥳 Você construiu uma aplicação web full-stack funcional e reativa — e, se fez também o tutorial de Clojure, agora viu o mesmo problema resolvido por duas filosofias:
| Clojure | Elixir | |
|---|---|---|
| Onde vive o estado reativo | No navegador (r/atom) |
No servidor (socket/assigns) |
| Como a UI conversa com os dados | API REST + JSON + CORS | WebSocket interno (phx-*) |
| Onde a validação acontece | No handler, "à mão" | No changeset, declarativa |
| Quantos servidores em dev | Dois (API + shadow-cljs) | Um (mix phx.server) |
Quer ir além? Algumas extensões (opcionais):
- Um filtro "Todas / Ativas / Concluídas" (um
assign+ cláusulas dehandle_event); - Edição do título de uma tarefa (outro pequeno
<.form>por item); - Um contador "X de Y concluídas" no topo;
- Trocar o SQLite por PostgreSQL (
ecto_sqlite3→postgrex, e o adapter no Repo); - Explorar o Phoenix PubSub para que duas abas do navegador vejam as mudanças uma da outra em tempo real — a "mágica" concorrente da BEAM em ação.