- Nieuwe migratie db/009: users.data_rev + data_updated_at en de
user_data_versions-tabel (voor de komende versiegeschiedenis)
- GET /me/data geeft nu {data, rev}; PUT /me/data controleert een optionele
x-data-rev-header en weigert een verouderde schrijver met 409 (zonder
header blijft het oude laatste-schrijver-wint-gedrag voor oude clients)
- core.js: rev wordt bijgehouden en meegestuurd; bij 409 toont de opslaan-
knop "Elders bewerkt" en haalt een klik eerst de nieuwste serverversie op
in plaats van te overschrijven
- beforeunload-waarschuwing bij een openstaande, lopende of mislukte save
- Nieuwe test test/save-system.test.js (rev mee, 409, legacy zonder header)
16 lines
927 B
SQL
16 lines
927 B
SQL
-- Opslaansysteem: optimistische concurrency + versiegeschiedenis.
|
|
-- data_rev telt elke wijziging van users.data; een client stuurt de rev mee
|
|
-- die hij geladen heeft en de update slaagt alleen als die nog actueel is
|
|
-- (anders 409: een ander tabblad/digibord schreef eerder). user_data_versions
|
|
-- bewaart periodieke snapshots van de vorige data zodat een leerkracht een
|
|
-- eerdere versie kan terugzetten.
|
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS data_rev BIGINT NOT NULL DEFAULT 0;
|
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS data_updated_at TIMESTAMPTZ;
|
|
|
|
CREATE TABLE IF NOT EXISTS user_data_versions (
|
|
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
data JSONB NOT NULL,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_user_data_versions ON user_data_versions(user_id, created_at DESC);
|