import functools from quart import g, jsonify, session from fabledassistant.services.auth import get_user_by_id def _check_auth(f, required_role: str | None = None): @functools.wraps(f) async def decorated(*args, **kwargs): user_id = session.get("user_id") if not user_id: return jsonify({"error": "Authentication required"}), 401 user = await get_user_by_id(user_id) if not user: session.clear() return jsonify({"error": "Authentication required"}), 401 if session.get("session_version") != user.session_version: session.clear() return jsonify({"error": "Session expired. Please log in again."}), 401 if required_role and user.role != required_role: return jsonify({"error": "Admin access required"}), 403 g.user = user return await f(*args, **kwargs) return decorated def login_required(f): return _check_auth(f) def admin_required(f): return _check_auth(f, required_role="admin") def get_current_user_id() -> int: return g.user.id