from os import access 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 glom import glom from layercake.dateutils import now, ttl from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey from boto3clients import dynamodb_client from config import ( ENROLLMENT_TABLE, ) logger = Logger(__name__) dyn = 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'] now_ = now() enrollment_id = new_image['id'] user = new_image['user'] course_name = glom(new_image, 'course.name') access_period = int( dyn.collection.get_item( KeyPair( pk=enrollment_id, sk=SortKey('METADATA#COURSE', path_spec='access_period'), ), ) ) with dyn.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', 'created_at': now_, 'ttl': ttl(start_dt=now_, days=access_period), }, ) print(access_period) transact.put( item={ 'id': enrollment_id, 'sk': 'SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS', 'name': user['name'], 'email': user['email'], 'course': course_name, 'created_at': now_, 'ttl': ttl(start_dt=now_, days=access_period - 30), }, ) return True