[backend/api] Clone files that exist in different folders owned by the same user instead of creating copies
This commit is contained in:
parent
59c26686e4
commit
bc7745c9fc
2 changed files with 14 additions and 11 deletions
|
@ -127,9 +127,10 @@ public class DriveController(
|
||||||
{
|
{
|
||||||
Filename = file.FileName,
|
Filename = file.FileName,
|
||||||
MimeType = file.ContentType,
|
MimeType = file.ContentType,
|
||||||
IsSensitive = false
|
IsSensitive = false,
|
||||||
|
FolderId = folderId
|
||||||
};
|
};
|
||||||
var res = await driveSvc.StoreFileAsync(file.OpenReadStream(), user, request, folderId: folderId);
|
var res = await driveSvc.StoreFileAsync(file.OpenReadStream(), user, request);
|
||||||
return await GetFileById(res.Id);
|
return await GetFileById(res.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ public class DriveService(
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DriveFile> StoreFileAsync(
|
public async Task<DriveFile> StoreFileAsync(
|
||||||
Stream input, User user, DriveFileCreationRequest request, bool skipImageProcessing = false, string? folderId = null
|
Stream input, User user, DriveFileCreationRequest request, bool skipImageProcessing = false
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (user.IsLocalUser && input.Length > storageConfig.Value.MaxUploadSizeBytes)
|
if (user.IsLocalUser && input.Length > storageConfig.Value.MaxUploadSizeBytes)
|
||||||
|
@ -206,19 +206,19 @@ public class DriveService(
|
||||||
await input.CopyToAsync(memoryStream);
|
await input.CopyToAsync(memoryStream);
|
||||||
|
|
||||||
// If the requested folder doesn't exist then store it in the root folder
|
// If the requested folder doesn't exist then store it in the root folder
|
||||||
if (folderId != null)
|
if (request.FolderId != null)
|
||||||
{
|
{
|
||||||
var folder = await db.DriveFolders
|
var folder = await db.DriveFolders
|
||||||
.FirstOrDefaultAsync(p => p.Id == folderId && p.UserId == user.Id);
|
.FirstOrDefaultAsync(p => p.Id == request.FolderId && p.UserId == user.Id);
|
||||||
if (folder == null) folderId = null;
|
if (folder == null) request.FolderId = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var digest = await DigestHelpers.Sha256DigestAsync(buf);
|
var digest = await DigestHelpers.Sha256DigestAsync(buf);
|
||||||
logger.LogDebug("Storing file {digest} for user {userId}", digest, user.Id);
|
logger.LogDebug("Storing file {digest} for user {userId}", digest, user.Id);
|
||||||
file = await db.DriveFiles.FirstOrDefaultAsync(p => p.Sha256 == digest && p.FolderId == folderId && (!p.IsLink || p.UserId == user.Id));
|
file = await db.DriveFiles.FirstOrDefaultAsync(p => p.Sha256 == digest && (!p.IsLink || p.UserId == user.Id));
|
||||||
if (file != null)
|
if (file != null)
|
||||||
{
|
{
|
||||||
if (file.UserId == user.Id)
|
if (file.UserId == user.Id && file.FolderId == request.FolderId)
|
||||||
{
|
{
|
||||||
logger.LogDebug("File {digest} is already registered for user, returning existing file {id}",
|
logger.LogDebug("File {digest} is already registered for user, returning existing file {id}",
|
||||||
digest, file.Id);
|
digest, file.Id);
|
||||||
|
@ -227,7 +227,7 @@ public class DriveService(
|
||||||
|
|
||||||
var clonedFile = file.Clone(user, request);
|
var clonedFile = file.Clone(user, request);
|
||||||
|
|
||||||
logger.LogDebug("File {digest} is already registered for different user, returning clone of existing file {id}, stored as {cloneId}",
|
logger.LogDebug("File {digest} is already registered for different user or folder, returning clone of existing file {id}, stored as {cloneId}",
|
||||||
digest, file.Id, clonedFile.Id);
|
digest, file.Id, clonedFile.Id);
|
||||||
|
|
||||||
await db.AddAsync(clonedFile);
|
await db.AddAsync(clonedFile);
|
||||||
|
@ -360,7 +360,7 @@ public class DriveService(
|
||||||
PublicUrl = @public?.url,
|
PublicUrl = @public?.url,
|
||||||
PublicAccessKey = @public?.accessKey,
|
PublicAccessKey = @public?.accessKey,
|
||||||
PublicMimeType = @public?.format.Format.MimeType,
|
PublicMimeType = @public?.format.Format.MimeType,
|
||||||
FolderId = folderId
|
FolderId = request.FolderId
|
||||||
};
|
};
|
||||||
|
|
||||||
await db.AddAsync(file);
|
await db.AddAsync(file);
|
||||||
|
@ -672,6 +672,7 @@ public class DriveFileCreationRequest
|
||||||
public string? RequestIp;
|
public string? RequestIp;
|
||||||
public string? Source;
|
public string? Source;
|
||||||
public string? Uri;
|
public string? Uri;
|
||||||
|
public string? FolderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
file static class DriveFileExtensions
|
file static class DriveFileExtensions
|
||||||
|
@ -707,7 +708,8 @@ file static class DriveFileExtensions
|
||||||
Comment = request.Comment,
|
Comment = request.Comment,
|
||||||
RequestHeaders = request.RequestHeaders,
|
RequestHeaders = request.RequestHeaders,
|
||||||
RequestIp = request.RequestIp,
|
RequestIp = request.RequestIp,
|
||||||
ThumbnailAccessKey = file.ThumbnailAccessKey
|
ThumbnailAccessKey = file.ThumbnailAccessKey,
|
||||||
|
FolderId = request.FolderId
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue