[backend/drive] Store attachments as links if they can't be fetched for caching / further processing

This commit is contained in:
Laura Hausmann 2024-05-16 18:43:24 +02:00
parent b76f154f50
commit 2108f91bcf
No known key found for this signature in database
GPG key ID: D044E84C5BE01605

View file

@ -84,18 +84,45 @@ public class DriveService(
if (!logExisting) if (!logExisting)
logger.LogDebug("Storing file {uri} for user {userId}", uri, user.Id); logger.LogDebug("Storing file {uri} for user {userId}", uri, user.Id);
var res = await httpClient.GetAsync(uri); try
var request = new DriveFileCreationRequest
{ {
Uri = uri, var res = await httpClient.GetAsync(uri);
Filename = new Uri(uri).AbsolutePath.Split('/').LastOrDefault() ?? "",
IsSensitive = sensitive,
Comment = description,
MimeType = CleanMimeType(mimeType ?? res.Content.Headers.ContentType?.MediaType)
};
return await StoreFile(await res.Content.ReadAsStreamAsync(), user, request); var request = new DriveFileCreationRequest
{
Uri = uri,
Filename = new Uri(uri).AbsolutePath.Split('/').LastOrDefault() ?? "",
IsSensitive = sensitive,
Comment = description,
MimeType = CleanMimeType(mimeType ?? res.Content.Headers.ContentType?.MediaType)
};
return await StoreFile(await res.Content.ReadAsStreamAsync(), user, request);
}
catch (Exception e)
{
logger.LogDebug("Failed to download file from {uri}: {error}, storing as link", uri, e.Message);
file = new DriveFile
{
Id = IdHelpers.GenerateSlowflakeId(),
CreatedAt = DateTime.UtcNow,
User = user,
UserHost = user.Host,
Size = 0,
IsLink = true,
IsSensitive = sensitive,
StoredInternal = false,
Uri = uri,
Url = uri,
Name = new Uri(uri).AbsolutePath.Split('/').LastOrDefault() ?? "",
Comment = description,
Type = CleanMimeType(mimeType ?? "application/octet-stream")
};
db.Add(file);
await db.SaveChangesAsync();
return file;
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -115,29 +142,29 @@ public class DriveService(
{ {
file = new DriveFile file = new DriveFile
{ {
Id = IdHelpers.GenerateSlowflakeId(), Id = IdHelpers.GenerateSlowflakeId(),
CreatedAt = DateTime.UtcNow, CreatedAt = DateTime.UtcNow,
User = user, User = user,
UserHost = user.Host, UserHost = user.Host,
Size = (int)input.Length, Size = (int)input.Length,
IsLink = true, IsLink = true,
IsSensitive = request.IsSensitive, IsSensitive = request.IsSensitive,
StoredInternal = false, StoredInternal = false,
Src = request.Source, Src = request.Source,
Uri = request.Uri, Uri = request.Uri,
Url = request.Uri ?? throw new Exception("Cannot store remote attachment without URI"), Url = request.Uri ?? throw new Exception("Cannot store remote attachment without URI"),
Name = request.Filename, Name = request.Filename,
Comment = request.Comment, Comment = request.Comment,
Type = CleanMimeType(request.MimeType), Type = CleanMimeType(request.MimeType),
RequestHeaders = request.RequestHeaders, RequestHeaders = request.RequestHeaders,
RequestIp = request.RequestIp RequestIp = request.RequestIp
}; };
db.Add(file); db.Add(file);
await db.SaveChangesAsync(); await db.SaveChangesAsync();
return file; return file;
} }
await using var data = new BufferedStream(input); await using var data = new BufferedStream(input);
var digest = await DigestHelpers.Sha256DigestAsync(data); var digest = await DigestHelpers.Sha256DigestAsync(data);