advent22/api/advent22_api/routers/admin.py

195 lines
4.7 KiB
Python
Raw Permalink Normal View History

from datetime import date
from enum import Enum
from fastapi import APIRouter, Depends, HTTPException, status
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,
)
from ..core.settings import SETTINGS, Credentials, 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
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.redis.cache_ttl,
2023-09-11 22:24:01 +00:00
"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)
class CredentialsName(str, Enum):
DAV = "dav"
UI = "ui"
@router.get("/credentials/{name}")
async def get_credentials(
name: CredentialsName,
_: None = Depends(require_admin),
cfg: Config = Depends(get_config),
) -> Credentials:
if name == CredentialsName.DAV:
return SETTINGS.webdav.auth
elif name == CredentialsName.UI:
return cfg.admin
else:
raise HTTPException(status.HTTP_400_BAD_REQUEST)