CAFÉ AURORA — WEB II — CHECKPOINT DO CAPÍTULO 9

Este checkpoint serve para conferência ou retomada depois da construção prática.
Ele inclui os capítulos anteriores e acrescenta a exclusão controlada de mensagens respondidas.

COMO EXECUTAR
1. Abra a pasta cafe-aurora-web2 no VS Code.
2. Confira o PHP, o driver SQLite e a sintaxe:
   php -v
   php -m | findstr /I "PDO sqlite"
   php -l src/inicializar-banco.php
   php -l public/admin/painel.php
   php -l public/admin/atualizar-status.php
   php -l public/admin/excluir-mensagem.php
3. Execute novamente o inicializador, mesmo que o banco já exista:
   php src/inicializar-banco.php
4. Se ainda não houver credencial, crie uma:
   php src/criar-administrador.php
5. Inicie o servidor:
   php -S localhost:8000 -t public
6. Envie ao menos três mensagens em http://localhost:8000/contato.php.
7. Entre em http://localhost:8000/admin/entrar.php.
8. Deixe uma mensagem Nova, outra Em atendimento e outra Respondida.
9. Confirme que apenas a respondida oferece a opção de exclusão.
10. Marque a confirmação, exclua a mensagem respondida e verifique que somente ela desapareceu.

O QUE FOI ACRESCENTADO
- critério de negócio: somente mensagens respondidas podem ser excluídas;
- formulário de exclusão separado do formulário de atualização;
- confirmação explícita por caixa de seleção;
- botão e área visualmente identificados como ação destrutiva;
- rota administrativa exclusiva para a exclusão;
- validação do ID, da confirmação e do filtro de retorno;
- exigência de autenticação, método POST e token CSRF;
- DELETE preparado com marcador para o ID;
- cláusula WHERE com ID e estado respondida;
- conferência da quantidade de linhas removidas;
- mensagem temporária de sucesso ou erro;
- redirecionamento 303 e preservação do filtro atual.

CONFIRA
- acessar excluir-mensagem.php por GET retorna 405;
- remover ou alterar o token CSRF retorna 403;
- enviar ID zero, negativo ou inexistente não remove outra mensagem;
- retirar ou inventar o valor de confirmação é rejeitado;
- alterar o ID para uma mensagem Nova ou Em atendimento não a exclui;
- somente a mensagem Respondida identificada pode ser removida;
- recarregar o painel não repete o DELETE;
- o filtro por assunto permanece depois da tentativa;
- atualizar estados e encerrar a sessão continuam funcionando.

IMPORTANTE
- nunca execute DELETE sem verificar sua cláusula WHERE;
- esconder o botão não substitui a regra no servidor;
- required é uma ajuda da interface, não uma barreira de segurança;
- o exercício não define prazo universal de retenção;
- retenção real depende de finalidade, necessidade e obrigações aplicáveis;
- backup, arquivamento, anonimização e exclusão não são equivalentes;
- o próximo capítulo transformará testes manuais importantes em verificações repetíveis.
