From 64946471b97462d53cb201ce3c17429db5b63923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Fri, 18 Jul 2025 13:05:03 -0300 Subject: [PATCH] update user on konviva --- .../app/events/stopgap/enroll.py | 4 +- konviva-events/app/events/create_user.py | 6 +-- konviva-events/app/events/update_user.py | 44 +++++++++++++++++++ konviva-events/template.yaml | 23 ++++++++++ .../tests/events/test_update_user.py | 17 +++++++ .../app/events/docs_into_eventbus.py | 6 ++- 6 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 konviva-events/app/events/update_user.py create mode 100644 konviva-events/tests/events/test_update_user.py diff --git a/enrollments-events/app/events/stopgap/enroll.py b/enrollments-events/app/events/stopgap/enroll.py index ec8e063..63dd2bf 100644 --- a/enrollments-events/app/events/stopgap/enroll.py +++ b/enrollments-events/app/events/stopgap/enroll.py @@ -46,7 +46,9 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: 'sk': 'metadata#course', 'created_at': now_, 'access_period': int(course['access_period']), - 'cert': course['cert'], + 'cert': { + 'exp_interval': int(course['cert']['exp_interval']), + }, } ) diff --git a/konviva-events/app/events/create_user.py b/konviva-events/app/events/create_user.py index 7fb7972..2847aa5 100644 --- a/konviva-events/app/events/create_user.py +++ b/konviva-events/app/events/create_user.py @@ -35,10 +35,10 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: except konviva.EmailAlreadyExistsError as exc: logger.exception(exc, email=new_image['email']) - r = konviva.get_users_by_email(new_image['email']) - user_id = glom(r, '0.IDUsuario') + result = konviva.get_users_by_email(new_image['email']) + user_id = glom(result, '0.IDUsuario') - if not r: + if not result: raise UserNotFoundError() except Exception: raise diff --git a/konviva-events/app/events/update_user.py b/konviva-events/app/events/update_user.py new file mode 100644 index 0000000..4a1d13e --- /dev/null +++ b/konviva-events/app/events/update_user.py @@ -0,0 +1,44 @@ +from aws_lambda_powertools import Logger +from aws_lambda_powertools.utilities.data_classes import ( + EventBridgeEvent, + event_source, +) +from aws_lambda_powertools.utilities.typing import LambdaContext +from layercake.dynamodb import DynamoDBPersistenceLayer + +import konviva +from boto3clients import dynamodb_client +from config import ENROLLMENT_TABLE + +logger = Logger(__name__) +enrollment_layer = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client) + + +@event_source(data_class=EventBridgeEvent) +@logger.inject_lambda_context +def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: + new_image = event.detail['new_image'] + changes = event.detail['changes'] + user_id = new_image['metadata__konviva_user_id'] + + payload = {} + for attr in changes: + match attr: + case 'name': + payload.update(NomeUsuario=new_image['name']) + case 'email': + payload.update( + Email=new_image['email'], + Login=new_image['email'], + ) + case 'cpf': + payload.update(CPF=new_image['cpf']) + + try: + result = konviva.update_user(id=user_id, **payload) + except Exception as exc: + logger.exception(exc) + return False + else: + logger.info('User updated', result=result, payload=payload) + return True diff --git a/konviva-events/template.yaml b/konviva-events/template.yaml index 1908639..b87484c 100644 --- a/konviva-events/template.yaml +++ b/konviva-events/template.yaml @@ -104,3 +104,26 @@ Resources: status: [CANCELED] old_image: status: [PENDING] + + EventUpdateUserFunction: + Type: AWS::Serverless::Function + Properties: + Handler: events.update_user.lambda_handler + LoggingConfig: + LogGroup: !Ref EventLog + Policies: + - DynamoDBReadPolicy: + TableName: !Ref UserTable + Events: + DynamoDBEvent: + Type: EventBridgeRule + Properties: + Pattern: + resources: [!Ref UserTable] + detail-type: [MODIFY] + detail: + new_image: + sk: ["0"] + metadata__konviva_user_id: + - exists: true + changes: [name, email, cpf] diff --git a/konviva-events/tests/events/test_update_user.py b/konviva-events/tests/events/test_update_user.py new file mode 100644 index 0000000..80bfb04 --- /dev/null +++ b/konviva-events/tests/events/test_update_user.py @@ -0,0 +1,17 @@ +from aws_lambda_powertools.utilities.typing import LambdaContext + +import events.update_user as app + + +def test_update_user(lambda_context: LambdaContext): + event = { + 'detail': { + 'new_image': { + 'name': 'Sérgio Rafael Siqueira', + 'metadata__konviva_user_id': 26943, + }, + 'changes': ['name'], + }, + } + + assert app.lambda_handler(event, lambda_context) diff --git a/streams-events/app/events/docs_into_eventbus.py b/streams-events/app/events/docs_into_eventbus.py index c2650e2..d0166ab 100644 --- a/streams-events/app/events/docs_into_eventbus.py +++ b/streams-events/app/events/docs_into_eventbus.py @@ -36,7 +36,7 @@ def record_handler(record: DynamoDBRecord): new_image: dict = record.dynamodb.new_image # type: ignore old_image: dict = record.dynamodb.old_image # type: ignore record_ttl: int | None = old_image.get('ttl') - modified = diff(new_image, old_image) + changes = diff(new_image, old_image) now_ = now() # Should be EXPIRE if event is REMOVE and TTL has elapsed @@ -51,7 +51,9 @@ def record_handler(record: DynamoDBRecord): 'keys': record.dynamodb.keys, # type: ignore 'new_image': new_image, 'old_image': old_image, - 'modified': modified, + 'changes': changes, + # Post-migration: remove the following line + 'modified': changes, } result = client.put_events(