import 'package:isar/isar.dart'; import '../Entities/recurring_transaction.dart'; import '../Entities/time_frame_enum.dart'; import '../Services/isar_service.dart'; /// Funktionen zum interagieren mit der Datenbank für die Transaktionen class RecurringTransactionRepository { final IsarService _isarService = IsarService(); /// Fügt eine neue wiederkehrende Transaktion zur Datenbank hinzu Future add( final RecurringTransaction recurringTransaction, ) async { final Isar isar = await _isarService.getDatabase(); final int id = await isar.writeTxn( () => isar.recurringTransactions.put(recurringTransaction), ); return find(id); } /// Entfernt eine wiederkehrende Transaktion aus der Datenbank Future remove(final RecurringTransaction recurringTransaction) async { final Isar isar = await _isarService.getDatabase(); return isar.writeTxn( () => isar.recurringTransactions.delete(recurringTransaction.id), ); } /// Sucht eine wiederkehrende Transaktion anhand seiner Id aus der Datenbank Future find(final int id) async { final Isar isar = await _isarService.getDatabase(); return isar.recurringTransactions.get(id); } /// Sucht wiederkehrende Transaktionen anhand der gegebenen Parameter /// aus der Datenbank /// Sucht wiederkehrende Transaktionen anhand der gegebenen Parameter Future> findBy({ final int? id, final String? name, final DateTime? startDate, final DateTime? startDateBefore, final DateTime? startDateAfter, final DateTime? startDateFrom, final DateTime? startDateTo, final TimeFrameEnum? timeFrame, final double? amount, final double? amountMin, final double? amountMax, final String? orderBy, }) async { final Isar isar = await _isarService.getDatabase(); final QueryBuilder< RecurringTransaction, RecurringTransaction, QAfterFilterCondition > baseQuery = isar.recurringTransactions .filter() .optional(id != null, (final q) => q.idEqualTo(id!)) .optional( name != null && name.isNotEmpty, (final q) => q.nameMatches('*$name*', caseSensitive: false), ) // --- StartDate Filter --- .optional(startDate != null, (final q) => q.startDateEqualTo(startDate)) .optional( startDateAfter != null, (final q) => q.startDateGreaterThan(startDateAfter), ) .optional( startDateBefore != null, (final q) => q.startDateLessThan(startDateBefore), ) .optional( startDateFrom != null && startDateTo != null, (final q) => q.startDateBetween(startDateFrom, startDateTo), ) // --- TimeFrame --- .optional( timeFrame != null, (final q) => q.timeFrameEqualTo(timeFrame!), ) // --- Amount Filter --- .optional(amount != null, (final q) => q.amountEqualTo(amount!)) .optional( amountMin != null && amountMax == null, (final q) => q.amountGreaterThan(amountMin!), ) .optional( amountMin == null && amountMax != null, (final q) => q.amountLessThan(amountMax!), ) .optional( amountMin != null && amountMax != null, (final q) => q.amountBetween(amountMin!, amountMax!), ); // --- Sortierung --- switch (orderBy) { case 'nameAsc': return baseQuery.sortByName().findAll(); case 'nameDesc': return baseQuery.sortByNameDesc().findAll(); case 'amountAsc': return baseQuery.sortByAmount().findAll(); case 'amountDesc': return baseQuery.sortByAmountDesc().findAll(); case 'startDateAsc': return baseQuery.sortByStartDate().findAll(); case 'startDateDesc': return baseQuery.sortByStartDateDesc().findAll(); default: return baseQuery.findAll(); } } }