Skip to content

Commit 870f690

Browse files
Merge pull request #10 from dabblingwithcode/staging
Merge Staging
2 parents 44f323c + 3594508 commit 870f690

36 files changed

Lines changed: 1756 additions & 1145 deletions

File tree

school_data_hub_client/lib/src/protocol/client.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -669,11 +669,12 @@ class EndpointPupilBookLending extends _i1.EndpointRef {
669669
{},
670670
);
671671

672-
_i2.Future<_i22.PupilBookLending?> fetchPupilBookLendingById(int id) =>
672+
_i2.Future<_i22.PupilBookLending?> fetchPupilBookLendingByLendingId(
673+
String lendingId) =>
673674
caller.callServerEndpoint<_i22.PupilBookLending?>(
674675
'pupilBookLending',
675-
'fetchPupilBookLendingById',
676-
{'id': id},
676+
'fetchPupilBookLendingByLendingId',
677+
{'lendingId': lendingId},
677678
);
678679

679680
_i2.Future<_i5.PupilData> updatePupilBookLending(
@@ -684,11 +685,11 @@ class EndpointPupilBookLending extends _i1.EndpointRef {
684685
{'pupilBookLending': pupilBookLending},
685686
);
686687

687-
_i2.Future<_i5.PupilData> deletePupilBookLending(int id) =>
688+
_i2.Future<_i5.PupilData> deletePupilBookLending(String lendingId) =>
688689
caller.callServerEndpoint<_i5.PupilData>(
689690
'pupilBookLending',
690691
'deletePupilBookLending',
691-
{'id': id},
692+
{'lendingId': lendingId},
692693
);
693694
}
694695

