Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 29 additions & 4 deletions app/api/Files.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
2 changes: 1 addition & 1 deletion app/services/FileService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
8 changes: 6 additions & 2 deletions app/services/mongodb/MongoDBFileService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand Down Expand Up @@ -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")
}
}

Expand Down