8
8
import os
9
9
import warnings
10
10
from abc import ABC , abstractmethod
11
- from typing import Any , Dict , Optional
11
+ from typing import Any , Dict , Optional , Union
12
12
13
13
import jmespath
14
14
@@ -160,16 +160,20 @@ def _generate_hash(self, data: Any) -> str:
160
160
hashed_data = self .hash_function (json .dumps (data , cls = Encoder , sort_keys = True ).encode ())
161
161
return hashed_data .hexdigest ()
162
162
163
- def _validate_payload (self , data : Dict [str , Any ], data_record : DataRecord ) -> None :
163
+ def _validate_payload (
164
+ self ,
165
+ data_payload : Union [Dict [str , Any ], DataRecord ],
166
+ stored_data_record : DataRecord ,
167
+ ) -> None :
164
168
"""
165
169
Validate that the hashed payload matches data provided and stored data record
166
170
167
171
Parameters
168
172
----------
169
- data: Dict[str, Any]
173
+ data_payload: Union[ Dict[str, Any], DataRecord ]
170
174
Payload
171
- data_record : DataRecord
172
- DataRecord instance
175
+ stored_data_record : DataRecord
176
+ DataRecord fetched from Dynamo or cache
173
177
174
178
Raises
175
179
----------
@@ -178,30 +182,13 @@ def _validate_payload(self, data: Dict[str, Any], data_record: DataRecord) -> No
178
182
179
183
"""
180
184
if self .payload_validation_enabled :
181
- data_hash = self ._get_hashed_payload (data = data )
182
- if data_record .payload_hash != data_hash :
183
- raise IdempotencyValidationError ("Payload does not match stored record for this event key" )
184
-
185
- def _validate_hashed_payload (self , old_data_record : DataRecord , data_record : DataRecord ) -> None :
186
- """
187
- Validate that the hashed data provided matches the payload_hash stored data record
188
-
189
- Parameters
190
- ----------
191
- old_data_record: DataRecord
192
- DataRecord instance fetched from Dynamo
193
- data_record: DataRecord
194
- DataRecord instance which failed insert into Dynamo
185
+ if isinstance (data_payload , DataRecord ):
186
+ data_hash = data_payload .payload_hash
187
+ else :
188
+ data_hash = self ._get_hashed_payload (data = data_payload )
195
189
196
- Raises
197
- ----------
198
- IdempotencyValidationError
199
- Payload doesn't match the stored record for the given idempotency key
200
-
201
- """
202
- if self .payload_validation_enabled :
203
- if old_data_record .payload_hash != data_record .payload_hash :
204
- raise IdempotencyValidationError ("Hashed payload does not match stored record for this event key" )
190
+ if stored_data_record .payload_hash != data_hash :
191
+ raise IdempotencyValidationError ("Payload does not match stored record for this event key" )
205
192
206
193
def _get_expiry_timestamp (self ) -> int :
207
194
"""
@@ -391,14 +378,14 @@ def get_record(self, data: Dict[str, Any]) -> Optional[DataRecord]:
391
378
cached_record = self ._retrieve_from_cache (idempotency_key = idempotency_key )
392
379
if cached_record :
393
380
logger .debug (f"Idempotency record found in cache with idempotency key: { idempotency_key } " )
394
- self ._validate_payload (data = data , data_record = cached_record )
381
+ self ._validate_payload (data_payload = data , stored_data_record = cached_record )
395
382
return cached_record
396
383
397
384
record = self ._get_record (idempotency_key = idempotency_key )
398
385
399
386
self ._save_to_cache (data_record = record )
400
387
401
- self ._validate_payload (data = data , data_record = record )
388
+ self ._validate_payload (data_payload = data , stored_data_record = record )
402
389
return record
403
390
404
391
@abstractmethod
0 commit comments