diff --git a/enrollments-events/app/config.py b/enrollments-events/app/config.py index c782ed9..8ea4eeb 100644 --- a/enrollments-events/app/config.py +++ b/enrollments-events/app/config.py @@ -13,7 +13,7 @@ EMAIL_SENDER = ('EDUSEGĀ®', 'noreply@eduseg.com.br') PAPERFORGE_API = 'https://paperforge.saladeaula.digital' CERT_REPORTING_URI = 's3://saladeaula.digital/certs/reporting.html' -ESIGN_URI = 's3://saladeaula.digital/esigns/ecnpj_2025.pfx' +ESIGN_URI = 's3://saladeaula.digital/esigns/11de2510136adbac.pfx' DBNAME: str = os.getenv('POSTGRES_DB') # type: ignore diff --git a/enrollments-events/app/enrollment.py b/enrollments-events/app/enrollment.py index 67f879e..4438994 100644 --- a/enrollments-events/app/enrollment.py +++ b/enrollments-events/app/enrollment.py @@ -130,7 +130,7 @@ def enroll( if deduplication_window else DEDUP_WINDOW_OFFSET_DAYS ) - ttl_ = ttl( + dedup_lock_ttl = ttl( start_dt=now_, days=course.access_period - offset_days, ) @@ -140,7 +140,7 @@ def enroll( 'sk': lock_hash, 'enrollment_id': enrollment.id, 'created_at': now_, - 'ttl': ttl_, + 'ttl': dedup_lock_ttl, }, cond_expr='attribute_not_exists(sk)', exc_cls=DeduplicationConflictError, @@ -151,7 +151,7 @@ def enroll( 'sk': 'LOCK', 'hash': lock_hash, 'created_at': now_, - 'ttl': ttl_, + 'ttl': dedup_lock_ttl, }, ) diff --git a/enrollments-events/app/events/reenroll_if_failed.py b/enrollments-events/app/events/reenroll_if_failed.py index 8d4d21f..96d6b9d 100644 --- a/enrollments-events/app/events/reenroll_if_failed.py +++ b/enrollments-events/app/events/reenroll_if_failed.py @@ -52,6 +52,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: enrollment, org=metadata.get('org', None), subscription=subscription, + # Transfer the deduplication window if it exists deduplication_window={'offset_days': offset_days} if offset_days else None, linked_entities=frozenset( { diff --git a/konviva-events/app/config.py b/konviva-events/app/config.py index e54b04f..7b632de 100644 --- a/konviva-events/app/config.py +++ b/konviva-events/app/config.py @@ -1,5 +1,7 @@ import os +DEDUP_WINDOW_OFFSET_DAYS = 90 + USER_TABLE: str = os.getenv('USER_TABLE') # type: ignore COURSE_TABLE: str = os.getenv('COURSE_TABLE') # type: ignore ENROLLMENT_TABLE: str = os.getenv('ENROLLMENT_TABLE') # type: ignore diff --git a/konviva-events/app/enrollment.py b/konviva-events/app/enrollment.py index 7258dbf..a8f0fe2 100644 --- a/konviva-events/app/enrollment.py +++ b/konviva-events/app/enrollment.py @@ -9,7 +9,7 @@ from layercake.dateutils import now, ttl from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey from layercake.strutils import md5_hash -from config import COURSE_TABLE +from config import COURSE_TABLE, DEDUP_WINDOW_OFFSET_DAYS logger = Logger(__name__) @@ -117,7 +117,9 @@ def set_score( ) user_id = enrollment['user']['id'] course_id = enrollment['course']['id'] - dedup_window_offset_days = int(enrollment['dedup_window_offset_days']) + dedup_window_offset_days = int( + enrollment.get('dedup_window_offset_days', DEDUP_WINDOW_OFFSET_DAYS) + ) try: if score >= 70: @@ -159,7 +161,7 @@ def _set_status_as_completed( ) -> bool: now_ = now() lock_hash = md5_hash(f'{user_id}{course_id}') - exp_interval = int( + cert_exp_interval = int( dynamodb_persistence_layer.collection.get_item( KeyPair( pk=course_id, @@ -191,17 +193,17 @@ def _set_status_as_completed( exc_cls=EnrollmentConflictError, ) - if exp_interval: + if cert_exp_interval: dedup_lock_ttl = ttl( start_dt=now_, - days=exp_interval - dedup_window_offset_days, + days=cert_exp_interval - dedup_window_offset_days, ) transact.put( item={ 'id': id, 'sk': 'SCHEDULE#SET_CERT_EXPIRED', - 'ttl': ttl(start_dt=now_, days=exp_interval), + 'ttl': ttl(start_dt=now_, days=cert_exp_interval), 'created_at': now_, } ) @@ -209,7 +211,7 @@ def _set_status_as_completed( item={ 'id': id, 'sk': 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS', - 'ttl': ttl(start_dt=now_, days=exp_interval - 30), + 'ttl': ttl(start_dt=now_, days=cert_exp_interval - 30), 'created_at': now_, } ) @@ -231,6 +233,23 @@ def _set_status_as_completed( 'created_at': now_, } ) + else: + transact.put( + item={ + 'id': id, + 'sk': 'LOCK', + 'hash': lock_hash, + 'created_at': now_, + } + ) + transact.put( + item={ + 'id': 'LOCK', + 'sk': lock_hash, + 'enrollment_id': id, + 'created_at': now_, + } + ) # Remove reminders and policies that no longer apply transact.delete( diff --git a/konviva-events/tests/seeds.jsonl b/konviva-events/tests/seeds.jsonl index 8995efd..d16aa95 100644 --- a/konviva-events/tests/seeds.jsonl +++ b/konviva-events/tests/seeds.jsonl @@ -20,7 +20,6 @@ {"id": "6c7e3d9b-f5d1-4da4-9e55-0825bb6ff2b8", "sk": "SCHEDULE#SET_ACCESS_EXPIRED"} {"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "0", "progress": 109, "status": "COMPLETED", "user": {"id": "321", "name": "Chester Bennington"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"} -{"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "METADATA#DEDUPLICATION_WINDOW", "offset_days": 90, "created_at": "2025-04-06T11:07:32.762178-03:00"} {"id": "cc2c3bce-c34a-4e82-aa6c-1a19e70ec5ae", "sk": "SCHEDULE#SET_AS_ARCHIVED"} {"id": "5db53b35-0bae-4907-afda-a213cb5bf651", "sk": "0", "progress": 0, "status": "PENDING", "user": {"id": "1234", "name": "Michael Jackinson"}, "course": {"id": "432", "name": "pytest"}, "created_at": "2022-04-06T11:07:32.762178-03:00"} diff --git a/konviva-events/tests/test_app.py b/konviva-events/tests/test_app.py index 805ce7c..a7d127b 100644 --- a/konviva-events/tests/test_app.py +++ b/konviva-events/tests/test_app.py @@ -113,7 +113,7 @@ def test_set_as_completed( docx = next((x for x in r['items'] if x['sk'] == '0'), {}) assert 'completed_at' in docx - assert len(r['items']) == 6 + assert len(r['items']) == 5 assert any(item.get('sk') == 'LOCK' for item in r['items']) assert any( item.get('sk') == 'SCHEDULE#REMINDER_CERT_EXPIRATION_BEFORE_30_DAYS'