Skip to content

Commit ccfe3df

Browse files
tcnichollmarini
andauthored
209 bulk delete permissions (#230)
* adding new lists - to return json with more info * json returns list of files deleted, not found, no permission and error deleting * no need for 'no permission' listbuffer * Updated CHANGELOG.md. Co-authored-by: Luigi Marini <[email protected]> Co-authored-by: Luigi Marini <[email protected]>
1 parent d1d7166 commit ccfe3df

File tree

4 files changed

+37
-7
lines changed

4 files changed

+37
-7
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1919

2020
### Added
2121
- Status endpoint will now show what storage is used
22+
- `GET /api/files/bulkRemove` now returns status of files deleted, not found, no permission, errors.
2223

2324
### Fixed
2425
- Docker image for mongo-init now based on python:3.7-slim reduces size

app/api/Files.scala

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,24 +1611,49 @@ class Files @Inject()(
16111611
}
16121612

16131613
def bulkDeleteFiles() = PrivateServerAction (parse.json) {implicit request=>
1614+
var filesToCheck : ListBuffer[String] = ListBuffer.empty[String]
1615+
var filesNotExist : ListBuffer[String] = ListBuffer.empty[String]
1616+
var filesDeleted : ListBuffer[String] = ListBuffer.empty[String]
1617+
var filesErrorDeleted: ListBuffer[String] = ListBuffer.empty[String]
16141618
request.user match {
16151619
case Some(user) => {
16161620
val fileIds = request.body.\("fileIds").asOpt[List[String]].getOrElse(List.empty[String])
1621+
filesToCheck.appendAll(fileIds)
16171622
if (fileIds.isEmpty){
16181623
BadRequest("No file ids supplied")
16191624
} else {
16201625
var resourceRefList: ListBuffer[ResourceRef] = ListBuffer.empty[ResourceRef]
16211626
for (fileId <- fileIds) {
16221627
if (UUID.isValid(fileId)) {
1623-
val current_resource_ref = ResourceRef(ResourceRef.file, UUID(fileId))
1624-
resourceRefList += current_resource_ref
1628+
files.get(UUID(fileId)) match {
1629+
case Some(currentFile) => {
1630+
val current_resource_ref = ResourceRef(ResourceRef.file, UUID(fileId))
1631+
resourceRefList += current_resource_ref
1632+
}
1633+
case None => {
1634+
filesToCheck -= fileId
1635+
filesNotExist += fileId
1636+
}
1637+
}
1638+
} else {
1639+
filesToCheck -= fileId
1640+
filesNotExist += fileId
16251641
}
16261642
}
16271643
val filesIdsCanDelete = Permission.checkPermissions(request.user, Permission.DeleteFile, resourceRefList.toList).approved.map(_.id)
16281644
for (id <- filesIdsCanDelete) {
1629-
files.removeFile(id,Utils.baseUrl(request), request.apiKey, request.user)
1645+
val id_removed = files.removeFile(id,Utils.baseUrl(request), request.apiKey, request.user)
1646+
if (id_removed == true) {
1647+
filesToCheck -= id.stringify
1648+
filesDeleted += id.stringify
1649+
} else {
1650+
filesToCheck -= id.stringify
1651+
filesErrorDeleted += id.stringify
1652+
}
16301653
}
1631-
Ok(toJson(Map("status" -> "success")))
1654+
Ok(toJson(Map("deleted"->filesDeleted.toList, "not found"->filesNotExist.toList,
1655+
"error deleting"->filesErrorDeleted.toList,"no permission"->filesToCheck.toList)))
1656+
// Ok(toJson(Map("status" -> "success")))
16321657
}
16331658
}
16341659
case None => {

app/services/FileService.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ trait FileService {
5454
/**
5555
* Remove the file from mongo
5656
*/
57-
def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User])
57+
def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]) : Boolean
5858

5959
/**
6060
* List all files in the system.

app/services/mongodb/MongoDBFileService.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ class MongoDBFileService @Inject() (
803803
false, false, WriteConcern.Safe)
804804
}
805805

806-
def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]){
806+
def removeFile(id: UUID, host: String, apiKey: Option[String], user: Option[User]) : Boolean = {
807807
get(id) match{
808808
case Some(file) => {
809809
if(!file.isIntermediate){
@@ -867,8 +867,12 @@ class MongoDBFileService @Inject() (
867867

868868
// finally remove metadata - if done before file is deleted, document metadataCounts won't match
869869
metadatas.removeMetadataByAttachTo(ResourceRef(ResourceRef.file, id), host, apiKey, user)
870+
true
871+
}
872+
case None => {
873+
Logger.debug("File not found")
874+
false
870875
}
871-
case None => Logger.debug("File not found")
872876
}
873877
}
874878

0 commit comments

Comments
 (0)