shoe-store-z9mjrn/helpers/shoe_helpers.py
2025-03-27 12:54:58 +00:00

98 lines
2.7 KiB
Python

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()
]
}