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