fix retain key
This commit is contained in:
@@ -26,7 +26,6 @@ Example
|
||||
from dataclasses import asdict, dataclass
|
||||
from typing import Any
|
||||
|
||||
import boto3
|
||||
from aws_lambda_powertools import Logger, Tracer
|
||||
from aws_lambda_powertools.utilities.data_classes import event_source
|
||||
from aws_lambda_powertools.utilities.data_classes.api_gateway_authorizer_event import (
|
||||
@@ -38,7 +37,7 @@ from botocore.endpoint_provider import Enum
|
||||
from layercake.dynamodb import DynamoDBCollection, DynamoDBPersistenceLayer, KeyPair
|
||||
from layercake.funcs import pick
|
||||
|
||||
from boto3clients import dynamodb_client
|
||||
from boto3clients import dynamodb_client, idp_client
|
||||
from cognito import get_user
|
||||
from conf import USER_TABLE
|
||||
|
||||
@@ -46,7 +45,6 @@ APIKEY_PREFIX = 'sk-'
|
||||
|
||||
tracer = Tracer()
|
||||
logger = Logger(__name__)
|
||||
idp_client = boto3.client('cognito-idp')
|
||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
user_collect = DynamoDBCollection(user_layer)
|
||||
|
||||
|
||||
@@ -2,15 +2,16 @@ import os
|
||||
|
||||
import boto3
|
||||
|
||||
DYNAMODB_ENDPOINT_URL: str | None = None
|
||||
|
||||
# Only when running `sam local start-api`
|
||||
if 'AWS_SAM_LOCAL' in os.environ:
|
||||
DYNAMODB_ENDPOINT_URL = 'http://host.docker.internal:8000'
|
||||
def get_dynamodb_client():
|
||||
sam_local = os.getenv('AWS_SAM_LOCAL')
|
||||
|
||||
# Only when running `pytest`
|
||||
if 'PYTEST_VERSION' in os.environ:
|
||||
DYNAMODB_ENDPOINT_URL = 'http://127.0.0.1:8000'
|
||||
if os.getenv('AWS_LAMBDA_FUNCTION_NAME') and not sam_local:
|
||||
return boto3.client('dynamodb')
|
||||
|
||||
dynamodb_client = boto3.client('dynamodb', endpoint_url=DYNAMODB_ENDPOINT_URL)
|
||||
url = 'host.docker.internal' if sam_local else 'localhost'
|
||||
return boto3.client('dynamodb', endpoint_url=f'http://{url}:8000')
|
||||
|
||||
|
||||
dynamodb_client = get_dynamodb_client()
|
||||
idp_client = boto3.client('cognito-idp')
|
||||
|
||||
@@ -2,9 +2,9 @@ from dataclasses import asdict, dataclass
|
||||
from urllib.parse import quote as urlquote
|
||||
from urllib.parse import urlencode, urlparse
|
||||
|
||||
import requests
|
||||
from aws_lambda_powertools.event_handler.exceptions import BadRequestError
|
||||
from glom import glom
|
||||
import requests
|
||||
|
||||
from conf import KONVIVA_API_URL, KONVIVA_SECRET_KEY
|
||||
|
||||
|
||||
@@ -119,12 +119,12 @@ def _tenant(
|
||||
# Ensure user has ACL
|
||||
collect.get_item(
|
||||
KeyPair(user.id, ComposeKey(tenant_id, prefix='acls')),
|
||||
exception_cls=ForbiddenError,
|
||||
exc_cls=ForbiddenError,
|
||||
)
|
||||
|
||||
# For root tenant, provide the default Tenant
|
||||
if tenant_id == '*':
|
||||
return Tenant(id=tenant_id, name='default')
|
||||
|
||||
obj = collect.get_item(KeyPair(tenant_id, '0'), exception_cls=NotFoundError)
|
||||
return Tenant.parse_obj(obj)
|
||||
obj = collect.get_item(KeyPair(tenant_id, '0'), exc_cls=NotFoundError)
|
||||
return Tenant.model_validate(obj)
|
||||
|
||||
@@ -76,7 +76,7 @@ def post_course(payload: Course):
|
||||
def get_course(id: str):
|
||||
return course_collect.get_item(
|
||||
KeyPair(id, '0'),
|
||||
exception_cls=NotFoundError,
|
||||
exc_cls=NotFoundError,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ from conf import ELASTIC_CONN, ORDER_TABLE
|
||||
|
||||
router = Router()
|
||||
order_layer = DynamoDBPersistenceLayer(ORDER_TABLE, dynamodb_client)
|
||||
order_collect = DynamoDBCollection(order_layer, exception_cls=BadRequestError)
|
||||
order_collect = DynamoDBCollection(order_layer, exc_cls=BadRequestError)
|
||||
elastic_client = Elasticsearch(**ELASTIC_CONN)
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ from rules.org import update_policies
|
||||
|
||||
router = Router()
|
||||
org_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
org_collect = DynamoDBCollection(org_layer, exception_cls=BadRequestError)
|
||||
org_collect = DynamoDBCollection(org_layer, exc_cls=BadRequestError)
|
||||
|
||||
|
||||
@router.get(
|
||||
@@ -31,7 +31,9 @@ org_collect = DynamoDBCollection(org_layer, exception_cls=BadRequestError)
|
||||
)
|
||||
def get_policies(id: str):
|
||||
return org_collect.get_items(
|
||||
TransactKey(id) + SortKey('billing_policy') + SortKey('payment_policy'),
|
||||
TransactKey(id)
|
||||
+ SortKey('metadata#billing_policy', remove_prefix='metadata#')
|
||||
+ SortKey('metadata#payment_policy', remove_prefix='metadata#'),
|
||||
flatten_top=False,
|
||||
)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class BadRequestError(MissingError, PowertoolsBadRequestError):
|
||||
|
||||
router = Router()
|
||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
user_collect = DynamoDBCollection(user_layer, exception_cls=BadRequestError)
|
||||
user_collect = DynamoDBCollection(user_layer, exc_cls=BadRequestError)
|
||||
elastic_client = Elasticsearch(**ELASTIC_CONN)
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ class BadRequestError(MissingError, PowertoolsBadRequestError): ...
|
||||
|
||||
router = Router()
|
||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
user_collect = DynamoDBCollection(user_layer, exception_cls=BadRequestError)
|
||||
user_collect = DynamoDBCollection(user_layer, exc_cls=BadRequestError)
|
||||
|
||||
|
||||
@router.get(
|
||||
|
||||
@@ -23,7 +23,7 @@ class BadRequestError(MissingError, PowertoolsBadRequestError): ...
|
||||
|
||||
router = Router()
|
||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
user_collect = DynamoDBCollection(user_layer, exception_cls=BadRequestError)
|
||||
user_collect = DynamoDBCollection(user_layer, exc_cls=BadRequestError)
|
||||
|
||||
|
||||
@router.get(
|
||||
|
||||
@@ -26,7 +26,7 @@ class BadRequestError(MissingError, PowertoolsBadRequestError): ...
|
||||
|
||||
router = Router()
|
||||
user_layer = DynamoDBPersistenceLayer(USER_TABLE, dynamodb_client)
|
||||
user_collect = DynamoDBCollection(user_layer, exception_cls=BadRequestError)
|
||||
user_collect = DynamoDBCollection(user_layer, exc_cls=BadRequestError)
|
||||
|
||||
|
||||
@router.get(
|
||||
|
||||
@@ -23,7 +23,7 @@ def create_course(
|
||||
transact.put(
|
||||
item={
|
||||
'id': course.id,
|
||||
'sk': 'tenant',
|
||||
'sk': 'metadata#tenant',
|
||||
'org_id': org.id,
|
||||
'name': org.name,
|
||||
'create_date': now_,
|
||||
@@ -42,7 +42,8 @@ def update_course(
|
||||
transact = TransactItems(persistence_layer.table_name)
|
||||
transact.update(
|
||||
key=KeyPair(id, '0'),
|
||||
update_expr='SET #name = :name, access_period = :access_period, cert = :cert, update_date = :update_date',
|
||||
update_expr='SET #name = :name, access_period = :access_period, \
|
||||
cert = :cert, update_date = :update_date',
|
||||
expr_attr_names={
|
||||
'#name': 'name',
|
||||
},
|
||||
|
||||
@@ -17,24 +17,24 @@ def update_policies(
|
||||
transact.put(
|
||||
item={
|
||||
'id': id,
|
||||
'sk': 'payment_policy',
|
||||
'sk': 'metadata#payment_policy',
|
||||
'create_date': now_,
|
||||
}
|
||||
| payment_policy
|
||||
)
|
||||
else:
|
||||
transact.delete(key=KeyPair(id, 'payment_policy'))
|
||||
transact.delete(key=KeyPair(id, 'metadata#payment_policy'))
|
||||
|
||||
if billing_policy:
|
||||
transact.put(
|
||||
item={
|
||||
'id': id,
|
||||
'sk': 'billing_policy',
|
||||
'sk': 'metadata#billing_policy',
|
||||
'create_date': now_,
|
||||
}
|
||||
| billing_policy
|
||||
)
|
||||
else:
|
||||
transact.delete(key=KeyPair(id, 'billing_policy'))
|
||||
transact.delete(key=KeyPair(id, 'metadata#billing_policy'))
|
||||
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
|
||||
@@ -4,7 +4,6 @@ from typing import TypedDict
|
||||
from aws_lambda_powertools.event_handler.exceptions import (
|
||||
BadRequestError,
|
||||
)
|
||||
from botocore.exceptions import ClientError
|
||||
from botocore.tokens import timedelta
|
||||
from layercake.dateutils import now, ttl
|
||||
from layercake.dynamodb import (
|
||||
@@ -14,11 +13,6 @@ from layercake.dynamodb import (
|
||||
TransactItems,
|
||||
)
|
||||
|
||||
|
||||
class CPFConflictError(BadRequestError):
|
||||
pass
|
||||
|
||||
|
||||
User = TypedDict('User', {'id': str, 'name': str, 'cpf': str})
|
||||
|
||||
|
||||
@@ -60,6 +54,10 @@ def update_user(
|
||||
cond_expr='attribute_not_exists(sk)',
|
||||
)
|
||||
|
||||
class CPFConflictError(BadRequestError):
|
||||
def __init__(self, msg: str):
|
||||
super().__init__('Cpf already exists')
|
||||
|
||||
if user.cpf != old_cpf:
|
||||
transact.put(
|
||||
item={
|
||||
@@ -69,18 +67,14 @@ def update_user(
|
||||
'create_date': now_,
|
||||
},
|
||||
cond_expr='attribute_not_exists(sk)',
|
||||
exc_cls=CPFConflictError,
|
||||
)
|
||||
|
||||
# Ensures that the old CPF is discarded
|
||||
if old_cpf:
|
||||
transact.delete(key=KeyPair('cpf', old_cpf))
|
||||
|
||||
try:
|
||||
persistence_layer.transact_write_items(transact)
|
||||
except ClientError:
|
||||
raise CPFConflictError('CPF is already in use.')
|
||||
else:
|
||||
return True
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
|
||||
|
||||
def add_email(
|
||||
@@ -109,6 +103,11 @@ def add_email(
|
||||
},
|
||||
cond_expr='attribute_not_exists(sk)',
|
||||
)
|
||||
|
||||
class EmailConflictError(BadRequestError):
|
||||
def __init__(self, msg: str):
|
||||
super().__init__('Email already exists')
|
||||
|
||||
transact.put(
|
||||
item={
|
||||
'id': 'email',
|
||||
@@ -117,12 +116,10 @@ def add_email(
|
||||
'create_date': now_,
|
||||
},
|
||||
cond_expr='attribute_not_exists(sk)',
|
||||
exc_cls=EmailConflictError,
|
||||
)
|
||||
|
||||
try:
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
except ClientError:
|
||||
raise BadRequestError('Email already exists.')
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
|
||||
|
||||
def del_email(
|
||||
@@ -141,6 +138,7 @@ def del_email(
|
||||
key=KeyPair(id, ComposeKey(email, prefix='emails')),
|
||||
cond_expr='email_primary <> :primary',
|
||||
expr_attr_values={':primary': True},
|
||||
exc_cls=BadRequestError,
|
||||
)
|
||||
transact.update(
|
||||
key=KeyPair(id, '0'),
|
||||
@@ -150,10 +148,7 @@ def del_email(
|
||||
},
|
||||
)
|
||||
|
||||
try:
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
except ClientError:
|
||||
raise BadRequestError('Cannot remove the primary email.')
|
||||
return persistence_layer.transact_write_items(transact)
|
||||
|
||||
|
||||
def set_email_as_primary(
|
||||
@@ -188,10 +183,8 @@ def set_email_as_primary(
|
||||
)
|
||||
transact.update(
|
||||
key=KeyPair(id, '0'),
|
||||
update_expr=(
|
||||
'SET email = :email, email_verified = :email_verified, '
|
||||
'update_date = :update_date'
|
||||
),
|
||||
update_expr='SET email = :email, email_verified = :email_verified, \
|
||||
update_date = :update_date',
|
||||
expr_attr_values={
|
||||
':email': new_email,
|
||||
':email_verified': email_verified,
|
||||
|
||||
Reference in New Issue
Block a user