ovdashboard/api/ovdashboard_api/routers/v1/_common.py

141 lines
3 KiB
Python
Raw Normal View History

2022-09-05 12:54:02 +00:00
"""
Dependables for defining Routers.
"""
2022-09-02 13:22:35 +00:00
import re
2022-09-08 14:02:50 +00:00
from logging import getLogger
2023-10-23 18:56:01 +00:00
from typing import Awaitable, Callable
2022-09-02 13:22:35 +00:00
2023-10-22 14:25:19 +00:00
from fastapi import Depends, HTTPException, status
2022-09-02 13:22:35 +00:00
from webdav3.exceptions import RemoteResourceNotFound
2023-10-20 08:43:15 +00:00
from ...core.caldav import CalDAV
2023-10-22 14:25:19 +00:00
from ...core.config import Config, get_config
2023-10-20 08:43:15 +00:00
from ...core.webdav import WebDAV
2022-09-02 13:22:35 +00:00
2022-09-08 14:02:50 +00:00
_logger = getLogger(__name__)
2022-09-02 13:22:35 +00:00
2022-09-05 00:23:00 +00:00
_RESPONSE_OK = {
status.HTTP_200_OK: {
"description": "Operation successful",
},
}
2023-10-22 14:25:19 +00:00
async def get_remote_path(
path_name: str,
*,
cfg: Config = Depends(get_config),
) -> str:
return getattr(cfg, path_name)
2023-10-23 18:56:01 +00:00
def get_lf_responses(
path: str = Depends(get_remote_path),
) -> dict:
return {
**_RESPONSE_OK,
status.HTTP_404_NOT_FOUND: {
"description": f"{path!r} not found",
"content": None,
},
}
2023-10-22 14:25:19 +00:00
async def list_files(
re: re.Pattern[str],
*,
path: str = Depends(get_remote_path),
) -> list[str]:
"""
List files in remote `path` matching the RegEx `re`
"""
try:
return await WebDAV.list_files(path, regex=re)
except RemoteResourceNotFound:
_logger.error(
"WebDAV path %s lost!",
repr(path),
)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
async def list_calendar_names() -> list[str]:
"""
List calendar names
"""
return await CalDAV.calendars
async def list_aggregate_names(
cfg: Config = Depends(get_config),
) -> list[str]:
"""
List aggregate calendar names
"""
return list(cfg.calendar.aggregates.keys())
2023-10-23 18:56:01 +00:00
def get_fp_responses(
src: Callable[[], Awaitable[list[str]]],
) -> dict:
return {
**_RESPONSE_OK,
status.HTTP_404_NOT_FOUND: {
"description": f"Failure in lister {src.__name__!r}",
"content": None,
},
}
2022-09-05 12:54:02 +00:00
2023-10-23 18:56:01 +00:00
async def filter_prefix(
src: Callable[[], Awaitable[list[str]]],
prefix: str = "",
) -> list[str]:
"""
Filter names from an async source `src` for names starting with a given prefix.
2022-09-05 12:54:02 +00:00
"""
2023-10-23 18:56:01 +00:00
return list(
item for item in (await src()) if item.lower().startswith(prefix.lower())
)
2022-09-02 14:51:11 +00:00
2023-10-23 18:56:01 +00:00
def get_fpu_responses() -> dict:
return {
**_RESPONSE_OK,
status.HTTP_404_NOT_FOUND: {
"description": "Prefix not found",
"content": None,
},
status.HTTP_409_CONFLICT: {
"description": "Ambiguous prefix",
"content": None,
},
}
2022-09-02 14:51:11 +00:00
2023-10-23 18:56:01 +00:00
async def filter_prefix_unique(
src: Callable[[str], Awaitable[list[str]]],
prefix: str = "",
) -> str:
2022-09-05 12:54:02 +00:00
"""
2023-10-23 18:56:01 +00:00
Determines if a given prefix is unique in the list produced by the async source `src`.
2022-09-05 12:54:02 +00:00
2023-10-23 18:56:01 +00:00
On success, produces the unique name with that prefix. Otherwise, throws a HTTPException.
2022-09-05 12:54:02 +00:00
"""
2023-10-23 18:56:01 +00:00
names = await src(prefix)
match names:
case [name]:
return name
case []:
2022-09-02 14:51:11 +00:00
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)
2023-10-23 18:56:01 +00:00
case _:
2022-09-02 14:51:11 +00:00
raise HTTPException(status_code=status.HTTP_409_CONFLICT)