"""GraphqlGateway connections.""" import config from src.common.connectors import graphql_gateway FINGERPRINT_RULES_FRAGMENT = """ fragment FingerprintRulesFragment on FingerprintRule { start_date: startDate end_date: endDate is_start_absolute: isStartAbsolute is_end_absolute: isEndAbsolute territory active policy service created_by: createdBy { id: profileId type: profileType } last_modified_by: lastModifiedBy { id: profileId type: profileType } created_date: createdDate last_modified_date: lastModifiedDate } """ TRACKS_QUERY = """ query tracksForSoundRecording($tuids: [ID!]!) { tracks(tuids: $tuids) { rules {...FingerprintRulesFragment} product { id: releaseId } tuid isrc name: trackName explicit version duration_minutes: durationMinutes duration_seconds: durationSeconds meta_language_code: metaLanguageCode language { iso_639_1_code } p_info: pInfo participations { participant { uuid name } participated_as } label_sound_recording: labelSoundRecording { participations { participant { uuid name } role { name category { name } } } } territories original_rights_holder_country: originalRightsHolderCountry { territory_code_a2: territoryCodeA2 } recording_country: recordingCountry { territory_code_a2: territoryCodeA2 } audio_attributes: audioAttributes { id attribute { id description } } rights_attributes: rightsAttributes { id attribute { id description } } offer_type: offerType ownership_rights: ownershipRights } } """ + FINGERPRINT_RULES_FRAGMENT PRODUCTS_QUERY = """ query Products($upcs: [String!]!) { productByUpcs(upcs: $upcs) { id: releaseId display_upc: displayUpc status release_date: releaseDate ingestion_completed: ingestionCompleted sale_start_date: saleStartDate label { name type: __typename uuid id { vendorId subaccountId } ... on Vendor { rules { ...FingerprintRulesFragment } } ... on Subaccount { rules { ...FingerprintRulesFragment } vendor { rules { ...FingerprintRulesFragment } } } } subgenre { id name genre { name id } } } } """ + FINGERPRINT_RULES_FRAGMENT def execute_query(track_ids): """Execute gql tracks query. Args: track_ids (list): tuid ints for tracks Returns: list: dicts in format of TRACK_FRAGMENT """ headers = { 'apollographql-client-name': config.APPLICATION_NAME, 'apollographql-client-version': '1', 'Orchard-Identity-Id': config.ADMIN_IDENTITY_ID, 'Orchard-Profile-Id': config.ADMIN_PROFILE_ID, 'Orchard-Profile-Type': config.ADMIN_PROFILE_TYPE, 'Cache-Control': 'no-cache' } params = {'tuids': track_ids} return graphql_gateway.make_request(headers, TRACKS_QUERY, params) def get_tracks(track_ids): """Get metadata about tracks by their ids. Args: track_ids (list): tuid ints for tracks Returns: dict[tracks]: list of track data """ chunked_tracks = list() for i in range(0, len(track_ids), 100): chunked_tracks.append(track_ids[i:i + 100]) result = {'tracks': []} for track_ids in chunked_tracks: try: data = execute_query(track_ids) result['tracks'] += data['tracks'] except Exception as e: raise e return result def execute_product_query(upcs): """Execute gql product query. Args: upcs (list): upcs for products Returns: list: dicts resembling product data """ headers = { 'apollographql-client-name': config.APPLICATION_NAME, 'apollographql-client-version': '1', 'Orchard-Identity-Id': config.ADMIN_IDENTITY_ID, 'Orchard-Profile-Id': config.ADMIN_PROFILE_ID, 'Orchard-Profile-Type': config.ADMIN_PROFILE_TYPE, 'Cache-Control': 'no-cache' } params = {'upcs': upcs} return graphql_gateway.make_request(headers, PRODUCTS_QUERY, params) def get_products(upcs): """Get metadata about products by their upcs. Args: upcs (list): product upc strings Returns: dict[products]: list of product data """ chunked_upcs = list() upcs_per_chunk = 100 # 100 is a guessed limit for upcs per query for i in range(0, len(upcs), upcs_per_chunk): chunked_upcs.append(upcs[i:i + upcs_per_chunk]) result = {'products': []} for upcs_chunk in chunked_upcs: data = execute_product_query(upcs_chunk) result['products'] += data['productByUpcs'] return result