update batch
This commit is contained in:
@@ -24,6 +24,7 @@ Example
|
||||
"""
|
||||
|
||||
from dataclasses import asdict, dataclass
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
|
||||
from aws_lambda_powertools import Logger, Tracer
|
||||
@@ -33,7 +34,6 @@ from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event i
|
||||
APIGatewayAuthorizerResponseV2,
|
||||
)
|
||||
from aws_lambda_powertools.utilities.typing import LambdaContext
|
||||
from botocore.endpoint_provider import Enum
|
||||
from layercake.dynamodb import DynamoDBCollection, DynamoDBPersistenceLayer, KeyPair
|
||||
from layercake.funcs import pick
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@ import boto3
|
||||
|
||||
|
||||
def get_dynamodb_client():
|
||||
sam_local = os.getenv('AWS_SAM_LOCAL')
|
||||
running_sam_local = os.getenv('AWS_SAM_LOCAL')
|
||||
|
||||
if os.getenv('AWS_LAMBDA_FUNCTION_NAME') and not sam_local:
|
||||
if os.getenv('AWS_LAMBDA_FUNCTION_NAME') and not running_sam_local:
|
||||
return boto3.client('dynamodb')
|
||||
|
||||
url = 'host.docker.internal' if sam_local else 'localhost'
|
||||
url = 'host.docker.internal' if running_sam_local else 'localhost'
|
||||
return boto3.client('dynamodb', endpoint_url=f'http://{url}:8000')
|
||||
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ class Course(BaseModel):
|
||||
|
||||
|
||||
class Enrollment(BaseModel):
|
||||
id: UUID4 = Field(default_factory=uuid4)
|
||||
id: UUID4 | str = Field(default_factory=uuid4)
|
||||
user: User
|
||||
course: Course
|
||||
progress: int = Field(default=0, ge=0, le=100)
|
||||
|
||||
@@ -46,7 +46,10 @@ def cancel(id: str, payload: Cancel):
|
||||
set_status_as_canceled(
|
||||
id,
|
||||
lock_hash=payload.lock_hash,
|
||||
author=user.model_dump(), # type: ignore
|
||||
author={
|
||||
'id': user.id,
|
||||
'name': user.name,
|
||||
},
|
||||
course=payload.course, # type: ignore
|
||||
vacancy_key=KeyPair.parse_obj(payload.vacancy),
|
||||
persistence_layer=enrollment_layer,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from datetime import datetime
|
||||
from http import HTTPStatus
|
||||
|
||||
from aws_lambda_powertools.event_handler.api_gateway import Router
|
||||
from layercake.batch import BatchProcessor
|
||||
@@ -8,13 +9,15 @@ from layercake.dynamodb import (
|
||||
)
|
||||
from pydantic import BaseModel
|
||||
|
||||
from api_gateway import JSONResponse
|
||||
from boto3clients import dynamodb_client
|
||||
from config import (
|
||||
ENROLLMENT_TABLE,
|
||||
USER_TABLE,
|
||||
)
|
||||
from middlewares import Tenant, TenantMiddleware
|
||||
from models import Course, User
|
||||
from models import Course, Enrollment, User
|
||||
from rules.enrollment import enroll
|
||||
|
||||
router = Router()
|
||||
|
||||
@@ -28,6 +31,7 @@ processor = BatchProcessor()
|
||||
class Item(BaseModel):
|
||||
user: User
|
||||
course: Course
|
||||
deduplication_window: dict = {}
|
||||
schedule_date: datetime | None = None
|
||||
|
||||
|
||||
@@ -49,16 +53,33 @@ def enroll_(payload: Payload):
|
||||
with processor(payload.items, handler, context):
|
||||
processor.process()
|
||||
|
||||
return {}
|
||||
print(processor.exceptions)
|
||||
|
||||
return JSONResponse(
|
||||
HTTPStatus.OK,
|
||||
{
|
||||
'successes': processor.successes,
|
||||
'failures': processor.failures,
|
||||
'exceptions': [str(exc) for exc in processor.exceptions],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def handler(record: Item, context: dict):
|
||||
tenant: Tenant = context['tenant']
|
||||
# enroll(
|
||||
# enrollment=Enrollment(user=[])
|
||||
# tenant={
|
||||
# 'id': str(tenant.id),
|
||||
# 'name': tenant.name,
|
||||
# },
|
||||
# persistence_layer=enrollment_layer,
|
||||
# )
|
||||
enrollment = Enrollment(
|
||||
user=record.user,
|
||||
course=record.course,
|
||||
)
|
||||
|
||||
enroll(
|
||||
enrollment=enrollment,
|
||||
tenant={
|
||||
'id': str(tenant.id),
|
||||
'name': tenant.name,
|
||||
},
|
||||
deduplication_window=record.deduplication_window, # type: ignore
|
||||
persistence_layer=enrollment_layer,
|
||||
)
|
||||
|
||||
return enrollment
|
||||
|
||||
@@ -125,6 +125,11 @@ def enroll(
|
||||
ttl_expiration = ttl(
|
||||
start_dt=now_ + timedelta(days=course.access_period - offset_days)
|
||||
)
|
||||
|
||||
class DeduplicationConflictError(Exception):
|
||||
def __init__(self, *args):
|
||||
super().__init__('Enrollment already exists')
|
||||
|
||||
transact.put(
|
||||
item={
|
||||
'id': 'lock',
|
||||
@@ -134,6 +139,7 @@ def enroll(
|
||||
'ttl': ttl_expiration,
|
||||
},
|
||||
cond_expr='attribute_not_exists(sk)',
|
||||
exc_cls=DeduplicationConflictError,
|
||||
)
|
||||
transact.put(
|
||||
item={
|
||||
|
||||
@@ -4,7 +4,6 @@ from typing import TypedDict
|
||||
from aws_lambda_powertools.event_handler.exceptions import (
|
||||
BadRequestError,
|
||||
)
|
||||
from botocore.tokens import timedelta
|
||||
from layercake.dateutils import now, ttl
|
||||
from layercake.dynamodb import (
|
||||
ComposeKey,
|
||||
|
||||
Reference in New Issue
Block a user