fix: resolve sync data inconsistency between mobile and web (#55) #58
No reviewers
Labels
No labels
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/simpl-liste#58
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/simpl-liste-55-sync-data-inconsistency"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #55
Problème
Les données entre mobile et web étaient incohérentes : tâches complétées sur mobile apparaissaient non-complétées sur web, nouvelles tâches non synchronisées, Sync Now silencieusement cassé.
Causes racines
{changes: [...], sync_token}.pullChanges()itéraitdata.changesqui étaitundefined.due_date,list_id,task_tagmais le serveur attenddueDate,listId,taskTag(Drizzle camelCase).completedAtmanquant — Jamais inclus dans les payloads outbox, donc la completion était perdue au sync.Corrections
SyncPullChangecompletedAtajouté aux payloads create et updatecompletedAtcôté serveuridretiré du payload d'update pour éviter d'écraser la PKThree root causes fixed: 1. API GET /api/sync returned raw entities but mobile client expected {changes: [...], sync_token} format — pullChanges() iterated data.changes which was undefined, silently skipping all server data. Now transforms entities into the SyncPullChange format. 2. Mobile outbox writes used snake_case keys (due_date, list_id, etc.) but server processOperation spreads data directly into Drizzle which expects camelCase (dueDate, listId). Fixed all outbox writes to use camelCase. Also fixed task_tag → taskTag entity type. 3. Missing completedAt in task outbox payloads — completion state was lost during sync. Added completedAt to both create and update outbox entries, and added Date conversion in server update handler. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>Review — APPROVE ✅
3 causes racines corrigées pour la sync mobile ↔ web :
{changes, sync_token}attendu parpullChanges()dueDate,listId,taskTag)Bonus défensif :
delete raw.idempêche l'écrasement de la PK dans les updates.Note non-bloquante :
slTagsn'a pas de colonneupdatedAt, donccreatedAtest utilisé comme proxy dans le GET.🤖 Review automatique par sprint