Skip to content

Commit 5a43f21

Browse files
authored
Merge pull request #267 from clowder-framework/266-Add-when-parameter-in-api-datasets
266 add when parameter in api datasets, collections and spaces
2 parents 3e27a54 + 3454c4d commit 5a43f21

File tree

6 files changed

+214
-46
lines changed

6 files changed

+214
-46
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/)
55
and this project adheres to [Semantic Versioning](http://semver.org/).
66

7+
## Unreleased
8+
### Added
9+
- Add "when" parameter in a few GET API endpoints to enable pagination [#266](https://github.com/clowder-framework/clowder/issues/266)
10+
11+
712
## 1.18.1 - 2021-08-16
813

914
This release fixes a critical issue where invalid zip files could result in the files not being uploaded correctly. To check to see if you are affected, please use the following query:

app/api/Collections.scala

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -237,15 +237,15 @@ class Collections @Inject() (datasets: DatasetService,
237237
}
238238
}
239239

240-
def list(title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
241-
Ok(toJson(listCollections(title, date, limit, Set[Permission](Permission.ViewCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)))
240+
def list(when: Option[String], title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
241+
Ok(toJson(listCollections(when, title, date, limit, Set[Permission](Permission.ViewCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)))
242242
}
243243

244-
def listCanEdit(title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
245-
Ok(toJson(listCollections(title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)))
244+
def listCanEdit(when: Option[String], title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
245+
Ok(toJson(listCollections(when, title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)))
246246
}
247247

248-
def addDatasetToCollectionOptions(datasetId: UUID, title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
248+
def addDatasetToCollectionOptions(when: Option[String], datasetId: UUID, title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
249249
implicit val user = request.user
250250
var listAll = false
251251
var collectionList: List[Collection] = List.empty
@@ -265,7 +265,7 @@ class Collections @Inject() (datasets: DatasetService,
265265
}
266266
}
267267
if(listAll) {
268-
collectionList = listCollections(title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)
268+
collectionList = listCollections(when, title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false, request.user, request.user.fold(false)(_.superAdminMode), exact)
269269
}
270270
Ok(toJson(collectionList))
271271
}
@@ -274,10 +274,10 @@ class Collections @Inject() (datasets: DatasetService,
274274
collections.get(current_collections.map(_.child_collection_ids).flatten).found
275275
}
276276

277-
def listPossibleParents(currentCollectionId : String, title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
277+
def listPossibleParents(when: Option[String], currentCollectionId : String, title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
278278
val selfAndAncestors = collections.getSelfAndAncestors(UUID(currentCollectionId))
279279
val descendants = collections.getAllDescendants(UUID(currentCollectionId)).toList
280-
val allCollections = listCollections(title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false,
280+
val allCollections = listCollections(when, title, date, limit, Set[Permission](Permission.AddResourceToCollection, Permission.EditCollection), false,
281281
request.user, request.user.fold(false)(_.superAdminMode), exact)
282282
val possibleNewParents = allCollections.filter(c =>
283283
if(play.api.Play.current.plugin[services.SpaceSharingPlugin].isDefined) {
@@ -303,29 +303,55 @@ class Collections @Inject() (datasets: DatasetService,
303303
* Returns list of collections based on parameters and permissions.
304304
* TODO this needs to be cleaned up when do permissions for adding to a resource
305305
*/
306-
private def listCollections(title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], mine: Boolean, user: Option[User], superAdmin: Boolean, exact: Boolean) : List[Collection] = {
306+
private def listCollections(when: Option[String], title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], mine: Boolean, user: Option[User], superAdmin: Boolean, exact: Boolean) : List[Collection] = {
307307
if (mine && user.isEmpty) return List.empty[Collection]
308308

309-
(title, date) match {
310-
case (Some(t), Some(d)) => {
309+
(when, title, date) match {
310+
case (Some(w), Some(t), Some(d)) => {
311+
if (mine)
312+
collections.listUser(d, nextPage=(w=="a"), limit, t, user, superAdmin, user.get, exact)
313+
else
314+
collections.listAccess(d, nextPage=(w=="a"), limit, t, permission, user, superAdmin, true,false, exact)
315+
}
316+
case (Some(w), Some(t), None) => {
317+
if (mine)
318+
collections.listUser(limit, t, user, superAdmin, user.get, exact)
319+
else
320+
collections.listAccess(limit, t, permission, user, superAdmin, true,false, exact)
321+
}
322+
case (Some(w), None, Some(d)) => {
323+
if (mine)
324+
collections.listUser(d, nextPage=(w=="a"), limit, user, superAdmin, user.get)
325+
else
326+
collections.listAccess(d, nextPage=(w=="a"), limit, permission, user, superAdmin, true,false)
327+
}
328+
case (Some(w), None, None) => {
329+
if (mine)
330+
collections.listUser(limit, user, superAdmin, user.get)
331+
else
332+
collections.listAccess(limit, permission, user, superAdmin, true,false)
333+
}
334+
335+
// default when to be "after" if not present in parameters. i.e. nextPage=true
336+
case (None, Some(t), Some(d)) => {
311337
if (mine)
312338
collections.listUser(d, true, limit, t, user, superAdmin, user.get, exact)
313339
else
314340
collections.listAccess(d, true, limit, t, permission, user, superAdmin, true,false, exact)
315341
}
316-
case (Some(t), None) => {
342+
case (None, Some(t), None) => {
317343
if (mine)
318344
collections.listUser(limit, t, user, superAdmin, user.get, exact)
319345
else
320346
collections.listAccess(limit, t, permission, user, superAdmin, true,false, exact)
321347
}
322-
case (None, Some(d)) => {
348+
case (None, None, Some(d)) => {
323349
if (mine)
324350
collections.listUser(d, true, limit, user, superAdmin, user.get)
325351
else
326352
collections.listAccess(d, true, limit, permission, user, superAdmin, true,false)
327353
}
328-
case (None, None) => {
354+
case (None, None, None) => {
329355
if (mine)
330356
collections.listUser(limit, user, superAdmin, user.get)
331357
else

app/api/Datasets.scala

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,19 @@ class Datasets @Inject()(
6565
}
6666
}
6767

68-
def list(title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
69-
Ok(toJson(listDatasets(title, date, limit, Set[Permission](Permission.ViewDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
68+
def list(when: Option[String], title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
69+
Ok(toJson(listDatasets(when, title, date, limit, Set[Permission](Permission.ViewDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
7070
}
7171

72-
def listCanEdit(title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
73-
Ok(toJson(listDatasets(title, date, limit, Set[Permission](Permission.AddResourceToDataset, Permission.EditDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
72+
def listCanEdit(when: Option[String], title: Option[String], date: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
73+
Ok(toJson(listDatasets(when, title, date, limit, Set[Permission](Permission.AddResourceToDataset, Permission.EditDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
7474
}
7575

7676
def listMoveFileToDataset(file_id: UUID, title: Option[String], limit: Int, exact: Boolean) = PrivateServerAction { implicit request =>
7777
if (play.Play.application().configuration().getBoolean("datasetFileWithinSpace")) {
7878
Ok(toJson(listDatasetsInSpace(file_id, title, limit, Set[Permission](Permission.AddResourceToDataset, Permission.EditDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
7979
} else {
80-
Ok(toJson(listDatasets(title, None, limit, Set[Permission](Permission.AddResourceToDataset, Permission.EditDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
80+
Ok(toJson(listDatasets(None, title, None, limit, Set[Permission](Permission.AddResourceToDataset, Permission.EditDataset), request.user, request.user.fold(false)(_.superAdminMode), exact)))
8181
}
8282
}
8383

@@ -152,18 +152,31 @@ class Datasets @Inject()(
152152
/**
153153
* Returns list of datasets based on parameters and permissions.
154154
*/
155-
private def listDatasets(title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], user: Option[User], superAdmin: Boolean, exact: Boolean) : List[Dataset] = {
156-
(title, date) match {
157-
case (Some(t), Some(d)) => {
155+
private def listDatasets(when: Option[String], title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], user: Option[User], superAdmin: Boolean, exact: Boolean) : List[Dataset] = {
156+
(when, title, date) match {
157+
case (Some(w), Some(t), Some(d)) => {
158+
datasets.listAccess(d, nextPage=(w=="a"), limit, t, permission, user, superAdmin, true,false, exact)
159+
}
160+
case (Some(w), Some(t), None) => {
161+
datasets.listAccess(limit, t, permission, user, superAdmin, true,false, exact)
162+
}
163+
case (Some(w), None, Some(d)) => {
164+
datasets.listAccess(d, nextPage=(w=="a"), limit, permission, user, superAdmin, true,false)
165+
}
166+
case (Some(w), None, None) => {
167+
datasets.listAccess(limit, permission, user, superAdmin, true,false)
168+
}
169+
// default when to be "after" if not present in parameters. i.e. nextPage=true
170+
case (None, Some(t), Some(d)) => {
158171
datasets.listAccess(d, true, limit, t, permission, user, superAdmin, true,false, exact)
159172
}
160-
case (Some(t), None) => {
173+
case (None, Some(t), None) => {
161174
datasets.listAccess(limit, t, permission, user, superAdmin, true,false, exact)
162175
}
163-
case (None, Some(d)) => {
176+
case (None, None, Some(d)) => {
164177
datasets.listAccess(d, true, limit, permission, user, superAdmin, true,false)
165178
}
166-
case (None, None) => {
179+
case (None, None, None) => {
167180
datasets.listAccess(limit, permission, user, superAdmin, true,false)
168181
}
169182
}

app/api/Spaces.scala

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,45 +86,70 @@ class Spaces @Inject()(spaces: SpaceService,
8686
}
8787
}
8888

89-
def list(title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=false) { implicit request =>
90-
Ok(toJson(listSpaces(title, date, limit, Set[Permission](Permission.ViewSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
89+
def list(when: Option[String], title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=false) { implicit request =>
90+
Ok(toJson(listSpaces(when, title, date, limit, Set[Permission](Permission.ViewSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
9191
}
9292

93-
def listCanEdit(title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=true) { implicit request =>
94-
Ok(toJson(listSpaces(title, date, limit, Set[Permission](Permission.AddResourceToSpace, Permission.EditSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
93+
def listCanEdit(when: Option[String], title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=true) { implicit request =>
94+
Ok(toJson(listSpaces(when, title, date, limit, Set[Permission](Permission.AddResourceToSpace, Permission.EditSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
9595
}
9696

97-
def listCanEditNotAlreadyIn(collectionId : UUID, title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=true ){ implicit request =>
98-
Ok(toJson(listSpaces(title, date, limit, Set[Permission](Permission.AddResourceToSpace, Permission.EditSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
97+
def listCanEditNotAlreadyIn(when: Option[String], collectionId : UUID, title: Option[String], date: Option[String], limit: Int) = UserAction(needActive=true ){ implicit request =>
98+
Ok(toJson(listSpaces(when, title, date, limit, Set[Permission](Permission.AddResourceToSpace, Permission.EditSpace), false, request.user, request.user.fold(false)(_.superAdminMode), true).map(spaceToJson)))
9999
}
100100

101101
/**
102102
* Returns list of collections based on parameters and permissions.
103103
* TODO this needs to be cleaned up when do permissions for adding to a resource
104104
*/
105-
private def listSpaces(title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], mine: Boolean, user: Option[User], superAdmin: Boolean, showPublic: Boolean, onlyTrial: Boolean = false) : List[ProjectSpace] = {
105+
private def listSpaces(when: Option[String], title: Option[String], date: Option[String], limit: Int, permission: Set[Permission], mine: Boolean, user: Option[User], superAdmin: Boolean, showPublic: Boolean, onlyTrial: Boolean = false) : List[ProjectSpace] = {
106106
if (mine && user.isEmpty) return List.empty[ProjectSpace]
107107

108-
(title, date) match {
109-
case (Some(t), Some(d)) => {
108+
(when, title, date) match {
109+
case (Some(w), Some(t), Some(d)) => {
110+
if (mine)
111+
spaces.listUser(d, nextPage=(w=="a"), limit, t, user, superAdmin, user.get)
112+
else
113+
spaces.listAccess(d, nextPage=(w=="a"), limit, t, permission, user, superAdmin, showPublic, showOnlyShared = false)
114+
}
115+
case (Some(w), Some(t), None) => {
116+
if (mine)
117+
spaces.listUser(limit, t, user, superAdmin, user.get)
118+
else
119+
spaces.listAccess(limit, t, permission, user, superAdmin, showPublic, showOnlyShared = false)
120+
}
121+
case (Some(w), None, Some(d)) => {
122+
if (mine)
123+
spaces.listUser(d, nextPage=(w=="a"), limit, user, superAdmin, user.get)
124+
else
125+
spaces.listAccess(d, nextPage=(w=="a"), limit, permission, user, superAdmin, showPublic, onlyTrial, showOnlyShared = false)
126+
}
127+
case (Some(w), None, None) => {
128+
if (mine)
129+
spaces.listUser(limit, user, superAdmin, user.get)
130+
else
131+
spaces.listAccess(limit, permission, user, superAdmin, showPublic, onlyTrial, showOnlyShared = false)
132+
}
133+
// default when to be "after" if not present in parameters. i.e. nextPage=true
134+
case (None, Some(t), Some(d)) => {
110135
if (mine)
111136
spaces.listUser(d, true, limit, t, user, superAdmin, user.get)
112137
else
113138
spaces.listAccess(d, true, limit, t, permission, user, superAdmin, showPublic, showOnlyShared = false)
114139
}
115-
case (Some(t), None) => {
140+
case (None, Some(t), None) => {
116141
if (mine)
117142
spaces.listUser(limit, t, user, superAdmin, user.get)
118143
else
119144
spaces.listAccess(limit, t, permission, user, superAdmin, showPublic, showOnlyShared = false)
120145
}
121-
case (None, Some(d)) => {
146+
case (None, None, Some(d)) => {
122147
if (mine)
123148
spaces.listUser(d, true, limit, user, superAdmin, user.get)
124149
else
125150
spaces.listAccess(d, true, limit, permission, user, superAdmin, showPublic, onlyTrial, showOnlyShared = false)
126151
}
127-
case (None, None) => {
152+
case (None, None, None) => {
128153
if (mine)
129154
spaces.listUser(limit, user, superAdmin, user.get)
130155
else

0 commit comments

Comments
 (0)