from fastapi import APIRouter, HTTPException, Depends, Query, Path from sqlalchemy.orm import Session from typing import List, Optional import logging from app.database import get_db from app.models.dress import Dress, GarmentType from app.schemas.dress import DressCreate, DressUpdate, DressResponse logger = logging.getLogger(__name__) router = APIRouter() @router.post("/", response_model=DressResponse, status_code=201) async def create_dress( dress: DressCreate, db: Session = Depends(get_db) ): """ 创建一个新的服装记录 - **name**: 服装名称(必填) - **image_url**: 服装图片URL(可选) - **garment_type**: 服装类型(TOP_GARMENT:上衣, BOTTOM_GARMENT:下衣)(可选) - **description**: 服装描述(可选) """ try: db_dress = Dress( name=dress.name, image_url=dress.image_url, garment_type=dress.garment_type, description=dress.description ) db.add(db_dress) db.commit() db.refresh(db_dress) return db_dress except Exception as e: logger.error(f"创建服装记录失败: {str(e)}") db.rollback() raise HTTPException(status_code=500, detail=f"创建服装记录失败: {str(e)}") @router.get("/", response_model=List[DressResponse]) async def get_dresses( skip: int = Query(0, description="跳过的记录数量"), limit: int = Query(100, description="返回的最大记录数量"), name: Optional[str] = Query(None, description="按名称过滤"), garment_type: Optional[str] = Query(None, description="按服装类型过滤(TOP_GARMENT:上衣, BOTTOM_GARMENT:下衣)"), db: Session = Depends(get_db) ): """ 获取服装列表,支持分页和过滤 - **skip**: 跳过的记录数量,用于分页 - **limit**: 返回的最大记录数量,用于分页 - **name**: 按名称过滤(可选) - **garment_type**: 按服装类型过滤(可选) """ try: query = db.query(Dress) if name: query = query.filter(Dress.name.ilike(f"%{name}%")) if garment_type: try: garment_type_enum = GarmentType[garment_type] query = query.filter(Dress.garment_type == garment_type_enum) except KeyError: logger.warning(f"无效的服装类型: {garment_type}") # 继续查询,但不应用无效的过滤条件 dresses = query.offset(skip).limit(limit).all() return dresses except Exception as e: logger.error(f"获取服装列表失败: {str(e)}") raise HTTPException(status_code=500, detail=f"获取服装列表失败: {str(e)}") @router.get("/{dress_id}", response_model=DressResponse) async def get_dress( dress_id: int = Path(..., description="服装ID"), db: Session = Depends(get_db) ): """ 根据ID获取服装详情 - **dress_id**: 服装ID """ try: dress = db.query(Dress).filter(Dress.id == dress_id).first() if not dress: raise HTTPException(status_code=404, detail=f"未找到ID为{dress_id}的服装") return dress except HTTPException: raise except Exception as e: logger.error(f"获取服装详情失败: {str(e)}") raise HTTPException(status_code=500, detail=f"获取服装详情失败: {str(e)}") @router.put("/{dress_id}", response_model=DressResponse) async def update_dress( dress_id: int = Path(..., description="服装ID"), dress: DressUpdate = None, db: Session = Depends(get_db) ): """ 更新服装信息 - **dress_id**: 服装ID - **name**: 服装名称(可选) - **image_url**: 服装图片URL(可选) - **garment_type**: 服装类型(TOP_GARMENT:上衣, BOTTOM_GARMENT:下衣)(可选) - **description**: 服装描述(可选) """ try: db_dress = db.query(Dress).filter(Dress.id == dress_id).first() if not db_dress: raise HTTPException(status_code=404, detail=f"未找到ID为{dress_id}的服装") # 更新提供的字段 if dress.name is not None: db_dress.name = dress.name if dress.image_url is not None: db_dress.image_url = dress.image_url if dress.garment_type is not None: db_dress.garment_type = dress.garment_type if dress.description is not None: db_dress.description = dress.description db.commit() db.refresh(db_dress) return db_dress except HTTPException: raise except Exception as e: logger.error(f"更新服装信息失败: {str(e)}") db.rollback() raise HTTPException(status_code=500, detail=f"更新服装信息失败: {str(e)}") @router.delete("/{dress_id}", status_code=204) async def delete_dress( dress_id: int = Path(..., description="服装ID"), db: Session = Depends(get_db) ): """ 删除服装 - **dress_id**: 服装ID """ try: db_dress = db.query(Dress).filter(Dress.id == dress_id).first() if not db_dress: raise HTTPException(status_code=404, detail=f"未找到ID为{dress_id}的服装") db.delete(db_dress) db.commit() return None except HTTPException: raise except Exception as e: logger.error(f"删除服装失败: {str(e)}") db.rollback() raise HTTPException(status_code=500, detail=f"删除服装失败: {str(e)}")