diff --git a/src/sync/syncService.ts b/src/sync/syncService.ts index 0d43951..8b2def8 100644 --- a/src/sync/syncService.ts +++ b/src/sync/syncService.ts @@ -112,31 +112,48 @@ export async function syncAll(): Promise { if (remote.length > 0) { const local = await getAllMeasurementsForSync() - const merged = mergeMeasurements(local, remote) - const localMap = new Map(local.map(m => [m.id, m])) - for (const m of merged) { - if (m.deletedAt) { - await removeMeasurement(m.id) - const localRec = localMap.get(m.id) - if (localRec && !localRec.deletedAt) { - pulled++ - } - } else { - const localRec = localMap.get(m.id) - const isNew = !localRec - const isUpdated = - localRec && - new Date(m.updatedAt).getTime() !== - new Date(localRec.updatedAt).getTime() + for (const r of remote) { + const localRec = localMap.get(r.id) + const isDeleted = !!(r as any).deleted - if (isNew || isUpdated) { - await upsertMeasurement(m) - await updateSyncStatus(m.id, 'synced') + if (isDeleted) { + if (localRec) { + if ( + localRec.syncStatus === 'pending' || + localRec.syncStatus === 'pending-delete' + ) { + continue + } + await removeMeasurement(r.id) + deleted++ + } + continue + } + + const localIsPending = + localRec?.syncStatus === 'pending' || + localRec?.syncStatus === 'pending-delete' + + if (localIsPending) { + continue + } + + if (localRec) { + if (new Date(r.updatedAt) > new Date(localRec.updatedAt)) { + const record = { ...r, deletedAt: (r as any).deletedAt || undefined } as Measurement + await upsertMeasurement(record) + await updateSyncStatus(r.id, 'synced') pulled++ } + continue } + + const record = { ...r, deletedAt: (r as any).deletedAt || undefined } as Measurement + await upsertMeasurement(record) + await updateSyncStatus(r.id, 'synced') + pulled++ } }