Utvider den eksisterende offline-skrivekøen (ADR-028, hittil kun
hull-scoreføring) til også å dekke rundefeedens kommentarer/bilder.
offline-queue.ts fikk et isMultipart-flagg (Blob-verdier lagres nativt
i IndexedDB, flushQueue bygger FormData ved synk). round-messages.tsx
fikk sin egen isolerte kø (matchId scoped til "{roundId}:messages",
ikke bare roundId) og et optimistisk "Venter på synk"-kort.
Migrasjon 073: round_message.client_message_id (nullbar uuid) + delvis
unik indeks -- POST /messages er ulikt hull-score-PATCH IKKE naturlig
idempotent, så en avbrutt synk kunne duplisert en kommentar uten dette.
Klienten sender en selvgenerert id ved både første forsøk og et evt.
køet gjenforsøk; serveren deduplikerer på den.
Se ARCHITECTURE_DECISIONS.md (ADR-069) og CHANGELOG.md (punkt 85) for
full begrunnelse og verifiseringslogg (inkl. et reload-mens-offline-
scenario som beviser fravær av duplikater).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
25 lines
1.3 KiB
SQL
25 lines
1.3 KiB
SQL
-- =====================================================================
|
|
-- TeeCup — Idempotens for kommentar-posting via offline-kø (ADR-028-
|
|
-- tillegget "kommentarer/bilder offline", 2026-08-14, migrasjon 073).
|
|
--
|
|
-- Hull-score-køen (ADR-028) er trygg å synke på nytt fordi PATCH +
|
|
-- expected_version konvergerer uansett hvor mange ganger den gjentas.
|
|
-- POST /rounds/{id}/messages er IKKE naturlig idempotent -- hvert kall
|
|
-- oppretter en ny rad. En avbrutt synk (nettleseren lukkes midt i et
|
|
-- flush-kall, eller samme kø flushes fra to faner) kunne dermed skrevet
|
|
-- samme kommentar to ganger. Løsning: klienten sender en selvgenerert
|
|
-- `client_message_id` (crypto.randomUUID()); et gjentatt kall med samme
|
|
-- id returnerer den allerede opprettede meldingen i stedet for å
|
|
-- opprette en duplikat (se app/routers/round_messages.py::
|
|
-- post_round_message).
|
|
-- =====================================================================
|
|
\set ON_ERROR_STOP on
|
|
|
|
ALTER TABLE round_message ADD COLUMN client_message_id uuid;
|
|
|
|
-- Delvis unik indeks (kun når feltet faktisk er satt) -- eldre/andre
|
|
-- kallere som ikke sender client_message_id er upåvirket, samme
|
|
-- "None = ikke i bruk"-konvensjon som resten av appen.
|
|
CREATE UNIQUE INDEX round_message_client_id_idx
|
|
ON round_message (round_id, client_message_id)
|
|
WHERE client_message_id IS NOT NULL;
|