Objetivo: Fazer um servidor web subir, rodar na sua máquina e responder "Hello, World!" quando acessado por uma URL. Isso prova que nossa configuração base está correta.

Passo 1.1: O deps.edn (A "Lista de Compras" do Backend)

O que é o deps.edn? Pense neste arquivo como a "lista de compras" do seu projeto. Ele diz ao Clojure (clj) quais bibliotecas (dependências) de terceiros ele precisa baixar da internet para o seu projeto funcionar.

Ele também define "apelidos" (aliases), que são atalhos para comandos que usamos com frequência, como "rodar o servidor".

Ação: Crie o arquivo deps.edn na raiz do seu projeto (todo-app/) e cole o seguinte conteúdo nele:

{:paths ["src" "resources"] ;; 1. Onde nosso código-fonte vai ficar

 :deps ;; 2. Nossa "lista de compras" de bibliotecas
 {;; O próprio Clojure
  org.clojure/clojure {:mvn/version "1.11.1"} 

  ;; --- Dependências do Backend (API REST) ---
  ;; O "motor" do servidor web (Jetty) e as bibliotecas base do Ring
  ring/ring-core {:mvn/version "1.12.2"} 
  ring/ring-jetty-adapter {:mvn/version "1.12.2"} 

  ;; A biblioteca de roteamento (para definir as URLs)
  metosin/reitit-ring {:mvn/version "0.7.0"} 
  }

 :aliases ;; 3. Nossos "atalhos" de comando
 {;; O alias que usaremos para iniciar o servidor
  :run
  {:main-opts ["-m" "todo.backend.core"]} 
  }
 }

O que fizemos?

  1. :paths: Dissemos ao Clojure para procurar nosso código-fonte nas pastas src e resources (que ainda vamos criar).
  2. :deps: Pedimos apenas as bibliotecas essenciais do backend.
  3. :aliases: Criamos um atalho :run. Quando rodarmos clj -M:run, ele saberá que deve procurar e executar a função principal (-main) no namespace todo.backend.core (que vamos criar a seguir).

Agora que temos nossa "lista de compras", o próximo passo é criar o código que ela fará funcionar. Vamos criar nossa primeira função handler.

Pronto para o Passo 1.2: Criar o Handler Mínimo (handler.clj)?

Perfeito. Agora vamos escrever a primeira "peça" da nossa lógica de backend.

Fase 1, Passo 1.2: O Handler Mínimo (handler.clj)

O que é um "Handler"? No mundo do Ring (a biblioteca base da web em Clojure), um "Handler" é simplesmente uma função que segue um contrato:

  1. Ela recebe um argumento: um mapa request (um mapa Clojure com todos os dados da requisição HTTP que chegou).
  2. Ela retorna um valor: um mapa response (um mapa Clojure que descreve a resposta que queremos enviar de volta).

Nosso objetivo é criar a função hello-handler mais simples possível.

Ação 1: Criar os Diretórios