import 'package:drift/drift.dart'; import '../Entities/drift_database.dart'; import '../Services/database_service.dart'; /// Funktionen zum interagieren mit der Datenbank für die Transaktionen class TransactionRepository { final AppDatabase _db = DatabaseService().database; /// Fügt eine neue Transaktion zur Datenbank hinzu Future add(final TransactionsCompanion transaction) async { final int id = await _db.into(_db.transactions).insert(transaction); return find(id); } /// Entfernt eine Transaktion aus der Datenbank Future remove(final Transaction transaction) => (_db.delete( _db.transactions, )..where((final t) => t.id.equals(transaction.id))).go(); /// Sucht eine Transaktion anhand seiner Id aus der Datenbank Future find(final int id) => (_db.select( _db.transactions, )..where((final t) => t.id.equals(id))).getSingleOrNull(); /// 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, }) { final SimpleSelectStatement<$TransactionsTable, Transaction> query = _db .select(_db.transactions); 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 (date != null) { query.where((final t) => t.date.equals(date)); } if (dateBefore != null) { query.where((final t) => t.date.isBiggerThanValue(dateBefore)); } if (dateAfter != null) { query.where((final t) => t.date.isSmallerThanValue(dateAfter)); } 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 (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 'dateAsc': query.orderBy([(final t) => OrderingTerm.asc(t.date)]); case 'dateDesc': query.orderBy([(final t) => OrderingTerm.desc(t.date)]); case 'amountAsc': query.orderBy([(final t) => OrderingTerm.asc(t.amount)]); case 'amountDesc': query.orderBy([(final t) => OrderingTerm.desc(t.amount)]); } } return query.get(); } }