Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions templates/graphql/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from aws_lambda_powertools.event_handler import AppSyncResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing import LambdaContext
from pydantic import ValidationError
from pydantic import TypeAdapter, ValidationError

from templates.graphql.models import Item
from templates.graphql.settings import Settings
Expand All @@ -17,6 +17,8 @@
repository = Repository(settings.table_name)
app = AppSyncResolver()

ITEMS_ADAPTER = TypeAdapter(list[Item])


@app.resolver(type_name="Query", field_name="getItem")
@tracer.capture_method
Expand Down Expand Up @@ -47,7 +49,11 @@ def list_items() -> list[dict]:
A list of items.
"""
try:
return [Item.model_validate(item).dump() for item in repository.list_items()]
# Optimization: use Pydantic TypeAdapter for batch validation and serialization.
# This leverages Pydantic V2's Rust-based engine to process the entire list at once,
# which is significantly faster than individual model_validate and dump calls in a loop.
items = ITEMS_ADAPTER.validate_python(repository.list_items())
return ITEMS_ADAPTER.dump_python(items, by_alias=True, exclude_none=True) # type: ignore
except Exception as error:
logger.error("Failed to list items", exc_info=error)
raise RuntimeError("Failed to list items") from error
Expand Down