
- Enhance character model with additional fields - Create relationship between anime and characters - Implement character search functionality - Create Alembic migration for character table - Add sample character data for seeding - Update README with character endpoint information
65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
from typing import List, Optional
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.crud.base import CRUDBase
|
|
from app.models.character import Character
|
|
from app.schemas.character import CharacterCreate, CharacterUpdate
|
|
|
|
|
|
class CRUDCharacter(CRUDBase[Character, CharacterCreate, CharacterUpdate]):
|
|
def get_by_anime(self, db: Session, *, anime_id: int) -> List[Character]:
|
|
"""Get all characters for a specific anime"""
|
|
return db.query(Character).filter(Character.anime_id == anime_id).all()
|
|
|
|
def get_count_by_anime(self, db: Session, *, anime_id: int) -> int:
|
|
"""Get count of characters for a specific anime"""
|
|
return db.query(Character).filter(Character.anime_id == anime_id).count()
|
|
|
|
def search(
|
|
self,
|
|
db: Session,
|
|
*,
|
|
name: Optional[str] = None,
|
|
anime_id: Optional[int] = None,
|
|
role: Optional[str] = None,
|
|
skip: int = 0,
|
|
limit: int = 100
|
|
) -> List[Character]:
|
|
"""Search for characters with filters"""
|
|
query = db.query(Character)
|
|
|
|
if name:
|
|
query = query.filter(Character.name.ilike(f"%{name}%"))
|
|
|
|
if anime_id:
|
|
query = query.filter(Character.anime_id == anime_id)
|
|
|
|
if role:
|
|
query = query.filter(Character.role == role)
|
|
|
|
return query.offset(skip).limit(limit).all()
|
|
|
|
def search_count(
|
|
self,
|
|
db: Session,
|
|
*,
|
|
name: Optional[str] = None,
|
|
anime_id: Optional[int] = None,
|
|
role: Optional[str] = None,
|
|
) -> int:
|
|
"""Get count of characters matching search criteria"""
|
|
query = db.query(Character)
|
|
|
|
if name:
|
|
query = query.filter(Character.name.ilike(f"%{name}%"))
|
|
|
|
if anime_id:
|
|
query = query.filter(Character.anime_id == anime_id)
|
|
|
|
if role:
|
|
query = query.filter(Character.role == role)
|
|
|
|
return query.count()
|
|
|
|
|
|
character = CRUDCharacter(Character) |