Skip to content

Commit 6acc5fa

Browse files
feat(idempotency): simplify access to expiration time in DataRecord class (#5082)
Accessing expiration time
1 parent 550fe3d commit 6acc5fa

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

aws_lambda_powertools/utilities/idempotency/persistence/datarecord.py

+21
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,24 @@ def response_json_as_dict(self) -> dict | None:
9292
previous response data deserialized
9393
"""
9494
return json.loads(self.response_data) if self.response_data else None
95+
96+
def get_expiration_datetime(self) -> datetime.datetime | None:
97+
"""
98+
Converts the expiry timestamp to a datetime object.
99+
100+
This method checks if an expiry timestamp exists and converts it to a
101+
datetime object. If no timestamp is present, it returns None.
102+
103+
Returns:
104+
-------
105+
datetime.datetime | None
106+
A datetime object representing the expiration time, or None if no expiry timestamp is set.
107+
108+
Note:
109+
----
110+
The returned datetime object is timezone-naive and assumes the timestamp
111+
is in the system's local timezone. Lambda default timezone is UTC.
112+
"""
113+
if self.expiry_timestamp:
114+
return datetime.datetime.fromtimestamp(int(self.expiry_timestamp))
115+
return None

examples/idempotency/src/working_with_response_hook.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import datetime
21
import uuid
32
from typing import Dict
43

@@ -20,11 +19,10 @@ def my_response_hook(response: Dict, idempotent_data: DataRecord) -> Dict:
2019
# Return inserted Header data into the Idempotent Response
2120
response["x-idempotent-key"] = idempotent_data.idempotency_key
2221

23-
# expiry_timestamp could be None so include if set
24-
expiry_timestamp = idempotent_data.expiry_timestamp
22+
# expiry_timestamp can be None so include if set
23+
expiry_timestamp = idempotent_data.get_expiration_datetime()
2524
if expiry_timestamp:
26-
expiry_time = datetime.datetime.fromtimestamp(int(expiry_timestamp))
27-
response["x-idempotent-expiration"] = expiry_time.isoformat()
25+
response["x-idempotent-expiration"] = expiry_timestamp.isoformat()
2826

2927
# Must return the response here
3028
return response

tests/functional/idempotency/test_idempotency.py

+2
Original file line numberDiff line numberDiff line change
@@ -2045,6 +2045,7 @@ def test_idempotent_lambda_already_completed_response_hook_is_called(
20452045
def idempotent_response_hook(response: Any, idempotent_data: DataRecord) -> Any:
20462046
"""Modify the response provided by adding a new key"""
20472047
response["idempotent_response"] = True
2048+
response["idempotent_expiration"] = idempotent_data.get_expiration_datetime()
20482049

20492050
return response
20502051

@@ -2070,6 +2071,7 @@ def lambda_handler(event, context):
20702071

20712072
# Then idempotent_response value will be added to the response
20722073
assert lambda_resp["idempotent_response"]
2074+
assert lambda_resp["idempotent_expiration"] == datetime.datetime.fromtimestamp(int(timestamp_future))
20732075

20742076
stubber.assert_no_pending_responses()
20752077
stubber.deactivate()

0 commit comments

Comments
 (0)