128 lines
4.0 KiB
Dart
128 lines
4.0 KiB
Dart
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<Transaction?> 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<bool> 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<Transaction?> 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<List<Transaction>> 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<Transaction, Transaction, QAfterFilterCondition>
|
|
baseQuery = isar.transactions
|
|
.filter()
|
|
.optional(
|
|
id != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.idEqualTo(id!),
|
|
)
|
|
.optional(
|
|
name != null && name.isNotEmpty,
|
|
(
|
|
final QueryBuilder<Transaction, Transaction, QAfterFilterCondition>
|
|
q,
|
|
) => q.nameMatches('*$name*', caseSensitive: false),
|
|
)
|
|
.optional(
|
|
date != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.dateEqualTo(date),
|
|
)
|
|
.optional(
|
|
dateBefore != null && dateAfter == null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.dateGreaterThan(dateBefore),
|
|
)
|
|
.optional(
|
|
dateBefore == null && dateAfter != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.dateLessThan(dateAfter),
|
|
)
|
|
.optional(
|
|
dateBefore != null && dateAfter != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.dateBetween(dateBefore, dateAfter),
|
|
)
|
|
.optional(
|
|
amount != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.amountEqualTo(amount!),
|
|
)
|
|
.optional(
|
|
amountMin != null && amountMax == null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.amountGreaterThan(amountMin!),
|
|
)
|
|
.optional(
|
|
amountMin == null && amountMax != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> q) =>
|
|
q.amountLessThan(amountMax!),
|
|
)
|
|
.optional(
|
|
amountMin != null && amountMax != null,
|
|
(final QueryBuilder<Transaction, Transaction, QFilterCondition> 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();
|
|
}
|
|
}
|
|
}
|