add created by

This commit is contained in:
2025-12-08 12:40:35 -03:00
parent 807df116cf
commit a8bb1799bc
9 changed files with 127 additions and 233 deletions

View File

@@ -11,6 +11,7 @@ from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE
from middlewares.authentication_middleware import User as Authenticated
logger = Logger(__name__)
router = Router()
@@ -33,6 +34,7 @@ def cancel(
lock_hash: Annotated[str | None, Body(embed=True)] = None,
):
now_ = now()
canceled_by: Authenticated = router.context['user']
with dyn.transact_writer() as transact:
transact.update(
@@ -55,7 +57,10 @@ def cancel(
item={
'id': enrollment_id,
'sk': 'CANCELED_BY',
'canceled_by': {},
'canceled_by': {
'id': canceled_by.id,
'name': canceled_by.name,
},
'created_at': now_,
}
)

View File

@@ -1,14 +1,88 @@
from decimal import Decimal
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 (
NotFoundError,
)
from aws_lambda_powertools.event_handler.openapi.params import Body
from layercake.batch import BatchProcessor
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from layercake.extra_types import CnpjStr, CpfStr, NameStr
from pydantic import UUID4, BaseModel, EmailStr, FutureDate
from boto3clients import dynamodb_client
from config import ENROLLMENT_TABLE
from middlewares.authentication_middleware import User as Authenticated
logger = Logger(__name__)
router = Router()
dyn = DynamoDBPersistenceLayer(ENROLLMENT_TABLE, dynamodb_client)
processor = BatchProcessor()
class SubscriptionNotFoundError(NotFoundError): ...
class User(BaseModel):
id: str | UUID4
name: NameStr
cpf: CpfStr
email: EmailStr
class Course(BaseModel):
id: UUID4
name: str
access_period: int
unit_price: Decimal
class Enrollment(BaseModel):
user: User
course: Course
scheduled_for: FutureDate | None = None
class Org(BaseModel):
id: str | UUID4
name: str
cnpj: CnpjStr
@router.post('/')
def enroll(): ...
def enroll(
org_id: Annotated[UUID4 | str, Body(embed=True)],
enrollments: Annotated[tuple[Enrollment, ...], Body(embed=True)],
):
created_by: Authenticated = router.context['user']
org = dyn.collection.get_items(
KeyPair(
pk=str(org_id),
sk='0',
)
+ KeyPair(
pk='SUBSCRIPTION',
sk=f'ORG#{org_id}',
rename_key='subscription',
)
)
subscribed = 'subscription' in org
if not subscribed:
return checkout(Org.model_validate(org), enrollments, created_by=created_by)
scheduled, unscheduled = [], []
for x in enrollments:
(scheduled if x.scheduled_for else unscheduled).append(x)
print(scheduled, created_by)
def checkout(
org: Org,
enrollments: tuple[Enrollment, ...],
created_by: Authenticated,
):
print(org, enrollments, created_by)