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