v2.52 — Favoriten-Sync-Fix: bidirektionaler Merge (lokal↔Server), Toggle-Push sofort, cloud_id-Verdrahtung
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import 'cloud_service.dart';
|
||||
|
||||
/// Bidirektionaler Favoriten-Sync (Sprint D, v2.52).
|
||||
///
|
||||
/// Root-Cause des alten Bugs: `_syncAlles` las die Server-Favoriten und
|
||||
/// schrieb sie per `syncFavorites` UNVERÄNDERT zurück auf den Server —
|
||||
/// lokale ⭐-Toggles gingen verloren, `server_favorites` wurde nie genutzt.
|
||||
///
|
||||
/// Neues Verhalten (Merge statt Server-Spiegel):
|
||||
/// 1. **Lokal → Server:** Alle cloud_ids lokaler ⭐-Favoriten werden
|
||||
/// zusammen mit den Server-Favoriten hochgeladen (Vereinigung). Lokale
|
||||
/// Toggles erreichen den Server damit garantiert.
|
||||
/// 2. **Server → Lokal:** Server-Favoriten werden lokal als ⭐ markiert,
|
||||
/// sobald der Song lokal existiert (cloud_id-Verknüpfung).
|
||||
/// 3. **Feuer-und-Vergessen beim Toggle:** `CloudService.setFavorite`
|
||||
/// (deterministisch, kein Toggle) direkt beim lokalen Umschalten; ein
|
||||
/// Fehlschlag wird durch den nächsten vollständigen Sync korrigiert.
|
||||
|
||||
/// Vereinigt lokale und Server-Favoriten (cloud_ids) — keine Datenverluste
|
||||
/// in beide Richtungen. Sortiert für deterministische Tests.
|
||||
List<String> favoritenMerge({
|
||||
required Set<String> lokal,
|
||||
required Set<String> server,
|
||||
}) {
|
||||
final merged = <String>{...lokal, ...server}.toList()..sort();
|
||||
return merged;
|
||||
}
|
||||
|
||||
/// Feuer-und-Vergessen-Push eines Favoriten-Toggles an den Server.
|
||||
/// Deterministisch via `set` (kein Doppel-Toggle-Risiko). Fehler werden
|
||||
/// still geschluckt — der nächste vollständige Sync korrigiert den Zustand
|
||||
/// (favoritenMerge-Vereinigung).
|
||||
Future<void> pusheFavoritAnServer(
|
||||
CloudService cloud,
|
||||
String cloudId,
|
||||
bool favorit,
|
||||
) async {
|
||||
await cloud.setFavorite(cloudId, favorit: favorit);
|
||||
}
|
||||
Reference in New Issue
Block a user