""" db.py — Simple JSON file database No MongoDB. No setup. Just a file on disk. Data is saved in data.json automatically. """ import json import os import uuid from datetime import datetime DB_FILE = "data.json" def _load(): if not os.path.exists(DB_FILE): return {"users": {}, "expenses": {}, "debts": {}, "goals": {}} with open(DB_FILE, "r") as f: return json.load(f) def _save(data): with open(DB_FILE, "w") as f: json.dump(data, f, indent=2, default=str) def new_id(): return str(uuid.uuid4()) def now(): return datetime.utcnow().isoformat() # ── Users ────────────────────────────────────────────────────────────────────── def get_user_by_email(email): db = _load() for u in db["users"].values(): if u["email"] == email: return u return None def get_user_by_id(uid): return _load()["users"].get(uid) def create_user(name, email, password_hash, income, currency="PKR"): db = _load() uid = new_id() db["users"][uid] = { "id": uid, "name": name, "email": email, "password": password_hash, "income": income, "currency": currency, "created_at": now() } _save(db) return db["users"][uid] def update_user_income(uid, income): db = _load() if uid in db["users"]: db["users"][uid]["income"] = income _save(db) # ── Expenses ────────────────────────────────────────────────────────────────── def add_expense(user_id, description, amount, type_, category, notes=None): db = _load() eid = new_id() db["expenses"][eid] = { "id": eid, "user_id": user_id, "description": description, "amount": amount, "type": type_, "category": category, "notes": notes, "date": now() } _save(db) return db["expenses"][eid] def get_expenses(user_id): db = _load() return [e for e in db["expenses"].values() if e["user_id"] == user_id] def delete_expense(expense_id, user_id): db = _load() if expense_id in db["expenses"] and db["expenses"][expense_id]["user_id"] == user_id: del db["expenses"][expense_id] _save(db) return True return False # ── Debts ───────────────────────────────────────────────────────────────────── def add_debt(user_id, name, principal, interest_rate, monthly_payment, loan_type): db = _load() did = new_id() db["debts"][did] = { "id": did, "user_id": user_id, "name": name, "principal": principal, "interest_rate": interest_rate, "monthly_payment": monthly_payment, "loan_type": loan_type, "created_at": now() } _save(db) return db["debts"][did] def get_debts(user_id): db = _load() return [d for d in db["debts"].values() if d["user_id"] == user_id] def delete_debt(debt_id, user_id): db = _load() if debt_id in db["debts"] and db["debts"][debt_id]["user_id"] == user_id: del db["debts"][debt_id] _save(db) return True return False # ── Goals ───────────────────────────────────────────────────────────────────── def add_goal(user_id, name, emoji, target_amount, monthly_contribution): db = _load() gid = new_id() db["goals"][gid] = { "id": gid, "user_id": user_id, "name": name, "emoji": emoji, "target_amount": target_amount, "current_amount": 0, "monthly_contribution": monthly_contribution, "created_at": now() } _save(db) return db["goals"][gid] def get_goals(user_id): db = _load() return [g for g in db["goals"].values() if g["user_id"] == user_id] def contribute_goal(goal_id, user_id, amount): db = _load() if goal_id in db["goals"] and db["goals"][goal_id]["user_id"] == user_id: db["goals"][goal_id]["current_amount"] += amount _save(db) return db["goals"][goal_id] return None def delete_goal(goal_id, user_id): db = _load() if goal_id in db["goals"] and db["goals"][goal_id]["user_id"] == user_id: del db["goals"][goal_id] _save(db) return True return False