from typing import Literal from fastapi import HTTPException class AlbumNotFoundError(HTTPException): """Raises HTTP 404 if no album with this ID found.""" def __init__(self, id: str): self.id = id self.openapi = { "description": "Album Does Not Exist", "content": { "application/json": { "example": {"detail": "Could not find album with id '{id}'."} } }, } class AlbumNameNotFoundError(HTTPException): """Raises HTTP 404 if no album with this name found.""" def __init__(self, name: str): self.name = name self.openapi = { "description": "Album Does Not Exist", "content": { "application/json": { "example": {"detail": "Could not find album with name '{name}'."} } }, } super().__init__( status_code=404, detail=self.openapi["content"]["application/json"]["example"][ "detail" ].format(name=self.name), ) class AlbumAlreadyExistsError(HTTPException): """Raises HTTP 409 if album with this name already exists.""" def __init__(self, name: str): self.name = name self.openapi = { "description": "Album Already Exists", "content": { "application/json": { "example": {"detail": "Album with name '{name}' already exists."} } }, } super().__init__( status_code=409, detail=self.openapi["content"]["application/json"]["example"][ "detail" ].format(name=self.name), ) class AlbumIncorrectError(HTTPException): """Raises HTTP 406 if album's title or name is invalid.""" def __init__(self, place: Literal["name", "title"], error: str) -> None: self.place = place self.error = error self.openapi = { "description": "Album Name/Title Invalid", "content": { "application/json": { "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(HTTPException): """Raises HTTP 404 if no photo with this ID found.""" def __init__(self, id: str): self.id = id self.openapi = { "description": "Photo Does Not Exist", "content": { "application/json": { "example": {"detail": "Could not find photo with id '{id}'."} } }, } super().__init__( status_code=404, detail=self.openapi["content"]["application/json"]["example"][ "detail" ].format(id=self.id), ) class PhotoSearchQueryEmptyError(HTTPException): """Raises HTTP 422 if no photo search query provided.""" def __init__(self): self.openapi = { "description": "Invalid Query", "content": { "application/json": { "example": { "detail": "You must provide query, caption or coordinates to look for photos." } } }, } super().__init__( status_code=422, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class VideoNotFoundError(HTTPException): """Raises HTTP 404 if no video with this ID found.""" def __init__(self, id: str): self.id = id self.openapi = { "description": "Video Does Not Exist", "content": { "application/json": { "example": {"detail": "Could not find video with id '{id}'."} } }, } super().__init__( status_code=404, detail=self.openapi["content"]["application/json"]["example"][ "detail" ].format(id=self.id), ) class VideoSearchQueryEmptyError(HTTPException): """Raises HTTP 422 if no video search query provided.""" def __init__(self): self.openapi = { "description": "Invalid Query", "content": { "application/json": { "example": { "detail": "You must provide query or caption to look for videos." } } }, } super().__init__( status_code=422, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class SearchLimitInvalidError(HTTPException): """Raises HTTP 400 if search results limit not in valid range.""" def __init__(self): self.openapi = { "description": "Invalid Limit", "content": { "application/json": { "example": { "detail": "Parameter 'limit' must be greater or equal to 1." } } }, } super().__init__( status_code=400, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class SearchPageInvalidError(HTTPException): """Raises HTTP 400 if page or page size are not in valid range.""" def __init__(self): self.openapi = { "description": "Invalid Page", "content": { "application/json": { "example": { "detail": "Parameters 'page' and 'page_size' must be greater or equal to 1." } } }, } super().__init__( status_code=400, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class SearchTokenInvalidError(HTTPException): """Raises HTTP 401 if search token is not valid.""" def __init__(self): self.openapi = { "description": "Invalid Token", "content": { "application/json": {"example": {"detail": "Invalid search token."}} }, } super().__init__( status_code=401, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class UserEmailCodeInvalid(HTTPException): """Raises HTTP 400 if email confirmation code is not valid.""" def __init__(self): self.openapi = { "description": "Invalid Email Code", "content": { "application/json": { "example": {"detail": "Confirmation code is invalid."} } }, } super().__init__( status_code=400, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class UserAlreadyExists(HTTPException): """Raises HTTP 409 if user with this name already exists.""" def __init__(self): self.openapi = { "description": "User Already Exists", "content": { "application/json": { "example": {"detail": "User with this username already exists."} } }, } super().__init__( status_code=409, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class AccessTokenInvalidError(HTTPException): """Raises HTTP 401 if access token is not valid.""" def __init__(self): self.openapi = { "description": "Invalid Access Token", "content": { "application/json": {"example": {"detail": "Invalid access token."}} }, } super().__init__( status_code=401, detail=self.openapi["content"]["application/json"]["example"]["detail"], ) class UserCredentialsInvalid(HTTPException): """Raises HTTP 401 if user credentials are not valid.""" def __init__(self): self.openapi = { "description": "Invalid Credentials", "content": { "application/json": {"example": {"detail": "Invalid credentials."}} }, } super().__init__( status_code=401, detail=self.openapi["content"]["application/json"]["example"]["detail"], )