in delivery/src/table_update/main.py [0:0]
def process_record(record: dict) -> Optional[dict]:
"""
Process record from DynamoDB
A record have a 'status' field that can take any of the following values:
- NEW
- IN_PROGRESS
- COMPLETED
- FAILED
"""
# pylint: disable=no-else-return
event = {
"Time": datetime.datetime.now(),
"Source": "ecommerce.delivery",
"Resources": [
deserialize(record["dynamodb"]["Keys"]["orderId"])
],
"EventBusName": EVENT_BUS_NAME
}
if record["dynamodb"].get("OldImage", None) is not None:
event["Detail"] = json.dumps({
"orderId": deserialize(record["dynamodb"]["OldImage"]["orderId"]),
"address": deserialize(record["dynamodb"]["OldImage"]["address"])
}, cls=Encoder)
else:
event["Detail"] = json.dumps({
"orderId": deserialize(record["dynamodb"]["NewImage"]["orderId"]),
"address": deserialize(record["dynamodb"]["NewImage"]["address"])
}, cls=Encoder)
# INSERT records
# These events are just discarded
if record["eventName"].upper() == "INSERT":
logger.debug({
"message": "Ignoring INSERT record",
"record": record
})
return None
# REMOVE records
elif record["eventName"].upper() == "REMOVE":
if deserialize(record["dynamodb"]["OldImage"]["status"]) in ["COMPLETED", "FAILED"]:
logger.debug({
"message": "Ignoring REMOVE of completed record",
"record": record
})
return None
logger.warning({
"message": "Failed delivery: REMOVE before completion",
"record": record
})
event["DetailType"] = "DeliveryFailed"
metrics.add_metric(name="deliveryFailed", unit=MetricUnit.Count, value=1)
return event
# MODIFY records
elif record["eventName"].upper() == "MODIFY":
if deserialize(record["dynamodb"]["NewImage"]["status"]) == "FAILED":
logger.warning({
"message": "Failed delivery: status marked as FAILED",
"record": record
})
event["DetailType"] = "DeliveryFailed"
metrics.add_metric(name="deliveryFailed", unit=MetricUnit.Count, value=1)
return event
elif deserialize(record["dynamodb"]["NewImage"]["status"]) == "COMPLETED":
logger.info({
"message": "Delivery completed",
"record": record
})
event["DetailType"] = "DeliveryCompleted"
metrics.add_metric(name="deliveryCompleted", unit=MetricUnit.Count, value=1)
return event
else:
return None
else:
raise ValueError("Wrong eventName value for DynamoDB event: {}".format(record["eventName"]))