trial-project-gpuiwi/helpers/fruit_helpers.py

147 lines
4.0 KiB
Python

from typing import List, Optional, Dict, Any
from uuid import UUID
from sqlalchemy.orm import Session
from models.fruit import Fruit
from schemas.fruit import FruitCreate, FruitUpdate
def get_all_fruits(db: Session, include_inactive: bool = False) -> List[Fruit]:
"""
Retrieves all fruits from the database.
Args:
db (Session): The database session.
include_inactive (bool): Whether to include inactive fruits.
Returns:
List[Fruit]: A list of all fruit objects.
"""
query = db.query(Fruit)
if not include_inactive:
query = query.filter(Fruit.is_active.is_(True))
return query.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 create_fruit(db: Session, fruit_data: FruitCreate) -> 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:
Fruit: The newly created fruit object.
"""
db_fruit = Fruit(**fruit_data.dict())
db.add(db_fruit)
db.commit()
db.refresh(db_fruit)
return db_fruit
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 data to update the fruit with.
Returns:
Optional[Fruit]: The updated fruit object if found, otherwise None.
"""
db_fruit = get_fruit_by_id(db, fruit_id)
if not db_fruit:
return None
update_data = fruit_data.dict(exclude_unset=True)
for field, value in update_data.items():
setattr(db_fruit, field, value)
db.commit()
db.refresh(db_fruit)
return db_fruit
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
def soft_delete_fruit(db: Session, fruit_id: UUID) -> bool:
"""
Soft deletes a fruit by setting is_active to False.
Args:
db (Session): The database session.
fruit_id (UUID): The ID of the fruit to soft delete.
Returns:
bool: True if the fruit was soft deleted, False if not found.
"""
db_fruit = get_fruit_by_id(db, fruit_id)
if not db_fruit:
return False
db_fruit.is_active = False
db.commit()
return True
def validate_fruit_data(data: Dict[str, Any]) -> bool:
"""
Validates fruit input data dictionary.
Args:
data (Dict[str, Any]): The input data to validate.
Returns:
bool: True if the data is valid, False otherwise.
"""
if not data:
return False
if "name" not in data or not isinstance(data["name"], str) or len(data["name"]) < 1:
return False
if "description" in data and not isinstance(data["description"], (str, type(None))):
return False
if "is_active" in data and not isinstance(data["is_active"], bool):
return False
return True