Você tem uma aplicação CRUD (Create, Read) funcional. Agora, vamos adicionar o "U" (Update) para marcar um "todo" como feito. Você verá que o padrão é exatamente o mesmo que usamos para criar "todos".

⚙️ Parte 1: Atualizando o Backend (A API)

Passo B.1: Adicionar a Lógica ao db.clj

Precisamos de uma função que receba um id e "vire" o valor de completed no banco de dados.

Ação: Abra src/todo/backend/db.clj e adicione esta nova função no final:

(defn toggle-todo!
  "Alterna o status 'completed' de um todo no banco."
  [id]
  ;; (1 - completed) é um truque SQL para inverter 0 -> 1 e 1 -> 0.
  (jdbc/execute-one! db-spec ["
    UPDATE todos
    SET completed = (1 - completed)
    WHERE id = ?
    RETURNING *"
    id
  ]))

Passo B.2: Adicionar o Handler ao handler.clj

Ação: Abra src/todo/backend/handler.clj e adicione esta função no final:

(defn toggle-todo-handler
  "Handler para 'alternar' o status de um todo."
  [request]
  (let [id (-> request :path-params :id Integer/parseInt)]
    (if-let [updated-todo (db/toggle-todo! id)]
      {:status 200 :body updated-todo}
      {:status 404 :body {:error "Todo não encontrado"}})))

Passo B.3: Adicionar a Rota ao core.clj

Ação: Abra src/todo/backend/core.clj e adicione esta nova rota dentro de app-routes (junto à rota GET/POST de /todos):

    ["/todos/:id/toggle"
     {:post {:handler handler/toggle-todo-handler}}]

✅ Ação do Backend Concluída! Pare e reinicie seu servidor de backend (clj -M:run).


⚡️ Parte 2: Atualizando o Frontend (A UI)

Passo B.4: Adicionar a Função de API ao core.cljs

Ação: Abra src/todo/frontend/core.cljs e adicione esta função fetch (junto com get-todos e create-todo):