📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Especialização em Backend com Java e Spring Boot. Recomendado revisar antes de começar.

🎮 Biblioteca de Jogos 02 — Refatoração SOLID/DRY

Trilha de Aprendizado — Projeto 2 de 4

🎓 Nível profissional simulado: Júnior. Nenhuma feature nova em relação ao _01 — só reorganização. Um júnior reconhece dois problemas reais no código anterior e sabe nomeá-los: entidade JPA exposta direto no formulário (sem validação) e controller acessando o repositório sem nenhuma camada de regra de negócio no meio.`

🎯 Objetivo

Partir do código do Biblioteca de Jogos 01 e refatorar, sem adicionar feature nenhuma.`

🔍 Os 2 Problemas Encontrados no Código do _01

Problema 1 — Formulário sem validação, bind direto na entidade

// _01 (antes)
@PostMapping("/jogos")
public String adicionar(@ModelAttribute Jogo novoJogo) {
    jogoRepository.save(novoJogo);
    return "redirect:/";
}

Nada impede o cadastro de um jogo com título vazio — o form HTML tinha required, mas isso só protege contra o usuário usando o navegador normalmente; qualquer requisição HTTP direta (Postman, curl) passa batido.

Fix: NovoJogoDTO com @NotBlank nos dois campos, validado no controller com @Valid + BindingResult, mensagens de erro exibidas no formulário.

Problema 2 — Controller acessando o Repository direto

// _01 (antes)
@Autowired
private JogoRepository jogoRepository;

@PostMapping("/jogos/{id}/concluir")
public String marcarConcluido(@PathVariable Long id) {
    jogoRepository.findById(id).ifPresent(jogo -> { /* ... */ });
    return "redirect:/";
}

Fix: JogoService extraído, usado pelo JogoController — hoje os métodos só repassam pro repositório, mas a regra de negócio (ex.: “não permitir apagar um jogo com mais de X horas registradas”) tem onde crescer sem tocar no controller.`

✅ Checkpoint

  1. grep -r JogoRepository src/main/java/.../controller/ deve vir vazio — só classes em service/ acessam o repositório.
  2. Tente enviar o formulário com o campo “Título” vazio — deve mostrar erro em vez de criar um jogo sem nome.
  3. O comportamento visível é idêntico ao _01.`

🏁 Executando o Projeto

cd bibliotecajogos
./mvnw spring-boot:run

Voltar para Projetos

—`

🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd javaweb_jogos_02_dto

2. Execute a aplicação e os testes

./mvnw spring-boot:run
./mvnw test

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/javaweb_jogos_02_dto