def process_record()

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"]))