school_data_hub_flutter/lib/features/books/data/pupil_book_api_service.dart

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ final _client = di<Client>();
77
class PupilBookApiService {
88
//- create pupil book lending
99

10-
Future<PupilData?> postPupilBookLending(
11-
{required int pupilId,
12-
required String libraryId,
13-
required String lentBy}) async {
10+
Future<PupilData?> postPupilBookLending({
11+
required int pupilId,
12+
required String libraryId,
13+
required String lentBy,
14+
}) async {
1415
final pupil = await ClientHelper.apiCall(
15-
call: () => _client.pupilBookLending
16-
.postPupilBookLending(pupilId, libraryId, lentBy),
16+
call:
17+
() => _client.pupilBookLending.postPupilBookLending(
18+
pupilId,
19+
libraryId,
20+
lentBy,
21+
),
1722
errorMessage: 'Fehler beim Erstellen des Leihvorgangs',
1823
);
1924
return pupil;
@@ -33,7 +38,7 @@ class PupilBookApiService {
3338

3439
//- delete pupil book
3540

36-
Future<PupilData?> deletePupilBook(int lendingId) async {
41+
Future<PupilData?> deletePupilBook(String lendingId) async {
3742
final pupil = await ClientHelper.apiCall(
3843
call: () => _client.pupilBookLending.deletePupilBookLending(lendingId),
3944
errorMessage: 'Fehler beim Löschen des Leihvorgangs',

school_data_hub_flutter/lib/features/books/domain/book_helper.dart

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,28 @@ import 'package:watch_it/watch_it.dart';
55
enum BookBorrowStatus { since2Weeks, since3Weeks, since5weeks }
66

77
class BookHelpers {
8-
static List<PupilBookLending> pupilBooksLinkedToBook(
9-
{required String libraryId}) {
10-
// returned starting with the most recent
11-
final pupilBooks = di<PupilManager>()
12-
.allPupils
13-
.map((pupil) => pupil.pupilBooks)
14-
.expand((element) => element as Iterable<PupilBookLending>)
15-
.where((pupilBook) => pupilBook.libraryBook?.libraryId == libraryId)
16-
.toList();
8+
static List<PupilBookLending> pupilBookLendingsLinkedToLibraryBook({
9+
required int libraryBookId,
10+
}) {
11+
// Get all pupil book lendings
12+
final allPupilBookLendings =
13+
di<PupilManager>().allPupils
14+
.map((pupil) => pupil.pupilBookLendings ?? <PupilBookLending>[])
15+
.expand((element) => element)
16+
.toList();
1717

18-
pupilBooks.sort((a, b) => b.lentAt.compareTo(a.lentAt));
19-
return pupilBooks;
18+
// Filter by libraryId
19+
final pupilBookLendingsLinkedToLibraryBook =
20+
allPupilBookLendings.where((pupilBook) {
21+
final match = pupilBook.libraryBookId == libraryBookId;
22+
23+
return match;
24+
}).toList();
25+
26+
pupilBookLendingsLinkedToLibraryBook.sort(
27+
(a, b) => b.lentAt.compareTo(a.lentAt),
28+
);
29+
return pupilBookLendingsLinkedToLibraryBook;
2030
}
2131

2232
static BookBorrowStatus getBorrowedStatus(PupilBookLending book) {

school_data_hub_flutter/lib/features/books/domain/book_manager.dart

Lines changed: 91 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ class BookManager {
1515
ValueListenable<List<LibraryBookProxy>> get libraryBookProxies =>
1616
_libraryBookProxies;
1717

18-
final _isbnLibraryBooksMap =
19-
ValueNotifier<Map<int, List<LibraryBookProxy>>>({});
18+
final _isbnLibraryBooksMap = ValueNotifier<Map<int, List<LibraryBookProxy>>>(
19+
{},
20+
);
2021
ValueListenable<Map<int, List<LibraryBookProxy>>> get isbnLibraryBooksMap =>
2122
_isbnLibraryBooksMap;
2223

@@ -29,9 +30,7 @@ class BookManager {
2930
List<BookTag> selectedTags = []; // Liste für ausgewählte Buch-Tags
3031

3132
final _lastSelectedLocation = ValueNotifier<LibraryBookLocation>(
32-
LibraryBookLocation(
33-
location: 'Bitte auswählen',
34-
),
33+
LibraryBookLocation(location: 'Bitte auswählen'),
3534
);
3635
ValueListenable<LibraryBookLocation> get lastLocationValue =>
3736
_lastSelectedLocation;
@@ -41,7 +40,7 @@ class BookManager {
4140

4241
BookManager();
4342

44-
// final session = di<HubSessionManager>().credentials.value;
43+
// final session = di<HubSessionManager>().credentials.value;
4544

4645
int _currentPage = 1;
4746
final int _perPage = 30;
@@ -72,13 +71,12 @@ class BookManager {
7271

7372
// - manage collections
7473

75-
void _refreshLibraryBookProxyCollections(
76-
List<LibraryBook> libraryBooks,
77-
) {
74+
void _refreshLibraryBookProxyCollections(List<LibraryBook> libraryBooks) {
7875
final List<LibraryBookProxy> libraryBookProxies = [];
7976
for (LibraryBook libraryBook in libraryBooks) {
80-
LibraryBookProxy libraryBookProxy =
81-
LibraryBookProxy(librarybook: libraryBook);
77+
LibraryBookProxy libraryBookProxy = LibraryBookProxy(
78+
librarybook: libraryBook,
79+
);
8280
// 1. Add the libraryBookProxy to the collection
8381

8482
libraryBookProxies.add(libraryBookProxy);
@@ -90,12 +88,14 @@ class BookManager {
9088
.where((p) => p.libraryId == libraryBookProxy.libraryId);
9189
if (existingLibraryBookProxy.isNotEmpty) {
9290
// If it exists, remove it from the list
93-
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!
94-
.removeWhere((p) => p.libraryId == libraryBookProxy.libraryId);
91+
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!.removeWhere(
92+
(p) => p.libraryId == libraryBookProxy.libraryId,
93+
);
9594
}
9695
// Add the new libraryBookProxy to the list
97-
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!
98-
.add(libraryBookProxy);
96+
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!.add(
97+
libraryBookProxy,
98+
);
9999
} else {
100100
_isbnLibraryBooksMap.value[libraryBook.book!.isbn] = [libraryBookProxy];
101101
}
@@ -107,20 +107,20 @@ class BookManager {
107107
}
108108

109109
void _addLibraryBookProxyToCollections(LibraryBook libraryBook) {
110-
final LibraryBookProxy libraryBookProxy =
111-
LibraryBookProxy(librarybook: libraryBook);
110+
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
111+
librarybook: libraryBook,
112+
);
112113
final List<LibraryBookProxy> libraryBookProxies =
113114
_libraryBookProxies.value.toList();
114115
libraryBookProxies.add(libraryBookProxy);
115116
_libraryBookProxies.value = libraryBookProxies;
116117
_isbnLibraryBooksMap.value[libraryBook.book!.isbn] = libraryBookProxies;
117118
}
118119

119-
void _updateLibraryBookProxyInCollections(
120-
LibraryBook libraryBook,
121-
) {
122-
final LibraryBookProxy libraryBookProxy =
123-
LibraryBookProxy(librarybook: libraryBook);
120+
void _updateLibraryBookProxyInCollections(LibraryBook libraryBook) {
121+
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
122+
librarybook: libraryBook,
123+
);
124124
final List<LibraryBookProxy> libraryBookProxies =
125125
_libraryBookProxies.value.toList();
126126
int index = libraryBookProxies.indexWhere(
@@ -139,11 +139,13 @@ class BookManager {
139139
}
140140

141141
void _removeLibraryBookProxyFromCollection(
142-
LibraryBookProxy libraryBookProxy) {
142+
LibraryBookProxy libraryBookProxy,
143+
) {
143144
final List<LibraryBookProxy> libraryBookProxies =
144145
_libraryBookProxies.value.toList();
145-
libraryBookProxies
146-
.removeWhere((p) => p.libraryId == libraryBookProxy.libraryId);
146+
libraryBookProxies.removeWhere(
147+
(p) => p.libraryId == libraryBookProxy.libraryId,
148+
);
147149
_libraryBookProxies.value = libraryBookProxies;
148150
// Remove from the isbnLibraryBooksMap
149151
final isbnLibraryBookProxyList =
@@ -163,16 +165,23 @@ class BookManager {
163165

164166
//- get functions
165167

166-
LibraryBookProxy? getLibraryBookByLibraryBookId(int? libraryBookId) {
168+
LibraryBookProxy? getLibraryBookById(int? libraryBookId) {
167169
if (libraryBookId == null) return null;
168-
return _libraryBookProxies.value
169-
.firstWhereOrNull((element) => element.libraryBookId == libraryBookId);
170+
return _libraryBookProxies.value.firstWhereOrNull(
171+
(element) => element.id == libraryBookId,
172+
);
170173
}
171174

172175
List<LibraryBookProxy> getLibraryBooksByIsbn(int isbn) {
173176
return _isbnLibraryBooksMap.value[isbn] ?? [];
174177
}
175178

179+
LibraryBookProxy? getLibraryBookByLibraryId(int id) {
180+
return _libraryBookProxies.value.firstWhereOrNull(
181+
(element) => element.id == id,
182+
);
183+
}
184+
176185
//- Repository calls
177186

178187
//- BOOK TAGS
@@ -213,11 +222,9 @@ class BookManager {
213222
}
214223

215224
Future<void> postLocation(String locationName) async {
216-
final newLocation = LibraryBookLocation(
217-
location: locationName,
218-
);
219-
final LibraryBookLocation? responseLocation =
220-
await _bookApiService.postBookLocation(newLocation);
225+
final newLocation = LibraryBookLocation(location: locationName);
226+
final LibraryBookLocation? responseLocation = await _bookApiService
227+
.postBookLocation(newLocation);
221228
if (responseLocation == null) {
222229
return;
223230
}
@@ -230,9 +237,10 @@ class BookManager {
230237
return;
231238
}
232239

233-
_locations.value = _locations.value
234-
.where((loc) => loc.location != location.location)
235-
.toList();
240+
_locations.value =
241+
_locations.value
242+
.where((loc) => loc.location != location.location)
243+
.toList();
236244
}
237245

238246
void setLastLocationValue(LibraryBookLocation location) {
@@ -250,7 +258,9 @@ class BookManager {
250258
_refreshLibraryBookProxyCollections(responseBooks);
251259

252260
_notificationService.showSnackBar(
253-
NotificationType.success, 'Bücher erfolgreich geladen');
261+
NotificationType.success,
262+
'Bücher erfolgreich geladen',
263+
);
254264
}
255265

256266
Future<void> postLibraryBook({
@@ -269,7 +279,9 @@ class BookManager {
269279
_addLibraryBookProxyToCollections(responseBook);
270280

271281
_notificationService.showSnackBar(
272-
NotificationType.success, 'Arbeitsheft erfolgreich erstellt');
282+
NotificationType.success,
283+
'Arbeitsheft erfolgreich erstellt',
284+
);
273285
}
274286

275287
Future<void> updateBookProperty({
@@ -280,27 +292,30 @@ class BookManager {
280292
String? description,
281293
String? readingLevel,
282294
}) async {
283-
final LibraryBook? updatedbook =
284-
await _bookApiService.updateLibraryBookOrBook(
285-
isbn: isbn,
286-
libraryId: libraryId,
287-
title: title,
288-
author: author,
289-
description: description,
290-
readingLevel: readingLevel,
291-
);
295+
final LibraryBook? updatedbook = await _bookApiService
296+
.updateLibraryBookOrBook(
297+
isbn: isbn,
298+
libraryId: libraryId,
299+
title: title,
300+
author: author,
301+
description: description,
302+
readingLevel: readingLevel,
303+
);
292304
if (updatedbook == null) {
293305
return;
294306
}
295307
_updateLibraryBookProxyInCollections(updatedbook);
296308

297309
_notificationService.showSnackBar(
298-
NotificationType.success, 'Arbeitsheft erfolgreich aktualisiert');
310+
NotificationType.success,
311+
'Arbeitsheft erfolgreich aktualisiert',
312+
);
299313
}
300314

301315
Future<void> deleteLibraryBook(LibraryBookProxy libraryBookProxy) async {
302-
final bool? success =
303-
await _bookApiService.deleteLibraryBook(libraryBookProxy.libraryBookId);
316+
final bool? success = await _bookApiService.deleteLibraryBook(
317+
libraryBookProxy.id,
318+
);
304319
if (success == null) {
305320
return;
306321
}
@@ -334,17 +349,27 @@ class BookManager {
334349
}
335350
final searchResults = <LibraryBookProxy>[];
336351
for (final result in results) {
337-
final LibraryBookProxy libraryBookProxy =
338-
LibraryBookProxy(librarybook: result);
339-
searchResults.add(libraryBookProxy);
352+
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
353+
librarybook: result,
354+
);
355+
// Check if this libraryId already exists to prevent duplicates
356+
if (!searchResults.any(
357+
(existing) => existing.libraryId == libraryBookProxy.libraryId,
358+
)) {
359+
searchResults.add(libraryBookProxy);
360+
}
340361
}
341362
_searchResults.value = searchResults;
342363

343364
_notificationService.showSnackBar(
344-
NotificationType.success, 'Suchergebnisse aktualisiert');
365+
NotificationType.success,
366+
'Suchergebnisse aktualisiert',
367+
);
345368
} catch (e) {
346369
_notificationService.showSnackBar(
347-
NotificationType.error, 'Fehler bei der Suche: $e');
370+
NotificationType.error,
371+
'Fehler bei der Suche: $e',
372+
);
348373
}
349374
}
350375

@@ -380,13 +405,19 @@ class BookManager {
380405
_hasMorePages = false;
381406
} else {
382407
final List<LibraryBookProxy> searchResultsToUpdate =
383-
searchResults.value;
408+
_searchResults.value.toList(); // Create a copy
384409
for (final result in newPageResults) {
385-
final LibraryBookProxy libraryBookProxy =
386-
LibraryBookProxy(librarybook: result);
387-
searchResultsToUpdate.add(libraryBookProxy);
410+
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
411+
librarybook: result,
412+
);
413+
// Check if this libraryId already exists to prevent duplicates
414+
if (!searchResultsToUpdate.any(
415+
(existing) => existing.libraryId == libraryBookProxy.libraryId,
416+
)) {
417+
searchResultsToUpdate.add(libraryBookProxy);
418+
}
388419
}
389-
_searchResults.value = [...searchResultsToUpdate];
420+
_searchResults.value = searchResultsToUpdate;
390421
if (newPageResults.length < _perPage) {
391422
_hasMorePages = false;
392423
}

0 commit comments

Comments
 (0)