""" Permissions API methods. """ from functools import lru_cache from typing import Iterable from monday_com_orca_backend.typings import Email from monday_com_orca_backend.utils.custom_types import FrozenDict from . import enums, exceptions, helpers, models @lru_cache(maxsize=1) # This won't change often, cache it def get_scope_level_priorities() -> FrozenDict: """Return a dictionary of scope levels with their priorities.""" # TODO this must be replaced with a real database query to fetch scope levels, # but now we hardcode the priorities. return FrozenDict( { enums.PermissionLevel.ALL: 200, enums.PermissionLevel.READ: 100, enums.PermissionLevel.NONE: 0, } ) def get_users_permissions( user_emails: Iterable[Email], limit: int | None = None, offset: int = 0 ) -> dict[Email, models.UserPermissions]: """Fetch user permissions based on their email addresses. Args: user_emails: An iterable of user email addresses to fetch permissions for. limit: Maximum number of records to return (default is None, meaning no limit). offset: Number of records to skip (default is 0). """ # TODO: This must be replaced with a real database query to fetch permissions, # but for now, we are simulating the response. It must also use pagination. user_emails = ( list(user_emails)[:limit] if limit is not None else user_emails ) # Simulate limit _, _ = limit, offset # Unused in this mock implementation permission_objs = { email: models.UserPermissions( view_permissions=enums.ViewUserPermissions.OWN, scopes={ enums.PermissionScope.DASHBOARD: enums.PermissionLevel.ALL, enums.PermissionScope.BUSINESS_PLAN: enums.PermissionLevel.ALL, }, features=[enums.PermissionFeature.IMPERSONATE_USERS], # Default features ) for email in set(map(helpers.clean_email, user_emails)) } return permission_objs def get_user_permissions(user_email: Email) -> models.UserPermissions: """Fetch permissions for a single user based on their email address. Args: user_email: The email address of the user to fetch permissions for. Returns: UserPermissions: The permissions object for the user. Raises: UserNotFound: If the user with the given email address is not found. """ user_email = helpers.clean_email(user_email) permissions = get_users_permissions([user_email], limit=1) try: return permissions[user_email] except KeyError: raise exceptions.NotFound(f"User with email {user_email} not found.") from None