Favoriten-GET gehaertet + deterministisches setzeFavorit
This commit is contained in:
@@ -114,10 +114,22 @@ class MeloCloudService {
|
||||
}
|
||||
|
||||
/// Liest die Favoriten-IDs aus einer Server-Antwort.
|
||||
///
|
||||
/// Ein fehlender `favorites`-Schlüssel ist ein **Fehler, keine leere
|
||||
/// Menge**: der Router verdrahtet für `GET /favorites` hart HTTP 200, und
|
||||
/// mehrere Handler desselben Servers melden Fehler im 200er-Körper. Eine
|
||||
/// fälschlich leere Antwort wäre sonst von einer echten nicht zu
|
||||
/// unterscheiden — genau wie bei [parseListe] und [parseUpload] wird
|
||||
/// deshalb geworfen.
|
||||
@visibleForTesting
|
||||
static List<String> parseFavoriten(String body) {
|
||||
final daten = jsonDecode(body) as Map<String, dynamic>;
|
||||
final liste = daten['favorites'] as List? ?? const [];
|
||||
final fehler = daten['error'] as String?;
|
||||
if (fehler != null) throw CloudException(fehler);
|
||||
final liste = daten['favorites'];
|
||||
if (liste is! List) {
|
||||
throw CloudException('Antwort ohne Favoritenliste');
|
||||
}
|
||||
return [
|
||||
for (final j in liste) (j as Map<String, dynamic>)['id'] as String,
|
||||
];
|
||||
@@ -264,6 +276,23 @@ class MeloCloudService {
|
||||
return parseFavoriten(antwort.body);
|
||||
}
|
||||
|
||||
/// Setzt einen einzelnen Favoriten am Server — additiv oder entfernend,
|
||||
/// aber immer **deterministisch**.
|
||||
///
|
||||
/// Bewusst kein Umschalten: hätte der Server einen abweichenden Stand,
|
||||
/// kehrte ein Toggle den Wunsch des Nutzers um.
|
||||
Future<void> setzeFavorit(String cloudId, bool gesetzt) async {
|
||||
_pruefeAnmeldung();
|
||||
final antwort = await _client
|
||||
.post(
|
||||
Uri.parse('$basisUrl/favorites/toggle'),
|
||||
headers: {..._kopf, 'Content-Type': 'application/json'},
|
||||
body: jsonEncode({'song_id': cloudId, 'set': gesetzt}),
|
||||
)
|
||||
.timeout(const Duration(seconds: 30));
|
||||
_pruefeStatus(antwort);
|
||||
}
|
||||
|
||||
/// Ersetzt die Favoriten am Server durch [cloudIds].
|
||||
Future<void> setzeFavoriten(List<String> cloudIds) async {
|
||||
_pruefeAnmeldung();
|
||||
|
||||
Reference in New Issue
Block a user