fastapi-demo/app/services/product_service.py

88 lines
3.0 KiB
Python

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