from typing import List, Optional from uuid import UUID from sqlalchemy.orm import Session from sqlalchemy.exc import IntegrityError from datetime import datetime from models.fruit import Fruit from schemas.fruit import FruitCreate, FruitUpdate def get_all_fruits(db: Session) -> List[Fruit]: """ Retrieves all fruits from the database. Args: db (Session): The database session. Returns: List[Fruit]: A list of all fruit objects. """ return db.query(Fruit).all() def get_fruit_by_id(db: Session, fruit_id: UUID) -> Optional[Fruit]: """ Retrieves a single fruit by its ID. Args: db (Session): The database session. fruit_id (UUID): The ID of the fruit to retrieve. Returns: Optional[Fruit]: The fruit object if found, otherwise None. """ return db.query(Fruit).filter(Fruit.id == fruit_id).first() def get_fruit_by_name(db: Session, name: str) -> Optional[Fruit]: """ Retrieves a single fruit by its name. Args: db (Session): The database session. name (str): The name of the fruit to retrieve. Returns: Optional[Fruit]: The fruit object if found, otherwise None. """ return db.query(Fruit).filter(Fruit.name == name).first() def get_all_fruit_names(db: Session) -> List[str]: """ Retrieves a list of all fruit names. Args: db (Session): The database session. Returns: List[str]: A list of fruit names. """ fruits = db.query(Fruit.name).all() return [fruit[0] for fruit in fruits] def create_fruit(db: Session, fruit_data: FruitCreate) -> Optional[Fruit]: """ Creates a new fruit in the database. Args: db (Session): The database session. fruit_data (FruitCreate): The data for the fruit to create. Returns: Optional[Fruit]: The newly created fruit object, or None if creation fails. """ try: db_fruit = Fruit(**fruit_data.dict()) db.add(db_fruit) db.commit() db.refresh(db_fruit) return db_fruit except IntegrityError: db.rollback() return None def update_fruit(db: Session, fruit_id: UUID, fruit_data: FruitUpdate) -> Optional[Fruit]: """ Updates an existing fruit in the database. Args: db (Session): The database session. fruit_id (UUID): The ID of the fruit to update. fruit_data (FruitUpdate): The update data for the fruit. Returns: Optional[Fruit]: The updated fruit object if found and updated, otherwise None. """ db_fruit = get_fruit_by_id(db, fruit_id) if not db_fruit: return None try: update_data = fruit_data.dict(exclude_unset=True) for key, value in update_data.items(): setattr(db_fruit, key, value) db_fruit.updated_at = datetime.utcnow() db.commit() db.refresh(db_fruit) return db_fruit except IntegrityError: db.rollback() return None def delete_fruit(db: Session, fruit_id: UUID) -> bool: """ Deletes a fruit from the database. Args: db (Session): The database session. fruit_id (UUID): The ID of the fruit to delete. Returns: bool: True if the fruit was deleted, False if not found. """ db_fruit = get_fruit_by_id(db, fruit_id) if not db_fruit: return False db.delete(db_fruit) db.commit() return True