add user to org

This commit is contained in:
2025-11-10 22:08:26 -03:00
parent 648da66c90
commit c00a42ea39
6 changed files with 139 additions and 19 deletions

View File

@@ -4,14 +4,14 @@ from uuid import uuid4
from aws_lambda_powertools.event_handler.api_gateway import Router
from aws_lambda_powertools.event_handler.exceptions import (
BadRequestError,
NotFoundError,
ServiceError,
)
from aws_lambda_powertools.event_handler.openapi.params import Body
from layercake.dateutils import now
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair, SortKey
from layercake.extra_types import CnpjStr, CpfStr, NameStr
from pydantic import UUID4, BaseModel, EmailStr, Field
from pydantic import BaseModel, EmailStr
from api_gateway import JSONResponse
from boto3clients import dynamodb_client
@@ -28,7 +28,6 @@ class Org(BaseModel):
class User(BaseModel):
id: UUID4 = Field(default_factory=uuid4)
name: NameStr
cpf: CpfStr
email: EmailStr
@@ -40,7 +39,9 @@ class CPFConflictError(Exception): ...
class EmailConflictError(Exception): ...
class UserConflictError(BadRequestError): ...
class UserConflictError(ServiceError):
def __init__(self, msg: str | dict):
super().__init__(HTTPStatus.CONFLICT, msg)
class UserNotFoundError(NotFoundError): ...
@@ -94,27 +95,41 @@ def add_user(
exc_cls=OrgMissingError,
)
return JSONResponse(HTTPStatus.CREATED)
return JSONResponse(HTTPStatus.NO_CONTENT)
def _create_user(user: User, org: Org) -> bool:
now_ = now()
user_id = uuid4()
try:
with dyn.transact_writer() as transact:
transact.put(
item={
**user.model_dump(),
'id': user_id,
'sk': '0',
'email_verified': False,
'org_id': {org.id},
'created_at': now_,
},
)
transact.put(
item={
'id': user_id,
# Post-migration: rename `emails` to `EMAIL`
'sk': f'emails#{user.email}',
'email_verified': False,
'email_primary': True,
'created_at': now_,
}
)
transact.put(
item={
# Post-migration: rename `cpf` to `CPF`
'id': 'cpf',
'sk': user.cpf,
'created_at': now_,
},
cond_expr='attribute_not_exists(sk)',
exc_cls=CPFConflictError,
@@ -124,13 +139,14 @@ def _create_user(user: User, org: Org) -> bool:
# Post-migration: rename `email` to `EMAIL`
'id': 'email',
'sk': user.email,
'created_at': now_,
},
cond_expr='attribute_not_exists(sk)',
exc_cls=EmailConflictError,
)
transact.put(
item={
'id': user.id,
'id': user_id,
# Post-migration: rename `orgs` to `ORG`
'sk': f'orgs#{org.id}',
'name': org.name,
@@ -142,7 +158,7 @@ def _create_user(user: User, org: Org) -> bool:
item={
# Post-migration: rename `orgmembers` to `ORGMEMBER`
'id': f'orgmembers#{org.id}',
'sk': user.id,
'sk': user_id,
'created_at': now_,
}
)