Coverage for src / local_deep_research / web / utils / route_decorators.py: 100%
21 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
1"""Route decorators for common patterns in Flask route handlers."""
3import functools
5from flask import jsonify, session
6from loguru import logger
8from ...database.session_context import get_user_db_session
9from ...settings import SettingsManager
12def with_user_session(include_settings_manager=True):
13 """Decorator that provides db_session and optionally SettingsManager.
15 Extracts username from session["username"], opens a database session,
16 and optionally creates a SettingsManager. Injects them as keyword arguments.
18 Requires @login_required to be applied first (outermost) to guarantee
19 session["username"] exists. Database session errors are caught and
20 returned as 500 JSON responses.
22 Args:
23 include_settings_manager: If True (default), also inject 'settings_manager'.
25 Usage:
26 @with_user_session()
27 def my_route(db_session, settings_manager):
28 ...
30 @with_user_session(include_settings_manager=False)
31 def my_route(db_session):
32 ...
33 """
35 def decorator(func):
36 @functools.wraps(func)
37 def wrapper(*args, **kwargs):
38 username = session["username"]
39 try:
40 with get_user_db_session(username) as db_session:
41 kwargs["db_session"] = db_session
42 if include_settings_manager:
43 kwargs["settings_manager"] = SettingsManager(
44 db_session, owns_session=False
45 )
46 return func(*args, **kwargs)
47 except Exception:
48 logger.exception("Database session error in {}", func.__name__)
49 return jsonify({"error": "Database session unavailable"}), 500
51 return wrapper
53 return decorator