Bloggen har brukerkontoer nå, som betyr at den har brukerdata, som betyr at EU-lovgivningen og min egen samvittighet er enige om at folk trenger to knapper: én for å laste ned alt jeg har om dem, og én for å få alt til å forsvinne. Dette er historien om å bygge begge, og om hvorfor slett-knappen egentlig ikke sletter.
Nedlastingsknappen var den enkle halvparten. Ett endepunkt som samler alt knyttet til kontoen din fra begge tjenestene (kontodetaljene dine fra auth, kommentarene, likes og rapportene dine fra blog) og gir det tilbake som én JSON-fil. Ferdig, trodde jeg. Kodegjennomgangen fanget opp at jeg hadde lagt den bak innlogging, men glemt rate limiteren, så hvem som helst med en konto kunne hamre løs på et ganske kostbart endepunkt. Én middleware-innpakning senere var det faktisk ferdig.
Slett-knappen var der det ble interessant. Den første instinktive løsningen min var den opplagte: slett kontoen, slett kommentarene, borte. Men det ødelegger samtaler. Hvis du skrev en kommentar og tre personer svarte på den, etterlater slettingen av kommentaren din svarene deres hengende i lufta, uten å svare noen. Tråden slutter å gi mening for alle andre enn deg.

Så i stedet setter bloggen opp en delt konto kalt anonymous ved første oppstart, og å slette kontoen din overfører alt du har skrevet til den. Navnet ditt forsvinner, ordene blir værende. Kommentartråden leses fortsatt fint, den sier bare anonymous der brukernavnet ditt pleide å stå:
-- name: AnonymizeComments :execrows
-- Reattributes a deleted user's comments to the shared anonymous account.
UPDATE comments
SET author_id = sqlc.arg(anonymous_id)::uuid, author_username = 'anonymous'
WHERE author_id = sqlc.arg(user_id)::uuid;Den delen fungerte på første forsøk. Likes gjorde ikke det. En like er en rad som sier "denne brukeren likte denne kommentaren", og paret må være unikt. Hvis du likte en kommentar som en tidligere slettet bruker også likte, vil begge likes nå bli "anonymous likte denne kommentaren", og databasen nekter med rette dupliseringen. Løsningen er å slette de kolliderende likes først (telleren på kommentaren forblir ærlig, anonymous har allerede likt den) og deretter overføre resten.
Rekkefølgen betydde også noe. Blogg-tjenesten anonymiserer først, deretter sletter auth-tjenesten kontoen. Hvis det krasjer midt i, sitter du igjen som en bruker hvis innhold allerede er anonymisert, noe som er trygt og bare kan gjøres på nytt. Den andre rekkefølgen kunne slettet kontoen din og latt kommentarene dine bli foreldreløse under en bruker-id som ikke lenger finnes.
To sperrer kom inn til slutt: anonymous-kontoen kan ikke slette seg selv (det ville vært en morsom bug), og den siste adminen kan heller ikke slette seg selv, fordi en blogg der ingen kan logge inn i adminpanelet er en veldig stille blogg.
Jeg testet hele greia med en engangskonto: registrerte meg, kommenterte, lastet ned dataene mine, trykket slett. Kommentaren er fortsatt der, signert anonymous, og innloggingen sluttet å fungere. Akkurat det knappen lover, selv om det ikke er akkurat det den sier.