namespace GmRelay.Web.Services.Portfolio.Covers; public sealed record PortfolioCoverUploadResult(string StorageKey, string ContentType); public interface IPortfolioCoverStorage { Task SaveAsync( Stream content, string contentType, CancellationToken cancellationToken = default); Task DeleteIfExistsAsync(string storageKey, CancellationToken cancellationToken = default); string GetPublicPath(string storageKey); }