diff --git a/http-api/routes/me/__init__.py b/http-api/routes/me/__init__.py index a6853ca..4998e9a 100644 --- a/http-api/routes/me/__init__.py +++ b/http-api/routes/me/__init__.py @@ -22,9 +22,14 @@ LIMIT = 25 @router.get('/') def me(): user: AuthenticatedUser = router.context['user'] - - acls = collect.get_items(KeyPair(user.id, PrefixKey('acls#')), limit=LIMIT) - workspaces = collect.get_items(KeyPair(user.id, PrefixKey('orgs#')), limit=LIMIT) + acls = collect.get_items( + KeyPair(user.id, PrefixKey('acls#')), + limit=LIMIT, + ) + workspaces = collect.get_items( + KeyPair(user.id, PrefixKey('orgs#')), + limit=LIMIT, + ) return { 'acls': acls['items'], diff --git a/http-api/routes/users/__init__.py b/http-api/routes/users/__init__.py index 1971764..8e0ae56 100644 --- a/http-api/routes/users/__init__.py +++ b/http-api/routes/users/__init__.py @@ -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): return Response(status_code=HTTPStatus.CREATED) @@ -65,12 +70,17 @@ class NewPasswordPayload(BaseModel): new_password: Annotated[str, StringConstraints(min_length=6)] -@router.patch('/', compress=True, tags=['User'], summary='') +@router.patch('/', compress=True, tags=['User']) def patch_reset(id: str, payload: NewPasswordPayload): return Response(status_code=HTTPStatus.OK) -@router.get('/', compress=True, tags=['User'], summary='Get user') +@router.get( + '/', + compress=True, + tags=['User'], + summary='Get user', +) def get_user(id: str): return collect.get_item(KeyPair(id, '0')) @@ -87,11 +97,9 @@ def get_idp(id: str): summary='Get user emails', ) def get_emails(id: str): - start_key = router.current_event.get_query_string_value('start_key', None) - return collect.get_items( 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', ) def get_logs(id: str): - start_key = router.current_event.get_query_string_value('start_key', None) - return collect.get_items( # Post-migration: uncomment to enable PartitionKey with a composite key (id with `logs` prefix). # PartitionKey(ComposeKey(id, prefix='logs')), 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', ) def get_orgs(id: str): - start_key = router.current_event.get_query_string_value('start_key', None) - return collect.get_items( KeyPair(id, PrefixKey('orgs#')), - start_key=start_key, + start_key=router.current_event.get_query_string_value('start_key', None), ) diff --git a/http-api/template.yaml b/http-api/template.yaml index c9ce513..617e17c 100644 --- a/http-api/template.yaml +++ b/http-api/template.yaml @@ -23,7 +23,7 @@ Globals: Architectures: - x86_64 Layers: - - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:18 + - !Sub arn:aws:lambda:sa-east-1:336641857101:layer:layercake:20 Environment: Variables: TZ: America/Sao_Paulo diff --git a/http-api/tests/routes/test_users.py b/http-api/tests/routes/test_users.py index 530ebc4..87e804d 100644 --- a/http-api/tests/routes/test_users.py +++ b/http-api/tests/routes/test_users.py @@ -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( mock_app, dynamodb_seeds, @@ -57,9 +77,23 @@ def test_get_logs( lambda_context, ) + # This data was added from seeds assert r['statusCode'] == HTTPStatus.OK - - print(r['body']) + assert json.loads(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( diff --git a/http-api/uv.lock b/http-api/uv.lock index 8f72109..5b88ff5 100644 --- a/http-api/uv.lock +++ b/http-api/uv.lock @@ -444,7 +444,7 @@ wheels = [ [[package]] name = "layercake" -version = "0.1.1" +version = "0.1.3" source = { directory = "../layercake" } dependencies = [ { name = "aws-lambda-powertools", extra = ["all"] }, diff --git a/layercake/README.md b/layercake/README.md index e69de29..f821ab5 100644 --- a/layercake/README.md +++ b/layercake/README.md @@ -0,0 +1 @@ +## Layercake diff --git a/layercake/layercake/dynamodb.py b/layercake/layercake/dynamodb.py index 3fb553d..14b5def 100644 --- a/layercake/layercake/dynamodb.py +++ b/layercake/layercake/dynamodb.py @@ -130,6 +130,10 @@ class PartitionKey(Key): def __init__(self, pk: str) -> None: super().__init__(**{PK: pk}) + def __repr__(self) -> str: + pk = self[PK] + return f'PartitionKey({pk!r})' + def expr_attr_name(self) -> dict: return {'#pk': PK} @@ -653,13 +657,10 @@ class DynamoDBCollection: else '#pk = :pk' ) - expr_attr_name.update(key.expr_attr_name()) - expr_attr_values.update(key.expr_attr_values()) - res = self.persistence_layer.query( key_cond_expr=key_cond_expr, - expr_attr_name=expr_attr_name, - expr_attr_values=expr_attr_values, + expr_attr_name=key.expr_attr_name() | expr_attr_name, + expr_attr_values=key.expr_attr_values() | expr_attr_values, filter_expr=filter_expr, index_forward=index_forward, limit=limit, diff --git a/layercake/pyproject.toml b/layercake/pyproject.toml index 8fd510f..068eff3 100644 --- a/layercake/pyproject.toml +++ b/layercake/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "layercake" -version = "0.1.2" +version = "0.1.3" description = "Add your description here" readme = "README.md" authors = [