finish seat
This commit is contained in:
@@ -61,7 +61,7 @@ Org = TypedDict('Org', {'org_id': str, 'name': str})
|
||||
|
||||
CreatedBy = TypedDict('CreatedBy', {'id': str, 'name': str})
|
||||
|
||||
Seat = TypedDict('Seat', {'id': str, 'sk': str})
|
||||
Seat = TypedDict('Seat', {'order_id': str})
|
||||
|
||||
DeduplicationWindow = TypedDict('DeduplicationWindow', {'offset_days': int})
|
||||
|
||||
@@ -189,6 +189,7 @@ def enroll(
|
||||
item={
|
||||
'id': enrollment.id,
|
||||
'sk': 'METADATA#SUBSCRIPTION_COVERED',
|
||||
'billing_day': subscription['billing_day'],
|
||||
'created_at': now_,
|
||||
}
|
||||
| subscription,
|
||||
|
||||
@@ -10,8 +10,15 @@ from layercake.dateutils import now
|
||||
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
|
||||
|
||||
from boto3clients import dynamodb_client
|
||||
from config import ENROLLMENT_TABLE
|
||||
from enrollment import Enrollment, Subscription, enroll
|
||||
from config import ENROLLMENT_TABLE, ORDER_TABLE
|
||||
from enrollment import (
|
||||
Enrollment,
|
||||
Kind,
|
||||
LinkedEntity,
|
||||
Seat,
|
||||
Subscription,
|
||||
enroll,
|
||||
)
|
||||
|
||||
logger = Logger(__name__)
|
||||
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
|
||||
@@ -30,7 +37,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
||||
offset_days = old_image.get('dedup_window_offset_days')
|
||||
billing_day = old_image.get('subscription_billing_day')
|
||||
created_by = old_image.get('created_by')
|
||||
seat = old_image.get('seat')
|
||||
seat: Seat | None = old_image.get('seat')
|
||||
enrollment = Enrollment(
|
||||
course=old_image['course'],
|
||||
user=old_image['user'],
|
||||
@@ -45,6 +52,21 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
||||
)
|
||||
|
||||
try:
|
||||
# The enrollment must know its source
|
||||
linked_entities = (
|
||||
frozenset(
|
||||
{
|
||||
LinkedEntity(
|
||||
id=seat['order_id'],
|
||||
kind=Kind.ORDER,
|
||||
table_name=ORDER_TABLE,
|
||||
),
|
||||
},
|
||||
)
|
||||
if seat
|
||||
else frozenset()
|
||||
)
|
||||
|
||||
enroll(
|
||||
enrollment,
|
||||
org={
|
||||
@@ -58,6 +80,7 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
||||
scheduled_at=datetime.fromisoformat(old_image['scheduled_at']),
|
||||
# Transfer the deduplication window if it exists
|
||||
deduplication_window={'offset_days': offset_days} if offset_days else None,
|
||||
linked_entities=linked_entities,
|
||||
persistence_layer=dyn,
|
||||
)
|
||||
|
||||
|
||||
@@ -25,13 +25,22 @@ def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool:
|
||||
|
||||
with dyn.transact_writer() as transact:
|
||||
transact.delete(
|
||||
key=KeyPair(enrollment_id, 'SCHEDULE#REMINDER_NO_ACCESS_AFTER_3_DAYS')
|
||||
key=KeyPair(
|
||||
enrollment_id,
|
||||
'SCHEDULE#REMINDER_NO_ACCESS_AFTER_3_DAYS',
|
||||
)
|
||||
)
|
||||
transact.delete(
|
||||
key=KeyPair(enrollment_id, 'SCHEDULE#REMINDER_NO_ACTIVITY_AFTER_7_DAYS')
|
||||
key=KeyPair(
|
||||
enrollment_id,
|
||||
'SCHEDULE#REMINDER_NO_ACTIVITY_AFTER_7_DAYS',
|
||||
)
|
||||
)
|
||||
transact.delete(
|
||||
key=KeyPair(enrollment_id, 'SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS')
|
||||
key=KeyPair(
|
||||
enrollment_id,
|
||||
'SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS',
|
||||
)
|
||||
)
|
||||
transact.delete(key=KeyPair(enrollment_id, 'CANCEL_POLICY'))
|
||||
# Remove locks related to this enrollment
|
||||
|
||||
60
enrollments-events/app/events/restore_seat.py
Normal file
60
enrollments-events/app/events/restore_seat.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from uuid import uuid4
|
||||
|
||||
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
|
||||
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
|
||||
|
||||
from boto3clients import dynamodb_client
|
||||
from config import ENROLLMENT_TABLE, ORDER_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:
|
||||
old_image = event.detail['old_image']
|
||||
order_id = old_image['seat']['order_id']
|
||||
enrollment_id = old_image['id']
|
||||
enrollment = dyn.get_item(key=KeyPair(enrollment_id, '0'))
|
||||
now_ = now()
|
||||
|
||||
if enrollment['status'] != 'CANCELED':
|
||||
return False
|
||||
|
||||
with dyn.transact_writer() as transact:
|
||||
org_id = enrollment['org_id']
|
||||
|
||||
transact.update(
|
||||
key=KeyPair(order_id, f'ENROLLMENT#{enrollment_id}'),
|
||||
update_expr='SET #status = :rollback, \
|
||||
rollback_at = :now, \
|
||||
reason = :reason',
|
||||
cond_expr='attribute_exists(sk) AND #status = :executed',
|
||||
table_name=ORDER_TABLE,
|
||||
expr_attr_names={
|
||||
'#status': 'status',
|
||||
},
|
||||
expr_attr_values={
|
||||
':rollback': 'ROLLBACK',
|
||||
':executed': 'EXECUTED',
|
||||
':reason': 'CANCELLATION',
|
||||
':now': now_,
|
||||
},
|
||||
)
|
||||
transact.put(
|
||||
item={
|
||||
'id': f'SEAT#ORG#{org_id}',
|
||||
'sk': f'ORDER#{order_id}#ENROLLMENT#{uuid4()}',
|
||||
'course': enrollment['course'],
|
||||
'created_at': now_,
|
||||
}
|
||||
)
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user