From c9406306c52398d93711a846b0675af849300d1c Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Mon, 5 Mar 2018 12:09:56 +0100
Subject: [PATCH] Support 'ownerId' property for /room/find

---
 .../java/de/thm/arsnova/persistance/RoomRepository.java  | 1 +
 .../persistance/couchdb/CouchDbRoomRepository.java       | 9 +++++++++
 .../de/thm/arsnova/services/RoomFindQueryService.java    | 3 +--
 src/main/java/de/thm/arsnova/services/RoomService.java   | 2 ++
 .../java/de/thm/arsnova/services/RoomServiceImpl.java    | 7 +++++++
 src/main/resources/couchdb/Room.design.js                | 7 +++++++
 6 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
index 2535a4cd6..2e89e3e24 100644
--- a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
@@ -30,6 +30,7 @@ public interface RoomRepository extends CrudRepository<Room, String> {
 	List<Room> findInactiveGuestRoomsMetadata(long lastActivityBefore);
 	List<Room> findByOwner(ClientAuthentication owner, int start, int limit);
 	List<Room> findByOwnerId(String ownerId, int start, int limit);
+	List<String> findIdsByOwnerId(String ownerId);
 	List<Room> findAllForPublicPool();
 	List<Room> findForPublicPoolByOwner(ClientAuthentication owner);
 	List<Room> getRoomsWithStatsForOwner(ClientAuthentication owner, int start, int limit);
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
index 50e457d79..b03c16b8b 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
@@ -287,6 +287,15 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 				Room.class);
 	}
 
+	@Override
+	public List<String> findIdsByOwnerId(final String ownerId) {
+		ViewResult result = db.queryView(createQuery("by_ownerid")
+				.key(ownerId)
+				.includeDocs(false));
+
+		return result.getRows().stream().map(ViewResult.Row::getId).collect(Collectors.toList());
+	}
+
 	@Override
 	public List<Room> findAllForPublicPool() {
 		// TODO replace with new view
diff --git a/src/main/java/de/thm/arsnova/services/RoomFindQueryService.java b/src/main/java/de/thm/arsnova/services/RoomFindQueryService.java
index d2be15025..c56a6c9b3 100644
--- a/src/main/java/de/thm/arsnova/services/RoomFindQueryService.java
+++ b/src/main/java/de/thm/arsnova/services/RoomFindQueryService.java
@@ -47,8 +47,7 @@ public class RoomFindQueryService implements FindQueryService<Room> {
 					.map(UserProfile.RoomHistoryEntry::getRoomId).collect(Collectors.toList()));
 		}
 		if (findQuery.getProperties().getOwnerId() != null) {
-			/* TODO: nyi */
-			// ids.add(roomService.getUserRooms(findQuery.getProperties().getOwnerId()));
+			ids.add(roomService.getUserRoomIds(findQuery.getProperties().getOwnerId()));
 		}
 
 		return ids.stream().flatMap(list -> list.stream()).collect(Collectors.toSet());
diff --git a/src/main/java/de/thm/arsnova/services/RoomService.java b/src/main/java/de/thm/arsnova/services/RoomService.java
index 77358a076..9c33d89b9 100644
--- a/src/main/java/de/thm/arsnova/services/RoomService.java
+++ b/src/main/java/de/thm/arsnova/services/RoomService.java
@@ -46,6 +46,8 @@ public interface RoomService extends EntityService<Room> {
 
 	List<Room> getUserRooms(String userId);
 
+	List<String> getUserRoomIds(String userId);
+
 	List<Room> getUserRoomHistory(String userId);
 
 	List<Room> getMyRooms(int offset, int limit);
diff --git a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
index 3efda3b0b..e70355428 100644
--- a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
@@ -250,6 +250,13 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		return roomRepository.findByOwnerId(userId, 0, 0);
 	}
 
+	/* TODO: Updated SpEL expression has not been tested yet */
+	@Override
+	@PreAuthorize("isAuthenticated() and hasPermission(#userId, 'userprofile', 'owner')")
+	public List<String> getUserRoomIds(String userId) {
+		return roomRepository.findIdsByOwnerId(userId);
+	}
+
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyRooms(final int offset, final int limit) {
diff --git a/src/main/resources/couchdb/Room.design.js b/src/main/resources/couchdb/Room.design.js
index 703528c46..a2999f96e 100644
--- a/src/main/resources/couchdb/Room.design.js
+++ b/src/main/resources/couchdb/Room.design.js
@@ -23,6 +23,13 @@ var designDoc = {
 				}
 			}
 		},
+		"by_ownerid": {
+			"map": function (doc) {
+				if (doc.type === "Room") {
+					emit(doc.ownerId, {_rev: doc._rev});
+				}
+			}
+		},
 		"by_lastactivity_for_guests": { /* needs rewrite */
 			"map": function (doc) {
 				if (doc.type === "Room" && !doc.poolProperties && doc.creator.indexOf("Guest") === 0) {
-- 
GitLab