Automated Action 4d6c2e1778 Implement Anime Information API with FastAPI and SQLite
- Create project structure and dependencies
- Set up SQLAlchemy models for anime, genres, and their relationships
- Implement CRUD operations for all models
- Set up FastAPI endpoints for managing anime and genres
- Add health check endpoint
- Configure Alembic for database migrations
- Add data seeding capability
- Update README with project information
2025-05-17 21:37:16 +00:00

97 lines
2.4 KiB
Python

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