API/extensions/exceptions.py

74 lines
2.1 KiB
Python
Raw Normal View History

2023-12-14 02:18:57 +02:00
from fastapi import Request
from fastapi.responses import UJSONResponse
from starlette.status import (
HTTP_400_BAD_REQUEST,
HTTP_401_UNAUTHORIZED,
HTTP_404_NOT_FOUND,
HTTP_422_UNPROCESSABLE_ENTITY,
)
from classes.exceptions import (
EntrySearchQueryEmptyError,
LocationNotFoundError,
LocationSearchQueryEmptyError,
SearchLimitInvalidError,
SearchPageInvalidError,
)
from modules.app import app
@app.exception_handler(LocationNotFoundError)
async def location_not_found_exception_handler(
request: Request, exc: LocationNotFoundError
):
return UJSONResponse(
status_code=HTTP_404_NOT_FOUND,
content={"detail": f"Could not find location with id '{exc.id}'."},
)
@app.exception_handler(EntrySearchQueryEmptyError)
async def entry_search_query_empty_exception_handler(
request: Request, exc: EntrySearchQueryEmptyError
):
return UJSONResponse(
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
content={
"detail": "You must provide location and date(s) to look for entries."
},
)
@app.exception_handler(LocationSearchQueryEmptyError)
async def location_search_query_empty_exception_handler(
request: Request, exc: LocationSearchQueryEmptyError
):
return UJSONResponse(
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
content={
"detail": "You must provide name or coordinates to look for location."
},
)
@app.exception_handler(SearchLimitInvalidError)
async def search_limit_invalid_exception_handler(
request: Request, exc: SearchLimitInvalidError
):
return UJSONResponse(
status_code=HTTP_401_UNAUTHORIZED,
content={"detail": "Parameter 'limit' must be greater or equal to 1."},
)
@app.exception_handler(SearchPageInvalidError)
async def search_page_invalid_exception_handler(
request: Request, exc: SearchPageInvalidError
):
return UJSONResponse(
status_code=HTTP_400_BAD_REQUEST,
content={
"detail": "Parameters 'page' and 'page_size' must be greater or equal to 1."
},
)