Rullst AcademyRullst Academy/Lição
Aplicações com Rullst I · Lição 08 / 14

Criar: texto continua sendo dado

Um apóstrofo no título não deve quebrar a consulta.

Trilhas de aprendizado18 min

Vamos descobrir juntos

  1. 1

    No fluxo POST, o handler recebe JSON, valida e chama Store::create. A SQL usa VALUES (?, ?); bind envia título e prioridade como valores. Não monte SQL concatenando entrada: O'Brien é um nome comum, e outros textos podem parecer comandos.

  2. 2

    Depois do INSERT, last_insert_rowid identifica o registro criado. A resposta 201 devolve esse id e os valores normalizados, incluindo done=false. Um título repetido cria outro registro; o projeto não definiu unicidade do título nem deduplicação de envios.

  3. 3

    Inspecione o teste com apóstrofo, marcação HTML e texto parecido com SQL. Depois da chamada, a tabela continua existindo e o título é preservado como texto. Isso verifica esse caminho parametrizado; não prova que toda aplicação é imune a injeção nem resolve autorização.

  4. 4

    Um INSERT isolado é atômico no SQLite: ou o registro é inserido, ou a instrução falha. Se uma futura ação modificar várias tabelas como uma unidade, será preciso uma transação envolvendo todas as etapas. Não chame duas gravações independentes de transação única.

Sua bancada de aplicações

O kit inclui o aplicativo completo para investigar e modificar. O trecho abaixo explica esta etapa; o editor contém o arquivo indicado. A Rullst Academy não compila nem executa esse servidor no navegador.

Arquivo para estudar e modificar

src/store.rs

sqlx::query("INSERT INTO missions (title, priority) VALUES (?, ?)")
    .bind(&input.title)
    .bind(input.priority)
    .execute(&self.pool).await?

Extraia o kit numa pasta nova e abra o terminal junto a Cargo.toml. Use Rust 1.96+; o primeiro build pode baixar dependências e demorar. Depois abra http://127.0.0.1:3010. Pare com Ctrl+C e execute novamente após editar.

cargo test --locked
cargo run --locked
Meus arquivos e GitHub

Baixe seu rascunho e substitua o arquivo indicado na sua cópia extraída. O editor guarda um arquivo neste navegador; a conta guarda avaliações e XP. O ZIP não contém suas alterações. GitHub envia só o arquivo confirmado; para o aplicativo completo use Git manual, sem bancos, backups ou segredos.

Links oficiais e próximo passo

✦
SUA MISSÃO

Seguir uma criação validada até o INSERT parametrizado e a resposta 201.

Agora é a sua vez

Oficina de descobertas

Decida antes de executar

Seguir uma criação validada até o INSERT parametrizado e a resposta 201.
Monte suas respostas e confira quando estiver pronto.
Uma pausa para entender

Duas criações com o mesmo título produzem o quê neste projeto?

Preciso de uma pista

Não há unicidade de título nem chave de idempotência para POST. Esse limite precisa ser conhecido antes de repetir um envio incerto.

Carregando sua jornada…

Leve com você

Crie um título com apóstrofo e confira resposta, listagem e reinício. Acrescente um teste com outra entrada incomum válida. Explique por que bind separa instrução e valor, sem prometer resolver permissões.

No seu ritmo

Meus arquivos e GitHub

Toda lição pode virar um registro seu: código, anotações ou um plano de prática. Guardar um arquivo no GitHub é opcional e não altera seu XP.

Manual do aluno

O editor e os downloads abrem quando esta lição estiver liberada para sua conta. Confira o acesso abaixo ou volte ao mapa da trilha.

Conferindo seu acesso à lição…

Rullstpetbot

A IA pode errar. Confira no material da lição.