#328 fix rename vault in S3 leads to empty vault

This commit is contained in:
Julian Raufelder 2021-07-07 15:48:35 +02:00
parent d5436c9b47
commit 543a03212f
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
2 changed files with 18 additions and 12 deletions

View File

@ -162,19 +162,25 @@ internal class S3Impl(context: Context, cloud: S3Cloud) {
@Throws(IOException::class, BackendException::class)
private fun moveFolder(source: S3Folder, target: S3Folder): S3Folder {
target.parent?.let { targetsParent ->
val nodes = list(source)
val request = ListObjectsArgs.builder().bucket(cloud.s3Bucket()).prefix(source.key).recursive(true).build()
val sourceKeysIncludingDescendants = try {
client().listObjects(request).mapNotNull {
run {
it.get().objectName()
}
}
} catch (e: ErrorResponseException) {
throw handleApiError(e, source.path)
}
val objectsToDelete: MutableList<DeleteObject> = LinkedList()
for (node in nodes) {
objectsToDelete.add(DeleteObject(node.key))
for (sourceKey in sourceKeysIncludingDescendants) {
objectsToDelete.add(DeleteObject(sourceKey))
val targetKey = if (node is S3Folder) {
S3CloudNodeFactory.folder(target, node.name).key
} else {
S3CloudNodeFactory.file(target, node.name).key
}
val copySource = CopySource.builder().bucket(cloud.s3Bucket()).`object`(sourceKey).build()
val targetKey = target.key + sourceKey.removePrefix(source.key)
val copySource = CopySource.builder().bucket(cloud.s3Bucket()).`object`(node.key).build()
val copyObjectArgs = CopyObjectArgs.builder().bucket(cloud.s3Bucket()).`object`(targetKey).source(copySource).build()
try {
client().copyObject(copyObjectArgs)

View File

@ -60,10 +60,10 @@ internal class GoogleDriveImpl(context: Context, googleDriveCloud: GoogleDriveCl
val fileListQuery = client().files().list() //
.setFields("files(id,mimeType,name,size)") //
.setSupportsAllDrives(true)
if (parentDriveId != null && parentDriveId == "root") {
fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false or sharedWithMe"
fileListQuery.q = if (parentDriveId != null && parentDriveId == "root") {
"name contains '$name' and '$parentDriveId' in parents and trashed = false or sharedWithMe"
} else {
fileListQuery.q = "name contains '$name' and '$parentDriveId' in parents and trashed = false"
"name contains '$name' and '$parentDriveId' in parents and trashed = false"
}
return fileListQuery.execute().files.firstOrNull { it.name == name }
}