Tema
/
Interneto svetainių serverio dalies kūrimas GO

Pasirašytojų lentelė ir transakcijų vamzdynas

Penki failai kortelėse, iš apačios į viršų: lentelė, jos užklausos, statuso pervertimo užklausa ir transakcijų vamzdynas. 00005_signers.sqlsigners.sqldocuments.sqlhandlers.gomain.go.

1. db/migrations/00005_signers.sql (naujas) — signers lentelė. Svarbūs stulpeliai: document_id (FK, ON DELETE CASCADE), email, token_hash TEXT NOT NULL UNIQUE, status (pending/signed), trys parašo stulpeliai (signed_name, signed_at, signed_doc_hash — užpildomi kitą pamoką) ir expires_at. UNIQUE (document_id, email) neleidžia to paties žmogaus pakviesti prie to paties dokumento du kartus. token_hash UNIQUE yra tai, kas leidžia žetonui sutapti su lygiai viena eilute.

2. internal/db/queries/signers.sql (naujas) — kol kas dvi užklausos: CreateSigner (įterpimas, RETURNING *) ir ListSignersByDocument (sąrašas). Pasirašymo + skaičiavimo užklausos atkeliaus kitą pamoką. Paleisk sqlc generate.

3. internal/db/queries/documents.sql (keitimas) — viena nauja užklausa, MarkDocumentSent: UPDATE ... SET status='sent' WHERE id=$1 AND owner_id=$2 AND status='draft'. Savininkui apribota ir juodraščiu apsaugota — ji negali perversti dokumento, kuris ne tavo ar ne juodraštis.

4. internal/handlers/handlers.go (keitimas) — Handlers struktūra įgyja Pool *pgxpool.Pool, o New jį priima. Užklausų metodai eina per Queries; neapdorotas Pool reikalingas tik transakcijoms atverti (pool.Begin). Tai pirmas valdiklis, kuriam reikia daugiau nei vieno atominio rašymo.

5. cmd/signflow/main.go (keitimas) — paduok jau atvertą telkinį į New:

h := handlers.New(cfg, pool, queries, sessions, mailer, store, log)

pool yra tas pats *pgxpool.Pool, ant kurio pastatytos užklausos; dabar valdikliai jį laiko ir tiesiogiai, kad galėtų atverti transakciją, kai vieno rašymo nepakanka.