femto-backend/Femto.Api/Controllers/Media/MediaController.cs
2025-05-18 13:51:49 +02:00

48 lines
1.7 KiB
C#

using Femto.Api.Controllers.Media.Dto;
using Femto.Modules.Media.Application;
using Femto.Modules.Media.Contracts;
using Femto.Modules.Media.Contracts.LoadFile;
using Femto.Modules.Media.Contracts.SaveFile;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Femto.Api.Controllers.Media;
[ApiController]
[Route("media")]
public class MediaController(IMediaModule mediaModule) : ControllerBase
{
[HttpPost]
[Authorize]
public async Task<ActionResult<UploadMediaResponse>> UploadMedia(
IFormFile file,
CancellationToken cancellationToken
)
{
await using var data = file.OpenReadStream();
var id = await mediaModule.PostCommand(
new SaveFileCommand(data, file.ContentType, file.Length),
cancellationToken
);
var fileGetUrl =
$"{this.HttpContext.Request.Scheme}://{this.HttpContext.Request.Host}/media/{id}";
return new UploadMediaResponse(id, fileGetUrl);
}
[HttpGet("{id}")]
public async Task GetMedia(Guid id, CancellationToken cancellationToken)
{
var res = await mediaModule.PostQuery(new LoadFileQuery(id), cancellationToken);
// Set cache headers
HttpContext.Response.Headers.CacheControl = "public,max-age=31536000"; // Cache for 1 year
HttpContext.Response.Headers.Expires = DateTime.UtcNow.AddYears(1).ToString("R");
// If you want to support cache validation
HttpContext.Response.Headers.ETag = $"\"{id}\""; // Using the file ID as ETag
HttpContext.Response.ContentType = res.Type;
HttpContext.Response.ContentLength = res.Size;
await res.Data.CopyToAsync(HttpContext.Response.Body, cancellationToken);
}}