advent22/api/advent22_api/routers/admin.py

194 lines
4.7 KiB
Python
Raw Normal View History

from datetime import date
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from advent22_api.core.helpers import EventDates
from ..core.calendar_config import CalendarConfig, DoorsSaved, get_calendar_config
2023-09-21 11:49:28 +00:00
from ..core.config import Config, Image, get_config
2023-11-01 00:30:33 +00:00
from ..core.depends import (
TTFont,
get_all_event_dates,
get_all_image_names,
get_all_parts,
get_all_ttfonts,
)
2023-10-31 21:48:27 +00:00
from ..core.settings import SETTINGS, RedisSettings
2023-09-11 23:36:36 +00:00
from ._security import require_admin, user_is_admin
router = APIRouter(prefix="/admin", tags=["admin"])
2023-09-11 23:10:17 +00:00
@router.get("/is_admin")
async def is_admin(
is_admin: bool = Depends(user_is_admin),
) -> bool:
2023-09-11 23:10:17 +00:00
return is_admin
2023-11-02 12:49:02 +00:00
class AdminConfigModel(BaseModel):
2023-10-31 19:18:18 +00:00
class __Solution(BaseModel):
value: str
2023-10-31 21:36:22 +00:00
whitespace: str
2023-11-21 22:20:22 +00:00
special_chars: str
2023-10-31 21:36:22 +00:00
case: str
2023-10-31 19:18:18 +00:00
clean: str
2023-09-11 22:24:01 +00:00
class __Puzzle(BaseModel):
first: date
next: date | None
last: date
2023-09-11 22:24:01 +00:00
end: date
seed: str
2023-11-24 00:40:54 +00:00
extra_days: list[int]
skip_empty: bool
2023-09-11 22:24:01 +00:00
class __Calendar(BaseModel):
config_file: str
background: str
2023-11-02 12:48:52 +00:00
favicon: str
2023-09-11 22:24:01 +00:00
2023-11-01 00:30:33 +00:00
class __Font(BaseModel):
file: str
size: int
2023-09-11 22:24:01 +00:00
class __WebDAV(BaseModel):
url: str
cache_ttl: int
config_file: str
2023-10-31 19:18:18 +00:00
solution: __Solution
2023-09-11 22:24:01 +00:00
puzzle: __Puzzle
calendar: __Calendar
2023-09-21 11:49:28 +00:00
image: Image
2023-11-01 00:30:33 +00:00
fonts: list[__Font]
2023-10-31 21:48:27 +00:00
redis: RedisSettings
2023-09-11 22:24:01 +00:00
webdav: __WebDAV
@router.get("/config_model")
async def get_config_model(
_: None = Depends(require_admin),
cfg: Config = Depends(get_config),
cal_cfg: CalendarConfig = Depends(get_calendar_config),
event_dates: EventDates = Depends(get_all_event_dates),
2023-11-01 00:30:33 +00:00
ttfonts: list[TTFont] = Depends(get_all_ttfonts),
2023-11-02 12:49:02 +00:00
) -> AdminConfigModel:
2023-09-12 17:16:02 +00:00
"""
Kombiniert aus privaten `settings`, `config` und `calendar_config`
"""
2023-11-02 12:49:02 +00:00
return AdminConfigModel.model_validate(
2023-09-11 22:24:01 +00:00
{
2023-10-31 19:18:18 +00:00
"solution": {
"value": cfg.solution.value,
"whitespace": cfg.solution.whitespace,
2023-11-21 22:20:22 +00:00
"special_chars": cfg.solution.special_chars,
2023-10-31 19:18:18 +00:00
"case": cfg.solution.case,
"clean": cfg.solution.clean,
},
2023-09-11 22:24:01 +00:00
"puzzle": {
"first": event_dates.first,
"next": event_dates.next,
"last": event_dates.last,
"end": event_dates.end,
2023-09-21 11:49:28 +00:00
"seed": cfg.random_seed,
2023-11-24 00:40:54 +00:00
"extra_days": sorted(cfg.puzzle.extra_days),
"skip_empty": cfg.puzzle.skip_empty,
2023-09-11 22:24:01 +00:00
},
"calendar": {
2023-09-21 11:49:28 +00:00
"config_file": cfg.calendar,
2023-09-11 22:24:01 +00:00
"background": cal_cfg.background,
2023-11-02 12:48:52 +00:00
"favicon": cal_cfg.favicon,
2023-09-11 22:24:01 +00:00
},
2023-09-21 11:49:28 +00:00
"image": cfg.image,
2023-11-01 00:30:33 +00:00
"fonts": [
{"file": ttfont.file_name, "size": ttfont.size} for ttfont in ttfonts
],
2023-10-31 21:48:27 +00:00
"redis": SETTINGS.redis,
2023-09-11 22:24:01 +00:00
"webdav": {
"url": SETTINGS.webdav.url,
"cache_ttl": SETTINGS.webdav.cache_ttl,
"config_file": SETTINGS.webdav.config_filename,
},
}
)
2023-09-21 12:25:23 +00:00
@router.get("/day_image_names")
async def get_day_image_names(
2023-09-12 16:26:12 +00:00
_: None = Depends(require_admin),
2023-09-21 12:25:23 +00:00
image_names: dict[int, str] = Depends(get_all_image_names),
2023-09-21 00:45:57 +00:00
) -> dict[int, str]:
2023-09-12 17:15:44 +00:00
"""
2023-09-21 12:25:23 +00:00
Zuordnung der verwendeten Bilder zu den Tagen
2023-09-12 17:15:44 +00:00
"""
2023-09-21 12:25:23 +00:00
return image_names
2023-09-12 16:26:12 +00:00
2023-09-21 12:25:23 +00:00
@router.get("/day_parts")
async def get_day_parts(
_: None = Depends(require_admin),
2023-09-21 12:25:23 +00:00
parts: dict[int, str] = Depends(get_all_parts),
2023-09-21 00:45:57 +00:00
) -> dict[int, str]:
"""
2023-09-21 12:25:23 +00:00
Zuordnung der Lösungsteile zu den Tagen
"""
2023-09-21 12:25:23 +00:00
return parts
@router.get("/doors")
async def get_doors(
2023-09-12 16:26:12 +00:00
_: None = Depends(require_admin),
cal_cfg: CalendarConfig = Depends(get_calendar_config),
) -> DoorsSaved:
"""
Türchen lesen
"""
return cal_cfg.doors
@router.put("/doors")
async def put_doors(
doors: DoorsSaved,
2023-09-12 16:26:12 +00:00
_: None = Depends(require_admin),
cfg: Config = Depends(get_config),
cal_cfg: CalendarConfig = Depends(get_calendar_config),
) -> None:
"""
Türchen ändern
"""
cal_cfg.doors = sorted(
doors,
key=lambda door: door.day,
)
await cal_cfg.change(cfg)
@router.get("/dav_credentials")
async def get_dav_credentials(
_: None = Depends(require_admin),
) -> tuple[str, str]:
"""
Zugangsdaten für WebDAV
"""
return SETTINGS.webdav.username, SETTINGS.webdav.password
@router.get("/ui_credentials")
async def get_ui_credentials(
_: None = Depends(require_admin),
cfg: Config = Depends(get_config),
) -> tuple[str, str]:
"""
Zugangsdaten für Admin-UI
"""
return cfg.admin.name, cfg.admin.password