func()

in lambda/go/add-podcasts/main.go [66:123]


func (h *Handler) Handle(ctx context.Context, input events.APIGatewayV2HTTPRequest) (
	*events.APIGatewayV2HTTPResponse, error,
) {
	log.Printf("Request:\n%#v", input)

	var apiInput APIInput
	if err := json.Unmarshal([]byte(input.Body), &apiInput); err != nil {
		log.Printf("ERROR: failed to unmarshal request body, %v", err)
		return workshop.NewBadRequestErrorResponse("invalid add podcast request body")
	}

	var episodes []workshop.Episode
	if apiInput.ImportEpisode != nil {
		episode, err := h.importEpisode(apiInput.ImportEpisode)
		if err != nil {
			return nil, fmt.Errorf("failed to import episode, %w", err)
		}
		episodes = append(episodes, episode)
	}

	if apiInput.ImportRSSFeed != nil {
		es, err := h.importRSSFeed(ctx, apiInput.ImportRSSFeed)
		if err != nil {
			return nil, fmt.Errorf("failed to import episodes from RSS feed, %w", err)
		}
		episodes = append(episodes, es...)
	}

	if len(episodes) == 0 {
		return workshop.NewJSONResponse(400, nil, messageOutput{
			Message: "RSS feed did not contain any episodes",
		})
	}

	episodes, err := h.filterEpisodes(ctx, episodes)
	if err != nil {
		return nil, fmt.Errorf("failed to filter episodes, %w", err)
	}
	if len(episodes) == 0 {
		return workshop.NewJSONResponse(200, nil, messageOutput{
			Message: "All episodes in RSS feed up to max number episodes are already imported",
		})
	}

	// Record the episodes
	if err := h.writeEpisodes(ctx, episodes); err != nil {
		return nil, fmt.Errorf("failed to record episodes, %w", err)
	}

	// Kick off imports of episodes
	if err := h.startImport(ctx, episodes); err != nil {
		return nil, fmt.Errorf("failed to import episodes, %w", err)
	}

	return workshop.NewJSONResponse(200, nil, APIOutput{
		Episodes: episodes,
	})
}