[backend/api] Allow optionally storing a drive file in a specified folder

This commit is contained in:
pancakes 2024-12-16 14:41:06 +10:00 committed by Laura Hausmann
parent 673e5c88bc
commit 98686e334e
No known key found for this signature in database
GPG key ID: D044E84C5BE01605
2 changed files with 13 additions and 4 deletions

View file

@ -118,7 +118,7 @@ public class DriveController(
[Produces(MediaTypeNames.Application.Json)] [Produces(MediaTypeNames.Application.Json)]
[ProducesResults(HttpStatusCode.OK)] [ProducesResults(HttpStatusCode.OK)]
[MaxRequestSizeIsMaxUploadSize] [MaxRequestSizeIsMaxUploadSize]
public async Task<DriveFileResponse> UploadFile(IFormFile file) public async Task<DriveFileResponse> UploadFile(IFormFile file, [FromQuery] string? folderId)
{ {
var user = HttpContext.GetUserOrFail(); var user = HttpContext.GetUserOrFail();
var request = new DriveFileCreationRequest var request = new DriveFileCreationRequest
@ -127,7 +127,7 @@ public class DriveController(
MimeType = file.ContentType, MimeType = file.ContentType,
IsSensitive = false IsSensitive = false
}; };
var res = await driveSvc.StoreFileAsync(file.OpenReadStream(), user, request); var res = await driveSvc.StoreFileAsync(file.OpenReadStream(), user, request, folderId: folderId);
return await GetFileById(res.Id); return await GetFileById(res.Id);
} }

View file

@ -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 Stream input, User user, DriveFileCreationRequest request, bool skipImageProcessing = false, string? folderId = null
) )
{ {
if (user.IsLocalUser && input.Length > storageConfig.Value.MaxUploadSizeBytes) if (user.IsLocalUser && input.Length > storageConfig.Value.MaxUploadSizeBytes)
@ -324,6 +324,14 @@ public class DriveService(
request.Filename += $".{fmt.Extension}"; request.Filename += $".{fmt.Extension}";
} }
// If the requested folder doesn't exist then store it in the root folder
if (folderId != null)
{
var folder = await db.DriveFolders
.FirstOrDefaultAsync(p => p.Id == folderId && p.UserId == user.Id);
if (folder == null) folderId = null;
}
file = new DriveFile file = new DriveFile
{ {
Id = IdHelpers.GenerateSnowflakeId(), Id = IdHelpers.GenerateSnowflakeId(),
@ -351,7 +359,8 @@ public class DriveService(
ThumbnailMimeType = thumbnail?.format.Format.MimeType, ThumbnailMimeType = thumbnail?.format.Format.MimeType,
PublicUrl = @public?.url, PublicUrl = @public?.url,
PublicAccessKey = @public?.accessKey, PublicAccessKey = @public?.accessKey,
PublicMimeType = @public?.format.Format.MimeType PublicMimeType = @public?.format.Format.MimeType,
FolderId = folderId
}; };
await db.AddAsync(file); await db.AddAsync(file);