from typing import List, Optional from sqlalchemy.orm import Session from sqlalchemy.exc import IntegrityError from fastapi import HTTPException from app.database.models import Product from app.schemas.product import ProductCreate, ProductUpdate class ProductService: @staticmethod def get_all_products(db: Session) -> List[Product]: """获取所有产品""" return db.query(Product).all() @staticmethod def get_product_by_id(db: Session, product_id: int) -> Optional[Product]: """根据ID获取产品""" return db.query(Product).filter(Product.id == product_id).first() @staticmethod def create_product(db: Session, product_data: ProductCreate) -> Product: """创建新产品""" try: db_product = Product( name=product_data.name, description=product_data.description, price=product_data.price, stock=product_data.stock ) db.add(db_product) db.commit() db.refresh(db_product) return db_product except IntegrityError as e: db.rollback() error_msg = str(e.orig) if "name" in error_msg: raise HTTPException(status_code=409, detail="Product name already exists") else: raise HTTPException(status_code=409, detail="Data conflict") except Exception as e: db.rollback() raise HTTPException(status_code=500, detail="Internal server error") @staticmethod def update_product(db: Session, product_id: int, product_data: ProductUpdate) -> Optional[Product]: """更新产品信息""" try: db_product = db.query(Product).filter(Product.id == product_id).first() if not db_product: return None update_data = product_data.model_dump(exclude_unset=True) for field, value in update_data.items(): setattr(db_product, field, value) db.commit() db.refresh(db_product) return db_product except IntegrityError as e: db.rollback() error_msg = str(e.orig) if "name" in error_msg: raise HTTPException(status_code=409, detail="Product name already exists") else: raise HTTPException(status_code=409, detail="Data conflict") except Exception as e: db.rollback() raise HTTPException(status_code=500, detail="Internal server error") @staticmethod def delete_product(db: Session, product_id: int) -> bool: """删除产品""" try: db_product = db.query(Product).filter(Product.id == product_id).first() if not db_product: return False db.delete(db_product) db.commit() return True except Exception as e: db.rollback() raise HTTPException(status_code=500, detail="Internal server error") product_service = ProductService()