from typing import List, Optional from sqlalchemy.orm import Session from app.crud.base import CRUDBase from app.models.inventory import InventoryItem from app.schemas.inventory import InventoryItemCreate, InventoryItemUpdate class CRUDInventory(CRUDBase[InventoryItem, InventoryItemCreate, InventoryItemUpdate]): def get_by_product( self, db: Session, *, product_id: int ) -> Optional[InventoryItem]: return db.query(InventoryItem).filter(InventoryItem.product_id == product_id).first() def get_low_stock( self, db: Session, *, skip: int = 0, limit: int = 100 ) -> List[InventoryItem]: return ( db.query(InventoryItem) .filter(InventoryItem.quantity <= InventoryItem.min_stock_level) .offset(skip) .limit(limit) .all() ) def update_quantity( self, db: Session, *, item_id: int, quantity_change: int ) -> InventoryItem: db_obj = db.query(InventoryItem).filter(InventoryItem.id == item_id).first() if db_obj: new_quantity = db_obj.quantity + quantity_change # Ensure quantity never goes below 0 db_obj.quantity = max(0, new_quantity) db.add(db_obj) db.commit() db.refresh(db_obj) return db_obj inventory = CRUDInventory(InventoryItem)