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:
parent
55572a1455
commit
df05fb75dd
13 changed files with 405 additions and 62 deletions
59
src/store/measurementStore.ts
Normal file
59
src/store/measurementStore.ts
Normal 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
|
||||
}
|
||||
Loading…
Reference in a new issue