wip middleware

This commit is contained in:
2025-03-27 19:25:32 -03:00
parent 76c2656dd1
commit 5af61465f3
16 changed files with 422 additions and 52 deletions

View File

@@ -173,15 +173,6 @@ class KeyPair(Key):
class TransactItems:
"""
Documentation:
--------------
- https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html
- https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.transact_write_items
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.transact_get_items
"""
def __init__(self, table_name: str) -> None:
self.table_name = table_name
self.items: list[dict] = []
@@ -336,18 +327,6 @@ class TransactItems:
class DynamoDBPersistenceLayer:
"""
Documentation:
--------------
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.query
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.get_item
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.put_item
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.update_item
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.delete_item
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.transact_get_items
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.transact_write_items
"""
def __init__(self, table_name: str, dynamodb_client) -> None:
self.table_name = table_name
self.dynamodb_client = dynamodb_client
@@ -393,7 +372,7 @@ class DynamoDBPersistenceLayer:
attrs['Limit'] = limit
try:
res = self.dynamodb_client.query(
response = self.dynamodb_client.query(
TableName=self.table_name,
KeyConditionExpression=key_cond_expr,
**attrs,
@@ -403,17 +382,17 @@ class DynamoDBPersistenceLayer:
raise
else:
return dict(
items=[deserialize(v) for v in res.get('Items', [])],
last_key=res.get('LastEvaluatedKey', None),
items=[deserialize(v) for v in response.get('Items', [])],
last_key=response.get('LastEvaluatedKey', None),
)
def get_item(self, key: dict) -> dict:
"""The GetItem operation returns a set of attributes for the item with the given primary key.
If there is no matching item, GetItem does not return any data and there will be no Item element in the res.
If there is no matching item, GetItem does not return any data and there will be no Item element in the response.
"""
try:
res = self.dynamodb_client.get_item(
response = self.dynamodb_client.get_item(
TableName=self.table_name,
Key=serialize(key),
)
@@ -421,7 +400,7 @@ class DynamoDBPersistenceLayer:
logger.exception(err)
raise
else:
return deserialize(res.get('Item', {}))
return deserialize(response.get('Item', {}))
def put_item(self, item: dict, *, cond_expr: str | None = None) -> bool:
attrs = {}
@@ -508,14 +487,17 @@ class DynamoDBPersistenceLayer:
def transact_get_items(self, transact_items: TransactItems) -> list[dict]:
try:
res = self.dynamodb_client.transact_get_items(
response = self.dynamodb_client.transact_get_items(
TransactItems=transact_items.items
)
except ClientError as err:
logger.exception(err)
raise
else:
return [deserialize(res.get('Item', {})) for res in res.get('ress', [])]
return [
deserialize(response.get('Item', {}))
for response in response.get('Responses', [])
]
def transact_write_items(self, transact_items: TransactItems) -> bool:
try:
@@ -572,6 +554,7 @@ class DynamoDBCollection:
def __init__(
self,
persistence_layer: DynamoDBPersistenceLayer,
/,
exc_cls: Type[ValueError] = MissingError,
tz: str = TZ,
) -> None:
@@ -586,7 +569,7 @@ class DynamoDBCollection:
def get_item(
self,
key: KeyPair,
key: Key,
path_spec: str | None = None,
raise_on_error: bool = True,
default: Any = None,
@@ -607,7 +590,7 @@ class DynamoDBCollection:
def put_item(
self,
key: KeyPair,
key: Key,
ttl: int | datetime | None = None,
**kwargs: Any,
) -> bool:
@@ -629,13 +612,11 @@ class DynamoDBCollection:
}
)
return self.persistence_layer.put_item(
item=key | {'create_date': now_} | kwargs
)
return self.persistence_layer.put_item(item=key | kwargs)
def delete_item(
self,
key: KeyPair,
key: Key,
*,
cond_expr: str | None = None,
expr_attr_names: dict | None = None,
@@ -665,7 +646,7 @@ class DynamoDBCollection:
else '#pk = :pk'
)
res = self.persistence_layer.query(
response = self.persistence_layer.query(
key_cond_expr=key_cond_expr,
expr_attr_name=key.expr_attr_name() | expr_attr_name,
expr_attr_values=key.expr_attr_values() | expr_attr_values,
@@ -675,8 +656,10 @@ class DynamoDBCollection:
start_key=_startkey_b64decode(start_key) if start_key else {},
)
items = res['items']
last_key = _startkey_b64encode(res['last_key']) if res['last_key'] else None
items = response['items']
last_key = (
_startkey_b64encode(response['last_key']) if response['last_key'] else None
)
match key.get(PK), key.get(SK):
case ComposeKey(), _: # Remove prefix from Partition Key