From 6d5501a017ae445c46e342a6ed212e496ed108d0 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Mon, 17 May 2021 13:10:28 -0500 Subject: [PATCH 1/4] adding new lists - to return json with more info --- app/api/Files.scala | 26 ++++++++++++++++--- app/services/FileService.scala | 2 +- app/services/mongodb/MongoDBFileService.scala | 8 ++++-- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/app/api/Files.scala b/app/api/Files.scala index 1c8406e0d..b7220fb12 100644 --- a/app/api/Files.scala +++ b/app/api/Files.scala @@ -1611,22 +1611,42 @@ class Files @Inject()( } def bulkDeleteFiles() = PrivateServerAction (parse.json) {implicit request=> + var filesToCheck : List[String] = List.empty[String] + var filesNotExist : ListBuffer[String] = ListBuffer.empty[String] + var filesNoPermission : ListBuffer[String] = ListBuffer.empty[String] + var filesDeleted : ListBuffer[String] = ListBuffer.empty[String] + var filesErrorDeleted: ListBuffer[String] = ListBuffer.empty[String] request.user match { case Some(user) => { val fileIds = request.body.\("fileIds").asOpt[List[String]].getOrElse(List.empty[String]) + filesToCheck = fileIds if (fileIds.isEmpty){ BadRequest("No file ids supplied") } else { var resourceRefList: ListBuffer[ResourceRef] = ListBuffer.empty[ResourceRef] for (fileId <- fileIds) { if (UUID.isValid(fileId)) { - val current_resource_ref = ResourceRef(ResourceRef.file, UUID(fileId)) - resourceRefList += current_resource_ref + files.get(UUID(fileId)) match { + case Some(currentFile) => { + val current_resource_ref = ResourceRef(ResourceRef.file, UUID(fileId)) + resourceRefList += current_resource_ref + } + case None => { + filesNotExist += fileId + } + } + } else { + filesNotExist += fileId } } val filesIdsCanDelete = Permission.checkPermissions(request.user, Permission.DeleteFile, resourceRefList.toList).approved.map(_.id) for (id <- filesIdsCanDelete) { - files.removeFile(id,Utils.baseUrl(request), request.apiKey, request.user) + val id_removed = files.removeFile(id,Utils.baseUrl(request), request.apiKey, request.user) + if (id_removed == true) { + filesDeleted += id.stringify + } else { + filesErrorDeleted += id.stringify + } } Ok(toJson(Map("status" -> "success"))) } diff --git a/app/services/FileService.scala b/app/services/FileService.scala index 317ea5a5d..25a46c6bd 100644 --- a/app/services/FileService.scala +++ b/app/services/FileService.scala @@ -54,7 +54,7 @@ trait FileService { /** * Remove the file from mongo */ - def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]) + def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]) : Boolean /** * List all files in the system. diff --git a/app/services/mongodb/MongoDBFileService.scala b/app/services/mongodb/MongoDBFileService.scala index a526c769b..df800507e 100644 --- a/app/services/mongodb/MongoDBFileService.scala +++ b/app/services/mongodb/MongoDBFileService.scala @@ -803,7 +803,7 @@ class MongoDBFileService @Inject() ( false, false, WriteConcern.Safe) } - def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]){ + def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]) : Boolean = { get(id) match{ case Some(file) => { if(!file.isIntermediate){ @@ -867,8 +867,12 @@ class MongoDBFileService @Inject() ( // finally remove metadata - if done before file is deleted, document metadataCounts won't match metadatas.removeMetadataByAttachTo(ResourceRef(ResourceRef.file, id), host, apiKey, user) + true + } + case None => { + Logger.debug("File not found") + false } - case None => Logger.debug("File not found") } } From 7828d433a4517bbcf962b7f3232aeeafbfa3bc95 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Mon, 17 May 2021 13:56:12 -0500 Subject: [PATCH 2/4] json returns list of files deleted, not found, no permission and error deleting --- app/api/Files.scala | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/api/Files.scala b/app/api/Files.scala index b7220fb12..376d4e8ea 100644 --- a/app/api/Files.scala +++ b/app/api/Files.scala @@ -1611,7 +1611,7 @@ class Files @Inject()( } def bulkDeleteFiles() = PrivateServerAction (parse.json) {implicit request=> - var filesToCheck : List[String] = List.empty[String] + var filesToCheck : ListBuffer[String] = ListBuffer.empty[String] var filesNotExist : ListBuffer[String] = ListBuffer.empty[String] var filesNoPermission : ListBuffer[String] = ListBuffer.empty[String] var filesDeleted : ListBuffer[String] = ListBuffer.empty[String] @@ -1619,7 +1619,7 @@ class Files @Inject()( request.user match { case Some(user) => { val fileIds = request.body.\("fileIds").asOpt[List[String]].getOrElse(List.empty[String]) - filesToCheck = fileIds + filesToCheck.appendAll(fileIds) if (fileIds.isEmpty){ BadRequest("No file ids supplied") } else { @@ -1632,10 +1632,12 @@ class Files @Inject()( resourceRefList += current_resource_ref } case None => { + filesToCheck -= fileId filesNotExist += fileId } } } else { + filesToCheck -= fileId filesNotExist += fileId } } @@ -1643,12 +1645,16 @@ class Files @Inject()( for (id <- filesIdsCanDelete) { val id_removed = files.removeFile(id,Utils.baseUrl(request), request.apiKey, request.user) if (id_removed == true) { + filesToCheck -= id.stringify filesDeleted += id.stringify } else { + filesToCheck -= id.stringify filesErrorDeleted += id.stringify } } - Ok(toJson(Map("status" -> "success"))) + Ok(toJson(Map("deleted"->filesDeleted.toList, "not found"->filesNotExist.toList, + "error deleting"->filesErrorDeleted.toList,"no permission"->filesToCheck.toList))) + // Ok(toJson(Map("status" -> "success"))) } } case None => { From 2e684fda09522bb2bbcfae7474d86c685d98a4f4 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Mon, 17 May 2021 13:56:37 -0500 Subject: [PATCH 3/4] no need for 'no permission' listbuffer --- app/api/Files.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/app/api/Files.scala b/app/api/Files.scala index 376d4e8ea..27c382932 100644 --- a/app/api/Files.scala +++ b/app/api/Files.scala @@ -1613,7 +1613,6 @@ class Files @Inject()( def bulkDeleteFiles() = PrivateServerAction (parse.json) {implicit request=> var filesToCheck : ListBuffer[String] = ListBuffer.empty[String] var filesNotExist : ListBuffer[String] = ListBuffer.empty[String] - var filesNoPermission : ListBuffer[String] = ListBuffer.empty[String] var filesDeleted : ListBuffer[String] = ListBuffer.empty[String] var filesErrorDeleted: ListBuffer[String] = ListBuffer.empty[String] request.user match { From 36dea14b754c26f3e75e06af9bdd4121fa6d6feb Mon Sep 17 00:00:00 2001 From: Luigi Marini Date: Wed, 7 Jul 2021 15:58:09 -0500 Subject: [PATCH 4/4] Updated CHANGELOG.md. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0825149f8..be4511057 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Added - Status endpoint will now show what storage is used +- `GET /api/files/bulkRemove` now returns status of files deleted, not found, no permission, errors. ### Fixed - Docker image for mongo-init now based on python:3.7-slim reduces size