-
Notifications
You must be signed in to change notification settings - Fork 0
/
complete_order.py
60 lines (48 loc) · 1.72 KB
/
complete_order.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import decimal
import json
import os
import boto3
TABLE_NAME = os.environ.get("ORDER_TABLE")
TOPIC_ARN = os.environ.get("TOPIC_ARN")
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(TABLE_NAME)
sns = boto3.client("sns")
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
return str(o)
return super(DecimalEncoder, self).default(o)
def update_order(order_status, event):
response = table.update_item(
Key={
"user_id": event["saveResults"]["user_id"],
"id": event["saveResults"]["id"],
},
UpdateExpression="set orderStatus = :s",
ExpressionAttributeValues={":s": order_status},
ReturnValues="UPDATED_NEW",
)
message = {"order_status": order_status, "order_id": event["saveResults"]["id"]}
send_order_notification(message)
print(f"Order success sent {message}")
return {"message": "Order created and notification sent"}
def send_order_notification(message):
"""
Expects message (type dict) with order_status and order_id values from
the invoking event.
{"order_status": SUCCESS, "order_id": b4d27a00-1a73-4089-94f8-87e273b57067}
Make sns.publish() call using the 'sns' client defined globally. SNS Topic
retrieved from Lambda Environment Variable TOPIC_ARN
"""
topic_arn = TOPIC_ARN
sns.publish(
TopicArn=topic_arn,
Message=json.dumps(message),
Subject=f'Orders-App: Update for order {message["order_id"]}',
)
def handler(event, context):
print(f"event: {event}")
order_status = "SUCCESS"
response = update_order(order_status, event)
print(f"update_order response: {response}")
return response