update layercake

This commit is contained in:
2025-03-26 17:41:10 -03:00
parent 3d6801df70
commit b1e8f19d39
8 changed files with 70 additions and 25 deletions

View File

@@ -22,9 +22,14 @@ LIMIT = 25
@router.get('/') @router.get('/')
def me(): def me():
user: AuthenticatedUser = router.context['user'] user: AuthenticatedUser = router.context['user']
acls = collect.get_items(
acls = collect.get_items(KeyPair(user.id, PrefixKey('acls#')), limit=LIMIT) KeyPair(user.id, PrefixKey('acls#')),
workspaces = collect.get_items(KeyPair(user.id, PrefixKey('orgs#')), limit=LIMIT) limit=LIMIT,
)
workspaces = collect.get_items(
KeyPair(user.id, PrefixKey('orgs#')),
limit=LIMIT,
)
return { return {
'acls': acls['items'], 'acls': acls['items'],

View File

@@ -55,7 +55,12 @@ def get_users():
) )
@router.post('/', compress=True, tags=['User'], summary='Create user') @router.post(
'/',
compress=True,
tags=['User'],
summary='Create user',
)
def post_user(payload: User): def post_user(payload: User):
return Response(status_code=HTTPStatus.CREATED) return Response(status_code=HTTPStatus.CREATED)
@@ -65,12 +70,17 @@ class NewPasswordPayload(BaseModel):
new_password: Annotated[str, StringConstraints(min_length=6)] new_password: Annotated[str, StringConstraints(min_length=6)]
@router.patch('/<id>', compress=True, tags=['User'], summary='') @router.patch('/<id>', compress=True, tags=['User'])
def patch_reset(id: str, payload: NewPasswordPayload): def patch_reset(id: str, payload: NewPasswordPayload):
return Response(status_code=HTTPStatus.OK) return Response(status_code=HTTPStatus.OK)
@router.get('/<id>', compress=True, tags=['User'], summary='Get user') @router.get(
'/<id>',
compress=True,
tags=['User'],
summary='Get user',
)
def get_user(id: str): def get_user(id: str):
return collect.get_item(KeyPair(id, '0')) return collect.get_item(KeyPair(id, '0'))
@@ -87,11 +97,9 @@ def get_idp(id: str):
summary='Get user emails', summary='Get user emails',
) )
def get_emails(id: str): def get_emails(id: str):
start_key = router.current_event.get_query_string_value('start_key', None)
return collect.get_items( return collect.get_items(
KeyPair(id, PrefixKey('emails#')), KeyPair(id, PrefixKey('emails#')),
start_key=start_key, start_key=router.current_event.get_query_string_value('start_key', None),
) )
@@ -102,13 +110,11 @@ def get_emails(id: str):
summary='Get user logs', summary='Get user logs',
) )
def get_logs(id: str): def get_logs(id: str):
start_key = router.current_event.get_query_string_value('start_key', None)
return collect.get_items( return collect.get_items(
# Post-migration: uncomment to enable PartitionKey with a composite key (id with `logs` prefix). # Post-migration: uncomment to enable PartitionKey with a composite key (id with `logs` prefix).
# PartitionKey(ComposeKey(id, prefix='logs')), # PartitionKey(ComposeKey(id, prefix='logs')),
PartitionKey(ComposeKey(id, prefix='log', delimiter=':')), PartitionKey(ComposeKey(id, prefix='log', delimiter=':')),
start_key=start_key, start_key=router.current_event.get_query_string_value('start_key', None),
) )
@@ -119,9 +125,7 @@ def get_logs(id: str):
summary='Get user orgs', summary='Get user orgs',
) )
def get_orgs(id: str): def get_orgs(id: str):
start_key = router.current_event.get_query_string_value('start_key', None)
return collect.get_items( return collect.get_items(
KeyPair(id, PrefixKey('orgs#')), KeyPair(id, PrefixKey('orgs#')),
start_key=start_key, start_key=router.current_event.get_query_string_value('start_key', None),
) )

View File

@@ -23,7 +23,7 @@ Globals:
Architectures: Architectures:
- x86_64 - x86_64
Layers: Layers:
- !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:18 - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:20
Environment: Environment:
Variables: Variables:
TZ: America/Sao_Paulo TZ: America/Sao_Paulo

View File

@@ -40,6 +40,26 @@ def test_get_emails(
} }
def test_get_orgs(
mock_app,
dynamodb_seeds,
dynamodb_persistence_layer: DynamoDBPersistenceLayer,
http_api_proxy: HttpApiProxy,
lambda_context: LambdaContext,
):
mock_app.users.collect = DynamoDBCollection(dynamodb_persistence_layer)
r = mock_app.lambda_handler(
http_api_proxy(
raw_path='/users/5OxmMjL-ujoR5IMGegQz/orgs',
method=HTTPMethod.GET,
),
lambda_context,
)
assert r['statusCode'] == HTTPStatus.OK
def test_get_logs( def test_get_logs(
mock_app, mock_app,
dynamodb_seeds, dynamodb_seeds,
@@ -57,9 +77,23 @@ def test_get_logs(
lambda_context, lambda_context,
) )
# This data was added from seeds
assert r['statusCode'] == HTTPStatus.OK assert r['statusCode'] == HTTPStatus.OK
assert json.loads(r['body']) == {
print(r['body']) 'items': [
{
'sk': '2024-02-08T16:42:33.776409-03:00',
'action': 'OPEN_EMAIL',
'id': '5OxmMjL-ujoR5IMGegQz',
},
{
'sk': '2019-03-25T00:00:00-03:00',
'action': 'CLICK_EMAIL',
'id': '5OxmMjL-ujoR5IMGegQz',
},
],
'last_key': None,
}
def test_post_user( def test_post_user(

2
http-api/uv.lock generated
View File

@@ -444,7 +444,7 @@ wheels = [
[[package]] [[package]]
name = "layercake" name = "layercake"
version = "0.1.1" version = "0.1.3"
source = { directory = "../layercake" } source = { directory = "../layercake" }
dependencies = [ dependencies = [
{ name = "aws-lambda-powertools", extra = ["all"] }, { name = "aws-lambda-powertools", extra = ["all"] },

View File

@@ -0,0 +1 @@
## Layercake

View File

@@ -130,6 +130,10 @@ class PartitionKey(Key):
def __init__(self, pk: str) -> None: def __init__(self, pk: str) -> None:
super().__init__(**{PK: pk}) super().__init__(**{PK: pk})
def __repr__(self) -> str:
pk = self[PK]
return f'PartitionKey({pk!r})'
def expr_attr_name(self) -> dict: def expr_attr_name(self) -> dict:
return {'#pk': PK} return {'#pk': PK}
@@ -653,13 +657,10 @@ class DynamoDBCollection:
else '#pk = :pk' else '#pk = :pk'
) )
expr_attr_name.update(key.expr_attr_name())
expr_attr_values.update(key.expr_attr_values())
res = self.persistence_layer.query( res = self.persistence_layer.query(
key_cond_expr=key_cond_expr, key_cond_expr=key_cond_expr,
expr_attr_name=expr_attr_name, expr_attr_name=key.expr_attr_name() | expr_attr_name,
expr_attr_values=expr_attr_values, expr_attr_values=key.expr_attr_values() | expr_attr_values,
filter_expr=filter_expr, filter_expr=filter_expr,
index_forward=index_forward, index_forward=index_forward,
limit=limit, limit=limit,

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "layercake" name = "layercake"
version = "0.1.2" version = "0.1.3"
description = "Add your description here" description = "Add your description here"
readme = "README.md" readme = "README.md"
authors = [ authors = [