in lambda/go/get-podcast/main.go [31:72]
func (h *Handler) Handle(ctx context.Context, input events.APIGatewayV2HTTPRequest) (
*events.APIGatewayV2HTTPResponse, error,
) {
log.Printf("Request:\n%#v", input)
episodeID, ok := input.PathParameters["id"]
if !ok || episodeID == "" {
return workshop.NewBadRequestErrorResponse("Episode id not provided")
}
// Build the DynamoDB expression for retrieving only select fields from the item.
expr, err := ddbexp.NewBuilder().
WithProjection(workshop.DescribeEpisodeProjection()).
Build()
if err != nil {
return nil, fmt.Errorf("failed to build expression projection, %w", err)
}
// Call out to Amazon DynamoDB using GetItem API to get the specific
// episode from the table.
result, err := h.ddbClient.GetItem(ctx, &ddb.GetItemInput{
TableName: &h.episodeTableName,
Key: workshop.Episode{ID: episodeID}.AttributeValuePrimaryKey(),
ExpressionAttributeNames: expr.Names(),
ProjectionExpression: expr.Projection(),
})
if err != nil {
return handleGetItemError(err)
}
if len(result.Item) == 0 {
return workshop.NewNotFoundErrorResponse("Podcast not found")
}
// Convert the DynamoDB AttributeValue datatype into our Episode Go type.
var episode workshop.DescribeEpisode
if err := ddbav.UnmarshalMap(result.Item, &episode); err != nil {
return nil, fmt.Errorf("failed to unmarshal episode item, %w", err)
}
// Respond back with the episode fields selected in the projection.
return workshop.NewJSONResponse(200, nil, episode)
}