Start migration to sqlite using drift

This commit is contained in:
2025-05-17 23:51:51 +02:00
parent 4d267eff88
commit 5dc474407c
50 changed files with 9549 additions and 6972 deletions

View File

@@ -1,15 +1,8 @@
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:okane/database/collections/account.dart';
import 'package:okane/database/collections/beneficiary.dart';
import 'package:okane/database/collections/budget.dart';
import 'package:okane/database/collections/expense_category.dart';
import 'package:okane/database/collections/loan.dart';
import 'package:okane/database/collections/recurrent.dart';
import 'package:okane/database/collections/template.dart';
import 'package:okane/database/collections/transaction.dart';
import 'package:okane/database/database.dart' as db;
import 'package:get_it/get_it.dart';
import 'package:okane/database/sqlite.dart';
import 'package:okane/ui/navigation.dart';
part 'core.freezed.dart';
@@ -19,17 +12,17 @@ abstract class CoreState with _$CoreState {
const factory CoreState({
@Default(OkanePage.accounts) OkanePage activePage,
int? activeAccountIndex,
@Default(null) Transaction? activeTransaction,
@Default(null) TransactionDto? activeTransaction,
@Default([]) List<Account> accounts,
@Default([]) List<RecurringTransaction> recurringTransactions,
@Default([]) List<Transaction> transactions,
@Default([]) List<TransactionTemplate> transactionTemplates,
@Default([]) List<RecurringTransactionDto> recurringTransactions,
@Default([]) List<TransactionDto> transactions,
@Default([]) List<TransactionTemplateDto> transactionTemplates,
@Default([]) List<Beneficiary> beneficiaries,
@Default([]) List<ExpenseCategory> expenseCategories,
@Default([]) List<Budget> budgets,
@Default(null) Budget? activeBudget,
@Default([]) List<Loan> loans,
@Default(null) Loan? activeLoan,
@Default([]) List<BudgetsDto> budgets,
@Default(null) BudgetsDto? activeBudget,
@Default([]) List<LoanDto> loans,
@Default(null) LoanDto? activeLoan,
@Default(false) bool isDeletingAccount,
}) = _CoreState;
}
@@ -48,80 +41,65 @@ class CoreCubit extends Cubit<CoreState> {
void setupAccountStream() {
_accountsStreamSubscription?.cancel();
_accountsStreamSubscription = db.watchAccounts().listen((_) async {
final resetStreams = state.activeAccountIndex == null;
final accounts = await db.getAccounts();
emit(
state.copyWith(
accounts: accounts,
activeAccountIndex: state.activeAccountIndex ?? 0,
),
);
if (resetStreams) {
setupStreams(accounts[0]);
}
});
_accountsStreamSubscription = GetIt.I
.get<OkaneDatabase>()
.accountsDao
.accountsStream()
.listen((accounts) {
emit(
state.copyWith(
accounts: accounts,
activeAccountIndex:
accounts.isNotEmpty ? state.activeAccountIndex ?? 0 : null,
),
);
});
}
void setupStreams(Account account) {
final db = GetIt.I.get<OkaneDatabase>();
setupAccountStream();
_recurringTransactionStreamSubscription?.cancel();
_recurringTransactionStreamSubscription = db
.watchRecurringTransactions(activeAccount!)
.listen((_) async {
print("RECURRING UPDATE");
emit(
state.copyWith(
recurringTransactions: await db.getRecurringTransactions(
activeAccount!,
),
),
);
_recurringTransactionStreamSubscription = db.recurringTransactionsDao
.recurringTransactionsStream(account)
.listen((recurring) async {
emit(state.copyWith(recurringTransactions: recurring));
});
_transactionTemplatesStreamSubcription?.cancel();
_transactionTemplatesStreamSubcription = db
.watchTransactionTemplates(activeAccount!)
.listen((_) async {
emit(
state.copyWith(
transactionTemplates: await db.getTransactionTemplates(
activeAccount!,
),
),
);
_transactionTemplatesStreamSubcription = db.transactionTemplatesDao
.transactionTemplatesStream(account)
.listen((templates) async {
emit(state.copyWith(transactionTemplates: templates));
});
_transactionsStreamSubscription?.cancel();
_transactionsStreamSubscription = db
.watchTransactions(activeAccount!)
.listen((_) async {
emit(
state.copyWith(
transactions: await db.getTransactions(activeAccount!),
),
);
_transactionsStreamSubscription = db.transactionsDao
.transactionsStream(activeAccount!)
.listen((transactions) async {
emit(state.copyWith(transactions: transactions));
});
_beneficiariesStreamSubscription?.cancel();
_beneficiariesStreamSubscription = db.watchBeneficiaries().listen((
_,
) async {
emit(state.copyWith(beneficiaries: await db.getBeneficiaries()));
});
_beneficiariesStreamSubscription = db.beneficiariesDao
.beneficiariesStream()
.listen((beneficiaries) async {
emit(state.copyWith(beneficiaries: beneficiaries));
});
_expenseCategoryStreamSubscription?.cancel();
_expenseCategoryStreamSubscription = db.watchExpenseCategory().listen((
_,
) async {
emit(state.copyWith(expenseCategories: await db.getExpenseCategories()));
});
_expenseCategoryStreamSubscription = db.expenseCategoriesDao
.expenseCategoriesStream(account)
.listen((expenseCategories) async {
emit(state.copyWith(expenseCategories: expenseCategories));
});
_budgetsStreamSubscription?.cancel();
_budgetsStreamSubscription = db.watchBudgets(activeAccount!).listen((
_,
) async {
emit(state.copyWith(budgets: await db.getBudgets(activeAccount!)));
});
_budgetsStreamSubscription = db.budgetsDao
.budgetsStream(activeAccount!)
.listen((budgets) async {
emit(state.copyWith(budgets: budgets));
});
_loanStreamSubscription?.cancel();
_loanStreamSubscription = db.watchLoans().listen((_) async {
emit(state.copyWith(loans: await db.getLoans()));
_loanStreamSubscription = db.loansDao.loansStream(account).listen((
loans,
) async {
emit(state.copyWith(loans: loans));
});
}
@@ -137,23 +115,29 @@ class CoreCubit extends Cubit<CoreState> {
}
Future<void> init() async {
final accounts = await db.getAccounts();
final db = GetIt.I.get<OkaneDatabase>();
final accounts = await db.accountsDao.getAccounts();
final account = accounts.isEmpty ? null : accounts[0];
emit(
state.copyWith(
accounts: accounts,
activeAccountIndex: accounts.isEmpty ? null : 0,
transactions: await db.getTransactions(account),
beneficiaries: await db.getBeneficiaries(),
transactionTemplates: await db.getTransactionTemplates(account),
recurringTransactions: await db.getRecurringTransactions(account),
expenseCategories: await db.getExpenseCategories(),
budgets: await db.getBudgets(account),
loans: await db.getLoans(),
transactions: await db.transactionsDao.getTransactions(account),
beneficiaries: await db.beneficiariesDao.getBeneficiaries(),
transactionTemplates: await db.transactionTemplatesDao
.getTransactionTemplates(account),
recurringTransactions: await db.recurringTransactionsDao
.getRecurringTransactions(account),
expenseCategories: await db.expenseCategoriesDao.getExpenseCategories(
account,
),
budgets: await db.budgetsDao.getBudgets(account),
loans: await db.loansDao.getLoans(account),
),
);
if (account != null) {
setupAccountStream();
setupStreams(account);
} else {
setupAccountStream();
@@ -166,15 +150,18 @@ class CoreCubit extends Cubit<CoreState> {
}
Future<void> setActiveAccountIndex(int index) async {
final db = GetIt.I.get<OkaneDatabase>();
final account = state.accounts[index];
emit(
state.copyWith(
activeAccountIndex: index,
transactions: await db.getTransactions(account),
beneficiaries: await db.getBeneficiaries(),
transactionTemplates: await db.getTransactionTemplates(account),
recurringTransactions: await db.getRecurringTransactions(account),
budgets: await db.getBudgets(account),
transactions: await db.transactionsDao.getTransactions(account),
beneficiaries: await db.beneficiariesDao.getBeneficiaries(),
transactionTemplates: await db.transactionTemplatesDao
.getTransactionTemplates(account),
recurringTransactions: await db.recurringTransactionsDao
.getRecurringTransactions(account),
budgets: await db.budgetsDao.getBudgets(account),
activeBudget: null,
activeTransaction: null,
activeLoan: null,
@@ -183,7 +170,7 @@ class CoreCubit extends Cubit<CoreState> {
setupStreams(account);
}
void setActiveTransaction(Transaction? item) {
void setActiveTransaction(TransactionDto? item) {
emit(state.copyWith(activeTransaction: item));
}
@@ -191,7 +178,7 @@ class CoreCubit extends Cubit<CoreState> {
emit(state.copyWith(accounts: accounts));
}
void setActiveBudget(Budget? budget) {
void setActiveBudget(BudgetsDto? budget) {
emit(state.copyWith(activeBudget: budget));
}
@@ -203,14 +190,15 @@ class CoreCubit extends Cubit<CoreState> {
cancelStreams();
try {
await db.deleteAccount(account);
// TODO
//await db.deleteAccount(account);
} finally {
emit(state.copyWith(isDeletingAccount: false));
}
await init();
}
void setActiveLoan(Loan loan) {
void setActiveLoan(LoanDto loan) {
emit(state.copyWith(activeLoan: loan));
}

View File

@@ -19,20 +19,20 @@ final _privateConstructorUsedError = UnsupportedError(
mixin _$CoreState {
OkanePage get activePage => throw _privateConstructorUsedError;
int? get activeAccountIndex => throw _privateConstructorUsedError;
Transaction? get activeTransaction => throw _privateConstructorUsedError;
TransactionDto? get activeTransaction => throw _privateConstructorUsedError;
List<Account> get accounts => throw _privateConstructorUsedError;
List<RecurringTransaction> get recurringTransactions =>
List<RecurringTransactionDto> get recurringTransactions =>
throw _privateConstructorUsedError;
List<Transaction> get transactions => throw _privateConstructorUsedError;
List<TransactionTemplate> get transactionTemplates =>
List<TransactionDto> get transactions => throw _privateConstructorUsedError;
List<TransactionTemplateDto> get transactionTemplates =>
throw _privateConstructorUsedError;
List<Beneficiary> get beneficiaries => throw _privateConstructorUsedError;
List<ExpenseCategory> get expenseCategories =>
throw _privateConstructorUsedError;
List<Budget> get budgets => throw _privateConstructorUsedError;
Budget? get activeBudget => throw _privateConstructorUsedError;
List<Loan> get loans => throw _privateConstructorUsedError;
Loan? get activeLoan => throw _privateConstructorUsedError;
List<BudgetsDto> get budgets => throw _privateConstructorUsedError;
BudgetsDto? get activeBudget => throw _privateConstructorUsedError;
List<LoanDto> get loans => throw _privateConstructorUsedError;
LoanDto? get activeLoan => throw _privateConstructorUsedError;
bool get isDeletingAccount => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
@@ -48,17 +48,17 @@ abstract class $CoreStateCopyWith<$Res> {
$Res call({
OkanePage activePage,
int? activeAccountIndex,
Transaction? activeTransaction,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransaction> recurringTransactions,
List<Transaction> transactions,
List<TransactionTemplate> transactionTemplates,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<Budget> budgets,
Budget? activeBudget,
List<Loan> loans,
Loan? activeLoan,
List<BudgetsDto> budgets,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount,
});
}
@@ -107,7 +107,7 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as Transaction?,
as TransactionDto?,
accounts:
null == accounts
? _value.accounts
@@ -117,17 +117,17 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
null == recurringTransactions
? _value.recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransaction>,
as List<RecurringTransactionDto>,
transactions:
null == transactions
? _value.transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<Transaction>,
as List<TransactionDto>,
transactionTemplates:
null == transactionTemplates
? _value.transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplate>,
as List<TransactionTemplateDto>,
beneficiaries:
null == beneficiaries
? _value.beneficiaries
@@ -142,22 +142,22 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
null == budgets
? _value.budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<Budget>,
as List<BudgetsDto>,
activeBudget:
freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as Budget?,
as BudgetsDto?,
loans:
null == loans
? _value.loans
: loans // ignore: cast_nullable_to_non_nullable
as List<Loan>,
as List<LoanDto>,
activeLoan:
freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as Loan?,
as LoanDto?,
isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount
@@ -181,17 +181,17 @@ abstract class _$$CoreStateImplCopyWith<$Res>
$Res call({
OkanePage activePage,
int? activeAccountIndex,
Transaction? activeTransaction,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransaction> recurringTransactions,
List<Transaction> transactions,
List<TransactionTemplate> transactionTemplates,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<Budget> budgets,
Budget? activeBudget,
List<Loan> loans,
Loan? activeLoan,
List<BudgetsDto> budgets,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount,
});
}
@@ -239,7 +239,7 @@ class __$$CoreStateImplCopyWithImpl<$Res>
freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as Transaction?,
as TransactionDto?,
accounts:
null == accounts
? _value._accounts
@@ -249,17 +249,17 @@ class __$$CoreStateImplCopyWithImpl<$Res>
null == recurringTransactions
? _value._recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransaction>,
as List<RecurringTransactionDto>,
transactions:
null == transactions
? _value._transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<Transaction>,
as List<TransactionDto>,
transactionTemplates:
null == transactionTemplates
? _value._transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplate>,
as List<TransactionTemplateDto>,
beneficiaries:
null == beneficiaries
? _value._beneficiaries
@@ -274,22 +274,22 @@ class __$$CoreStateImplCopyWithImpl<$Res>
null == budgets
? _value._budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<Budget>,
as List<BudgetsDto>,
activeBudget:
freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as Budget?,
as BudgetsDto?,
loans:
null == loans
? _value._loans
: loans // ignore: cast_nullable_to_non_nullable
as List<Loan>,
as List<LoanDto>,
activeLoan:
freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as Loan?,
as LoanDto?,
isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount
@@ -308,14 +308,14 @@ class _$CoreStateImpl implements _CoreState {
this.activeAccountIndex,
this.activeTransaction = null,
final List<Account> accounts = const [],
final List<RecurringTransaction> recurringTransactions = const [],
final List<Transaction> transactions = const [],
final List<TransactionTemplate> transactionTemplates = const [],
final List<RecurringTransactionDto> recurringTransactions = const [],
final List<TransactionDto> transactions = const [],
final List<TransactionTemplateDto> transactionTemplates = const [],
final List<Beneficiary> beneficiaries = const [],
final List<ExpenseCategory> expenseCategories = const [],
final List<Budget> budgets = const [],
final List<BudgetsDto> budgets = const [],
this.activeBudget = null,
final List<Loan> loans = const [],
final List<LoanDto> loans = const [],
this.activeLoan = null,
this.isDeletingAccount = false,
}) : _accounts = accounts,
@@ -334,7 +334,7 @@ class _$CoreStateImpl implements _CoreState {
final int? activeAccountIndex;
@override
@JsonKey()
final Transaction? activeTransaction;
final TransactionDto? activeTransaction;
final List<Account> _accounts;
@override
@JsonKey()
@@ -344,29 +344,29 @@ class _$CoreStateImpl implements _CoreState {
return EqualUnmodifiableListView(_accounts);
}
final List<RecurringTransaction> _recurringTransactions;
final List<RecurringTransactionDto> _recurringTransactions;
@override
@JsonKey()
List<RecurringTransaction> get recurringTransactions {
List<RecurringTransactionDto> get recurringTransactions {
if (_recurringTransactions is EqualUnmodifiableListView)
return _recurringTransactions;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_recurringTransactions);
}
final List<Transaction> _transactions;
final List<TransactionDto> _transactions;
@override
@JsonKey()
List<Transaction> get transactions {
List<TransactionDto> get transactions {
if (_transactions is EqualUnmodifiableListView) return _transactions;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_transactions);
}
final List<TransactionTemplate> _transactionTemplates;
final List<TransactionTemplateDto> _transactionTemplates;
@override
@JsonKey()
List<TransactionTemplate> get transactionTemplates {
List<TransactionTemplateDto> get transactionTemplates {
if (_transactionTemplates is EqualUnmodifiableListView)
return _transactionTemplates;
// ignore: implicit_dynamic_type
@@ -392,10 +392,10 @@ class _$CoreStateImpl implements _CoreState {
return EqualUnmodifiableListView(_expenseCategories);
}
final List<Budget> _budgets;
final List<BudgetsDto> _budgets;
@override
@JsonKey()
List<Budget> get budgets {
List<BudgetsDto> get budgets {
if (_budgets is EqualUnmodifiableListView) return _budgets;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_budgets);
@@ -403,11 +403,11 @@ class _$CoreStateImpl implements _CoreState {
@override
@JsonKey()
final Budget? activeBudget;
final List<Loan> _loans;
final BudgetsDto? activeBudget;
final List<LoanDto> _loans;
@override
@JsonKey()
List<Loan> get loans {
List<LoanDto> get loans {
if (_loans is EqualUnmodifiableListView) return _loans;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_loans);
@@ -415,7 +415,7 @@ class _$CoreStateImpl implements _CoreState {
@override
@JsonKey()
final Loan? activeLoan;
final LoanDto? activeLoan;
@override
@JsonKey()
final bool isDeletingAccount;
@@ -497,17 +497,17 @@ abstract class _CoreState implements CoreState {
const factory _CoreState({
final OkanePage activePage,
final int? activeAccountIndex,
final Transaction? activeTransaction,
final TransactionDto? activeTransaction,
final List<Account> accounts,
final List<RecurringTransaction> recurringTransactions,
final List<Transaction> transactions,
final List<TransactionTemplate> transactionTemplates,
final List<RecurringTransactionDto> recurringTransactions,
final List<TransactionDto> transactions,
final List<TransactionTemplateDto> transactionTemplates,
final List<Beneficiary> beneficiaries,
final List<ExpenseCategory> expenseCategories,
final List<Budget> budgets,
final Budget? activeBudget,
final List<Loan> loans,
final Loan? activeLoan,
final List<BudgetsDto> budgets,
final BudgetsDto? activeBudget,
final List<LoanDto> loans,
final LoanDto? activeLoan,
final bool isDeletingAccount,
}) = _$CoreStateImpl;
@@ -516,27 +516,27 @@ abstract class _CoreState implements CoreState {
@override
int? get activeAccountIndex;
@override
Transaction? get activeTransaction;
TransactionDto? get activeTransaction;
@override
List<Account> get accounts;
@override
List<RecurringTransaction> get recurringTransactions;
List<RecurringTransactionDto> get recurringTransactions;
@override
List<Transaction> get transactions;
List<TransactionDto> get transactions;
@override
List<TransactionTemplate> get transactionTemplates;
List<TransactionTemplateDto> get transactionTemplates;
@override
List<Beneficiary> get beneficiaries;
@override
List<ExpenseCategory> get expenseCategories;
@override
List<Budget> get budgets;
List<BudgetsDto> get budgets;
@override
Budget? get activeBudget;
BudgetsDto? get activeBudget;
@override
List<Loan> get loans;
List<LoanDto> get loans;
@override
Loan? get activeLoan;
LoanDto? get activeLoan;
@override
bool get isDeletingAccount;
@override