From 8698262b8a1c4ced657bb8f4df9c045fd8fe1188 Mon Sep 17 00:00:00 2001 From: Gustl22 Date: Sat, 7 Dec 2024 10:43:42 +0100 Subject: [PATCH] fix: Disallow adding existing membership of API (#74) --- .../lib/view/screens/edit/lineup_edit.dart | 5 +++- .../lib/src/services/apis/germany_by.dart | 28 ++++++++++--------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/wrestling_scoreboard_client/lib/view/screens/edit/lineup_edit.dart b/wrestling_scoreboard_client/lib/view/screens/edit/lineup_edit.dart index 315ab58c..712a30ee 100644 --- a/wrestling_scoreboard_client/lib/view/screens/edit/lineup_edit.dart +++ b/wrestling_scoreboard_client/lib/view/screens/edit/lineup_edit.dart @@ -399,8 +399,11 @@ class _MembershipDropdown extends ConsumerWidget { authService: authService, includeApiProviderResults: true, ); - final providerMemberships = + Iterable providerMemberships = providerResults[getTableNameFromType(Membership)]?.map((membership) => membership as Membership) ?? []; + // Remove all memberships, which are already in the list. + providerMemberships = + providerMemberships.where((m) => filteredMemberships.where((fm) => fm.no == m.no).isEmpty); filteredMemberships.addAll(providerMemberships); } } diff --git a/wrestling_scoreboard_common/lib/src/services/apis/germany_by.dart b/wrestling_scoreboard_common/lib/src/services/apis/germany_by.dart index 48255a12..77f761bf 100644 --- a/wrestling_scoreboard_common/lib/src/services/apis/germany_by.dart +++ b/wrestling_scoreboard_common/lib/src/services/apis/germany_by.dart @@ -368,16 +368,15 @@ class ByGermanyWrestlingApi extends WrestlingApi { return memberships.toSet(); } - Future _getMembership({ + Future _getMembership({ required int passCode, required Future Function(String clubId) getClub, }) async { final json = await _getSaisonWrestler(passCode: passCode); - if (json == null) return null; final wrestlerJson = json['wrestler']; final club = await getClub(wrestlerJson['clubId']); if (wrestlerJson == null || club == null) { - return null; + throw Exception('No field "wrestler" and/or "clubId" found for json:\n$json'); } return Membership( club: club, @@ -694,15 +693,16 @@ class ByGermanyWrestlingApi extends WrestlingApi { Future> search({required String searchStr, required Type searchType}) async { switch (searchType) { case const (Membership): - final membership = await _getMembership( - passCode: int.parse(searchStr), - getClub: (clubId) async { - return await _getSingleBySyncId(clubId); - }); - if (membership == null) { - throw Exception('Membership with search string "$searchStr" and type "$searchType" was not found.'); + try { + final membership = await _getMembership( + passCode: int.parse(searchStr), + getClub: (clubId) async { + return await _getSingleBySyncId(clubId); + }); + return [membership]; + } catch (_) { + return []; } - return [membership]; default: throw Exception('API provider search for type $searchType is not supported yet.'); } @@ -907,7 +907,7 @@ class ByGermanyWrestlingApi extends WrestlingApi { final Map> cachedWrestlers = {}; - Future?> _getSaisonWrestler({ + Future> _getSaisonWrestler({ required int passCode, }) async { final cacheId = 'p:$passCode'; @@ -932,7 +932,9 @@ class ByGermanyWrestlingApi extends WrestlingApi { } else { body = getWrestlerJson(passCode); } - if (body == null) return null; + if (body == null) { + throw Exception('Response for the wrestler (passcode: $passCode) was null.'); + } cachedWrestlers[cacheId] = jsonDecode(body); return cachedWrestlers[cacheId]!; },