Files
bancho.py/app/api/v2/maps.py
2025-04-04 21:30:31 +09:00

77 lines
1.9 KiB
Python

"""bancho.py's v2 apis for interacting with maps"""
from __future__ import annotations
from fastapi import APIRouter
from fastapi import status
from fastapi.param_functions import Query
from app.api.v2.common import responses
from app.api.v2.common.responses import Failure
from app.api.v2.common.responses import Success
from app.api.v2.models.maps import Map
from app.repositories import maps as maps_repo
router = APIRouter()
@router.get("/maps")
async def get_maps(
set_id: int | None = None,
server: str | None = None,
status: int | None = None,
artist: str | None = None,
creator: str | None = None,
filename: str | None = None,
mode: int | None = None,
frozen: bool | None = None,
page: int = Query(1, ge=1),
page_size: int = Query(50, ge=1, le=100),
) -> Success[list[Map]] | Failure:
maps = await maps_repo.fetch_many(
server=server,
set_id=set_id,
status=status,
artist=artist,
creator=creator,
filename=filename,
mode=mode,
frozen=frozen,
page=page,
page_size=page_size,
)
total_maps = await maps_repo.fetch_count(
server=server,
set_id=set_id,
status=status,
artist=artist,
creator=creator,
filename=filename,
mode=mode,
frozen=frozen,
)
response = [Map.from_mapping(rec) for rec in maps]
return responses.success(
content=response,
meta={
"total": total_maps,
"page": page,
"page_size": page_size,
},
)
@router.get("/maps/{map_id}")
async def get_map(map_id: int) -> Success[Map] | Failure:
data = await maps_repo.fetch_one(id=map_id)
if data is None:
return responses.failure(
message="Map not found.",
status_code=status.HTTP_404_NOT_FOUND,
)
response = Map.from_mapping(data)
return responses.success(response)