From 4a0185a31266d09d14e59f94cc702fd15f7add74 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Sat, 15 May 2021 15:21:56 -0500 Subject: [PATCH 1/4] new method adds folder id and name to file in datasets files endpoint --- app/api/Datasets.scala | 74 +++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/app/api/Datasets.scala b/app/api/Datasets.scala index aa49176ea..4558e5a8b 100644 --- a/app/api/Datasets.scala +++ b/app/api/Datasets.scala @@ -1,40 +1,34 @@ package api -import java.io._ -import java.io.{File => JFile} -import java.net.URL -import java.security.{DigestInputStream, MessageDigest} -import java.text.SimpleDateFormat -import java.util.{Calendar, Date} - +import _root_.util._ import api.Permission.Permission -import java.util.zip._ - -import javax.inject.{Inject, Singleton} +import controllers.Utils.https import controllers.{Previewers, Utils} import jsonutils.JsonUtil import models._ import org.apache.commons.codec.binary.Hex import org.json.JSONObject import play.api.Logger -import play.api.Play.{configuration, current, routes} +import play.api.Play.{configuration, current} import play.api.i18n.Messages +import play.api.libs.Files import play.api.libs.concurrent.Execution.Implicits._ import play.api.libs.iteratee.Enumerator -import play.api.libs.json._ import play.api.libs.json.Json._ -import play.api.mvc.{Action, AnyContent, MultipartFormData, SimpleResult} -import services._ -import _root_.util._ -import controllers.Utils.https -import org.json.simple.{JSONArray, JSONObject => SimpleJSONObject} -import org.json.simple.parser.JSONParser -import play.api.libs.Files -import play.api.libs.Files.TemporaryFile +import play.api.libs.json._ +import play.api.mvc.{AnyContent, MultipartFormData, SimpleResult} import scalax.file.Path.createTempFile +import services._ -import scala.concurrent.{ExecutionContext, Future} +import java.io._ +import java.net.URL +import java.security.{DigestInputStream, MessageDigest} +import java.text.SimpleDateFormat +import java.util.zip._ +import java.util.{Calendar, Date} +import javax.inject.{Inject, Singleton} import scala.collection.mutable.{ListBuffer, Map => MutaMap} +import scala.concurrent.{ExecutionContext, Future} /** * Dataset API. @@ -1134,15 +1128,18 @@ class Datasets @Inject()( private def getFilesWithinFolders(id: UUID, serveradmin: Boolean=false, max: Int = -1): List[JsValue] = { val output = new ListBuffer[JsValue]() var resultCount = 0 + var current_folder : Option[Folder] = None datasets.get(id) match { case Some(dataset) => { - folders.findByParentDatasetId(id).map { folder => + folders.findByParentDatasetId(id).foreach { folder => + current_folder = Some(folder) files.get(folder.files).found.foreach(file => { if (max < 0 || resultCount < max) { - output += jsonFile(file, serveradmin) + output += jsonFileWithFolder(file, current_folder.get, serveradmin) resultCount += 1 } }) + print("done with folder") } } case None => Logger.error(s"Error getting dataset $id") @@ -1150,6 +1147,37 @@ class Datasets @Inject()( output.toList } + def jsonFileWithFolder(file: models.File, folder: models.Folder, serverAdmin: Boolean = false) : JsValue = { + + val folderMap : JsValue = Json.obj("id"->folder.id, "name"->folder.name) + val defaultMap : JsValue = Json.obj( + "id" -> file.id.toString, + "filename" -> file.filename, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "folders"->folderMap, + "size" -> file.length.toString) + + // Only include filepath if using DiskByte storage and user is serverAdmin + val jsonMap = file.loader match { + case "services.filesystem.DiskByteStorageService" => { + if (serverAdmin) + Json.obj( + "id" -> file.id.toString, + "filename" -> file.filename, + "filepath" -> file.loader_id, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "folders"->folderMap, + "size" -> file.length.toString) + else + defaultMap + } + case _ => defaultMap + } + toJson(jsonMap) + } + def jsonFile(file: models.File, serverAdmin: Boolean = false): JsValue = { val defaultMap = Map( "id" -> file.id.toString, From 70faf2582b14fcf1d0c58c1ceb023773d8022a85 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Sat, 15 May 2021 17:04:23 -0500 Subject: [PATCH 2/4] adding CHANGELOG.md entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c428d6a5b..6ae9a7d8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +- Added folder and folder id to api datasets files list [#34](https://github.com/clowder-framework/clowder/issues/34) ### Fixed - Added index for comments, will speed up index creation From 8f1f240b8c5fde55b5317e0480f9e5de19546056 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Mon, 17 May 2021 13:23:34 -0500 Subject: [PATCH 3/4] using a case for jsonFile removing jsonFileWithFolder --- app/api/Datasets.scala | 117 +++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/app/api/Datasets.scala b/app/api/Datasets.scala index 4558e5a8b..04d8dac82 100644 --- a/app/api/Datasets.scala +++ b/app/api/Datasets.scala @@ -1135,7 +1135,7 @@ class Datasets @Inject()( current_folder = Some(folder) files.get(folder.files).found.foreach(file => { if (max < 0 || resultCount < max) { - output += jsonFileWithFolder(file, current_folder.get, serveradmin) + output += jsonFile(file, serveradmin, Some(folder)) resultCount += 1 } }) @@ -1147,62 +1147,65 @@ class Datasets @Inject()( output.toList } - def jsonFileWithFolder(file: models.File, folder: models.Folder, serverAdmin: Boolean = false) : JsValue = { - - val folderMap : JsValue = Json.obj("id"->folder.id, "name"->folder.name) - val defaultMap : JsValue = Json.obj( - "id" -> file.id.toString, - "filename" -> file.filename, - "contentType" -> file.contentType, - "date-created" -> file.uploadDate.toString(), - "folders"->folderMap, - "size" -> file.length.toString) - - // Only include filepath if using DiskByte storage and user is serverAdmin - val jsonMap = file.loader match { - case "services.filesystem.DiskByteStorageService" => { - if (serverAdmin) - Json.obj( - "id" -> file.id.toString, - "filename" -> file.filename, - "filepath" -> file.loader_id, - "contentType" -> file.contentType, - "date-created" -> file.uploadDate.toString(), - "folders"->folderMap, - "size" -> file.length.toString) - else - defaultMap - } - case _ => defaultMap - } - toJson(jsonMap) - } - - def jsonFile(file: models.File, serverAdmin: Boolean = false): JsValue = { - val defaultMap = Map( - "id" -> file.id.toString, - "filename" -> file.filename, - "contentType" -> file.contentType, - "date-created" -> file.uploadDate.toString(), - "size" -> file.length.toString) - - // Only include filepath if using DiskByte storage and user is serverAdmin - val jsonMap = file.loader match { - case "services.filesystem.DiskByteStorageService" => { - if (serverAdmin) - Map( - "id" -> file.id.toString, - "filename" -> file.filename, - "filepath" -> file.loader_id, - "contentType" -> file.contentType, - "date-created" -> file.uploadDate.toString(), - "size" -> file.length.toString) - else - defaultMap - } - case _ => defaultMap - } - toJson(jsonMap) + + def jsonFile(file: models.File, serverAdmin: Boolean = false, folder : Option[Folder] = None): JsValue = { + folder match { + case Some(f) => { + val folderMap : JsValue = Json.obj("id"->f.id, "name"->f.name) + val defaultMap : JsValue = Json.obj( + "id" -> file.id.toString, + "filename" -> file.filename, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "folders"->folderMap, + "size" -> file.length.toString) + + // Only include filepath if using DiskByte storage and user is serverAdmin + val jsonMap = file.loader match { + case "services.filesystem.DiskByteStorageService" => { + if (serverAdmin) + Json.obj( + "id" -> file.id.toString, + "filename" -> file.filename, + "filepath" -> file.loader_id, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "folders"->folderMap, + "size" -> file.length.toString) + else + defaultMap + } + case _ => defaultMap + } + toJson(jsonMap) + } + case None => { + val defaultMap = Map( + "id" -> file.id.toString, + "filename" -> file.filename, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "size" -> file.length.toString) + + // Only include filepath if using DiskByte storage and user is serverAdmin + val jsonMap = file.loader match { + case "services.filesystem.DiskByteStorageService" => { + if (serverAdmin) + Map( + "id" -> file.id.toString, + "filename" -> file.filename, + "filepath" -> file.loader_id, + "contentType" -> file.contentType, + "date-created" -> file.uploadDate.toString(), + "size" -> file.length.toString) + else + defaultMap + } + case _ => defaultMap + } + toJson(jsonMap) + } + } } //Update Dataset Information code starts From 78cc6d5d4989d7789c4866056fd310fcfd5dc4e0 Mon Sep 17 00:00:00 2001 From: tcnichol Date: Mon, 17 May 2021 13:34:45 -0500 Subject: [PATCH 4/4] fixing spacing --- app/api/Datasets.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/app/api/Datasets.scala b/app/api/Datasets.scala index 04d8dac82..b1178c732 100644 --- a/app/api/Datasets.scala +++ b/app/api/Datasets.scala @@ -927,6 +927,7 @@ class Datasets @Inject()( } } + def getMetadataDefinitions(id: UUID, currentSpace: Option[String]) = PermissionAction(Permission.AddMetadata, Some(ResourceRef(ResourceRef.dataset, id))) { implicit request => implicit val user = request.user datasets.get(id) match {