from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel from app.database import get_db from app.core.deps import require_role from app.models.user import User from app.schemas.user import UserCreate, UserUpdate, UserResponse from app.services.user import UserService router = APIRouter() class ResetPasswordRequest(BaseModel): new_password: str @router.get("/", response_model=List[UserResponse]) async def list_users( db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) users = await service.get_all_users() return [UserResponse.model_validate(u) for u in users] @router.get("/{user_id}", response_model=UserResponse) async def get_user( user_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) user = await service.get_user(user_id) if not user: raise HTTPException(status_code=404, detail="用户不存在") return UserResponse.model_validate(user) @router.post("/", response_model=UserResponse) async def create_user( data: UserCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) existing_user = await service.get_user_by_username(data.username) if existing_user: raise HTTPException(status_code=409, detail="用户名已存在") user = await service.create_user(data.model_dump()) return UserResponse.model_validate(user) @router.put("/{user_id}", response_model=UserResponse) async def update_user( user_id: int, data: UserUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) user = await service.update_user(user_id, data.model_dump(exclude_unset=True)) if not user: raise HTTPException(status_code=404, detail="用户不存在") return UserResponse.model_validate(user) @router.delete("/{user_id}") async def delete_user( user_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) success = await service.delete_user(user_id) if not success: raise HTTPException(status_code=404, detail="用户不存在") return {"message": "删除成功"} @router.post("/{user_id}/reset-password") async def reset_password( user_id: int, data: ResetPasswordRequest, db: AsyncSession = Depends(get_db), current_user: User = Depends(require_role(["admin"])) ): service = UserService(db) success = await service.reset_password(user_id, data.new_password) if not success: raise HTTPException(status_code=404, detail="用户不存在") return {"message": "success"}