diff --git a/app/routers/cache.py b/app/routers/cache.py index 4eac9a1..1a491d7 100644 --- a/app/routers/cache.py +++ b/app/routers/cache.py @@ -47,8 +47,7 @@ async def get_cached( cache_service: CacheService = Depends(get_cache_service), ): """Get cached content by hash. Content negotiation: HTML for browsers, JSON for APIs.""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) + ctx = await get_current_user(request) # Pass actor_id to get friendly name and user-specific metadata actor_id = ctx.actor_id if ctx else None @@ -255,17 +254,9 @@ async def list_media( limit: int = 24, media_type: Optional[str] = None, cache_service: CacheService = Depends(get_cache_service), + ctx: UserContext = Depends(require_auth), ): """List all media in cache.""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - from fastapi.responses import RedirectResponse - return RedirectResponse(url="/auth", status_code=302) - items = await cache_service.list_media( actor_id=ctx.actor_id, username=ctx.username, @@ -301,9 +292,7 @@ async def get_metadata_form( cache_service: CacheService = Depends(get_cache_service), ): """Get metadata editing form (HTMX).""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse('
Login required
') @@ -341,9 +330,7 @@ async def update_metadata_htmx( cache_service: CacheService = Depends(get_cache_service), ): """Update metadata (HTMX form handler).""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse('
Login required
') diff --git a/app/routers/recipes.py b/app/routers/recipes.py index 41f7ee3..f70b337 100644 --- a/app/routers/recipes.py +++ b/app/routers/recipes.py @@ -16,7 +16,7 @@ from artdag_common import render from artdag_common.middleware import wants_html, wants_json from artdag_common.middleware.auth import UserContext -from ..dependencies import require_auth, get_templates, get_redis_client, get_cache_manager +from ..dependencies import require_auth, get_current_user, get_templates, get_redis_client, get_cache_manager from ..services.auth_service import AuthService from ..services.recipe_service import RecipeService from ..types import ( @@ -365,17 +365,9 @@ async def list_recipes( offset: int = 0, limit: int = 20, recipe_service: RecipeService = Depends(get_recipe_service), + ctx: UserContext = Depends(require_auth), ): """List available recipes.""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - from fastapi.responses import RedirectResponse - return RedirectResponse(url="/auth", status_code=302) - recipes = await recipe_service.list_recipes(ctx.actor_id, offset=offset, limit=limit) has_more = len(recipes) >= limit @@ -402,17 +394,9 @@ async def get_recipe( recipe_id: str, request: Request, recipe_service: RecipeService = Depends(get_recipe_service), + ctx: UserContext = Depends(require_auth), ): """Get recipe details.""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - from fastapi.responses import RedirectResponse - return RedirectResponse(url="/auth", status_code=302) - recipe = await recipe_service.get_recipe(recipe_id) if not recipe: raise HTTPException(404, "Recipe not found") @@ -640,9 +624,7 @@ async def ui_discard_recipe( recipe_service: RecipeService = Depends(get_recipe_service), ): """HTMX handler: discard a recipe.""" - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse('
Login required
', status_code=401) diff --git a/app/routers/runs.py b/app/routers/runs.py index a5fe593..45fcfbf 100644 --- a/app/routers/runs.py +++ b/app/routers/runs.py @@ -370,18 +370,9 @@ async def list_runs( offset: int = 0, limit: int = 20, run_service: RunService = Depends(get_run_service), + ctx: UserContext = Depends(require_auth), ): """List all runs for the current user.""" - from ..services.auth_service import AuthService - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - from fastapi.responses import RedirectResponse - return RedirectResponse(url="/auth", status_code=302) runs = await run_service.list_runs(ctx.actor_id, offset=offset, limit=limit) has_more = len(runs) >= limit @@ -449,19 +440,9 @@ async def run_detail( run_id: str, request: Request, run_service: RunService = Depends(get_run_service), + ctx: UserContext = Depends(require_auth), ): """Run detail page with tabs for plan/analysis/artifacts.""" - from ..services.auth_service import AuthService - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - from fastapi.responses import RedirectResponse - return RedirectResponse(url="/auth", status_code=302) - run = await run_service.get_run(run_id) if not run: raise HTTPException(404, f"Run {run_id} not found") @@ -532,16 +513,9 @@ async def run_plan( run_id: str, request: Request, run_service: RunService = Depends(get_run_service), + ctx: UserContext = Depends(require_auth), ): """Plan visualization as interactive DAG.""" - from ..services.auth_service import AuthService - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - raise HTTPException(401, "Authentication required") - plan = await run_service.get_run_plan(run_id) if not plan: raise HTTPException(404, "Plan not found for this run") @@ -597,16 +571,9 @@ async def run_artifacts( run_id: str, request: Request, run_service: RunService = Depends(get_run_service), + ctx: UserContext = Depends(require_auth), ): """Get artifacts list for a run.""" - from ..services.auth_service import AuthService - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - raise HTTPException(401, "Authentication required") - artifacts = await run_service.get_run_artifacts(run_id) if wants_json(request): @@ -629,12 +596,9 @@ async def plan_node_detail( run_service: RunService = Depends(get_run_service), ): """HTMX partial: Get plan node detail by cache_id.""" - from ..services.auth_service import AuthService from artdag_common import render_fragment - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse('

Login required

', status_code=401) @@ -732,11 +696,7 @@ async def ui_discard_run( run_service: RunService = Depends(get_run_service), ): """HTMX handler: discard a run.""" - from ..services.auth_service import AuthService - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse( '
Login required
', diff --git a/app/routers/storage.py b/app/routers/storage.py index 92ee4f0..b8f2fc8 100644 --- a/app/routers/storage.py +++ b/app/routers/storage.py @@ -47,19 +47,9 @@ class UpdateStorageRequest(BaseModel): async def list_storage( request: Request, storage_service: StorageService = Depends(get_storage_service), + ctx: UserContext = Depends(require_auth), ): """List user's storage providers. HTML for browsers, JSON for API.""" - from ..services.auth_service import AuthService - from ..dependencies import get_redis_client - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - return RedirectResponse(url="/auth", status_code=302) - storages = await storage_service.list_storages(ctx.actor_id) if wants_json(request): @@ -120,12 +110,7 @@ async def add_storage_form( storage_service: StorageService = Depends(get_storage_service), ): """Add a storage provider via HTML form.""" - from ..services.auth_service import AuthService - from ..dependencies import get_redis_client - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: return HTMLResponse('
Not authenticated
', status_code=401) @@ -208,17 +193,9 @@ async def delete_storage( storage_id: int, request: Request, storage_service: StorageService = Depends(get_storage_service), + ctx: UserContext = Depends(require_auth), ): """Remove a storage provider.""" - from ..services.auth_service import AuthService - from ..dependencies import get_redis_client - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - raise HTTPException(401, "Not authenticated") - success, error = await storage_service.delete_storage(storage_id, ctx.actor_id) if error: @@ -237,12 +214,7 @@ async def test_storage( storage_service: StorageService = Depends(get_storage_service), ): """Test storage provider connectivity.""" - from ..services.auth_service import AuthService - from ..dependencies import get_redis_client - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - + ctx = await get_current_user(request) if not ctx: if wants_html(request): return HTMLResponse('Not authenticated', status_code=401) @@ -262,19 +234,9 @@ async def storage_type_page( provider_type: str, request: Request, storage_service: StorageService = Depends(get_storage_service), + ctx: UserContext = Depends(require_auth), ): """Page for managing storage configs of a specific type.""" - from ..services.auth_service import AuthService - from ..dependencies import get_redis_client - - auth_service = AuthService(get_redis_client()) - ctx = auth_service.get_user_from_cookie(request) - - if not ctx: - if wants_json(request): - raise HTTPException(401, "Authentication required") - return RedirectResponse(url="/auth", status_code=302) - if provider_type not in STORAGE_PROVIDERS_INFO: raise HTTPException(404, "Invalid provider type")