"""Main Handler.""" from typing import Dict from bulk_metadata_ingester_common.models.bulk_release import BulkRelease from bulk_metadata_ingester_common.utils.error import graphql_execute from bulk_metadata_ingester_common.utils.jitter import jitter from bulk_metadata_ingester_common.utils.logging import get_current_logger from bulk_metadata_ingester_common.utils.release_utils import \ get_release_track_list import config from config import graphql_gateway from constants.queries import GET_SUBACCOUNT_ID_BY_NAME from utils.participant_utils import process_participants from utils.project_utils import ( check_for_project, check_project_code_mismatch, create_project, update_project) def handler(event: Dict, context: object) -> Dict: """Lambda Entrypoint.""" key = event.get('key') bucket = event.get('bucket') item_index = event.get('item_index') correlation_id = event.get('correlation_id') release = event.get('release', {}) tracks = event.get('tracks', {}) logger = get_current_logger( config.ENVIRONMENT, config.LAMBDA_NAME, logging_level=config.LOGGING_LEVEL, correlation_id=correlation_id) # Jitter calls - Sleep for randomness jitter(logger) graphql_gateway.set_headers( { 'Orchard-User-Id': config.OA_USER, 'Correlation-Id': correlation_id } ) # Log lambda begins message logger.info(f'set_project received: {event}') # Get single release from JSON release_track_list = get_release_track_list(bucket, key, item_index) # Move JSON to model modeled_release = BulkRelease(json_release_rows=release_track_list) # Rehydrate passed values modeled_release.rehydrate(release, tracks) modeled_release = set_project(event, modeled_release, logger) # Get all passed and updated fields updates = modeled_release.get_modified() result = { **event, 'release': { **updates['release'], }, 'tracks': { **updates['tracks'] } } return result def set_project( event: Dict, model: BulkRelease, logger: object) -> BulkRelease: """Set the project ID.""" # Get subaccount ID model.subaccount_id = find_subaccount_id(model.subaccount_name, logger) # Add participants model = process_participants(model, logger) # Check if this upc is on another project check_project_code_mismatch(model, logger) # Check if project exists graphql_result = check_for_project(model, logger) if not graphql_result: project_response = create_project(event, model, logger) model.project_id = project_response.get('projectId') else: model.project_id = graphql_result.get('projectId') graphql_result = update_project(event, model, logger) return model def find_subaccount_id(subaccount_name: str, logger: object): """Find a subaccount ID in a D3 Vendor from the subaccount name.""" if not subaccount_name: return 0 graphql_result = graphql_execute( graphql_gateway, GET_SUBACCOUNT_ID_BY_NAME, {'term': subaccount_name}, logger )['data']['orchardLabelSearch'][0]['id']['subaccountId'] return graphql_result