from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.core.deps import get_current_user from app.services.auth import AuthService from app.schemas.user import UserLogin, Token, UserResponse from app.schemas.auth import PasswordChangeRequest from app.services.user import UserService router = APIRouter() @router.post("/login", response_model=Token) async def login(data: UserLogin, db: AsyncSession = Depends(get_db)): service = AuthService(db) result = await service.login(data.username, data.password) if not result: raise HTTPException(status_code=401, detail="用户名或密码错误") return Token( access_token=result["access_token"], token_type=result["token_type"], user=UserResponse.model_validate(result["user"]) ) @router.get("/me", response_model=UserResponse) async def get_current_user_info(current_user=Depends(get_current_user)): return UserResponse.model_validate(current_user) @router.put("/password") async def change_password( data: PasswordChangeRequest, current_user=Depends(get_current_user), db: AsyncSession = Depends(get_db) ): service = UserService(db) success = await service.change_password(current_user.id, data.old_password, data.new_password) if not success: raise HTTPException(status_code=400, detail="原密码错误") return {"message": "密码修改成功"}