Coverage for opt/mealie/lib/python3.12/site-packages/mealie/routes/_base/routers.py: 100%
27 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1import contextlib
2import json
3from collections.abc import Callable
4from enum import Enum
5from json.decoder import JSONDecodeError
7from fastapi import APIRouter, Depends, Request, Response
8from fastapi.routing import APIRoute
10from mealie.core.dependencies import get_admin_user, get_current_user
13class AdminAPIRouter(APIRouter):
14 """Router for functions to be protected behind admin authentication"""
16 def __init__(self, tags: list[str | Enum] | None = None, prefix: str = "", **kwargs):
17 super().__init__(tags=tags, prefix=prefix, dependencies=[Depends(get_admin_user)], **kwargs)
20class UserAPIRouter(APIRouter):
21 """Router for functions to be protected behind user authentication"""
23 def __init__(self, tags: list[str | Enum] | None = None, prefix: str = "", **kwargs):
24 super().__init__(tags=tags, prefix=prefix, dependencies=[Depends(get_current_user)], **kwargs)
27class MealieCrudRoute(APIRoute):
28 """Route class to include the last-modified header when returning a MealieModel, when available"""
30 def get_route_handler(self) -> Callable:
31 original_route_handler = super().get_route_handler()
33 async def custom_route_handler(request: Request) -> Response:
34 with contextlib.suppress(JSONDecodeError):
35 response = await original_route_handler(request)
36 response_body = json.loads(response.body)
37 if isinstance(response_body, dict):
38 if last_modified := response_body.get("updatedAt"):
39 response.headers["last-modified"] = last_modified
41 # Force no-cache for all responses to prevent browser from caching API calls
42 response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
43 return response
45 return custom_route_handler