import 'package:rxdart/subjects.dart'; import 'package:krezus/repositories/json/json_repository.dart'; import 'package:krezus/repositories/metadata/models/budget.dart'; import 'package:krezus/repositories/metadata/models/category.dart'; import 'package:krezus/repositories/metadata/models/account.dart'; import 'package:krezus/repositories/metadata/models/metadata.dart'; import 'package:krezus/repositories/metadata/models/settings.dart'; class MetadataRepository { final JsonRepository _jsonRepository; final _categoriesController = BehaviorSubject>.seeded(const []); final _budgetController = BehaviorSubject>.seeded(const []); final _accountController = BehaviorSubject>.seeded(const []); final _settingsController = BehaviorSubject.seeded(const Settings()); MetadataRepository({ required jsonRepository, }) : _jsonRepository = jsonRepository; List getCategories() { return _categoriesController.value; } Stream> getCategoriesStream() { return _categoriesController.asBroadcastStream(); } List getBudgets() { return _budgetController.value; } Stream> getBudgetsStream() { return _budgetController.asBroadcastStream(); } List getAccounts() { return _accountController.value; } Stream> getAccountsStream() { return _accountController.asBroadcastStream(); } Settings getSettings() { return _settingsController.value; } Stream getSettingsStream() { return _settingsController.asBroadcastStream(); } void loadMetadata() async { Metadata metadata = await _jsonRepository.loadJson(Metadata(), MetadataFactory()); _broadcastMetadata(metadata); } List saveCategories(List categories) { Metadata metadata = _constructMetadataFromControllers(); metadata.categories = categories; _jsonRepository.saveJson(metadata); _categoriesController.add(categories); return categories; } List saveBudgets(List budgets) { Metadata metadata = _constructMetadataFromControllers(); metadata.budgets = budgets; _jsonRepository.saveJson(metadata); _budgetController.add(budgets); return budgets; } List saveAccounts(List accounts) { Metadata metadata = _constructMetadataFromControllers(); metadata.accounts = accounts; _jsonRepository.saveJson(metadata); _accountController.add(accounts); return accounts; } Settings saveSettings(Settings settings) { Metadata metadata = _constructMetadataFromControllers(); metadata.settings = settings; _jsonRepository.saveJson(metadata); _settingsController.add(settings); return settings; } void deleteMetadata() { Metadata metadata = Metadata(); _jsonRepository.saveJson(metadata); _broadcastMetadata(metadata); } void _broadcastMetadata(Metadata metadata) { _categoriesController.add(metadata.categories); _budgetController.add(metadata.budgets); _accountController.add(metadata.accounts); _settingsController.add(metadata.settings); } Metadata _constructMetadataFromControllers() { return Metadata( categories: _categoriesController.value, budgets: _budgetController.value, accounts: _accountController.value, settings: _settingsController.value, ); } }