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)