import 'dart:async'; /// Wraps your data with sync metadata (Dirty flags, tombstones, versions) class SyncRecord { final String id; final T data; /// Server's timestamp. Null if created locally and never synced. final DateTime? serverUpdatedAt; /// Snapshot of data before local edits (Critical for 3-way merge). final T? baseData; /// True if local data differs from server data. final bool isDirty; /// True if marked for deletion (Soft Delete). final bool isDeleted; /// When the soft delete happened (For Retention Policy). final DateTime? deletedAt; SyncRecord({ required this.id, required this.data, this.serverUpdatedAt, this.baseData, this.isDirty = false, this.isDeleted = false, this.deletedAt, }); SyncRecord copyWith({ T? data, DateTime? serverUpdatedAt, T? baseData, bool? isDirty, bool? isDeleted, DateTime? deletedAt, }) { return SyncRecord( id: id, data: data ?? this.data, serverUpdatedAt: serverUpdatedAt ?? this.serverUpdatedAt, baseData: baseData ?? this.baseData, isDirty: isDirty ?? this.isDirty, isDeleted: isDeleted ?? this.isDeleted, deletedAt: deletedAt ?? this.deletedAt, ); } } /// Abstract Storage Interface abstract class SyncRepository { Future>> getAll(); Future?> get(String id); Future save(SyncRecord record); Future delete(String id); // Hard Delete Future getLastSyncTime(); Future setLastSyncTime(DateTime time); }