Skip to content

Account

account

Account management API endpoints.

Provides endpoints for account operations like password change, email change, and account deletion.

Classes

Functions

change_user_password

change_user_password(
    request: ChangePasswordRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
)

Change the current user's password.

Requires the current password for verification. Invalidates all other sessions after password change for security.

Source code in fastauth/api/account.py
@router.post("/change-password", response_model=MessageResponse)
def change_user_password(
    request: ChangePasswordRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
):
    """
    Change the current user's password.

    Requires the current password for verification.
    Invalidates all other sessions after password change for security.
    """
    adapters = AdapterFactory(session=session)

    try:
        change_password(
            users=adapters.users,
            sessions=adapters.sessions,
            user_id=current_user.id,
            current_password=request.current_password,
            new_password=request.new_password,
            current_session_id=None,
        )
    except InvalidPasswordError:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=ErrorMessages.CURRENT_PASSWORD_INVALID,
        )
    except UserNotFoundError:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=ErrorMessages.USER_NOT_FOUND,
        )

    return MessageResponse(message="Password changed successfully")

delete_user_account

delete_user_account(
    request: DeleteAccountRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
)

Delete the current user's account.

Requires password for verification. Supports both soft delete (default) and hard delete. Soft delete sets deleted_at timestamp and deactivates the account. Hard delete permanently removes the user from the database.

Source code in fastauth/api/account.py
@router.delete("/delete", response_model=MessageResponse)
def delete_user_account(
    request: DeleteAccountRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
):
    """
    Delete the current user's account.

    Requires password for verification.
    Supports both soft delete (default) and hard delete.
    Soft delete sets deleted_at timestamp and deactivates the account.
    Hard delete permanently removes the user from the database.
    """
    adapters = AdapterFactory(session=session)

    try:
        delete_account(
            users=adapters.users,
            sessions=adapters.sessions,
            user_id=current_user.id,
            password=request.password,
            hard_delete=request.hard_delete,
        )
    except InvalidPasswordError:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=ErrorMessages.INVALID_PASSWORD,
        )
    except UserNotFoundError:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=ErrorMessages.USER_NOT_FOUND,
        )

    delete_type = "permanently deleted" if request.hard_delete else "deactivated"
    return MessageResponse(message=f"Account {delete_type} successfully")

request_user_email_change

request_user_email_change(
    request: RequestEmailChangeRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
)

Request an email change for the current user.

Generates a verification token that must be confirmed to complete the email change. The token expires in 60 minutes by default.

Source code in fastauth/api/account.py
@router.post("/request-email-change", response_model=EmailChangeTokenResponse)
def request_user_email_change(
    request: RequestEmailChangeRequest,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
):
    """
    Request an email change for the current user.

    Generates a verification token that must be confirmed to complete the email change.
    The token expires in 60 minutes by default.
    """
    adapters = AdapterFactory(session=session)

    try:
        token = request_email_change(
            users=adapters.users,
            email_changes=adapters.email_changes,
            user_id=current_user.id,
            new_email=request.new_email,
            expires_in_minutes=60,
        )
    except EmailAlreadyExistsError:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=ErrorMessages.EMAIL_ALREADY_EXISTS,
        )

    if not token:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=ErrorMessages.USER_NOT_FOUND,
        )

    return EmailChangeTokenResponse(
        message="Email change requested. \
            Please verify the token to complete the change.",
        token=token,
    )

confirm_user_email_change

confirm_user_email_change(
    request: ConfirmEmailChangeRequest, session: Session = Depends(get_session)
)

Confirm an email change with a verification token.

Completes the email change process started with request-email-change.

Source code in fastauth/api/account.py
@router.post("/confirm-email-change", response_model=MessageResponse)
def confirm_user_email_change(
    request: ConfirmEmailChangeRequest,
    session: Session = Depends(get_session),
):
    """
    Confirm an email change with a verification token.

    Completes the email change process started with request-email-change.
    """
    adapters = AdapterFactory(session=session)

    try:
        confirm_email_change(
            users=adapters.users,
            email_changes=adapters.email_changes,
            token=request.token,
        )
    except EmailChangeError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=str(e),
        )
    except EmailAlreadyExistsError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=str(e),
        )

    return MessageResponse(message="Email changed successfully")

confirm_user_email_change_get

confirm_user_email_change_get(
    token: str, session: Session = Depends(get_session)
)

Confirm email change via GET with query parameter.

This endpoint enables clickable email change confirmation links.

Source code in fastauth/api/account.py
@router.get("/confirm-email-change")
def confirm_user_email_change_get(
    token: str,
    session: Session = Depends(get_session),
):
    """
    Confirm email change via GET with query parameter.

    This endpoint enables clickable email change confirmation links.
    """
    adapters = AdapterFactory(session=session)

    try:
        confirm_email_change(
            users=adapters.users,
            email_changes=adapters.email_changes,
            token=token,
        )
    except EmailChangeError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=str(e),
        )
    except EmailAlreadyExistsError as e:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail=str(e),
        )

    return {
        "message": "Email changed successfully",
        "status": "success",
    }