Source code for ecstask.osp_eventhandler_v2.utilities.dynamodb_util
import datetime
import json
import logging
from decimal import Decimal
import time
from http import HTTPStatus
from pymorri.exceptions import MoriException
from .aws_client_util import AWSClientFactory
from pymorri.util.aws_utils import dynamodb_insert_row
from .sqs_util import write_messages_to_sqs
logger = logging.getLogger('ecstask.osp_eventhandler_v2')
[docs]def convert_float_to_decimal(payload):
return json.loads(json.dumps(payload), parse_float=Decimal)
[docs]def convert_decimal_to_float(payload):
return json.loads(json.dumps(payload))
[docs]def insert_payload_into_table(queue_name, table_name, payload, ttl=366):
"""
This method is used to insert payload into dynamodb table
:param queue_name: (str) Standard SQS Queue where error detail needs to be pushed
:param table_name: (str) table name for inserting payload
:param payload:(dict) payload to inserted in DynamoDB
:param ttl: (int) tim eto live
"""
try:
payload['ttlattribute'] = ttl * 24 * 60 * 60 + int(time.time())
payload['lastUpdatedDateTime'] = f'{datetime.datetime.now()}'
payload = convert_float_to_decimal(payload)
logger.debug(f"Data to persist {payload}")
AWSClientFactory.get_dynamodb_resource(table_name).put_item(Item=payload)
logger.info(f"Data inserted into DynamoDB for PickTask: {payload['pickTaskId']}")
except Exception as ex:
logger.error(f"Exception while adding record into DynamoDB, error is {ex}")
payload['errorDetail'] = f'Exception while adding record into DynamoDB, error is {ex}'
payload = convert_decimal_to_float(payload)
write_messages_to_sqs(queue_name, payload)
raise MoriException(http_status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
detail=f"DynamoDB failure while saving data to the table {table_name}. "
f"Exception: {ex}")
[docs]def insert_error_into_table(table_name, payload, ttl=366):
"""
This method is used to insert payload into dynamodb table
:param table_name: (str) table name for inserting payload
:param payload:(dict) payload to inserted in DynamoDB
:param ttl: (int) tim eto live
"""
if payload['orderId']:
payload['ttlattribute'] = ttl * 24 * 60 * 60 + int(time.time())
payload['lastUpdatedDateTime'] = f'{datetime.datetime.now()}'
dynamodb_insert_row(table_name, payload)
logger.error(f"error data inserted into {table_name} for order id: {payload['orderId']}")
else:
raise MoriException(http_status_code=HTTPStatus.BAD_REQUEST,
detail=f"error not inserted in {table_name} as no orderId.")