feat(sync): include avatar in sync snapshot + auto-backup (multi-device)

The profile picture (users.avatar_b64, cosmetic/unencrypted) travelled only
in the manual export. Now it's also in buildSyncSnapshot and the auto-backup
container, so a new device / a restore picks it up.

- Restore is ADDITIVE (mirrors the import path): applyRemoteSnapshot adopts
  remote.avatar_b64 only when the local device has no avatar — never clobbers
  a locally-set picture. No per-avatar timestamp to arbitrate, so changing an
  existing avatar doesn't propagate (cosmetic, accepted).
- +2 merge tests (adopt-when-empty, don't-clobber-when-set). 65/65 green.
- Server /avatar endpoint unchanged (already accepts {avatar_b64}).

Closes the avatar item of CODE_AUDIT §4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-07-08 20:06:31 +01:00
parent dd86b2bd23
commit c58424d58c
5 changed files with 56 additions and 3 deletions
+4 -2
View File
@@ -305,8 +305,10 @@ cf. la checklist "Entry payload" de CLAUDE.md).
- 🔵 **Combobox custom fields** : navigation clavier (flèches ↑↓ + Enter)
dans le menu déroulant, pas seulement souris.
- 🔵 **Auto-lock** : afficher le temps restant avant lock dans un coin.
- 🔵 **Avatar** : l'inclure dans le sync snapshot + auto-backup (actuellement
seulement dans l'export manuel) pour cohérence multi-device.
- ~~🔵 **Avatar** : l'inclure dans le sync snapshot + auto-backup~~ — ✅ fait :
`avatar_b64` dans `buildSyncSnapshot` + payload auto-backup ; restauré
additivement dans `applyRemoteSnapshot` (adopté seulement si le device n'a
pas d'avatar, jamais écrasé). +2 tests merge.
---