LANCommander/LANCommander.Server/Endpoints/MediaEndpoints.cs

139 lines
4.6 KiB
C#
Raw Permalink Normal View History

2025-11-21 01:28:37 -06:00
using LANCommander.Server.Services;
2026-07-02 18:09:14 -05:00
using LANCommander.Server.Services.Mappers;
using Microsoft.AspNetCore.Http.HttpResults;
2025-11-21 01:28:37 -06:00
using Microsoft.AspNetCore.Mvc;
namespace LANCommander.Server.Endpoints;
public static class MediaEndpoints
{
public static void MapMediaEndpoints(this IEndpointRouteBuilder routes)
{
var group = routes.MapGroup("/api/Media").RequireAuthorization();
group.MapGet("/", GetAsync);
group.MapGet("/{id:guid}", GetByIdAsync);
group.MapGet("/{id:guid}/Thumbnail", ThumbnailAsync).AllowAnonymous();
group.MapGet("/{id:guid}/Download", DownloadAsync).AllowAnonymous();
2026-04-26 01:19:31 -05:00
group.MapGet("/{id:guid}/Stream", StreamAsync).AllowAnonymous();
2025-11-21 01:28:37 -06:00
}
internal static async Task<Ok<IEnumerable<SDK.Models.Media>>> GetAsync(
2026-07-02 18:09:14 -05:00
[FromServices] SdkMapper sdkMapper,
2025-11-21 01:28:37 -06:00
[FromServices] MediaService mediaService)
{
var media = await mediaService.GetAsync();
2026-07-02 18:09:14 -05:00
return TypedResults.Ok<IEnumerable<SDK.Models.Media>>(media.Select(sdkMapper.ToSdk).ToList());
2025-11-21 01:28:37 -06:00
}
internal static async Task<Results<NotFound, Ok<SDK.Models.Media>>> GetByIdAsync(
2025-11-21 01:28:37 -06:00
Guid id,
2026-07-02 18:09:14 -05:00
[FromServices] SdkMapper sdkMapper,
2025-11-21 01:28:37 -06:00
[FromServices] MediaService mediaService)
{
var media = await mediaService.GetAsync(id);
if (media == null)
return TypedResults.NotFound();
2026-07-02 18:09:14 -05:00
return TypedResults.Ok(sdkMapper.ToSdk(media));
2025-11-21 01:28:37 -06:00
}
internal static async Task<Results<FileStreamHttpResult, NotFound, InternalServerError>> ThumbnailAsync(
2025-11-21 01:28:37 -06:00
Guid id,
[FromServices] MediaService mediaService,
[FromServices] ILoggerFactory loggerFactory)
2025-11-21 01:28:37 -06:00
{
var logger = loggerFactory.CreateLogger(nameof(MediaEndpoints));
2025-11-21 01:28:37 -06:00
try
{
var media = await mediaService.GetAsync(id);
var fs = File.OpenRead(mediaService.GetThumbnailPath(media));
return TypedResults.File(fs, media.MimeType);
}
catch (FileNotFoundException)
2025-11-21 01:28:37 -06:00
{
logger.LogWarning("Media thumbnail {Id} does not exist", id);
2025-11-21 01:28:37 -06:00
return TypedResults.NotFound();
}
catch (DirectoryNotFoundException)
{
logger.LogWarning("Media thumbnail {Id} does not exist.", id);
return TypedResults.NotFound();
}
catch (Exception ex)
{
logger.LogError(ex, "Unhandled exception raised reading media thumbnail {Id}.", id);
return TypedResults.InternalServerError();
}
2025-11-21 01:28:37 -06:00
}
internal static async Task<Results<FileStreamHttpResult, NotFound, InternalServerError>> DownloadAsync(
2025-11-21 01:28:37 -06:00
Guid id,
[FromServices] MediaService mediaService,
[FromServices] ILoggerFactory loggerFactory)
2025-11-21 01:28:37 -06:00
{
var logger = loggerFactory.CreateLogger(nameof(MediaEndpoints));
2025-11-21 01:28:37 -06:00
try
{
var media = await mediaService.GetAsync(id);
var fs = File.OpenRead(MediaService.GetMediaPath(media));
return TypedResults.File(fs, media.MimeType);
}
catch (FileNotFoundException)
2025-11-21 01:28:37 -06:00
{
logger.LogWarning("Media file {Id} does not exist", id);
2025-11-21 01:28:37 -06:00
return TypedResults.NotFound();
}
2026-04-26 01:19:31 -05:00
catch (DirectoryNotFoundException)
{
logger.LogWarning("Media file {Id} does not exist.", id);
return TypedResults.NotFound();
}
catch (Exception ex)
{
logger.LogError(ex, "Unhandled exception raised reading media item {Id}.", id);
return TypedResults.InternalServerError();
}
}
internal static async Task<IResult> StreamAsync(
Guid id,
[FromServices] MediaService mediaService,
[FromServices] ILoggerFactory loggerFactory)
{
var logger = loggerFactory.CreateLogger(nameof(MediaEndpoints));
try
{
var media = await mediaService.GetAsync(id);
var path = MediaService.GetMediaPath(media);
if (!File.Exists(path))
return TypedResults.NotFound();
return TypedResults.PhysicalFile(path, media.MimeType, enableRangeProcessing: true);
}
catch (FileNotFoundException)
{
logger.LogWarning("Media file {Id} does not exist", id);
return TypedResults.NotFound();
}
catch (DirectoryNotFoundException)
{
logger.LogWarning("Media file {Id} does not exist.", id);
2026-04-26 01:19:31 -05:00
return TypedResults.NotFound();
}
2026-04-26 01:19:31 -05:00
catch (Exception ex)
{
logger.LogError(ex, "Unhandled exception raised streaming media item {Id}.", id);
return TypedResults.InternalServerError();
}
2025-11-21 01:28:37 -06:00
}
}