Skip to content

Commit 8628bb9

Browse files
Adding registry logic
1 parent 1f6ea86 commit 8628bb9

File tree

3 files changed

+115
-1
lines changed

3 files changed

+115
-1
lines changed
Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,56 @@
11
from __future__ import annotations
22

3+
from typing import TYPE_CHECKING, Any, Callable
4+
5+
from aws_lambda_powertools.event_handler.events_appsync._registry import ResolverEventsRegistry
6+
7+
if TYPE_CHECKING:
8+
from aws_lambda_powertools.utilities.data_classes.appsync_resolver_events_event import AppSyncResolverEventsEvent
9+
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext
10+
311

412
class AppSyncEventsResolver:
513
"""
614
AppSync Events API Resolver
715
"""
816

917
def __init__(self):
10-
pass
18+
self.context = {} # early init as customers might add context before event resolution
19+
self._publish_registry = ResolverEventsRegistry()
20+
self._async_publish_registry = ResolverEventsRegistry()
21+
self._subscribe_registry = ResolverEventsRegistry()
22+
self._async_subscribe_registry = ResolverEventsRegistry()
23+
24+
def resolve(
25+
self,
26+
event: AppSyncResolverEventsEvent,
27+
context: LambdaContext,
28+
) -> Any:
29+
"""Resolves the response based on the provide event and decorator operation and namespaces"""
30+
print(self._publish_registry.__dict__)
31+
32+
def publish(
33+
self,
34+
path: str = "/default/*",
35+
aggregate: bool = True,
36+
) -> Callable:
37+
return self._publish_registry.register(path=path, aggregate=aggregate)
38+
39+
def async_publish(
40+
self,
41+
path: str = "/default/*",
42+
aggregate: bool = True,
43+
) -> Callable:
44+
return self._async_publish_registry.register(path=path, aggregate=aggregate)
45+
46+
def subscribe(
47+
self,
48+
path: str = "/default/*",
49+
) -> Callable:
50+
return self._subscribe_registry.register(path=path)
51+
52+
def async_subscribe(
53+
self,
54+
path: str = "/default/*",
55+
) -> Callable:
56+
return self._async_subscribe_registry.register(path=path)

aws_lambda_powertools/event_handler/events_appsync/__init__.py

Whitespace-only changes.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from __future__ import annotations
2+
3+
import logging
4+
from typing import Any, Callable
5+
6+
logger = logging.getLogger(__name__)
7+
8+
9+
class ResolverEventsRegistry:
10+
def __init__(self):
11+
self.resolvers: dict[str, dict[str, Any]] = {}
12+
13+
def register(
14+
self,
15+
path: str = "/default/*",
16+
aggregate: bool = True,
17+
) -> Callable:
18+
"""Registers the resolver for path that includes namespace + channel
19+
20+
Parameters
21+
----------
22+
path : str
23+
Path including namespace + channel
24+
aggregate: bool
25+
A flag indicating whether the batch items should be processed at once or individually.
26+
If True (default), the batch resolver will process all items in the batch as a single event.
27+
If False, the batch resolver will process each item in the batch individually.
28+
29+
Return
30+
----------
31+
Callable
32+
A Callable
33+
"""
34+
35+
def _register(func) -> Callable:
36+
logger.debug(f"Adding resolver `{func.__name__}` for path `{path}`")
37+
self.resolvers[f"{path}"] = {
38+
"func": func,
39+
"aggregate": aggregate,
40+
}
41+
return func
42+
43+
return _register
44+
45+
def find_resolver(self, path: str) -> dict | None:
46+
"""Find resolver based on type_name and field_name
47+
48+
Parameters
49+
----------
50+
path : str
51+
Type name
52+
Return
53+
----------
54+
Optional[Dict]
55+
A dictionary with the resolver and if raise exception on error
56+
"""
57+
logger.debug(f"Looking for resolver for path={path}")
58+
return self.resolvers.get(f"{path}")
59+
60+
def merge(self, other_registry: ResolverEventsRegistry):
61+
"""Update current registry with incoming registry
62+
63+
Parameters
64+
----------
65+
other_registry : ResolverRegistry
66+
Registry to merge from
67+
"""
68+
self.resolvers.update(**other_registry.resolvers)

0 commit comments

Comments
 (0)