from typing import Any, List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from app import crud, schemas from app.api import deps router = APIRouter() @router.get("/", response_model=List[schemas.genre.Genre]) def read_genres( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, ) -> Any: """ Retrieve genres. """ genres = crud.genre.get_multi(db, skip=skip, limit=limit) return genres @router.post("/", response_model=schemas.genre.Genre) def create_genre( *, db: Session = Depends(deps.get_db), genre_in: schemas.genre.GenreCreate, ) -> Any: """ Create new genre. """ genre = crud.genre.get_by_name(db=db, name=genre_in.name) if genre: raise HTTPException( status_code=400, detail=f"Genre with name {genre_in.name} already exists", ) return crud.genre.create(db=db, obj_in=genre_in) @router.get("/{id}", response_model=schemas.genre.Genre) def read_genre( *, db: Session = Depends(deps.get_db), id: int, ) -> Any: """ Get genre by ID. """ genre = crud.genre.get(db=db, id=id) if not genre: raise HTTPException(status_code=404, detail="Genre not found") return genre @router.put("/{id}", response_model=schemas.genre.Genre) def update_genre( *, db: Session = Depends(deps.get_db), id: int, genre_in: schemas.genre.GenreUpdate, ) -> Any: """ Update a genre. """ genre = crud.genre.get(db=db, id=id) if not genre: raise HTTPException(status_code=404, detail="Genre not found") # Check if name already exists if genre_in.name != genre.name: existing_genre = crud.genre.get_by_name(db=db, name=genre_in.name) if existing_genre: raise HTTPException( status_code=400, detail=f"Genre with name {genre_in.name} already exists", ) return crud.genre.update(db=db, db_obj=genre, obj_in=genre_in) @router.delete("/{id}", response_model=None, status_code=204) def delete_genre( *, db: Session = Depends(deps.get_db), id: int, ) -> Any: """ Delete a genre. """ genre = crud.genre.get(db=db, id=id) if not genre: raise HTTPException(status_code=404, detail="Genre not found") crud.genre.remove(db=db, id=id) return None