"""Subaccount model in Neo4j.""" import textwrap import uuid from permissions.connectors import neo4j as neo4j_connector from permissions.constants import constants from permissions.types import Subaccount def get_directly_accessible_subaccounts_by_profile( identity_id: uuid.UUID, profile_id: int, profile_type: str, ) -> list[Subaccount]: """Get accessible subaccounts for the identity and profile. Args: identity_id (str): identity uuid profile_id (str): profile id profile_type (str): profile type Returns: list[Subaccount]: list of accessible subaccounts. """ # query params kwargs = { 'profile_id': profile_id, 'profile_type': profile_type, 'identity_id': str(identity_id), } query = textwrap.dedent(""" MATCH (i:Identity {id: $identity_id})-[:HAS_PROFILE]-> (p:Profile {profileType: $profile_type, profileId: $profile_id}) MATCH (p)-[:HAS_ACCESS_TO|HAS_ADMIN_ACCESS_TO]->(s:Subaccount) RETURN s.uuid as subaccount_uuid, s.id as subaccount_id""") with neo4j_connector.db_session(access_mode=constants.NEO4j_READ_ACCESS) as session: result = session.run(query, **kwargs) return [ Subaccount(subaccount_uuid=r['subaccount_uuid'], subaccount_id=r['subaccount_id']) for r in result ]