"""Database operations for ownership of objects.""" from connector_neo4j import get_session from sound_recordings.cypher import ownership as cypher class InvalidOwnershipData(Exception): """Ownership data in db is not as expected.""" pass def get_bulk_track_owners(track_ids): """Get Vendor and SubAccount owners of Tracks. Args: track_ids list(int): int for Track.id Returns: dict with track id as keys and corresponding dict of account data Raises: InvalidOwnershipData """ neo4j_session = get_session() unique_track_ids = list(set(track_ids)) results = neo4j_session.run( cypher.GET_BULK_TRACK_OWNERS, track_ids=unique_track_ids ) if not results: raise InvalidOwnershipData() track_ownership = {} for result in results: track_id = result['track_id'] vendor_id = result['vendor_id'] if vendor_id is None: raise InvalidOwnershipData() subaccount_id = result['subaccount_id'] if track_id in track_ownership: if track_ownership[track_id]['vendor_id'] != vendor_id or \ track_ownership[track_id]['subaccount_id'] != subaccount_id: raise InvalidOwnershipData(f'track_id {track_id}') else: continue track_ownership[track_id] = { 'vendor_id': vendor_id, 'subaccount_id': subaccount_id } if len(track_ownership) != len(unique_track_ids): raise InvalidOwnershipData() return track_ownership def get_bulk_subaccount_owner(subaccount_ids): """Get Vendor owners of SubAccounts. Args: subaccount_ids list(int): int for SubAccount.id Returns: dict with subaccount id as keys and corresponding dict of account data Raises: InvalidOwnershipData """ neo4j_session = get_session() results = neo4j_session.run( cypher.GET_BULK_SUBACCOUNT_OWNER, subaccount_ids=subaccount_ids ) if not results: raise InvalidOwnershipData() subaccount_ownership = {} for result in results: vendor_id = result['vendor_id'] subaccount_id = result['subaccount_id'] if subaccount_id in subaccount_ownership: raise InvalidOwnershipData() if vendor_id is None: raise InvalidOwnershipData() subaccount_ownership[subaccount_id] = { 'vendor_id': vendor_id } if len(subaccount_ownership) != len(subaccount_ids): raise InvalidOwnershipData() return subaccount_ownership