@@ -44,12 +44,14 @@ class EncryptedClient:
44
44
_client : botocore .client .BaseClient
45
45
_encryption_config : DynamoDbTablesEncryptionConfig
46
46
_transformer : DynamoDbEncryptionTransforms
47
+ _expect_standard_dictionaries : bool
47
48
48
49
def __init__ (
49
50
self ,
50
51
* ,
51
52
client : botocore .client .BaseClient ,
52
53
encryption_config : DynamoDbTablesEncryptionConfig ,
54
+ expect_standard_dictionaries : Optional [bool ] = False ,
53
55
):
54
56
"""
55
57
Parameters:
@@ -61,6 +63,87 @@ def __init__(
61
63
self ._transformer = DynamoDbEncryptionTransforms (
62
64
config = encryption_config
63
65
)
66
+ self ._expect_standard_dictionaries = expect_standard_dictionaries
67
+
68
+ def _maybe_transform_request_to_dynamodb_item (self , item_key , ** kwargs ):
69
+ if self ._expect_standard_dictionaries :
70
+ dynamodb_item = dict_to_ddb (kwargs [item_key ])
71
+ dynamodb_input = kwargs
72
+ dynamodb_input [item_key ] = dynamodb_item
73
+ else :
74
+ dynamodb_input = kwargs
75
+ return dynamodb_input
76
+
77
+ def _maybe_transform_batch_request_to_dynamodb_item (self , ** kwargs ):
78
+ if not self ._expect_standard_dictionaries :
79
+ return kwargs
80
+
81
+ output_requests = []
82
+
83
+ tables = kwargs ["RequestItems" ]
84
+ table_names = list (tables .keys ())
85
+ if len (tables .keys ()) > 1 :
86
+ raise ValueError ("Table batch_write_item only supports 1 table in a request." )
87
+ table_name = table_names [0 ]
88
+ requests = tables [table_names [0 ]]
89
+ for request in requests :
90
+ request_name_list = list (request .keys ())
91
+ if len (request_name_list ) > 1 :
92
+ raise ValueError ("Cannot send more than one request in a single request" )
93
+ request_name = request_name_list [0 ]
94
+ if request_name == "PutRequest" :
95
+ dict_request = dict_to_ddb (request [request_name ]["Item" ])
96
+ boto3_request = {"Item" : dict_request }
97
+ elif request_name == "DeleteRequest" :
98
+ dict_request = dict_to_ddb (request [request_name ]["Key" ])
99
+ boto3_request = {"Key" : dict_request }
100
+ output_requests .append ({request_name : boto3_request })
101
+ else :
102
+ raise ValueError (f"Unknown batch_write_items method key: { request_name } " )
103
+ output_requests .append ({request_name : boto3_request })
104
+ kwargs ["RequestItems" ][table_name ] = output_requests
105
+ return kwargs
106
+
107
+ def _maybe_transform_batch_request_to_dict_item (self , ** kwargs ):
108
+ # TODO separate standard dictionaries for this one (internal client expects dicts)
109
+ if not self ._expect_standard_dictionaries :
110
+ return kwargs
111
+
112
+ output_requests = []
113
+
114
+ tables = kwargs ["RequestItems" ]
115
+ table_names = list (tables .keys ())
116
+ if len (tables .keys ()) > 1 :
117
+ raise ValueError ("Table batch_write_item only supports 1 table in a request." )
118
+ table_name = table_names [0 ]
119
+ requests = tables [table_names [0 ]]
120
+ for request in requests :
121
+ request_name_list = list (request .keys ())
122
+ if len (request_name_list ) > 1 :
123
+ raise ValueError ("Cannot send more than one request in a single request" )
124
+ request_name = request_name_list [0 ]
125
+ if request_name == "PutRequest" :
126
+ dict_request = ddb_to_dict (request [request_name ]["Item" ])
127
+ boto3_request = {"Item" : dict_request }
128
+ elif request_name == "DeleteRequest" :
129
+ dict_request = ddb_to_dict (request [request_name ]["Key" ])
130
+ boto3_request = {"Key" : dict_request }
131
+ output_requests .append ({request_name : boto3_request })
132
+ else :
133
+ raise ValueError (f"Unknown batch_write_items method key: { request_name } " )
134
+ output_requests .append ({request_name : boto3_request })
135
+ kwargs ["RequestItems" ][table_name ] = output_requests
136
+ return kwargs
137
+
138
+ def _maybe_transform_response_to_python_dict (self , response ):
139
+ if self ._expect_standard_dictionaries :
140
+ if hasattr (response , "Item" ):
141
+ response ["Item" ] = ddb_to_dict (response ["Item" ])
142
+
143
+ def _maybe_transform_batch_response_to_python_dict (self , response ):
144
+ if self ._expect_standard_dictionaries :
145
+ if hasattr (response , "Item" ):
146
+ response ["Item" ] = ddb_to_dict (response ["Item" ])
64
147
65
148
def _copy_sdk_response_to_dbesdk_response (self , sdk_response , dbesdk_response ):
66
149
for sdk_response_key , sdk_response_value in sdk_response .items ():
@@ -75,131 +158,154 @@ def _get_protected_methods(self):
75
158
]
76
159
77
160
def put_item (self , ** kwargs ):
161
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Item" , ** kwargs )
78
162
transformed_request = self ._transformer .put_item_input_transform (
79
163
PutItemInputTransformInput (
80
- sdk_input = kwargs
164
+ sdk_input = sdk_input
81
165
)
82
166
).transformed_input
83
167
sdk_response = self ._client .put_item (** transformed_request )
84
168
dbesdk_response = self ._transformer .put_item_output_transform (
85
169
PutItemOutputTransformInput (
86
- original_input = kwargs ,
170
+ original_input = sdk_input ,
87
171
sdk_output = sdk_response ,
88
172
)
89
173
).transformed_output
90
174
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
175
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
91
176
return dbesdk_response
92
177
93
178
def get_item (self , ** kwargs ):
179
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
94
180
transformed_request = self ._transformer .get_item_input_transform (
95
181
GetItemInputTransformInput (
96
- sdk_input = kwargs
182
+ sdk_input = sdk_input
97
183
)
98
184
).transformed_input
99
185
sdk_response = self ._client .get_item (** transformed_request )
100
186
dbesdk_response = self ._transformer .get_item_output_transform (
101
187
GetItemOutputTransformInput (
102
- original_input = kwargs ,
188
+ original_input = sdk_input ,
103
189
sdk_output = sdk_response ,
104
190
)
105
191
).transformed_output
106
192
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
193
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
107
194
return dbesdk_response
108
195
109
196
def batch_write_item (self , ** kwargs ):
197
+ # print(f"batch_write_item pre {kwargs=}")
198
+ sdk_input = self ._maybe_transform_batch_request_to_dynamodb_item (** kwargs )
199
+ # print(f"batch_write_item post {kwargs=}")
110
200
transformed_request = self ._transformer .batch_write_item_input_transform (
111
201
BatchWriteItemInputTransformInput (
112
- sdk_input = kwargs
202
+ sdk_input = sdk_input
113
203
)
114
204
).transformed_input
205
+ # print(f"{self._client=}")
206
+ # print(f"{transformed_request=}")
207
+ transformed_request = self ._maybe_transform_batch_request_to_dict_item (** transformed_request )
115
208
sdk_response = self ._client .batch_write_item (** transformed_request )
116
209
dbesdk_response = self ._transformer .batch_write_item_output_transform (
117
210
BatchWriteItemOutputTransformInput (
118
- original_input = kwargs ,
211
+ original_input = sdk_input ,
119
212
sdk_output = sdk_response ,
120
213
)
121
214
).transformed_output
215
+ print (f'{ sdk_response = } ' )
122
216
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
217
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
218
+ print (f'{ dbesdk_response = } ' )
123
219
return dbesdk_response
124
220
125
221
def batch_get_item (self , ** kwargs ):
222
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = None , ** kwargs )
126
223
transformed_request = self ._transformer .batch_get_item_input_transform (
127
224
BatchGetItemInputTransformInput (
128
- sdk_input = kwargs
225
+ sdk_input = sdk_input
129
226
)
130
227
).transformed_input
131
228
sdk_response = self ._client .batch_get_item (** transformed_request )
132
229
dbesdk_response = self ._transformer .batch_get_item_output_transform (
133
230
BatchGetItemOutputTransformInput (
134
- original_input = kwargs ,
231
+ original_input = sdk_input ,
135
232
sdk_output = sdk_response ,
136
233
)
137
234
).transformed_output
138
235
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
236
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
139
237
return dbesdk_response
140
238
141
239
def scan (self , ** kwargs ):
240
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
142
241
transformed_request = self ._transformer .scan_input_transform (
143
242
ScanInputTransformInput (
144
- sdk_input = kwargs
243
+ sdk_input = sdk_input
145
244
)
146
245
).transformed_input
147
246
sdk_response = self ._client .scan (** transformed_request )
148
247
dbesdk_response = self ._transformer .scan_output_transform (
149
248
ScanOutputTransformInput (
150
- original_input = kwargs ,
249
+ original_input = sdk_input ,
151
250
sdk_output = sdk_response ,
152
251
)
153
252
).transformed_output
154
253
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
254
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
155
255
return dbesdk_response
156
256
157
257
def transact_get_items (self , ** kwargs ):
258
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
158
259
transformed_request = self ._transformer .transact_get_items_input_transform (
159
260
TransactGetItemsInputTransformInput (
160
- sdk_input = kwargs
261
+ sdk_input = sdk_input
161
262
)
162
263
).transformed_input
163
264
sdk_response = self ._client .transact_get_items (** transformed_request )
164
265
dbesdk_response = self ._transformer .transact_get_items_output_transform (
165
266
TransactGetItemsOutputTransformInput (
166
- original_input = kwargs ,
267
+ original_input = sdk_input ,
167
268
sdk_output = sdk_response ,
168
269
)
169
270
).transformed_output
170
271
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
272
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
171
273
return dbesdk_response
172
274
173
275
def transact_write_items (self , ** kwargs ):
276
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
174
277
transformed_request = self ._transformer .transact_write_items_input_transform (
175
278
TransactWriteItemsInputTransformInput (
176
- sdk_input = kwargs
279
+ sdk_input = sdk_input
177
280
)
178
281
).transformed_input
179
282
sdk_response = self ._client .transact_write_items (** transformed_request )
180
283
dbesdk_response = self ._transformer .transact_write_items_output_transform (
181
284
TransactWriteItemsOutputTransformInput (
182
- original_input = kwargs ,
285
+ original_input = sdk_input ,
183
286
sdk_output = sdk_response ,
184
287
)
185
288
).transformed_output
186
289
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
290
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
187
291
return dbesdk_response
188
292
189
293
def query (self , ** kwargs ):
294
+ sdk_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
190
295
transformed_request = self ._transformer .query_input_transform (
191
296
QueryInputTransformInput (
192
- sdk_input = kwargs
297
+ sdk_input = sdk_input
193
298
)
194
299
).transformed_input
195
300
sdk_response = self ._client .query (** transformed_request )
196
301
dbesdk_response = self ._transformer .query_output_transform (
197
302
QueryOutputTransformInput (
198
- original_input = kwargs ,
303
+ original_input = sdk_input ,
199
304
sdk_output = sdk_response ,
200
305
)
201
306
).transformed_output
202
307
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
308
+ self ._maybe_transform_response_to_python_dict (dbesdk_response )
203
309
return dbesdk_response
204
310
205
311
def __getattr__ (self , name ):
0 commit comments