Objetivo: Substituir nosso db.clj "de mentira" (o atom) por um db.clj "de verdade" que usa um banco de dados SQLite.

Por que SQLite? É o banco de dados mais simples de usar. Ele não requer um servidor separado (como o PostgreSQL) e armazena o banco de dados inteiro em um único arquivo (ex: prod.db) no seu projeto.

Nossa "Cirurgia": A parte mais legal desta fase é o quão pouco código vamos mudar. Graças à forma como estruturamos nosso aplicativo, nós só precisamos mudar o db.clj.

Os arquivos handler.clj e core.clj (que lidam com a API) não se importam como os dados são armazenados; eles apenas chamam funções como (db/get-all-todos). Vamos simplesmente reescrever o interior dessas funções para falar com SQL em vez de um atom.


Passo 5.1: Adicionar as Dependências do Banco de Dados

Primeiro, precisamos dizer ao deps.edn para baixar as "ferramentas" de banco de dados.

Ação: Abra seu arquivo deps.edn e adicione estas duas linhas ao seu bloco :deps:

 :deps
 {;; ... (dependências do backend) ...
  ring/ring-cors {:mvn/version "0.1.13"}

  ;; --- ADICIONE ESTAS DUAS LINHAS ---
	seancorfield/next.jdbc {:mvn/version "1.2.659"}
  org.xerial/sqlite-jdbc {:mvn/version "3.45.3.0"}
  
  ;; --- Dependências do Frontend ---
  thheller/shadow-cljs {:mvn/version "2.26.2"}
  reagent/reagent {:mvn/version "2.0.0-alpha5"}
  }

O que fizemos?

Nossa "lista de compras" (deps.edn) agora inclui as ferramentas necessárias para que o Clojure se conecte e execute comandos SQL em um banco de dados SQLite.

Passo 5.2 (Novo): Entendendo o next.jdbc (no REPL)

Objetivo: Aprender como o next.jdbc funciona em isolamento, antes de integrá-lo. Vamos criar um banco, inserir dados e ler dados, tudo a partir do REPL.

A "Cirurgia": A parte mais legal desta fase é o quão pouco código vamos mudar. Graças à forma como estruturamos nosso aplicativo, nós só precisamos mudar o db.clj.

Os arquivos handler.clj e core.clj (que lidam com a API) não se importam como os dados são armazenados; eles apenas chamam funções como (db/get-all-todos). Vamos simplesmente reescrever o interior dessas funções para falar com SQL em vez de um atom.


Ação 1: Crie a "Especificação" do Banco