[backend/drive] Fix DriveService.StoreFile edge cases and make the code flow more clear/readable

This commit is contained in:
Laura Hausmann 2024-05-02 16:23:08 +02:00
parent 87ade8a97c
commit 9a662f2bea
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -152,91 +152,115 @@ public class DriveService(
string? thumbnailFilename = null; string? thumbnailFilename = null;
string? webpublicFilename = null; string? webpublicFilename = null;
if (shouldStore && isImage && isReasonableSize) if (shouldStore)
{ {
var genWebp = user.Host == null; if (isImage && isReasonableSize)
var res = await imageProcessor.ProcessImage(data, request, shouldStore, genWebp);
blurhash = res?.Blurhash;
thumbnailFilename = res?.RenderThumbnail != null ? GenerateWebpFilename("thumbnail-") : null;
webpublicFilename = res?.RenderThumbnail != null ? GenerateWebpFilename("webpublic-") : null;
if (storedInternal)
{ {
var pathBase = storageConfig.Value.Local?.Path ?? var genWebp = user.Host == null;
throw new Exception("Local storage path cannot be null"); var res = await imageProcessor.ProcessImage(data, request, true, genWebp);
var path = Path.Combine(pathBase, filename);
await using var writer = File.OpenWrite(path); blurhash = res?.Blurhash;
await data.CopyToAsync(writer); thumbnailFilename = res?.RenderThumbnail != null ? GenerateWebpFilename("thumbnail-") : null;
url = $"https://{instanceConfig.Value.WebDomain}/files/{filename}"; webpublicFilename = res?.RenderThumbnail != null ? GenerateWebpFilename("webpublic-") : null;
if (thumbnailFilename != null && res?.RenderThumbnail != null) if (storedInternal)
{ {
var thumbPath = Path.Combine(pathBase, thumbnailFilename); var pathBase = storageConfig.Value.Local?.Path ??
await using var thumbWriter = File.OpenWrite(thumbPath); throw new Exception("Local storage path cannot be null");
try var path = Path.Combine(pathBase, filename);
data.Seek(0, SeekOrigin.Begin);
await using var writer = File.OpenWrite(path);
await data.CopyToAsync(writer);
url = $"https://{instanceConfig.Value.WebDomain}/files/{filename}";
if (thumbnailFilename != null && res?.RenderThumbnail != null)
{ {
await res.RenderThumbnail(thumbWriter); var thumbPath = Path.Combine(pathBase, thumbnailFilename);
thumbnailUrl = $"https://{instanceConfig.Value.WebDomain}/files/{thumbnailFilename}"; await using var thumbWriter = File.OpenWrite(thumbPath);
try
{
await res.RenderThumbnail(thumbWriter);
thumbnailUrl = $"https://{instanceConfig.Value.WebDomain}/files/{thumbnailFilename}";
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message);
}
} }
catch (Exception e)
if (webpublicFilename != null && res?.RenderWebpublic != null)
{ {
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message); var webpPath = Path.Combine(pathBase, webpublicFilename);
await using var webpWriter = File.OpenWrite(webpPath);
try
{
await res.RenderWebpublic(webpWriter);
webpublicUrl = $"https://{instanceConfig.Value.WebDomain}/files/{webpublicFilename}";
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write webp: {e}", e.Message);
}
} }
} }
else
if (webpublicFilename != null && res?.RenderWebpublic != null)
{ {
var webpPath = Path.Combine(pathBase, webpublicFilename); data.Seek(0, SeekOrigin.Begin);
await using var webpWriter = File.OpenWrite(webpPath); await storageSvc.UploadFileAsync(filename, data);
try url = storageSvc.GetFilePublicUrl(filename).AbsoluteUri;
if (thumbnailFilename != null && res?.RenderThumbnail != null)
{ {
await res.RenderWebpublic(webpWriter); try
webpublicUrl = $"https://{instanceConfig.Value.WebDomain}/files/{webpublicFilename}"; {
await using var stream = new MemoryStream();
await res.RenderThumbnail(stream);
stream.Seek(0, SeekOrigin.Begin);
await storageSvc.UploadFileAsync(thumbnailFilename, stream);
thumbnailUrl = storageSvc.GetFilePublicUrl(thumbnailFilename).AbsoluteUri;
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message);
}
} }
catch (Exception e)
if (webpublicFilename != null && res?.RenderWebpublic != null)
{ {
logger.LogDebug("Failed to generate/write webp: {e}", e.Message); try
{
await using var stream = new MemoryStream();
await res.RenderWebpublic(stream);
stream.Seek(0, SeekOrigin.Begin);
await storageSvc.UploadFileAsync(webpublicFilename, stream);
webpublicUrl = storageSvc.GetFilePublicUrl(webpublicFilename).AbsoluteUri;
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message);
}
} }
} }
} }
else else
{ {
data.Seek(0, SeekOrigin.Begin); //TODO: check against file size limit
await storageSvc.UploadFileAsync(filename, data); if (storedInternal)
url = storageSvc.GetFilePublicUrl(filename).AbsoluteUri;
if (thumbnailFilename != null && res?.RenderThumbnail != null)
{ {
try var pathBase = storageConfig.Value.Local?.Path ??
{ throw new Exception("Local storage path cannot be null");
await using var stream = new MemoryStream(); var path = Path.Combine(pathBase, filename);
await res.RenderThumbnail(stream);
stream.Seek(0, SeekOrigin.Begin); await using var writer = File.OpenWrite(path);
await storageSvc.UploadFileAsync(thumbnailFilename, stream); await data.CopyToAsync(writer);
thumbnailUrl = storageSvc.GetFilePublicUrl(thumbnailFilename).AbsoluteUri; url = $"https://{instanceConfig.Value.WebDomain}/files/{filename}";
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message);
}
} }
else
if (webpublicFilename != null && res?.RenderWebpublic != null)
{ {
try data.Seek(0, SeekOrigin.Begin);
{ await storageSvc.UploadFileAsync(filename, data);
await using var stream = new MemoryStream(); url = storageSvc.GetFilePublicUrl(filename).AbsoluteUri;
await res.RenderWebpublic(stream);
stream.Seek(0, SeekOrigin.Begin);
await storageSvc.UploadFileAsync(webpublicFilename, stream);
webpublicUrl = storageSvc.GetFilePublicUrl(webpublicFilename).AbsoluteUri;
}
catch (Exception e)
{
logger.LogDebug("Failed to generate/write thumbnail: {e}", e.Message);
}
} }
} }
} }
@ -253,7 +277,7 @@ public class DriveService(
UserHost = user.Host, UserHost = user.Host,
Sha256 = digest, Sha256 = digest,
Size = (int)data.Length, Size = (int)data.Length,
IsLink = !shouldStore && user.Host != null, IsLink = !shouldStore,
AccessKey = filename, AccessKey = filename,
IsSensitive = request.IsSensitive, IsSensitive = request.IsSensitive,
StoredInternal = storedInternal, StoredInternal = storedInternal,