Skip to content

Commit da1e745

Browse files
author
Michal Ploski
committed
Add batch processing to appsync handler
1 parent 432093c commit da1e745

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

aws_lambda_powertools/event_handler/appsync.py

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
import logging
2-
from typing import Any, Callable, Optional, Type, TypeVar
2+
from typing import Any, Callable, Optional, Type, TypeVar, List, Union
33

44
from aws_lambda_powertools.utilities.data_classes import AppSyncResolverEvent
55
from aws_lambda_powertools.utilities.typing import LambdaContext
6+
from itertools import groupby
7+
from operator import itemgetter
68

79
logger = logging.getLogger(__name__)
810

911
AppSyncResolverEventT = TypeVar("AppSyncResolverEventT", bound=AppSyncResolverEvent)
1012

1113

1214
class BaseRouter:
13-
current_event: AppSyncResolverEventT # type: ignore[valid-type]
15+
current_event: Union[AppSyncResolverEventT, List[AppSyncResolverEventT]] # type: ignore[valid-type]
1416
lambda_context: LambdaContext
1517
context: dict
1618

@@ -152,11 +154,26 @@ def lambda_handler(event, context):
152154
If we could not find a field resolver
153155
"""
154156
# Maintenance: revisit generics/overload to fix [attr-defined] in mypy usage
155-
BaseRouter.current_event = data_model(event)
157+
158+
# If event is a list it means that AppSync sent batch request
159+
if isinstance(event, list):
160+
event_groups = [
161+
{"field_name": field_name, "events": list(events)}
162+
for field_name, events in groupby(event, key=lambda x: x["info"]["fieldName"])
163+
]
164+
if len(event_groups) > 1:
165+
ValueError("batch with different field names. It shouldn't happen!")
166+
167+
BaseRouter.current_event = [data_model(event) for event in event_groups[0]["events"]]
168+
169+
resolver = self._get_resolver(BaseRouter.current_event[0].type_name, event_groups[0]["field_name"])
170+
response = resolver()
171+
else:
172+
BaseRouter.current_event = data_model(event)
173+
resolver = self._get_resolver(BaseRouter.current_event.type_name, BaseRouter.current_event.field_name)
174+
response = resolver(**BaseRouter.current_event.arguments)
156175
BaseRouter.lambda_context = context
157176

158-
resolver = self._get_resolver(BaseRouter.current_event.type_name, BaseRouter.current_event.field_name)
159-
response = resolver(**BaseRouter.current_event.arguments)
160177
self.clear_context()
161178

162179
return response

0 commit comments

Comments
 (0)