add filter

This commit is contained in:
2025-12-16 13:02:34 -03:00
parent 62b5340b20
commit ab5bf50900
7 changed files with 230 additions and 79 deletions

View File

@@ -1,5 +1,4 @@
from datetime import date, datetime, time, timedelta
from decimal import Decimal
from http import HTTPStatus
from typing import Annotated, TypedDict
from uuid import uuid4
@@ -49,7 +48,6 @@ class Course(BaseModel):
id: UUID4
name: str
access_period: int
unit_price: Decimal = Field(exclude=True)
class DeduplicationWindow(BaseModel):
@@ -177,6 +175,14 @@ def enroll_now(enrollment: Enrollment, context: Context):
)
with dyn.transact_writer() as transact:
transact.condition(
key=KeyPair(
pk='SUBSCRIPTION',
sk=f'ORG#{org.id}',
),
cond_expr='attribute_exists(sk)',
exc_cls=SubscriptionRequiredError,
)
transact.put(
item={
'id': enrollment.id,
@@ -276,6 +282,14 @@ def enroll_later(enrollment: Enrollment, context: Context):
pk = f'SCHEDULED#ORG#{org.id}'
sk = f'{scheduled_for.isoformat()}#{lock_hash}'
transact.condition(
key=KeyPair(
pk='SUBSCRIPTION',
sk=f'ORG#{org.id}',
),
cond_expr='attribute_exists(sk)',
exc_cls=SubscriptionRequiredError,
)
transact.put(
item={
'id': pk,

View File

@@ -11,12 +11,18 @@ from pydantic import FutureDatetime
from api_gateway import JSONResponse
from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE
from middlewares.authentication_middleware import User as Authenticated
from ...enrollments.enroll import Enrollment, Org, Subscription, enroll_now
logger = Logger(__name__)
router = Router()
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
class ScheduledNotFoundError(NotFoundError): ...
@router.get('/<org_id>/enrollments/scheduled')
def scheduled(
org_id: str,
@@ -29,9 +35,6 @@ def scheduled(
)
class ScheduledNotFoundError(NotFoundError): ...
@router.delete('/<org_id>/enrollments/scheduled')
def cancel(
org_id: str,
@@ -52,8 +55,52 @@ def cancel(
pk='LOCK#SCHEDULED',
sk=lock_hash,
),
cond_expr='attribute_exists(sk)',
exc_cls=ScheduledNotFoundError,
)
return JSONResponse(status_code=HTTPStatus.NO_CONTENT)
@router.post('/<org_id>/enrollments/scheduled/proceed')
def proceed(
org_id: str,
scheduled_for: Annotated[FutureDatetime, Body(embed=True)],
lock_hash: Annotated[str, Body(embed=True)],
):
pk = f'SCHEDULED#ORG#{org_id}'
sk = f'{scheduled_for.isoformat()}#{lock_hash}'
scheduled = dyn.collection.get_item(
KeyPair(pk, sk),
exc_cls=ScheduledNotFoundError,
)
org = Org(
id=org_id,
name=scheduled['org_name'],
)
subscription = Subscription(
billing_day=scheduled['subscription_billing_day'],
)
try:
enrollment = enroll_now(
Enrollment(
user=scheduled['user'],
course=scheduled['course'],
),
{
'org': org,
'subscription': subscription,
'created_by': router.context['user'],
},
)
with dyn.transact_writer() as transact:
transact.delete(key=KeyPair(pk, sk))
transact.delete(key=KeyPair('LOCK#SCHEDULED', lock_hash))
except Exception:
raise
else:
return JSONResponse(
status_code=HTTPStatus.CREATED,
body=enrollment,
)