fix(sync): bump updated_at on set-icon + folder-delete reassignment

Both UPDATEs mutated a synced column without touching updated_at, so the
change rode in the sync snapshot but other devices skipped it (last-write-
wins saw "not newer"). Now both SET updated_at = datetime('now') (UTC).

- POST /entries/{id}/icon (PM.Handler.Entries)
- folder delete → entries reassigned to 'All' (PM.Handler.Folders)

accessed_at stays exempt (read timestamp, not synced); bulk "clear all
icons" stays exempt (device-local favicon cache purge). Invariant documented
in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-07-05 15:55:23 +01:00
parent ca8081987d
commit 4ffbd63893
3 changed files with 16 additions and 2 deletions
+8
View File
@@ -868,6 +868,14 @@ le vide ET vide `FPendingURL` → écran noir permanent sur cold-start lent.
nécessite `AttachThreadInput` pour cross-process.
- **`updated_at`** est bumpé à chaque PUT entry → sort par défaut =
`name` asc pour que modifier une entry ne change pas sa position.
- **Toute mutation `vault_entries` qui doit se synchroniser DOIT bumper
`updated_at`** : la sync est last-write-wins sur `updated_at`, donc un
`UPDATE` qui ne le touche pas voyage bien dans le snapshot mais est ignoré
par les autres devices (« pas plus récent »). Corrigé pour set-icône
(`POST /entries/{id}/icon`) et réassignation-sur-delete-folder
(`PM.Handler.Folders`). `accessed_at` est **exempté** exprès (timestamp de
lecture, non synced). Le bulk « clear all icons » ne bump pas non plus —
assumé device-local (purge de cache favicon).
- **Timestamps = UTC partout** : tout `created_at`/`updated_at`/`deleted_at`
écrit côté Delphi passe par `NowUTC`/`NowUTCStr` (`PM.Database`) — JAMAIS
`FormatDateTime(..., Now)` (heure locale). SQLite `CURRENT_TIMESTAMP` /