fix: sync refactor — fix 6 bugs + cache refresh na sync

- setDeletedAt update nu ook updatedAt (bug 2)
- getAllMeasurements filtert deletedAt IS NULL, nieuwe getAllMeasurementsForSync voor sync
- mergeMeasurements detecteert server deleted:true → deletedAt (bug 1)
- syncAll: pull-push split met remoteUpdatedMap, geen double-push (bug 3)
- hard delete alleen na API-succes (bug 4)
- DashboardScreen: refreshCache() na syncAll zodat UI niet op Laden blijft hangen
- deleteMeasurement() dead code verwijderd (bug 5)
- tests: 3 nieuwe testcases voor deleted → deletedAt mapping, 15/15 pass
This commit is contained in:
eddy 2026-07-25 15:33:22 +02:00
commit df05fb75dd
13 changed files with 405 additions and 62 deletions

View file

@ -0,0 +1,59 @@
import { Measurement } from '../types'
import { initDatabase, getAllMeasurements, getLatestMeasurements, getMeasurementsSince } from '../database/db'
let cachedMeasurements: Measurement[] = []
let initialized = false
export async function loadFromDb(): Promise<Measurement[]> {
await initDatabase()
cachedMeasurements = await getAllMeasurements()
initialized = true
return cachedMeasurements
}
export async function loadLatest(count: number): Promise<Measurement[]> {
await initDatabase()
const latest = await getLatestMeasurements(count)
cachedMeasurements = latest
initialized = true
return latest
}
export async function loadSince(date: string): Promise<Measurement[]> {
await initDatabase()
const since = await getMeasurementsSince(date)
// Merge with existing cache (keep newer measurements)
const existingIds = new Set(cachedMeasurements.map(m => m.id))
const newOnes = since.filter(m => !existingIds.has(m.id))
cachedMeasurements = [...cachedMeasurements, ...newOnes]
cachedMeasurements.sort((a, b) => new Date(b.measuredAt).getTime() - new Date(a.measuredAt).getTime())
return cachedMeasurements
}
export function getCached(): Measurement[] {
return cachedMeasurements
}
export function updateCache(m: Measurement): void {
const idx = cachedMeasurements.findIndex(x => x.id === m.id)
if (idx >= 0) {
cachedMeasurements[idx] = m
} else {
cachedMeasurements.unshift(m)
}
// Re-sort by measuredAt descending
cachedMeasurements.sort((a, b) => new Date(b.measuredAt).getTime() - new Date(a.measuredAt).getTime())
}
export function removeFromCache(id: string): void {
cachedMeasurements = cachedMeasurements.filter(m => m.id !== id)
}
export async function refreshCache(): Promise<Measurement[]> {
await loadFromDb()
return cachedMeasurements
}
export function isInitialized(): boolean {
return initialized
}