| """ |
| 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() |
|
|
| |
| 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) |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| 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 |
|
|