import 'package:drift/drift.dart'; import '../Entities/drift_database.dart'; import '../Entities/time_frame_enum.dart'; import '../Services/database_service.dart'; /// Funktionen zum interagieren mit der Datenbank für die Transaktionen class RecurringTransactionRepository { final AppDatabase _db = DatabaseService().database; /// Fügt eine neue wiederkehrende Transaktion zur Datenbank hinzu Future add( final RecurringTransactionsCompanion recurringTransaction, ) async { final int id = await _db .into(_db.recurringTransactions) .insert(recurringTransaction); return find(id); } /// Aktualisiert eine wiederkehrende Transaktion in der Datenbank Future update( final RecurringTransactionsCompanion recurringTransaction, ) => _db.update(_db.recurringTransactions).replace(recurringTransaction); /// Entfernt eine wiederkehrende Transaktion aus der Datenbank Future remove(final RecurringTransaction recurringTransaction) => (_db.delete( _db.recurringTransactions, )..where((final t) => t.id.equals(recurringTransaction.id))).go(); /// Sucht eine wiederkehrende Transaktion anhand seiner Id aus der Datenbank Future find(final int id) => (_db.select( _db.recurringTransactions, )..where((final t) => t.id.equals(id))).getSingleOrNull(); /// Sucht wiederkehrende Transaktionen anhand der gegebenen Parameter /// aus der Datenbank Future> findBy({ final int? id, final String? name, final DateTime? startDate, final DateTime? startDateBefore, final DateTime? startDateAfter, final TimeFrameEnum? timeFrame, final double? amount, final double? amountMin, final double? amountMax, final Account? account, final String? orderBy, }) { final SimpleSelectStatement< $RecurringTransactionsTable, RecurringTransaction > query = _db.select(_db.recurringTransactions); if (id != null) { query.where((final t) => t.id.equals(id)); } if (name != null && name.isNotEmpty) { query.where((final t) => t.name.like('%$name%')); } if (startDate != null) { query.where((final t) => t.startDate.equals(startDate)); } if (startDateAfter != null) { query.where((final t) => t.startDate.isBiggerThanValue(startDateAfter)); } if (startDateBefore != null) { query.where((final t) => t.startDate.isSmallerThanValue(startDateBefore)); } if (timeFrame != null) { query.where((final t) => t.timeFrame.equals(timeFrame.index)); } if (amount != null) { query.where((final t) => t.amount.equals(amount)); } if (amountMin != null) { query.where((final t) => t.amount.isBiggerThanValue(amountMin)); } if (amountMax != null) { query.where((final t) => t.amount.isSmallerThanValue(amountMax)); } if (account != null) { query.where((final t) => t.accountId.equals(account.id)); } if (orderBy != null) { switch (orderBy) { case 'nameAsc': query.orderBy([(final t) => OrderingTerm.asc(t.name)]); case 'nameDesc': query.orderBy([(final t) => OrderingTerm.desc(t.name)]); case 'amountAsc': query.orderBy([(final t) => OrderingTerm.asc(t.amount)]); case 'amountDesc': query.orderBy([(final t) => OrderingTerm.desc(t.amount)]); case 'startDateAsc': query.orderBy([(final t) => OrderingTerm.asc(t.startDate)]); case 'startDateDesc': query.orderBy([(final t) => OrderingTerm.desc(t.startDate)]); } } return query.get(); } }