Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions school_data_hub_client/lib/src/protocol/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -669,11 +669,12 @@ class EndpointPupilBookLending extends _i1.EndpointRef {
{},
);

_i2.Future<_i22.PupilBookLending?> fetchPupilBookLendingById(int id) =>
_i2.Future<_i22.PupilBookLending?> fetchPupilBookLendingByLendingId(
String lendingId) =>
caller.callServerEndpoint<_i22.PupilBookLending?>(
'pupilBookLending',
'fetchPupilBookLendingById',
{'id': id},
'fetchPupilBookLendingByLendingId',
{'lendingId': lendingId},
);

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

_i2.Future<_i5.PupilData> deletePupilBookLending(int id) =>
_i2.Future<_i5.PupilData> deletePupilBookLending(String lendingId) =>
caller.callServerEndpoint<_i5.PupilData>(
'pupilBookLending',
'deletePupilBookLending',
{'id': id},
{'lendingId': lendingId},
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,18 @@ final _client = di<Client>();
class PupilBookApiService {
//- create pupil book lending

Future<PupilData?> postPupilBookLending(
{required int pupilId,
required String libraryId,
required String lentBy}) async {
Future<PupilData?> postPupilBookLending({
required int pupilId,
required String libraryId,
required String lentBy,
}) async {
final pupil = await ClientHelper.apiCall(
call: () => _client.pupilBookLending
.postPupilBookLending(pupilId, libraryId, lentBy),
call:
() => _client.pupilBookLending.postPupilBookLending(
pupilId,
libraryId,
lentBy,
),
errorMessage: 'Fehler beim Erstellen des Leihvorgangs',
);
return pupil;
Expand All @@ -33,7 +38,7 @@ class PupilBookApiService {

//- delete pupil book

Future<PupilData?> deletePupilBook(int lendingId) async {
Future<PupilData?> deletePupilBook(String lendingId) async {
final pupil = await ClientHelper.apiCall(
call: () => _client.pupilBookLending.deletePupilBookLending(lendingId),
errorMessage: 'Fehler beim Löschen des Leihvorgangs',
Expand Down
32 changes: 21 additions & 11 deletions school_data_hub_flutter/lib/features/books/domain/book_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,28 @@ import 'package:watch_it/watch_it.dart';
enum BookBorrowStatus { since2Weeks, since3Weeks, since5weeks }

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

pupilBooks.sort((a, b) => b.lentAt.compareTo(a.lentAt));
return pupilBooks;
// Filter by libraryId
final pupilBookLendingsLinkedToLibraryBook =
allPupilBookLendings.where((pupilBook) {
final match = pupilBook.libraryBookId == libraryBookId;

return match;
}).toList();

pupilBookLendingsLinkedToLibraryBook.sort(
(a, b) => b.lentAt.compareTo(a.lentAt),
);
return pupilBookLendingsLinkedToLibraryBook;
}

static BookBorrowStatus getBorrowedStatus(PupilBookLending book) {
Expand Down
151 changes: 91 additions & 60 deletions school_data_hub_flutter/lib/features/books/domain/book_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ class BookManager {
ValueListenable<List<LibraryBookProxy>> get libraryBookProxies =>
_libraryBookProxies;

final _isbnLibraryBooksMap =
ValueNotifier<Map<int, List<LibraryBookProxy>>>({});
final _isbnLibraryBooksMap = ValueNotifier<Map<int, List<LibraryBookProxy>>>(
{},
);
ValueListenable<Map<int, List<LibraryBookProxy>>> get isbnLibraryBooksMap =>
_isbnLibraryBooksMap;

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

final _lastSelectedLocation = ValueNotifier<LibraryBookLocation>(
LibraryBookLocation(
location: 'Bitte auswählen',
),
LibraryBookLocation(location: 'Bitte auswählen'),
);
ValueListenable<LibraryBookLocation> get lastLocationValue =>
_lastSelectedLocation;
Expand All @@ -41,7 +40,7 @@ class BookManager {

BookManager();

// final session = di<HubSessionManager>().credentials.value;
// final session = di<HubSessionManager>().credentials.value;

int _currentPage = 1;
final int _perPage = 30;
Expand Down Expand Up @@ -72,13 +71,12 @@ class BookManager {

// - manage collections

void _refreshLibraryBookProxyCollections(
List<LibraryBook> libraryBooks,
) {
void _refreshLibraryBookProxyCollections(List<LibraryBook> libraryBooks) {
final List<LibraryBookProxy> libraryBookProxies = [];
for (LibraryBook libraryBook in libraryBooks) {
LibraryBookProxy libraryBookProxy =
LibraryBookProxy(librarybook: libraryBook);
LibraryBookProxy libraryBookProxy = LibraryBookProxy(
librarybook: libraryBook,
);
// 1. Add the libraryBookProxy to the collection

libraryBookProxies.add(libraryBookProxy);
Expand All @@ -90,12 +88,14 @@ class BookManager {
.where((p) => p.libraryId == libraryBookProxy.libraryId);
if (existingLibraryBookProxy.isNotEmpty) {
// If it exists, remove it from the list
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!
.removeWhere((p) => p.libraryId == libraryBookProxy.libraryId);
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!.removeWhere(
(p) => p.libraryId == libraryBookProxy.libraryId,
);
}
// Add the new libraryBookProxy to the list
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!
.add(libraryBookProxy);
_isbnLibraryBooksMap.value[libraryBook.book!.isbn]!.add(
libraryBookProxy,
);
} else {
_isbnLibraryBooksMap.value[libraryBook.book!.isbn] = [libraryBookProxy];
}
Expand All @@ -107,20 +107,20 @@ class BookManager {
}

void _addLibraryBookProxyToCollections(LibraryBook libraryBook) {
final LibraryBookProxy libraryBookProxy =
LibraryBookProxy(librarybook: libraryBook);
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
librarybook: libraryBook,
);
final List<LibraryBookProxy> libraryBookProxies =
_libraryBookProxies.value.toList();
libraryBookProxies.add(libraryBookProxy);
_libraryBookProxies.value = libraryBookProxies;
_isbnLibraryBooksMap.value[libraryBook.book!.isbn] = libraryBookProxies;
}

void _updateLibraryBookProxyInCollections(
LibraryBook libraryBook,
) {
final LibraryBookProxy libraryBookProxy =
LibraryBookProxy(librarybook: libraryBook);
void _updateLibraryBookProxyInCollections(LibraryBook libraryBook) {
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
librarybook: libraryBook,
);
final List<LibraryBookProxy> libraryBookProxies =
_libraryBookProxies.value.toList();
int index = libraryBookProxies.indexWhere(
Expand All @@ -139,11 +139,13 @@ class BookManager {
}

void _removeLibraryBookProxyFromCollection(
LibraryBookProxy libraryBookProxy) {
LibraryBookProxy libraryBookProxy,
) {
final List<LibraryBookProxy> libraryBookProxies =
_libraryBookProxies.value.toList();
libraryBookProxies
.removeWhere((p) => p.libraryId == libraryBookProxy.libraryId);
libraryBookProxies.removeWhere(
(p) => p.libraryId == libraryBookProxy.libraryId,
);
_libraryBookProxies.value = libraryBookProxies;
// Remove from the isbnLibraryBooksMap
final isbnLibraryBookProxyList =
Expand All @@ -163,16 +165,23 @@ class BookManager {

//- get functions

LibraryBookProxy? getLibraryBookByLibraryBookId(int? libraryBookId) {
LibraryBookProxy? getLibraryBookById(int? libraryBookId) {
if (libraryBookId == null) return null;
return _libraryBookProxies.value
.firstWhereOrNull((element) => element.libraryBookId == libraryBookId);
return _libraryBookProxies.value.firstWhereOrNull(
(element) => element.id == libraryBookId,
);
}

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

LibraryBookProxy? getLibraryBookByLibraryId(int id) {
return _libraryBookProxies.value.firstWhereOrNull(
(element) => element.id == id,
);
}

//- Repository calls

//- BOOK TAGS
Expand Down Expand Up @@ -213,11 +222,9 @@ class BookManager {
}

Future<void> postLocation(String locationName) async {
final newLocation = LibraryBookLocation(
location: locationName,
);
final LibraryBookLocation? responseLocation =
await _bookApiService.postBookLocation(newLocation);
final newLocation = LibraryBookLocation(location: locationName);
final LibraryBookLocation? responseLocation = await _bookApiService
.postBookLocation(newLocation);
if (responseLocation == null) {
return;
}
Expand All @@ -230,9 +237,10 @@ class BookManager {
return;
}

_locations.value = _locations.value
.where((loc) => loc.location != location.location)
.toList();
_locations.value =
_locations.value
.where((loc) => loc.location != location.location)
.toList();
}

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

_notificationService.showSnackBar(
NotificationType.success, 'Bücher erfolgreich geladen');
NotificationType.success,
'Bücher erfolgreich geladen',
);
}

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

_notificationService.showSnackBar(
NotificationType.success, 'Arbeitsheft erfolgreich erstellt');
NotificationType.success,
'Arbeitsheft erfolgreich erstellt',
);
}

Future<void> updateBookProperty({
Expand All @@ -280,27 +292,30 @@ class BookManager {
String? description,
String? readingLevel,
}) async {
final LibraryBook? updatedbook =
await _bookApiService.updateLibraryBookOrBook(
isbn: isbn,
libraryId: libraryId,
title: title,
author: author,
description: description,
readingLevel: readingLevel,
);
final LibraryBook? updatedbook = await _bookApiService
.updateLibraryBookOrBook(
isbn: isbn,
libraryId: libraryId,
title: title,
author: author,
description: description,
readingLevel: readingLevel,
);
if (updatedbook == null) {
return;
}
_updateLibraryBookProxyInCollections(updatedbook);

_notificationService.showSnackBar(
NotificationType.success, 'Arbeitsheft erfolgreich aktualisiert');
NotificationType.success,
'Arbeitsheft erfolgreich aktualisiert',
);
}

Future<void> deleteLibraryBook(LibraryBookProxy libraryBookProxy) async {
final bool? success =
await _bookApiService.deleteLibraryBook(libraryBookProxy.libraryBookId);
final bool? success = await _bookApiService.deleteLibraryBook(
libraryBookProxy.id,
);
if (success == null) {
return;
}
Expand Down Expand Up @@ -334,17 +349,27 @@ class BookManager {
}
final searchResults = <LibraryBookProxy>[];
for (final result in results) {
final LibraryBookProxy libraryBookProxy =
LibraryBookProxy(librarybook: result);
searchResults.add(libraryBookProxy);
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
librarybook: result,
);
// Check if this libraryId already exists to prevent duplicates
if (!searchResults.any(
(existing) => existing.libraryId == libraryBookProxy.libraryId,
)) {
searchResults.add(libraryBookProxy);
}
}
_searchResults.value = searchResults;

_notificationService.showSnackBar(
NotificationType.success, 'Suchergebnisse aktualisiert');
NotificationType.success,
'Suchergebnisse aktualisiert',
);
} catch (e) {
_notificationService.showSnackBar(
NotificationType.error, 'Fehler bei der Suche: $e');
NotificationType.error,
'Fehler bei der Suche: $e',
);
}
}

Expand Down Expand Up @@ -380,13 +405,19 @@ class BookManager {
_hasMorePages = false;
} else {
final List<LibraryBookProxy> searchResultsToUpdate =
searchResults.value;
_searchResults.value.toList(); // Create a copy
for (final result in newPageResults) {
final LibraryBookProxy libraryBookProxy =
LibraryBookProxy(librarybook: result);
searchResultsToUpdate.add(libraryBookProxy);
final LibraryBookProxy libraryBookProxy = LibraryBookProxy(
librarybook: result,
);
// Check if this libraryId already exists to prevent duplicates
if (!searchResultsToUpdate.any(
(existing) => existing.libraryId == libraryBookProxy.libraryId,
)) {
searchResultsToUpdate.add(libraryBookProxy);
}
}
_searchResults.value = [...searchResultsToUpdate];
_searchResults.value = searchResultsToUpdate;
if (newPageResults.length < _perPage) {
_hasMorePages = false;
}
Expand Down
Loading