from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.core.deps import get_current_user, require_role from app.models.user import User from app.schemas.medicine import MedicineCreate, MedicineUpdate, MedicineResponse, MedicineWithStock from app.services.medicine import MedicineService router = APIRouter() @router.get("/") async def list_medicines( category_id: Optional[int] = Query(None), search: Optional[str] = Query(None), page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = MedicineService(db) medicines, total = await service.get_medicines( category_id=category_id, search=search, page=page, page_size=page_size ) return { "data": [MedicineWithStock.model_validate(m) for m in medicines], "total": total, "page": page, "page_size": page_size } @router.get("/{medicine_id}", response_model=MedicineResponse) async def get_medicine( medicine_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = MedicineService(db) medicine = await service.get_medicine(medicine_id) if not medicine: raise HTTPException(status_code=404, detail="药品不存在") return MedicineResponse.model_validate(medicine) @router.post("/", response_model=MedicineResponse) async def create_medicine( data: MedicineCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = MedicineService(db) medicine = await service.create_medicine(data, current_user.id) return MedicineResponse.model_validate(medicine) @router.put("/{medicine_id}", response_model=MedicineResponse) async def update_medicine( medicine_id: int, data: MedicineUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin", "user"])) ): service = MedicineService(db) medicine = await service.update_medicine(medicine_id, data) if not medicine: raise HTTPException(status_code=404, detail="药品不存在") return MedicineResponse.model_validate(medicine) @router.delete("/{medicine_id}") async def delete_medicine( medicine_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = MedicineService(db) success = await service.delete_medicine(medicine_id) if not success: raise HTTPException(status_code=404, detail="药品不存在") return {"message": "删除成功"}