"""DynamoDB utils.""" import json from boto3.dynamodb.types import TypeSerializer from src.aws_utils import parse_arn from src.models import DownloadRequest def get_table_name_from_arn(arn): """Extract DynamoDB table name from arn.""" return parse_arn(arn)['resource'].split('/')[0] def extract_download_request_from_dynamodb_item( dynamodb_item) -> (DownloadRequest, dict): """Parse dynamodb event record.""" dynamodb_key = dynamodb_item['Keys'] download_request_payload = dynamodb_item['NewImage']['request']['S'] taskId = dynamodb_item['NewImage']['taskId']['S'] download_request_dict = json.loads(download_request_payload) download_request_dict['tasksMessageId'] = taskId download_request = DownloadRequest(**download_request_dict) return download_request, dynamodb_key type_serializer = TypeSerializer() def build_update_item_expression_kwargs(to_update: dict): """Build kwargs for boto3 dynamodb update_item method.""" keys = {} values = {} expressions = [] for count, key_value in enumerate(to_update.items(), start=1): key, value = key_value key_name = f'#v{count}' value_name = f':v{count}' expressions.append(f'{key_name} = {value_name}') keys[key_name] = key values[value_name] = type_serializer.serialize(value) return dict( UpdateExpression=f'set {", ".join(expressions)}', ExpressionAttributeValues=values, ExpressionAttributeNames=keys )