from typing import Optional, List from sqlalchemy.orm import Session from models.character import Character from schemas.character import CharacterCreate, CharacterSchema from uuid import UUID def get_character_by_id(db: Session, character_id: UUID) -> Optional[Character]: """ Retrieves a character by its ID. Args: db (Session): The database session. character_id (UUID): The ID of the character to retrieve. Returns: Optional[Character]: The character object if found, otherwise None. """ return db.query(Character).filter(Character.id == character_id).first() def get_character_by_name(db: Session, character_name: str) -> Optional[Character]: """ Retrieves a character by its name. Args: db (Session): The database session. character_name (str): The name of the character to retrieve. Returns: Optional[Character]: The character object if found, otherwise None. """ return db.query(Character).filter(Character.name == character_name).first() def create_character(db: Session, character_data: CharacterCreate) -> Character: """ Creates a new character in the database. Args: db (Session): The database session. character_data (CharacterCreate): The data for the character to create. Returns: Character: The newly created character object. """ existing_character = get_character_by_name(db, character_data.name) if existing_character: raise ValueError(f"Character with name '{character_data.name}' already exists.") db_character = Character(**character_data.dict()) db.add(db_character) db.commit() db.refresh(db_character) return db_character def get_all_characters(db: Session) -> List[CharacterSchema]: """ Retrieves all characters from the database. Args: db (Session): The database session. Returns: List[CharacterSchema]: A list of all character objects. """ characters = db.query(Character).all() return [CharacterSchema.from_orm(character) for character in characters] def search_characters(db: Session, name: Optional[str] = None, bounty: Optional[int] = None) -> List[CharacterSchema]: """ Searches for characters based on name and/or bounty. Args: db (Session): The database session. name (Optional[str]): The name of the character to search for. bounty (Optional[int]): The bounty of the character to search for. Returns: List[CharacterSchema]: A list of character objects matching the search criteria. """ query = db.query(Character) if name: query = query.filter(Character.name.ilike(f"%{name}%")) if bounty: query = query.filter(Character.bounty == bounty) characters = query.all() return [CharacterSchema.from_orm(character) for character in characters]