diff --git a/classes/exceptions.py b/classes/exceptions.py index 1bec769..73c739a 100644 --- a/classes/exceptions.py +++ b/classes/exceptions.py @@ -1,7 +1,9 @@ from typing import Literal +from fastapi import HTTPException -class AlbumNotFoundError(Exception): + +class AlbumNotFoundError(HTTPException): """Raises HTTP 404 if no album with this ID found.""" def __init__(self, id: str): @@ -16,7 +18,7 @@ class AlbumNotFoundError(Exception): } -class AlbumNameNotFoundError(Exception): +class AlbumNameNotFoundError(HTTPException): """Raises HTTP 404 if no album with this name found.""" def __init__(self, name: str): @@ -29,9 +31,15 @@ class AlbumNameNotFoundError(Exception): } }, } + super().__init__( + status_code=404, + detail=self.openapi["content"]["application/json"]["example"][ + "detail" + ].format(name=self.name), + ) -class AlbumAlreadyExistsError(Exception): +class AlbumAlreadyExistsError(HTTPException): """Raises HTTP 409 if album with this name already exists.""" def __init__(self, name: str): @@ -44,9 +52,15 @@ class AlbumAlreadyExistsError(Exception): } }, } + super().__init__( + status_code=409, + detail=self.openapi["content"]["application/json"]["example"][ + "detail" + ].format(name=self.name), + ) -class AlbumIncorrectError(Exception): +class AlbumIncorrectError(HTTPException): """Raises HTTP 406 if album's title or name is invalid.""" def __init__(self, place: Literal["name", "title"], error: str) -> None: @@ -56,13 +70,19 @@ class AlbumIncorrectError(Exception): "description": "Album Name/Title Invalid", "content": { "application/json": { - "example": {"detail": "Album {name/title} invalid: {error}"} + "example": {"detail": "Album {place} invalid: {error}"} } }, } + super().__init__( + status_code=406, + detail=self.openapi["content"]["application/json"]["example"][ + "detail" + ].format(place=self.place, error=self.error), + ) -class PhotoNotFoundError(Exception): +class PhotoNotFoundError(HTTPException): """Raises HTTP 404 if no photo with this ID found.""" def __init__(self, id: str): @@ -75,9 +95,15 @@ class PhotoNotFoundError(Exception): } }, } + super().__init__( + status_code=404, + detail=self.openapi["content"]["application/json"]["example"][ + "detail" + ].format(id=self.id), + ) -class PhotoSearchQueryEmptyError(Exception): +class PhotoSearchQueryEmptyError(HTTPException): """Raises HTTP 422 if no photo search query provided.""" def __init__(self): @@ -91,9 +117,13 @@ class PhotoSearchQueryEmptyError(Exception): } }, } + super().__init__( + status_code=422, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class VideoNotFoundError(Exception): +class VideoNotFoundError(HTTPException): """Raises HTTP 404 if no video with this ID found.""" def __init__(self, id: str): @@ -106,9 +136,15 @@ class VideoNotFoundError(Exception): } }, } + super().__init__( + status_code=404, + detail=self.openapi["content"]["application/json"]["example"][ + "detail" + ].format(id=self.id), + ) -class VideoSearchQueryEmptyError(Exception): +class VideoSearchQueryEmptyError(HTTPException): """Raises HTTP 422 if no video search query provided.""" def __init__(self): @@ -122,9 +158,13 @@ class VideoSearchQueryEmptyError(Exception): } }, } + super().__init__( + status_code=422, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class SearchPageInvalidError(Exception): +class SearchPageInvalidError(HTTPException): """Raises HTTP 400 if page or page size are not in valid range.""" def __init__(self): @@ -138,9 +178,13 @@ class SearchPageInvalidError(Exception): } }, } + super().__init__( + status_code=400, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class SearchTokenInvalidError(Exception): +class SearchTokenInvalidError(HTTPException): """Raises HTTP 401 if search token is not valid.""" def __init__(self): @@ -150,9 +194,13 @@ class SearchTokenInvalidError(Exception): "application/json": {"example": {"detail": "Invalid search token."}} }, } + super().__init__( + status_code=401, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class UserEmailCodeInvalid(Exception): +class UserEmailCodeInvalid(HTTPException): """Raises HTTP 400 if email confirmation code is not valid.""" def __init__(self): @@ -164,9 +212,13 @@ class UserEmailCodeInvalid(Exception): } }, } + super().__init__( + status_code=400, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class UserAlreadyExists(Exception): +class UserAlreadyExists(HTTPException): """Raises HTTP 409 if user with this name already exists.""" def __init__(self): @@ -178,9 +230,13 @@ class UserAlreadyExists(Exception): } }, } + super().__init__( + status_code=409, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class AccessTokenInvalidError(Exception): +class AccessTokenInvalidError(HTTPException): """Raises HTTP 401 if access token is not valid.""" def __init__(self): @@ -190,9 +246,13 @@ class AccessTokenInvalidError(Exception): "application/json": {"example": {"detail": "Invalid access token."}} }, } + super().__init__( + status_code=401, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + ) -class UserCredentialsInvalid(Exception): +class UserCredentialsInvalid(HTTPException): """Raises HTTP 401 if user credentials are not valid.""" def __init__(self): @@ -202,3 +262,7 @@ class UserCredentialsInvalid(Exception): "application/json": {"example": {"detail": "Invalid credentials."}} }, } + super().__init__( + status_code=401, + detail=self.openapi["content"]["application/json"]["example"]["detail"], + )