📄 src/Api/YouTubeApiEndpoints.cs
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Routing;
using Slopper.Api.YouTubeAuth;
using Slopper.Domain;

namespace Slopper.Api;

public static class YouTubeApiEndpoints
{
    extension(IEndpointRouteBuilder endpoints)
    {
        public IEndpointConventionBuilder MapYouTubeApi()
        {
            var youtube = endpoints.MapGroup("/youtube").RequireYouTubeAuthorization();

            youtube.MapGet("/login", Login).WithDisplayName("YouTube Login");

            youtube.MapPost("/upload", UploadAll).WithDisplayName("Upload Clips to YouTube");

            return youtube;
        }
    }

    private static RedirectHttpResult Login() => TypedResults.Redirect("/admin/youtube");

    private static IAsyncEnumerable<Upload> UploadAll(
        [FromServices] Uploader uploader,
        CancellationToken cancellationToken
    ) => uploader.Upload("YouTube", cancellationToken).Select(Upload.FromDomain);
}