add download cert

This commit is contained in:
2025-11-18 16:58:15 -03:00
parent a96dcb3e96
commit cd5f96210f
13 changed files with 417 additions and 23 deletions

View File

@@ -64,9 +64,7 @@ def put_course(course_id: str):
event = router.current_event
if not event.decoded_body:
raise BadRequestError('Invalid request body')
now_ = now()
raise BadRequestError('Invalid request body') now_ = now()
body = parse(
event.headers,
BytesIO(event.decoded_body.encode()),

View File

@@ -1,6 +1,13 @@
from typing import Annotated
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler.api_gateway import Router
from layercake.dynamodb import DynamoDBPersistenceLayer
from aws_lambda_powertools.event_handler.exceptions import (
BadRequestError,
)
from aws_lambda_powertools.event_handler.openapi.params import Body
from layercake.dateutils import now
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE
@@ -10,5 +17,78 @@ router = Router()
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
@router.patch('/')
def cancel(): ...
class CancelPolicyConflictError(BadRequestError):
def __init__(self, *_):
super().__init__('Cancellation policy not found')
class SlotConflictError(BadRequestError):
def __init__(self, *_):
super().__init__('Slot not found')
@router.post('/<enrollment_id>/cancel')
def cancel(
enrollment_id: str,
lock_hash: Annotated[str | None, Body(embed=True)] = None,
):
now_ = now()
with dyn.transact_writer() as transact:
transact.update(
key=KeyPair(enrollment_id, '0'),
cond_expr='#status = pending',
update_expr='SET #status = :canceled, \
canceled_at = :now, \
updated_at = :now',
expr_attr_names={
':status': 'status',
},
expr_attr_values={
':pending': 'PENDING',
':canceled': 'CANCELED',
':true': True,
':now': now_,
},
)
transact.put(
item={
'id': enrollment_id,
'sk': 'CANCELED_BY',
'canceled_by': {},
'created_at': now_,
}
)
transact.delete(
key=KeyPair(
pk=enrollment_id,
sk='CANCEL_POLICY',
),
cond_expr='attribute_exists(sk)',
exc_cls=CancelPolicyConflictError,
)
# Remove reminders and policies that no longer apply
transact.delete(
key=KeyPair(
pk=enrollment_id,
sk='SCHEDULE#REMINDER_NO_ACCESS_AFTER_3_DAYS',
)
)
transact.delete(
key=KeyPair(
pk=enrollment_id,
sk='SCHEDULE#REMINDER_ACCESS_PERIOD_BEFORE_30_DAYS',
)
)
transact.delete(
key=KeyPair(
pk=enrollment_id,
sk='METADATA#PARENT_SLOT',
),
cond_expr='attribute_exists(sk)',
exc_cls=SlotConflictError,
)
if lock_hash:
transact.delete(key=KeyPair(enrollment_id, 'LOCK'))
transact.delete(key=KeyPair('LOCK', lock_hash))

View File

@@ -16,7 +16,7 @@ router = Router()
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
@router.patch('/<enrollment_id>/dedupwindow', compress=True)
@router.delete('/<enrollment_id>/dedupwindow', compress=True)
def dedup_window(
enrollment_id: str,
lock_hash: Annotated[str, Body(embed=True)],