Feat: Fügt IsarService und Repositories hinzu
This commit is contained in:
65
lib/Repositories/account_repository.dart
Normal file
65
lib/Repositories/account_repository.dart
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
132
lib/Repositories/recurring_transacation_repository.dart
Normal file
132
lib/Repositories/recurring_transacation_repository.dart
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
127
lib/Repositories/transaction_repository.dart
Normal file
127
lib/Repositories/transaction_repository.dart
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
40
lib/Services/isar_service.dart
Normal file
40
lib/Services/isar_service.dart
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:isar/isar.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
|
||||||
|
import '../Entities/account.dart';
|
||||||
|
import '../Entities/recurring_transaction.dart';
|
||||||
|
import '../Entities/transaction.dart';
|
||||||
|
|
||||||
|
/// Ein Service um auf die Datenbank zuzugreifen
|
||||||
|
class IsarService {
|
||||||
|
/// Gibt eine gültige Instanz der Klasse zurück
|
||||||
|
factory IsarService() => _instance;
|
||||||
|
|
||||||
|
/// Initialisiert eine neue Instanz dieser Klasse
|
||||||
|
IsarService._internal();
|
||||||
|
|
||||||
|
static final _instance = IsarService._internal();
|
||||||
|
|
||||||
|
Isar? _isar;
|
||||||
|
|
||||||
|
/// Gibt die Datenbank zurück.
|
||||||
|
Future<Isar> getDatabase() async {
|
||||||
|
if (_isar == null) {
|
||||||
|
await _initializeDatabase();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _isar!;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Initialisiert die Datenbank
|
||||||
|
Future<void> _initializeDatabase() async {
|
||||||
|
final Directory dir = await getApplicationDocumentsDirectory();
|
||||||
|
_isar = await Isar.open([
|
||||||
|
AccountSchema,
|
||||||
|
TransactionSchema,
|
||||||
|
RecurringTransactionSchema,
|
||||||
|
], directory: dir.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user