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_406_NOT_ACCEPTABLE, HTTP_409_CONFLICT, HTTP_422_UNPROCESSABLE_ENTITY, ) from classes.exceptions import ( AlbumNotFoundError, AlbumAlreadyExistsError, AlbumIncorrectError, PhotoNotFoundError, PhotoSearchQueryEmptyError, VideoNotFoundError, VideoSearchQueryEmptyError, SearchPageInvalidError, SearchTokenInvalidError, AccessTokenInvalidError, UserEmailCodeInvalid, UserAlreadyExists, UserCredentialsInvalid, ) from modules.app import app @app.exception_handler(AlbumNotFoundError) async def album_not_found_exception_handler(request: Request, exc: AlbumNotFoundError): return UJSONResponse( status_code=HTTP_404_NOT_FOUND, content={"detail": f"Could not find album with id '{exc.id}'."}, ) @app.exception_handler(AlbumAlreadyExistsError) async def album_already_exists_exception_handler( request: Request, exc: AlbumAlreadyExistsError ): return UJSONResponse( status_code=HTTP_409_CONFLICT, content={"detail": f"Album with name '{exc.name}' already exists."}, ) @app.exception_handler(AlbumIncorrectError) async def album_incorrect_exception_handler(request: Request, exc: AlbumIncorrectError): return UJSONResponse( status_code=HTTP_406_NOT_ACCEPTABLE, content={"detail": f"Album {exc.place} invalid: {exc.error}"}, ) @app.exception_handler(PhotoNotFoundError) async def photo_not_found_exception_handler(request: Request, exc: PhotoNotFoundError): return UJSONResponse( status_code=HTTP_404_NOT_FOUND, content={"detail": f"Could not find photo with id '{exc.id}'."}, ) @app.exception_handler(PhotoSearchQueryEmptyError) async def photo_search_query_empty_exception_handler( request: Request, exc: PhotoSearchQueryEmptyError ): return UJSONResponse( status_code=HTTP_422_UNPROCESSABLE_ENTITY, content={ "detail": "You must provide query, caption or coordinates to look for photos." }, ) @app.exception_handler(VideoNotFoundError) async def video_not_found_exception_handler(request: Request, exc: VideoNotFoundError): return UJSONResponse( status_code=HTTP_404_NOT_FOUND, content={"detail": f"Could not find video with id '{exc.id}'."}, ) @app.exception_handler(VideoSearchQueryEmptyError) async def video_search_query_empty_exception_handler( request: Request, exc: VideoSearchQueryEmptyError ): return UJSONResponse( status_code=HTTP_422_UNPROCESSABLE_ENTITY, content={ "detail": "You must provide query, caption or coordinates to look for photos." }, ) @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." }, ) @app.exception_handler(SearchTokenInvalidError) async def search_token_invalid_exception_handler( request: Request, exc: SearchTokenInvalidError ): return UJSONResponse( status_code=HTTP_401_UNAUTHORIZED, content={ "detail": "Parameters 'page' and 'page_size' must be greater or equal to 1." }, ) @app.exception_handler(UserEmailCodeInvalid) async def user_email_code_invalid_exception_handler( request: Request, exc: UserEmailCodeInvalid ): return UJSONResponse( status_code=HTTP_400_BAD_REQUEST, content={"detail": "Confirmation code is invalid."}, ) @app.exception_handler(UserAlreadyExists) async def user_already_exists_exception_handler( request: Request, exc: UserAlreadyExists ): return UJSONResponse( status_code=HTTP_409_CONFLICT, content={"detail": "User with this username already exists."}, ) @app.exception_handler(AccessTokenInvalidError) async def access_token_invalid_exception_handler( request: Request, exc: AccessTokenInvalidError ): return UJSONResponse( status_code=HTTP_401_UNAUTHORIZED, content={"detail": "Invalid access token."}, ) @app.exception_handler(UserCredentialsInvalid) async def user_credentials_invalid_exception_handler( request: Request, exc: UserCredentialsInvalid ): return UJSONResponse( status_code=HTTP_401_UNAUTHORIZED, content={"detail": "Invalid credentials."}, )