Source code for pyniryo_nate.components.users

from datetime import datetime

from .base_api_component import BaseAPIComponent

from .._internal import paths_gen, transport_models
from .._internal.utils import ensure_utc
from .._internal.transport_models import EmptyPayload
from ..models import User, Token, TokenInfo


[docs] class Users(BaseAPIComponent): """ Users component for managing user accounts. This component provides methods for: - Creating, retrieving, updating, and deleting users - Managing user tokens - Updating user passwords """
[docs] def get_all(self) -> list[User]: """ Get all the registered users. :return: The list of all the users. """ users = self._http_client.get( paths_gen.Authentication.GET_ALL_USERS, transport_models.UserList, ) return [User.from_transport_model(user) for user in users.root]
[docs] def create(self, email: str, name: str, role_id: int, password: str) -> User: """ Create a new user. :param email: The email of the user. :param name: The name of the user. :param role_id: The role ID of the user. :param password: The password of the user. :return: The created user. """ user = self._http_client.post( paths_gen.Authentication.CREATE_USER, transport_models.s.User, transport_models.s.NewUser(email=email, name=name, role_id=role_id, password=password), ) return User.from_transport_model(user)
[docs] def get(self, user_id: str) -> User: """ Get a user by its ID. :param user_id: The ID of the user. :return: The corresponding user. """ user = self._http_client.get( paths_gen.Authentication.GET_USER.format(user_id=user_id), transport_models.s.User, ) return User.from_transport_model(user)
[docs] def delete(self, user_id: str) -> None: """ Delete a user by its ID. :param user_id: The ID of the user. :return: None """ self._http_client.delete( paths_gen.Authentication.DELETE_USER.format(user_id=user_id), EmptyPayload, )
[docs] def update(self, user: User) -> User: """ Update a user. :param user: The user with its new properties. :return: The updated user. """ response = self._http_client.patch( paths_gen.Authentication.UPDATE_USER.format(user_id=user.id), transport_models.s.User, user.to_transport_model(), ) return User.from_transport_model(response)
[docs] def get_tokens(self, user_id: str) -> list[TokenInfo]: """ Get all the tokens of a user. The robot lists them without their secret, which it hands out once, on creation. :param user_id: The ID of the user. :return: The list of all the tokens of the user. """ tokens = self._http_client.get( paths_gen.Authentication.GET_USER_TOKENS.format(user_id=user_id), transport_models.TokenInfoList, ) return [TokenInfo.from_transport_model(token) for token in tokens.root]
[docs] def create_token(self, user_id: str, expires_at: datetime) -> Token: """ Create a new token for a user. :param user_id: The ID of the user. :param expires_at: The expiration date of the token, timezone-aware. :return: The created token. :raises DataValidationError: If ``expires_at`` carries no timezone. """ token = self._http_client.post( paths_gen.Authentication.CREATE_USER_TOKEN.format(user_id=user_id), transport_models.s.Token, transport_models.s.TokenCreation(expires_at=ensure_utc(expires_at)), ) return Token.from_transport_model(token)
[docs] def update_password(self, user_id: str, old_password: str, new_password: str) -> None: """ Update the password of a user. :param user_id: The ID of the user. :param old_password: The old password of the user. :param new_password: The new password of the user. :return: None """ self._http_client.patch( paths_gen.Authentication.UPDATE_USER_PASSWORD.format(user_id=user_id), EmptyPayload, transport_models.s.UpdatePassword(old_password=old_password, new_password=new_password), )