import json from pathlib import Path from core.user import User from core.item import Item from core.transaction import Transaction class DataManager: def __init__(self, data_dir) -> None: self.data_dir = Path(data_dir) self.data_dir.mkdir(exist_ok=True) self.users_file = self.data_dir / "users.json" self.items_file = self.data_dir / "items.json" self.debts_file = self.data_dir / "debts.json" self.transactions_file = self.data_dir / "transactions.json" self._init_files() def _init_files(self): if not self.users_file.exists(): self._save_json(self.users_file, {}) if not self.items_file.exists(): self._save_json(self.items_file, {}) if not self.debts_file.exists(): self._save_json(self.debts_file, {}) if not self.transactions_file.exists(): self._save_json(self.transactions_file, []) def load_users(self): data = self._load_json(self.users_file) return { user_id: User.from_json(user_data) for user_id, user_data in data.items() } def load_items(self): data = self._load_json(self.items_file) return { item_id: Item.from_json(item_data) for item_id, item_data in data.items() } def load_debts(self): return self._load_json(self.debts_file) def load_transactions(self): data = self._load_json(self.transactions_file) return [Transaction.from_json(t) for t in data] def save_users(self, users): data = {user_id: user.to_json() for user_id, user in users.items()} self._save_json(self.users_file, data) def save_items(self, items): data = {item_id: item.to_json() for item_id, item in items.items()} self._save_json(self.items_file, data) def save_debts(self, debts): self._save_json(self.debts_file, debts) def save_transactions(self, transactions): data = [t.to_json() for t in transactions] self._save_json(self.transactions_file, data) def _load_json(self, filepath): try: with open(filepath, "r") as f: return json.load(f) except (FileNotFoundError, json.JSONDecodeError): return ( {} if filepath.name.endswith(".json") and "transaction" not in filepath.name else [] ) def _save_json(self, filepath, data): with open(filepath, "w") as f: json.dump(data, f, indent=2)