func()

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)
}