def handle(event: dict, context: dict) -> Optional[dict]: s3_client = boto3.client('s3') download_token = event_parser.extract_from_headers( config.AUTHORIZATION_HEADER, event) logger.info(f'Extracted download_token from headers: {download_token}') identifier = exchange_repository.get_identifier_from_token( download_token=download_token) logger.info(f'Queried identifier from repository: {identifier}') key = file_repository.get_file(identifier) logger.info(f'Extracted file key from storage: {key}') if key: try: logger.info("Generating presigned url") response = s3_client.generate_presigned_url('get_object', Params={ 'Bucket': BUCKET_NAME, 'Key': key }) except ClientError as e: logging.error(e) return generate_response("Internal Error", HTTPStatus.INTERNAL_SERVER_ERROR) return generate_response(response, HTTPStatus.OK) else: return generate_response("No file associated to this token", HTTPStatus.NOT_FOUND)
def test_get_file_should_return_none_if_identifier_has_no_file( self, mock_get_s3_client, get_s3_client): # Given mock_get_s3_client.return_value = get_s3_client # When actual_file = file_repository.get_file('non-existing-identifier') # Then assert actual_file is None
def test_get_file_should_return_the_exchange_file(self, mock_get_s3_client, an_exchange, get_s3_client): # Given mock_get_s3_client.return_value = get_s3_client get_s3_client.put_object( Bucket=BUCKET_NAME, Key=f'{an_exchange.identifier}/a_binary_content') # When actual_file = file_repository.get_file(an_exchange.identifier) # Then assert actual_file == f'{an_exchange.identifier}/a_binary_content'
def _check_if_a_file_exists(identifier: str) -> bool: return True if file_repository.get_file(identifier) is not None else False