diff --git a/CHANGELOG.md b/CHANGELOG.md index c38c05a22..14f165113 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,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 diff --git a/app/api/Files.scala b/app/api/Files.scala index d6239e756..b306d2d02 100644 --- a/app/api/Files.scala +++ b/app/api/Files.scala @@ -1611,24 +1611,49 @@ 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 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.appendAll(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 => { + filesToCheck -= fileId + filesNotExist += fileId + } + } + } else { + filesToCheck -= fileId + 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) { + 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 => { diff --git a/app/services/FileService.scala b/app/services/FileService.scala index 4c26210b2..9558e7daf 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 e5225ad41..ca38a846a 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") } }