Feat: Fügt IsarService und Repositories hinzu

This commit is contained in:
2025-12-22 03:33:37 +01:00
parent 277800a578
commit 92fec89333
4 changed files with 364 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
import 'package:isar/isar.dart';
import '../Entities/account.dart';
import '../Services/isar_service.dart';
/// Funktionen zum interagieren mit der Datenbank für die Konten
class AccountRepository {
final IsarService _isarService = IsarService();
/// Fügt ein neues Konto zur Datenbank hinzu
Future<Account?> add(final Account account) async {
final Isar isar = await _isarService.getDatabase();
final int id = await isar.writeTxn(() => isar.accounts.put(account));
return find(id);
}
/// Entfernt ein Konto aus der Datenbank
Future<bool> remove(final Account account) async {
final Isar isar = await _isarService.getDatabase();
return isar.writeTxn(() => isar.accounts.delete(account.id));
}
/// Sucht ein Konto anhand seiner Id aus der Datenbank
Future<Account?> find(final int id) async {
final Isar isar = await _isarService.getDatabase();
return isar.accounts.get(id);
}
/// Sucht Konten anhand der gegebenen Parameter aus der Datenbank
Future<List<Account>> findBy({
final int? id,
final String? name,
final String? orderBy,
}) async {
final Isar isar = await _isarService.getDatabase();
final QueryBuilder<Account, Account, QAfterFilterCondition> baseQuery = isar
.accounts
.filter()
.optional(
id != null,
(final QueryBuilder<Account, Account, QFilterCondition> q) =>
q.idEqualTo(id!),
)
.optional(
name != null && name.isNotEmpty,
(final QueryBuilder<Account, Account, QAfterFilterCondition> q) =>
q.nameMatches('*$name*', caseSensitive: false),
);
switch (orderBy) {
case 'nameAsc':
return baseQuery.sortByName().findAll();
case 'nameDesc':
return baseQuery.sortByNameDesc().findAll();
default:
return baseQuery.findAll();
}
}
}

View File

@@ -0,0 +1,132 @@
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<RecurringTransaction?> 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<bool> 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<RecurringTransaction?> 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<List<RecurringTransaction>> 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();
}
}
}

View File

@@ -0,0 +1,127 @@
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();
}
}
}