import 'package:isar/isar.dart'; import '../Entities/transaction.dart'; import '../Services/isar_service.dart'; /// Funktionen zum interagieren mit der Datenbank für die Transaktionen class TransactionRepository { final IsarService _isarService = IsarService(); /// Fügt eine neue Transaktion zur Datenbank hinzu Future add(final Transaction transaction) async { final Isar isar = await _isarService.getDatabase(); final int id = await isar.writeTxn( () => isar.transactions.put(transaction), ); return find(id); } /// Entfernt eine Transaktion aus der Datenbank Future remove(final Transaction transaction) async { final Isar isar = await _isarService.getDatabase(); return isar.writeTxn(() => isar.transactions.delete(transaction.id)); } /// Sucht eine Transaktion anhand seiner Id aus der Datenbank Future find(final int id) async { final Isar isar = await _isarService.getDatabase(); return isar.transactions.get(id); } /// Sucht Transaktionen anhand der gegebenen Parameter aus der Datenbank Future> findBy({ final int? id, final String? name, final DateTime? date, final DateTime? dateBefore, final DateTime? dateAfter, final double? amount, final double? amountMin, final double? amountMax, final String? orderBy, }) async { final Isar isar = await _isarService.getDatabase(); final QueryBuilder baseQuery = isar.transactions .filter() .optional( id != null, (final QueryBuilder q) => q.idEqualTo(id!), ) .optional( name != null && name.isNotEmpty, ( final QueryBuilder q, ) => q.nameMatches('*$name*', caseSensitive: false), ) .optional( date != null, (final QueryBuilder q) => q.dateEqualTo(date), ) .optional( dateBefore != null && dateAfter == null, (final QueryBuilder q) => q.dateGreaterThan(dateBefore), ) .optional( dateBefore == null && dateAfter != null, (final QueryBuilder q) => q.dateLessThan(dateAfter), ) .optional( dateBefore != null && dateAfter != null, (final QueryBuilder q) => q.dateBetween(dateBefore, dateAfter), ) .optional( amount != null, (final QueryBuilder q) => q.amountEqualTo(amount!), ) .optional( amountMin != null && amountMax == null, (final QueryBuilder q) => q.amountGreaterThan(amountMin!), ) .optional( amountMin == null && amountMax != null, (final QueryBuilder q) => q.amountLessThan(amountMax!), ) .optional( amountMin != null && amountMax != null, (final QueryBuilder q) => q.amountBetween(amountMin!, amountMax!), ); switch (orderBy) { case 'nameAsc': return baseQuery.sortByName().findAll(); case 'nameDesc': return baseQuery.sortByNameDesc().findAll(); case 'dateAsc': return baseQuery.sortByDate().findAll(); case 'dateDesc': return baseQuery.sortByDateDesc().findAll(); case 'amountAsc': return baseQuery.sortByAmount().findAll(); case 'amountDesc': return baseQuery.sortByAmountDesc().findAll(); default: return baseQuery.findAll(); } } }