aidress/app/routers/dress_router.py
2025-03-21 17:06:54 +08:00

162 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)}")