from datetime import timedelta 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.dateutils import now, ttl from layercake.dynamodb import DynamoDBPersistenceLayer 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'] enrollment_id = new_image['id'] user = new_image['user'] course = new_image['course'] now_ = now() with enrollment_layer.transact_writer() as transact: transact.put( item={ 'id': enrollment_id, 'sk': 'SCHEDULE#REMINDER_NO_ACCESS_AFTER_3_DAYS', 'name': user.name, 'email': user.email, 'course': course.name, 'created_at': now_, 'ttl': ttl(days=3, start_dt=now_), }, ) # By default, the enrollment will expire when the access period ends # (scheduled below). # If the enrollment is completed earlier (e.g., certificate issued), # the expiration schedule is canceled and an archive schedule # (`SCHEDULE#SET_AS_ARCHIVED`) is created instead. transact.put( item={ 'id': enrollment_id, 'sk': 'SCHEDULE#SET_AS_EXPIRED', 'name': user.name, 'email': user.email, 'course': course.name, 'created_at': now_, 'ttl': ttl(start_dt=now_ + timedelta(days=course.access_period)), }, ) transact.put( item={ 'id': enrollment_id, 'sk': 'REMINDER_ACCESS_PERIOD_BEFORE_15_DAYS', 'name': user.name, 'email': user.email, 'course': course.name, 'created_at': now_, 'ttl': ttl(start_dt=now_ + timedelta(days=course.access_period - 15)), }, ) return True