162 lines
5.5 KiB
Python
162 lines
5.5 KiB
Python
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)}") |