diff --git a/konviva-events/app/config.py b/konviva-events/app/config.py index c4c5302..76e917b 100644 --- a/konviva-events/app/config.py +++ b/konviva-events/app/config.py @@ -1,6 +1,7 @@ import os USER_TABLE: str = os.getenv('USER_TABLE') # type: ignore +ENROLLMENT_TABLE: str = os.getenv('ENROLLMENT_TABLE') # type: ignore KONVIVA_API_URL: str = os.getenv('KONVIVA_API_URL') # type: ignore KONVIVA_SECRET_KEY: str = os.getenv('KONVIVA_SECRET_KEY') # type:ignore diff --git a/konviva-events/app/events/enroll.py b/konviva-events/app/events/enroll.py index f85ea2f..aaba335 100644 --- a/konviva-events/app/events/enroll.py +++ b/konviva-events/app/events/enroll.py @@ -4,13 +4,37 @@ from aws_lambda_powertools.utilities.data_classes import ( event_source, ) from aws_lambda_powertools.utilities.typing import LambdaContext +from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair + +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'] + user_id = new_image['user_id'] + class_id = new_image['class_id'] - return True + try: + enrollment_id = konviva.enroll( + user_id, + class_id, + ) + except konviva.KonvivaError as err: + logger.exception(err) + return False + + return enrollment_layer.update_item( + key=KeyPair(new_image['id'], 'konviva'), + update_expr='SET enrollment_id = :enrollment_id', + cond_expr='attribute_exists(sk)', + expr_attr_values={ + ':enrollment_id': enrollment_id, + }, + ) diff --git a/konviva-events/app/konviva.py b/konviva-events/app/konviva.py index addc2a5..510d818 100644 --- a/konviva-events/app/konviva.py +++ b/konviva-events/app/konviva.py @@ -1,4 +1,3 @@ -from dataclasses import dataclass from urllib.parse import quote_plus, urlparse import requests @@ -27,15 +26,6 @@ class EmailAlreadyExistsError(KonvivaError): pass -@dataclass(frozen=True) -class User: - IDUsuario: int - Identificador: str - NomeUsuario: str - Email: str - CPF: str | None = None - - def create_user( id: str, name: str, @@ -97,7 +87,6 @@ def update_user(id: str, **kwargs) -> dict: ) r.raise_for_status() - # Because Konviva does not return the proper HTTP status code if err := glom(r.json(), 'errors', default=None): err = err[0] if isinstance(err, list) else err raise KonvivaError(err) @@ -120,3 +109,24 @@ def get_users_by_email(email: str) -> list[dict]: return [] return r.json() + + +def enroll(user_id: str, class_id: str) -> str: + url = urlparse(KONVIVA_API_URL)._replace(path='/action/api/integrarMatricula') + + r = requests.post( + url=url.geturl(), + headers=headers, + json={ + 'IDUsuario': str(user_id), + 'IDTurma': str(class_id), + 'StatusMatricula': 'MATRICULADO', + }, + ) + r.raise_for_status() + + if err := glom(r.json(), 'errors', default=None): + err = err[0] if isinstance(err, list) else err + raise KonvivaError(err) + + return r.json().get('IDMatricula') diff --git a/konviva-events/config.py b/konviva-events/config.py index c4c5302..76e917b 100644 --- a/konviva-events/config.py +++ b/konviva-events/config.py @@ -1,6 +1,7 @@ import os USER_TABLE: str = os.getenv('USER_TABLE') # type: ignore +ENROLLMENT_TABLE: str = os.getenv('ENROLLMENT_TABLE') # type: ignore KONVIVA_API_URL: str = os.getenv('KONVIVA_API_URL') # type: ignore KONVIVA_SECRET_KEY: str = os.getenv('KONVIVA_SECRET_KEY') # type:ignore diff --git a/konviva-events/template.yaml b/konviva-events/template.yaml index bed8eb9..ddee80b 100644 --- a/konviva-events/template.yaml +++ b/konviva-events/template.yaml @@ -5,6 +5,9 @@ Parameters: UserTable: Type: String Default: betaeducacao-prod-users_d2o3r5gmm4it7j + EnrollmentTable: + Type: String + Default: betaeducacao-prod-enrollments Globals: Function: @@ -23,6 +26,7 @@ Globals: POWERTOOLS_LOGGER_SAMPLE_RATE: 0.1 POWERTOOLS_LOGGER_LOG_EVENT: true USER_TABLE: !Ref UserTable + ENROLLMENT_TABLE: !Ref EnrollmentTable KONVIVA_API_URL: https://lms.saladeaula.digital KONVIVA_SECRET_KEY: "{{resolve:ssm:/betaeducacao/konviva/secret_key/str}}" @@ -55,3 +59,25 @@ Resources: - exists: false metadata__konviva_user_id: - exists: false + + EventEnrollFunction: + Type: AWS::Serverless::Function + Properties: + Handler: events.enroll.lambda_handler + LoggingConfig: + LogGroup: !Ref EventLog + Policies: + - DynamoDBWritePolicy: + TableName: !Ref EnrollmentTable + Events: + DynamoDBEvent: + Type: EventBridgeRule + Properties: + Pattern: + resources: [!Ref EnrollmentTable] + detail-type: [INSERT] + detail: + new_image: + sk: ["konviva"] + enrollment_id: + - exists: false diff --git a/konviva-events/tests/conftest.py b/konviva-events/tests/conftest.py index 98debc8..340de12 100644 --- a/konviva-events/tests/conftest.py +++ b/konviva-events/tests/conftest.py @@ -15,6 +15,7 @@ def pytest_configure(): os.environ['DYNAMODB_PARTITION_KEY'] = PK os.environ['DYNAMODB_SORT_KEY'] = SK os.environ['USER_TABLE'] = PYTEST_TABLE_NAME + os.environ['ENROLLMENT_TABLE'] = PYTEST_TABLE_NAME os.environ['KONVIVA_API_URL'] = 'https://lms.saladeaula.digital' diff --git a/konviva-events/tests/events/test_enroll.py b/konviva-events/tests/events/test_enroll.py new file mode 100644 index 0000000..3ed2b24 --- /dev/null +++ b/konviva-events/tests/events/test_enroll.py @@ -0,0 +1,18 @@ +from aws_lambda_powertools.utilities.typing import LambdaContext + +import events.enroll as app + + +def test_enroll(dynamodb_client, dynamodb_seeds, lambda_context: LambdaContext): + event = { + 'detail': { + 'new_image': { + 'id': '03ad39c6-055e-48d8-acc8-e11385ed8904', + 'sk': 'konviva', + 'class_id': 275, + 'user_id': 26943, + } + } + } + + assert not app.lambda_handler(event, lambda_context) # type: ignore diff --git a/konviva-events/tests/seeds.jsonl b/konviva-events/tests/seeds.jsonl index 7aa4f87..6f43cf0 100644 --- a/konviva-events/tests/seeds.jsonl +++ b/konviva-events/tests/seeds.jsonl @@ -1 +1,2 @@ -{"id": {"S": "123"}, "sk": {"S": "0"}} \ No newline at end of file +{"id": {"S": "123"}, "sk": {"S": "0"}} +{"id": {"S": "03ad39c6-055e-48d8-acc8-e11385ed8904"}, "sk": {"S": "konviva"}, "user_id": {"N": "275"}, "class_id": {"N": "26943"}} \ No newline at end of file