Tema
/
Interneto svetainių serverio dalies kūrimas GO

Įpink įvykį į kiekvieną būsenos pokytį

Penki failai kortelėse. Audito pagalbininkas dabar persmelkia kiekvieną būsenos pokytį, o detalės puslapis įgyja pėdsaką. documents.gosigning.gosigning_view.goweb/signing.godocuments.templ.

1. internal/handlers/documents.go (keitimas) — du valdikliai įgyja įvykį, transakcijos viduje:

  • UploadDocument dabar apgaubia CreateDocument ir evtUploaded įvykį vienoje transakcijoje (atšaukdamas failą, jei bet kuris nepavyksta).
  • DeleteDocument apgaubia DeleteDraftDocument ir evtDeleted įvykį vienoje transakcijoje — ir čia atlygis: kadangi document_id yra be išorinio rakto, trynimas pašalina dokumentą, o jo audito eilutės (įskaitant „Deleted draft") lieka.
  • renderDocumentDetail užrašo evtTamper įvykį, kai vientisumas nepavyksta peržiūroje, įkelia pėdsaką su ListAuditEventsByDocument ir paduoda jį puslapiui.

2. internal/handlers/signing.go (keitimas) — pasirašymo srautas užrašo įdomias akimirkas: evtSent (kvietimo transakcijoje), evtViewed (geriausiomis pastangomis, kai laukiantis pasirašytojas atveria nuorodą), evtSigned ir — paskutiniam pasirašytojui — evtCompleted (abu pasirašymo transakcijoje), ir evtBadToken (pakartotinio pasirašymo ar pasibaigusios nuorodos bandymas). Kiekvienas naudoja tinkantį veikėją: actorUser, actorSigner ar actorSystem.

3. internal/handlers/signing_view.go (keitimas) — pridėk viewAuditEvents, kuris atvaizduoja db.AuditEvent eilutes į web.AuditView ir pažymi su saugumu susijusius tipus (bad_token, tamper_detected) pabrėžimui.

4. internal/web/signing.go (keitimas) — pridėk AuditView struktūrą.

5. internal/web/documents.templ (keitimas) — DocumentDetail įgyja events parametrą ir atvaizduoja @AuditLog(events); AuditLog — naujas komponentas, rodantis kiekvieno įvykio laiką, žinutę ir veikėją, su paryškintomis saugumo eilutėmis.

Patikra — perseeduok, paleisk ir pereik visą srautą, stebėdamas audito pėdsaką dokumento puslapyje:

  • Įkelk dokumentą, atverk jį — pėdsakas rodo vieną įvykį: Uploaded "contract.pdf" ..., veikėjas tu.
  • Išsiųsk jį dviem pasirašytojams — Sent for signature to 2 signer(s) įvykis, veikėjas tu.
  • Atverk pasirašymo nuorodą — ... opened the signing link įvykis, veikėjas signer. Pasirašyk... signed as "..." įvykis. Pasirašyk kaip antras — signed, tada All invited signers have signed — document completed, veikėjas system. Du įvykiai vienoje transakcijoje, ta pati laiko žyma, rikiuota pagal seq.
  • Suklastok failą (kaip praėjusią pamoką) ir perkrauk — Integrity check FAILED įvykis, paryškintas.

Dabar savybė, dėl kurios visa lentelė buvo sukurta. Ištrink juodraštį ir patvirtink, kad jo istorija pergyvena jį patį:

$ psql "$DATABASE_URL" -c "select event_type, actor_label, message from audit_events
                           where document_id='<ištrinto juodraščio id>' order by seq;"
    event_type      | actor_label |            message
--------------------+-------------+--------------------------------
 document.uploaded  | you@ex.com  | Uploaded "notes.txt" (12 B, ...)
 document.deleted   | you@ex.com  | Deleted draft "notes.txt"

documents eilutė dingusi; jos audito eilutės lieka, document_id vis dar nustatytas. Išorinis raktas būtų jas kaskadiškai pašalinęs arba užblokavęs trynimą. Be išorinio rakto — būtent todėl pėdsakas išlieka, visos pamokos esmė.