using Microsoft.AspNetCore.Http;
namespace SeaHaven.Services.Helpers
{
/// SH-116 media type allowlist for board work-order uploads.
public static class WorkOrderMediaFileRules
{
private static readonly HashSet AllowedContentTypes = new(StringComparer.OrdinalIgnoreCase)
{
"image/jpeg",
"image/png",
"video/mp4",
"video/quicktime"
};
private static readonly HashSet AllowedExtensions = new(StringComparer.OrdinalIgnoreCase)
{
".jpg",
".jpeg",
".png",
".mp4",
".mov"
};
public static bool IsAllowed(IFormFile file)
{
if (file == null)
return false;
var contentTypeOk = !string.IsNullOrWhiteSpace(file.ContentType)
&& AllowedContentTypes.Contains(file.ContentType.Trim());
var extension = Path.GetExtension(file.FileName ?? "");
var extensionOk = !string.IsNullOrWhiteSpace(extension)
&& AllowedExtensions.Contains(extension);
// Accept when either MIME or extension matches the advertised contract (JPG/PNG/MP4/MOV).
return contentTypeOk || extensionOk;
}
public static void EnsureAllowed(IFormFile file)
{
if (!IsAllowed(file))
{
throw new Exceptions.WorkOrderBoardValidationException(
"UnsupportedMediaType",
"Supported media types are JPG, PNG, MP4, and MOV.");
}
}
}
}