from uuid import UUID from typing import List from fastapi import APIRouter, HTTPException, status from sqlalchemy import select from app.models.comics.comic import ComicResponse, ComicDetailsResponse, get_comic_details from app.models.comics.artist import ArtistCreation, ArtistDetailResponse, ArtistResponse, get_artist_details from app.schema import Comic, SessionDep, Artist 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 = db.scalars(select(Comic)).all() for comic in comics: results.append(ComicResponse(id=comic.id, title=comic.title, completed=(comic.completed == 1))) return results @router.get("/comics/{comic_id}", response_model=ComicDetailsResponse) def get_comic(comic_id: UUID, 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: UUID, 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