Add helper functions for Shoe

This commit is contained in:
Backend IM Bot 2025-03-27 12:54:58 +00:00
parent 33e66b5a33
commit 0c11d38f8b

98
helpers/shoe_helpers.py Normal file
View File

@ -0,0 +1,98 @@
from typing import List, Optional, Dict, Union
from datetime import datetime
from sqlalchemy.orm import Session
from sqlalchemy import desc
from models.shoe import Shoe
from schemas.shoe import ShoeCreate, ShoeUpdate
def get_shoes_by_name(db: Session, name: str) -> List[Shoe]:
"""
Get shoes by name with case-insensitive search.
Args:
db: Database session
name: Name to search for
Returns:
List of matching Shoe objects
"""
return db.query(Shoe).filter(Shoe.name.ilike(f'%{name}%')).all()
def get_shoes_by_brand_and_size(db: Session, brand: str, size: int) -> List[Shoe]:
"""
Get shoes filtered by brand and size.
Args:
db: Database session
brand: Brand name to filter
size: Shoe size to filter
Returns:
List of matching Shoe objects
"""
return db.query(Shoe).filter(
Shoe.brand == brand,
Shoe.size == size
).all()
def validate_shoe_data(shoe_data: Union[ShoeCreate, ShoeUpdate]) -> Dict[str, str]:
"""
Validate shoe data before creation/update.
Args:
shoe_data: Shoe data to validate
Returns:
Dict with error message if validation fails, empty dict if valid
"""
errors = {}
if shoe_data.size <= 0:
errors["size"] = "Size must be positive"
if shoe_data.price and shoe_data.price < 0:
errors["price"] = "Price cannot be negative"
if shoe_data.purchase_date and shoe_data.purchase_date > datetime.now():
errors["purchase_date"] = "Purchase date cannot be in the future"
return errors
def get_shoes_by_condition(db: Session, condition: str) -> List[Shoe]:
"""
Get shoes filtered by condition.
Args:
db: Database session
condition: Condition to filter by
Returns:
List of matching Shoe objects
"""
return db.query(Shoe).filter(Shoe.condition == condition).all()
def calculate_collection_value(db: Session) -> Dict[str, Union[int, List[Dict[str, Any]]]]:
"""
Calculate total value of shoe collection and get price breakdown.
Args:
db: Database session
Returns:
Dict containing total value and price breakdown by brand
"""
shoes = db.query(Shoe).all()
total_value = sum(shoe.price for shoe in shoes if shoe.price)
brand_breakdown = {}
for shoe in shoes:
if shoe.price:
brand_breakdown[shoe.brand] = brand_breakdown.get(shoe.brand, 0) + shoe.price
return {
"total_value": total_value,
"brand_breakdown": [
{"brand": brand, "value": value}
for brand, value in brand_breakdown.items()
]
}