from abc import ABC, abstractmethod from typing import Optional from selfprivacy_api.models.group import Group from selfprivacy_api.models.user import UserDataUser class AbstractUserRepository(ABC): @staticmethod @abstractmethod def create_user( username: str, password: Optional[str] = None, directmemberof: Optional[list[str]] = None, displayname: Optional[str] = None, email: Optional[str] = None, ) -> None: """ Creates a new user. ! In KanidmUserRepository "password" is a legacy field, please use generate_password_reset_link() instead ! """ @staticmethod @abstractmethod def get_users( exclude_primary: bool = False, exclude_root: bool = False, ) -> list[UserDataUser]: """ Gets a list of users with options to exclude specific user groups. ! In KanidmUserRepository, the root user will never return ! """ @staticmethod @abstractmethod def delete_user(username: str) -> None: """ Deletes an existing user """ @staticmethod @abstractmethod def update_user( username: str, directmemberof: Optional[list[str]] = None, displayname: Optional[str] = None, email: Optional[str] = None, ) -> None: """ Update user information. In the JsonUserRepository, only update the password of an existing user. ! Do not update the password in KanidmUserRepository, use generate_password_reset_link() instead ! """ @staticmethod @abstractmethod def get_user_by_username(username: str) -> UserDataUser: """ Retrieves user data (UserDataUser) by username """ # ! Not implemented in JsonUserRepository ! # | | # \|/ \|/ @staticmethod @abstractmethod def generate_password_reset_link(username: str) -> str: """ Do not reset the password, just generate a link to reset the password. """ @staticmethod @abstractmethod def groups_list() -> list[Group]: """ Get groups list. """