diff --git a/enrollments-events/app/events/enroll_scheduled.py b/enrollments-events/app/events/enroll_scheduled.py index fd2bb97..7ddf72d 100644 --- a/enrollments-events/app/events/enroll_scheduled.py +++ b/enrollments-events/app/events/enroll_scheduled.py @@ -7,7 +7,7 @@ from aws_lambda_powertools.utilities.data_classes import ( ) from aws_lambda_powertools.utilities.typing import LambdaContext from layercake.dateutils import now -from layercake.dynamodb import DynamoDBPersistenceLayer +from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair from boto3clients import dynamodb_client from config import ENROLLMENT_TABLE @@ -22,6 +22,7 @@ dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client) def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: old_image = event.detail['old_image'] sk = old_image['sk'] + _, lock_hash = sk.split('#') now_ = now() # Key pattern `SCHEDULED#ORG#{org_id}` *_, org_id = old_image['id'].split('#') @@ -57,17 +58,24 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: persistence_layer=dyn, ) - dyn.put_item( - item={ - 'id': old_image['id'], - 'sk': f'{sk}#EXECUTED', - 'enrollment_id': enrollment.id, - 'user': old_image['user'], - 'course': old_image['course'], - 'created_by': created_by, - 'created_at': now_, - } - ) + with dyn.transact_writer() as transact: + transact.put( + item={ + 'id': old_image['id'], + 'sk': f'{sk}#EXECUTED', + 'enrollment_id': enrollment.id, + 'user': old_image['user'], + 'course': old_image['course'], + 'created_by': created_by, + 'created_at': now_, + } + ) + transact.delete( + key=KeyPair( + pk='LOCK#SCHEDULED', + sk=lock_hash, + ), + ) except Exception as exc: dyn.put_item( item={ diff --git a/enrollments-events/tests/test_docuseal.py b/enrollments-events/tests/test_docuseal.py index 6c09511..eb36e0a 100644 --- a/enrollments-events/tests/test_docuseal.py +++ b/enrollments-events/tests/test_docuseal.py @@ -13,15 +13,89 @@ Seu certificado já está pronto e aguardando apenas a sua assinatura digital. """ +doc = { + 'id': 549, + 'name': '7dc7005e-0b98-4e79-b1d1-17999b7555e7', + 'submitters': [ + { + 'id': 549, + 'slug': 'CPZ92dWCMVUbD5', + 'uuid': 'b57b1504-2c16-412e-96a4-1e555bff1cce', + 'name': 'Sérgio R Siqueira', + 'email': 'sergio@somosbeta.com.br', + 'phone': None, + 'completed_at': None, + 'declined_at': None, + 'external_id': None, + 'submission_id': 549, + 'metadata': {}, + 'opened_at': None, + 'sent_at': '2025-12-23T23:02:03.491Z', + 'created_at': '2025-12-23T23:02:03.496Z', + 'updated_at': '2025-12-23T23:02:03.496Z', + 'status': 'sent', + 'application_key': None, + 'values': [], + 'preferences': { + 'email_message_uuid': 'f53c861b-d851-46bc-bcae-e7260fdcff3c', + 'send_email': True, + 'send_sms': False, + }, + 'role': 'First Party', + 'embed_src': 'https://docs.eduseg.com.br/s/CPZ92dWCMVUbD5', + } + ], + 'source': 'api', + 'submitters_order': 'preserved', + 'status': 'pending', + 'schema': [ + { + 'name': '7dc7005e-0b98-4e79-b1d1-17999b7555e7', + 'attachment_uuid': '64bde5ce-327a-4a0d-9923-2b0c91028e71', + } + ], + 'fields': [ + { + 'name': 'Assinatura', + 'type': 'signature', + 'default_value': None, + 'conditions': None, + 'required': True, + 'uuid': '2bbae88a-8a00-4f71-bdc0-edcce154252c', + 'submitter_uuid': 'b57b1504-2c16-412e-96a4-1e555bff1cce', + 'areas': [ + { + 'page': 0, + 'attachment_uuid': '64bde5ce-327a-4a0d-9923-2b0c91028e71', + 'x': 0.08876572705307295, + 'y': 0.6920383425296537, + 'w': 0.1995770152872413, + 'h': 0.04878657103210542, + } + ], + } + ], + 'expire_at': None, + 'created_at': '2025-12-23T23:02:03.493Z', +} + + def Response(*args, **kwargs): - return type('Response', (), {'raise_for_status': object}) + return type( + 'Response', + (), + { + 'raise_for_status': object, + 'json': lambda: doc, + }, + ) def test_create_submission_from_pdf(): with patch('docuseal.requests.post', Response): with open('tests/sample.pdf', 'rb') as f: file = base64.b64encode(f.read()) - create_submission_from_pdf( + r = create_submission_from_pdf( str(uuid.uuid4()), file=file.decode('utf-8'), email_message={ @@ -36,3 +110,4 @@ def test_create_submission_from_pdf(): }, ], ) + assert 'name' in r diff --git a/enrollments-events/uv.lock b/enrollments-events/uv.lock index 7099cc7..176a669 100644 --- a/enrollments-events/uv.lock +++ b/enrollments-events/uv.lock @@ -576,7 +576,7 @@ wheels = [ [[package]] name = "layercake" -version = "0.11.3" +version = "0.11.4" source = { directory = "../layercake" } dependencies = [ { name = "arnparse" },