Docs: Schreib Docs

This commit is contained in:
2025-12-25 16:32:50 +01:00
parent 05a5bddf09
commit 8a612fc27c
7 changed files with 109 additions and 93 deletions

View File

@@ -5,55 +5,74 @@ import 'time_frame_enum.dart';
part 'drift_database.g.dart'; part 'drift_database.g.dart';
/// Eine Tabelle für Konten.
class Accounts extends Table { class Accounts extends Table {
/// Eindeutige ID des Kontos
IntColumn get id => integer().autoIncrement()(); IntColumn get id => integer().autoIncrement()();
/// Name des Kontos
TextColumn get name => text().withDefault(const Constant(''))(); TextColumn get name => text().withDefault(const Constant(''))();
} }
/// Eine Tabelle für einzelne Transaktionen.
class Transactions extends Table { class Transactions extends Table {
/// Eindeutige ID der Transaktion
IntColumn get id => integer().autoIncrement()(); IntColumn get id => integer().autoIncrement()();
/// Name/Beschreibung der Transaktion
TextColumn get name => text().withDefault(const Constant(''))(); TextColumn get name => text().withDefault(const Constant(''))();
/// Datum der Transaktion
DateTimeColumn get date => dateTime().nullable()(); DateTimeColumn get date => dateTime().nullable()();
RealColumn get amount => real().withDefault(const Constant(0.0))(); /// Betrag der Transaktion
RealColumn get amount => real().withDefault(const Constant(0))();
/// Fremdschlüssel zum zugehörigen Konto
IntColumn get accountId => integer().references(Accounts, #id)(); IntColumn get accountId => integer().references(Accounts, #id)();
/// Fremdschlüssel zur zugehörigen wiederkehrenden Transaktion,
/// falls vorhanden
IntColumn get recurringTransactionId => IntColumn get recurringTransactionId =>
integer().nullable().references(RecurringTransactions, #id)(); integer().nullable().references(RecurringTransactions, #id)();
} }
/// Eine Tabelle für wiederkehrende Transaktionen.
class RecurringTransactions extends Table { class RecurringTransactions extends Table {
/// Eindeutige ID der wiederkehrenden Transaktion
IntColumn get id => integer().autoIncrement()(); IntColumn get id => integer().autoIncrement()();
/// Name/Beschreibung der wiederkehrenden Transaktion
TextColumn get name => text().withDefault(const Constant(''))(); TextColumn get name => text().withDefault(const Constant(''))();
/// Startdatum der wiederkehrenden Transaktion
DateTimeColumn get startDate => dateTime().nullable()(); DateTimeColumn get startDate => dateTime().nullable()();
/// Zeitlicher Rahmen für die Wiederholung
IntColumn get timeFrame => intEnum<TimeFrameEnum>()(); IntColumn get timeFrame => intEnum<TimeFrameEnum>()();
RealColumn get amount => real().withDefault(const Constant(0.0))(); /// Betrag der wiederkehrenden Transaktion
RealColumn get amount => real().withDefault(const Constant(0))();
/// Fremdschlüssel zum zugehörigen Konto
IntColumn get accountId => integer().references(Accounts, #id)(); IntColumn get accountId => integer().references(Accounts, #id)();
} }
/// Hauptklasse für die Drift-Datenbank der Anwendung.
@DriftDatabase(tables: [Accounts, Transactions, RecurringTransactions]) @DriftDatabase(tables: [Accounts, Transactions, RecurringTransactions])
class AppDatabase extends _$AppDatabase { class AppDatabase extends _$AppDatabase {
/// Erstellt eine neue Datenbankinstanz
AppDatabase() : super(_openConnection()); AppDatabase() : super(_openConnection());
@override @override
int get schemaVersion => 1; int get schemaVersion => 1;
static QueryExecutor _openConnection() { /// Öffnet die Datenbankverbindung
return driftDatabase( static QueryExecutor _openConnection() => driftDatabase(
name: 'dragon_ledger', name: 'dragon_ledger',
web: DriftWebOptions( web: DriftWebOptions(
sqlite3Wasm: Uri.parse('sqlite3.wasm'), sqlite3Wasm: Uri.parse('sqlite3.wasm'),
driftWorker: Uri.parse('drift_worker.js'), driftWorker: Uri.parse('drift_worker.js'),
), ),
); );
}
} }

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// Eine Widget-Klasse, die die Einstellungsseite der Anwendung darstellt.
class Settings extends StatefulWidget { class Settings extends StatefulWidget {
/// Erstellt eine neue Instanz dieser Klasse.
const Settings({super.key}); const Settings({super.key});
@override @override

View File

@@ -14,41 +14,39 @@ class AccountRepository {
} }
/// Entfernt ein Konto aus der Datenbank /// Entfernt ein Konto aus der Datenbank
Future<int> remove(final Account account) async { Future<int> remove(final Account account) => (_db.delete(
return (_db.delete(_db.accounts) _db.accounts,
..where((t) => t.id.equals(account.id))).go(); )..where((final t) => t.id.equals(account.id))).go();
}
/// Sucht ein Konto anhand seiner Id aus der Datenbank /// Sucht ein Konto anhand seiner Id aus der Datenbank
Future<Account?> find(final int id) async { Future<Account?> find(final int id) => (_db.select(
return (_db.select(_db.accounts) _db.accounts,
..where((t) => t.id.equals(id))).getSingleOrNull(); )..where((final t) => t.id.equals(id))).getSingleOrNull();
}
/// Sucht Konten anhand der gegebenen Parameter aus der Datenbank /// Sucht Konten anhand der gegebenen Parameter aus der Datenbank
Future<List<Account>> findBy({ Future<List<Account>> findBy({
final int? id, final int? id,
final String? name, final String? name,
final String? orderBy, final String? orderBy,
}) async { }) {
final query = _db.select(_db.accounts); final SimpleSelectStatement<$AccountsTable, Account> query = _db.select(
_db.accounts,
);
if (id != null) { if (id != null) {
query.where((t) => t.id.equals(id)); query.where((final t) => t.id.equals(id));
} }
if (name != null && name.isNotEmpty) { if (name != null && name.isNotEmpty) {
query.where((t) => t.name.like('%$name%')); query.where((final t) => t.name.like('%$name%'));
} }
if (orderBy != null) { if (orderBy != null) {
switch (orderBy) { switch (orderBy) {
case 'nameAsc': case 'nameAsc':
query.orderBy([(t) => OrderingTerm.asc(t.name)]); query.orderBy([(final t) => OrderingTerm.asc(t.name)]);
break;
case 'nameDesc': case 'nameDesc':
query.orderBy([(t) => OrderingTerm.desc(t.name)]); query.orderBy([(final t) => OrderingTerm.desc(t.name)]);
break;
} }
} }

View File

@@ -10,24 +10,24 @@ class RecurringTransactionRepository {
/// Fügt eine neue wiederkehrende Transaktion zur Datenbank hinzu /// Fügt eine neue wiederkehrende Transaktion zur Datenbank hinzu
Future<RecurringTransaction?> add( Future<RecurringTransaction?> add(
final RecurringTransactionsCompanion recurringTransaction, final RecurringTransactionsCompanion recurringTransaction,
) async { ) async {
final int id = await _db.into(_db.recurringTransactions).insert( final int id = await _db
recurringTransaction); .into(_db.recurringTransactions)
.insert(recurringTransaction);
return find(id); return find(id);
} }
/// Entfernt eine wiederkehrende Transaktion aus der Datenbank /// Entfernt eine wiederkehrende Transaktion aus der Datenbank
Future<int> remove(final RecurringTransaction recurringTransaction) async { Future<int> remove(final RecurringTransaction recurringTransaction) =>
return (_db.delete(_db.recurringTransactions) (_db.delete(
..where((t) => t.id.equals(recurringTransaction.id))).go(); _db.recurringTransactions,
} )..where((final t) => t.id.equals(recurringTransaction.id))).go();
/// Sucht eine wiederkehrende Transaktion anhand seiner Id aus der Datenbank /// Sucht eine wiederkehrende Transaktion anhand seiner Id aus der Datenbank
Future<RecurringTransaction?> find(final int id) async { Future<RecurringTransaction?> find(final int id) => (_db.select(
return (_db.select(_db.recurringTransactions) _db.recurringTransactions,
..where((t) => t.id.equals(id))).getSingleOrNull(); )..where((final t) => t.id.equals(id))).getSingleOrNull();
}
/// Sucht wiederkehrende Transaktionen anhand der gegebenen Parameter /// Sucht wiederkehrende Transaktionen anhand der gegebenen Parameter
/// aus der Datenbank /// aus der Datenbank
@@ -44,70 +44,69 @@ class RecurringTransactionRepository {
final double? amountMin, final double? amountMin,
final double? amountMax, final double? amountMax,
final String? orderBy, final String? orderBy,
}) async { }) {
final query = _db.select(_db.recurringTransactions); final SimpleSelectStatement<
$RecurringTransactionsTable,
RecurringTransaction
>
query = _db.select(_db.recurringTransactions);
if (id != null) { if (id != null) {
query.where((t) => t.id.equals(id)); query.where((final t) => t.id.equals(id));
} }
if (name != null && name.isNotEmpty) { if (name != null && name.isNotEmpty) {
query.where((t) => t.name.like('%$name%')); query.where((final t) => t.name.like('%$name%'));
} }
if (startDate != null) { if (startDate != null) {
query.where((t) => t.startDate.equals(startDate)); query.where((final t) => t.startDate.equals(startDate));
} }
if (startDateAfter != null) { if (startDateAfter != null) {
query.where((t) => t.startDate.isBiggerThanValue(startDateAfter)); query.where((final t) => t.startDate.isBiggerThanValue(startDateAfter));
} }
if (startDateBefore != null) { if (startDateBefore != null) {
query.where((t) => t.startDate.isSmallerThanValue(startDateBefore)); query.where((final t) => t.startDate.isSmallerThanValue(startDateBefore));
} }
if (startDateFrom != null && startDateTo != null) { if (startDateFrom != null && startDateTo != null) {
query.where((t) => query.where(
t.startDate.isBetweenValues(startDateFrom, startDateTo)); (final t) => t.startDate.isBetweenValues(startDateFrom, startDateTo),
);
} }
if (timeFrame != null) { if (timeFrame != null) {
query.where((t) => t.timeFrame.equals(timeFrame.index)); query.where((final t) => t.timeFrame.equals(timeFrame.index));
} }
if (amount != null) { if (amount != null) {
query.where((t) => t.amount.equals(amount)); query.where((final t) => t.amount.equals(amount));
} }
if (amountMin != null) { if (amountMin != null) {
query.where((t) => t.amount.isBiggerThanValue(amountMin)); query.where((final t) => t.amount.isBiggerThanValue(amountMin));
} }
if (amountMax != null) { if (amountMax != null) {
query.where((t) => t.amount.isSmallerThanValue(amountMax)); query.where((final t) => t.amount.isSmallerThanValue(amountMax));
} }
if (orderBy != null) { if (orderBy != null) {
switch (orderBy) { switch (orderBy) {
case 'nameAsc': case 'nameAsc':
query.orderBy([(t) => OrderingTerm.asc(t.name)]); query.orderBy([(final t) => OrderingTerm.asc(t.name)]);
break;
case 'nameDesc': case 'nameDesc':
query.orderBy([(t) => OrderingTerm.desc(t.name)]); query.orderBy([(final t) => OrderingTerm.desc(t.name)]);
break;
case 'amountAsc': case 'amountAsc':
query.orderBy([(t) => OrderingTerm.asc(t.amount)]); query.orderBy([(final t) => OrderingTerm.asc(t.amount)]);
break;
case 'amountDesc': case 'amountDesc':
query.orderBy([(t) => OrderingTerm.desc(t.amount)]); query.orderBy([(final t) => OrderingTerm.desc(t.amount)]);
break;
case 'startDateAsc': case 'startDateAsc':
query.orderBy([(t) => OrderingTerm.asc(t.startDate)]); query.orderBy([(final t) => OrderingTerm.asc(t.startDate)]);
break;
case 'startDateDesc': case 'startDateDesc':
query.orderBy([(t) => OrderingTerm.desc(t.startDate)]); query.orderBy([(final t) => OrderingTerm.desc(t.startDate)]);
break;
} }
} }

View File

@@ -14,16 +14,14 @@ class TransactionRepository {
} }
/// Entfernt eine Transaktion aus der Datenbank /// Entfernt eine Transaktion aus der Datenbank
Future<int> remove(final Transaction transaction) async { Future<int> remove(final Transaction transaction) => (_db.delete(
return (_db.delete(_db.transactions) _db.transactions,
..where((t) => t.id.equals(transaction.id))).go(); )..where((final t) => t.id.equals(transaction.id))).go();
}
/// Sucht eine Transaktion anhand seiner Id aus der Datenbank /// Sucht eine Transaktion anhand seiner Id aus der Datenbank
Future<Transaction?> find(final int id) async { Future<Transaction?> find(final int id) => (_db.select(
return (_db.select(_db.transactions) _db.transactions,
..where((t) => t.id.equals(id))).getSingleOrNull(); )..where((final t) => t.id.equals(id))).getSingleOrNull();
}
/// Sucht Transaktionen anhand der gegebenen Parameter aus der Datenbank /// Sucht Transaktionen anhand der gegebenen Parameter aus der Datenbank
Future<List<Transaction>> findBy({ Future<List<Transaction>> findBy({
@@ -36,61 +34,56 @@ class TransactionRepository {
final double? amountMin, final double? amountMin,
final double? amountMax, final double? amountMax,
final String? orderBy, final String? orderBy,
}) async { }) {
final query = _db.select(_db.transactions); final SimpleSelectStatement<$TransactionsTable, Transaction> query = _db
.select(_db.transactions);
if (id != null) { if (id != null) {
query.where((t) => t.id.equals(id)); query.where((final t) => t.id.equals(id));
} }
if (name != null && name.isNotEmpty) { if (name != null && name.isNotEmpty) {
query.where((t) => t.name.like('%$name%')); query.where((final t) => t.name.like('%$name%'));
} }
if (date != null) { if (date != null) {
query.where((t) => t.date.equals(date)); query.where((final t) => t.date.equals(date));
} }
if (dateBefore != null) { if (dateBefore != null) {
query.where((t) => t.date.isBiggerThanValue(dateBefore)); query.where((final t) => t.date.isBiggerThanValue(dateBefore));
} }
if (dateAfter != null) { if (dateAfter != null) {
query.where((t) => t.date.isSmallerThanValue(dateAfter)); query.where((final t) => t.date.isSmallerThanValue(dateAfter));
} }
if (amount != null) { if (amount != null) {
query.where((t) => t.amount.equals(amount)); query.where((final t) => t.amount.equals(amount));
} }
if (amountMin != null) { if (amountMin != null) {
query.where((t) => t.amount.isBiggerThanValue(amountMin)); query.where((final t) => t.amount.isBiggerThanValue(amountMin));
} }
if (amountMax != null) { if (amountMax != null) {
query.where((t) => t.amount.isSmallerThanValue(amountMax)); query.where((final t) => t.amount.isSmallerThanValue(amountMax));
} }
if (orderBy != null) { if (orderBy != null) {
switch (orderBy) { switch (orderBy) {
case 'nameAsc': case 'nameAsc':
query.orderBy([(t) => OrderingTerm.asc(t.name)]); query.orderBy([(final t) => OrderingTerm.asc(t.name)]);
break;
case 'nameDesc': case 'nameDesc':
query.orderBy([(t) => OrderingTerm.desc(t.name)]); query.orderBy([(final t) => OrderingTerm.desc(t.name)]);
break;
case 'dateAsc': case 'dateAsc':
query.orderBy([(t) => OrderingTerm.asc(t.date)]); query.orderBy([(final t) => OrderingTerm.asc(t.date)]);
break;
case 'dateDesc': case 'dateDesc':
query.orderBy([(t) => OrderingTerm.desc(t.date)]); query.orderBy([(final t) => OrderingTerm.desc(t.date)]);
break;
case 'amountAsc': case 'amountAsc':
query.orderBy([(t) => OrderingTerm.asc(t.amount)]); query.orderBy([(final t) => OrderingTerm.asc(t.amount)]);
break;
case 'amountDesc': case 'amountDesc':
query.orderBy([(t) => OrderingTerm.desc(t.amount)]); query.orderBy([(final t) => OrderingTerm.desc(t.amount)]);
break;
} }
} }

View File

@@ -1,6 +1,8 @@
import '../Entities/drift_database.dart'; import '../Entities/drift_database.dart';
/// Eine Klasse, um auf die Datenbank zugreifen zu können
class DatabaseService { class DatabaseService {
/// Gibt die aktuell gültige Instanz der Klasse zurück
factory DatabaseService() => _instance; factory DatabaseService() => _instance;
DatabaseService._internal(); DatabaseService._internal();
@@ -9,6 +11,7 @@ class DatabaseService {
AppDatabase? _database; AppDatabase? _database;
/// Stellt die Datenbank dar
AppDatabase get database { AppDatabase get database {
_database ??= AppDatabase(); _database ??= AppDatabase();
return _database!; return _database!;

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// Eine Klasse, die die Navigation innerhalb der App steuert
class NavigationService { class NavigationService {
/// Der Navigator-Schlüssel, der für die Navigation verwendet wird
static final GlobalKey<NavigatorState> navigatorKey = static final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>(); GlobalKey<NavigatorState>();
} }