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

@@ -1,157 +1,7 @@
from http import HTTPStatus
from typing import Annotated
from uuid import uuid4
from aws_lambda_powertools.event_handler.api_gateway import Router
from aws_lambda_powertools.event_handler.exceptions import NotFoundError
from aws_lambda_powertools.event_handler.openapi.params import Body
from layercake.dateutils import now
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair
from layercake.extra_types import CnpjStr, NameStr
from pydantic import UUID4, BaseModel, EmailStr
from api_gateway import JSONResponse
from boto3clients import dynamodb_client
from config import INTERNAL_EMAIL_DOMAIN, USER_TABLE
from exceptions import ConflictError
from .add import router as add
from .admins import router as admins
from .custom_pricing import router as custom_pricing
from .enrollments.scheduled import router as scheduled
from .users import router as users
router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
__all__ = ['admins', 'custom_pricing', 'scheduled', 'users']
class CNPJConflictError(ConflictError): ...
class EmailConflictError(ConflictError): ...
class UserNotFoundError(NotFoundError): ...
class EmailNotFoundError(NotFoundError): ...
class User(BaseModel):
id: str | UUID4
name: NameStr
email: EmailStr
@router.post('/')
def add_org(
name: Annotated[str, Body(embed=True)],
cnpj: Annotated[CnpjStr, Body(embed=True)],
user: Annotated[User, Body(embed=True)],
):
now_ = now()
org_id = str(uuid4())
email = f'org+{cnpj}@{INTERNAL_EMAIL_DOMAIN}'
with dyn.transact_writer() as transact:
transact.put(
item={
# Post-migration (users): rename `cnpj` to `CNPJ`
'id': 'cnpj',
'sk': cnpj,
'org_id': org_id,
'created_at': now_,
},
cond_expr='attribute_not_exists(sk)',
exc_cls=CNPJConflictError,
)
transact.put(
item={
# Post-migration (users): rename `email` to `EMAIL`
'id': 'email',
'sk': email,
'user_id': org_id,
'created_at': now_,
},
cond_expr='attribute_not_exists(sk)',
exc_cls=EmailConflictError,
)
transact.put(
item={
'id': org_id,
'sk': '0',
'name': name,
'email': email,
'cnpj': cnpj,
'created_at': now_,
}
)
transact.put(
item={
'id': org_id,
# Post-migration: rename `emails` to `EMAIL`
'sk': f'emails#{email}',
'email_primary': True,
'email_verified': True,
'mx_record_exists': True,
'created_at': now_,
}
)
transact.put(
item={
'id': org_id,
# Post-migration (users): rename `admins#` to `ADMIN#`
'sk': f'admins#{user.id}',
'name': user.name,
'email': user.email,
'created_at': now_,
}
)
transact.put(
item={
'id': user.id,
# Post-migration (users): rename `orgs#` to `ORG#`
'sk': f'orgs#{org_id}',
'name': name,
'cnpj': cnpj,
'created_at': now_,
}
)
transact.put(
item={
'id': user.id,
'sk': f'SCOPE#{org_id}',
'scope': {'apps:admin'},
'created_at': now_,
}
)
transact.put(
item={
# Post-migration (users): rename `orgmembers#` to `MEMBER#ORG#`
'id': f'orgmembers#{org_id}',
'sk': user.id,
'created_at': now_,
}
)
transact.condition(
key=KeyPair(str(user.id), '0'),
cond_expr='attribute_exists(sk)',
exc_cls=UserNotFoundError,
)
transact.condition(
# Post-migration (users): rename `email` to `EMAIL`
key=KeyPair('email', user.email),
cond_expr='attribute_exists(sk)',
exc_cls=EmailNotFoundError,
)
return JSONResponse(
status_code=HTTPStatus.CREATED,
body={
'id': org_id,
'name': name,
'email': email,
},
)
__all__ = ['add', 'admins', 'custom_pricing', 'scheduled', 'users']

View File

@@ -14,6 +14,7 @@ from api_gateway import JSONResponse
from boto3clients import dynamodb_client
from config import INTERNAL_EMAIL_DOMAIN, USER_TABLE
from exceptions import ConflictError
from middlewares.authentication_middleware import User as Authenticated
router = Router()
dyn = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
@@ -53,8 +54,9 @@ def add(
org: Annotated[Org, Body(embed=True)],
):
org.id = org_id
created_by: Authenticated = router.context['user']
if _create_user(user, org):
if _create_user(user, org, created_by):
return JSONResponse(HTTPStatus.CREATED)
user_id = _get_user_id(user)
@@ -101,7 +103,11 @@ def unlink(org_id: str, user_id: str):
return JSONResponse(HTTPStatus.NO_CONTENT)
def _create_user(user: User, org: Org) -> bool:
def _create_user(
user: User,
org: Org,
created_by: Authenticated,
) -> bool:
now_ = now()
user_id = uuid4()
email_verified = INTERNAL_EMAIL_DOMAIN in user.email
@@ -130,6 +136,17 @@ def _create_user(user: User, org: Org) -> bool:
'created_at': now_,
}
)
transact.put(
item={
'id': user_id,
'sk': 'CREATED_BY',
'created_by': {
'id': created_by.id,
'name': created_by.name,
},
'created_at': now_,
}
)
transact.put(
item={
'id': user_id,