from typing import List, AnyStr from fastapi import APIRouter, HTTPException, status from src.apis.utils import SessionDep from src.db.repository.comic import get_artist_details, list_comics, get_issue_details from src.schema.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details, get_short_info from src.schema.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse from src.db.models.comic import Comic, Artist, Issue from src.schema.comics.issue import IssueDetailsResponse router = APIRouter( prefix="/comic", tags=["comics"], responses={404: {"description": "Not found"}}, ) @router.get("/comics") def get_all_comics(db: SessionDep) -> List[ComicResponse]: results: List[ComicResponse] = [] comics = list_comics(db) for comic in comics: response = get_short_info(comic) results.append(response) return results @router.get("/comics/{comic_id}", response_model=ComicDetailsResponse) def get_comic(comic_id: AnyStr, db: SessionDep) -> ComicDetailsResponse: comic = db.get(Comic, comic_id) if comic is None: raise HTTPException(status_code=404, detail="Comic could not be found") response: ComicDetailsResponse = get_comic_details(comic) return response @router.get("/artists", response_model=List[ArtistResponse]) def get_all_artists(db: SessionDep) -> List[ArtistResponse]: results: List[ArtistResponse] = [] artists = db.query(Artist).all() for artist in artists: results.append(ArtistResponse(id=artist.id, name=artist.name)) return results @router.get("/artists/{artist_id}", response_model=ArtistDetailResponse) def get_artist(artist_id: AnyStr, db: SessionDep) -> ArtistDetailResponse: artist = db.get(Artist, artist_id) if artist is None: raise HTTPException(status_code=404, detail="Artist could not be found") response: ArtistDetailResponse = get_artist_details(artist) return response @router.post("/artists", status_code=status.HTTP_201_CREATED) def add_artist(db: SessionDep, artist_creation: ArtistCreation) -> ArtistResponse: artist: Artist = Artist() setattr(artist, "name", artist_creation.name) try: db.add(artist) db.commit() except: raise HTTPException(status_code=409, detail="Artist already added") response = ArtistResponse(id=artist.id, name=artist.name) return response @router.get("/issues", response_model=List[IssueDetailsResponse]) def get_issues(db: SessionDep) -> List[IssueDetailsResponse]: results: List[IssueDetailsResponse] = [] issues = db.query(Issue).all() for issue in issues: results.append(get_issue_details(issue)) return results