📄 src/Api/YouTubeApiEndpoints.cs
using System.Threading;
using System.Threading.Tasks;
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", Upload).WithDisplayName("Upload Latest Clip to YouTube");

            return youtube;
        }
    }

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

    private static async Task<Results<Ok<Upload>, NotFound>> Upload(
        [FromServices] Uploader uploader,
        CancellationToken cancellationToken
    )
    {
        var result = await uploader.Upload("YouTube", cancellationToken);
        return result is null ? TypedResults.NotFound() : TypedResults.Ok(Api.Upload.FromDomain(result));
    }
}