Update User
Agora vamos adicionar uma rota para que o usuário possa alterar o próprio perfil.
O usuário será capaz de mudar apenas os campos bio
e avatar
bio será um texto e avatar a URL de uma imagem, e é claro, o usuário só
poderá alterar o seu próprio perfil.
Vamos começar criando o serializer que irá receber essas informações a serem alteradas:
EDITE models/user.py
e adicione:
class UserProfilePatchRequest(BaseModel):
avatar: Optional[str] = None
bio: Optional[str] = None
E agora EDITE routes/user.py
e adicione ao final.
@router.patch("/{username}/", response_model=UserResponse)
async def update_user(
*,
session: Session = ActiveSession,
patch_data: UserProfilePatchRequest,
current_user: User = AuthenticatedUser,
username: str
):
user = session.exec(select(User).where(User.username == username)).first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
if user.id != current_user.id and not current_user.superuser:
raise HTTPException(status_code=403, detail="You can only update your own profile")
# Update
user.avatar = patch_data.avatar
user.bio = patch_data.bio
session.add(user)
session.commit()
session.refresh(user)
return user
Agora podemos testar a rota fazendo a alteração do perfil do usuário michael-scott, lembre-se que primeiro
será necessário obter um token válido com uma chamada na rota /token
curl -X 'PATCH' \
-H 'Authorization: Bearer ...' \
-H 'Content-Type: application/json'
--data-raw '{"avatar": "https://test.com/MichaelScott.png", "bio": "I am the boss"}' \
-k 'http://localhost:8000/user/michael-scott/'
O usuário também precisará alterar a senha caso ele esqueça, vamos implementar esta funcionalidade -->