from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.models.point_product import ( PointProductDB, PointProductCreate, PointProductUpdate, PointProductInfo ) from app.models.database import get_db from app.api.deps import get_admin_user from app.models.user import UserDB from app.core.response import success_response, error_response, ResponseModel from typing import Optional router = APIRouter() @router.post("", response_model=ResponseModel) async def create_point_product( product: PointProductCreate, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """创建积分商品(管理员)""" db_product = PointProductDB(**product.model_dump()) db.add(db_product) try: db.commit() db.refresh(db_product) return success_response(data=PointProductInfo.model_validate(db_product)) except Exception as e: db.rollback() return error_response(code=500, message=f"创建失败: {str(e)}") @router.get("", response_model=ResponseModel) async def get_point_products( is_active: Optional[bool] = None, skip: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100), db: Session = Depends(get_db) ): """获取积分商品列表""" query = db.query(PointProductDB) if is_active is not None: query = query.filter(PointProductDB.is_active == is_active) total = query.count() products = query.order_by(PointProductDB.create_time.desc())\ .offset(skip)\ .limit(limit)\ .all() return success_response(data={ "total": total, "items": [PointProductInfo.model_validate(p) for p in products] }) @router.get("/{product_id}", response_model=ResponseModel) async def get_point_product( product_id: int, db: Session = Depends(get_db) ): """获取积分商品详情""" product = db.query(PointProductDB).filter( PointProductDB.id == product_id ).first() if not product: return error_response(code=404, message="商品不存在") return success_response(data=PointProductInfo.model_validate(product)) @router.put("/{product_id}", response_model=ResponseModel) async def update_point_product( product_id: int, product: PointProductUpdate, db: Session = Depends(get_db), admin: UserDB = Depends(get_admin_user) ): """更新积分商品(管理员)""" db_product = db.query(PointProductDB).filter( PointProductDB.id == product_id ).first() if not db_product: return error_response(code=404, message="商品不存在") update_data = product.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(db_product, key, value) try: db.commit() db.refresh(db_product) return success_response(data=PointProductInfo.model_validate(db_product)) except Exception as e: db.rollback() return error_response(code=500, message=f"更新失败: {str(e)}")