From d207941167245aaca3c08ef6c7f23c83ee6d1753 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Fri, 19 Jan 2018 21:06:55 +0100
Subject: [PATCH] Use ownerId instead of username for Room handling

---
 .../arsnova/controller/SessionController.java |  3 +-
 .../arsnova/persistance/RoomRepository.java   | 12 +++----
 .../couchdb/CouchDbRoomRepository.java        | 32 +++++++++---------
 .../de/thm/arsnova/services/RoomService.java  |  2 +-
 .../thm/arsnova/services/RoomServiceImpl.java | 12 +++----
 src/main/resources/couchdb/Room.design.js     | 33 +++++++++----------
 6 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 889f471aa..bf8526cf4 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -162,9 +162,10 @@ public class SessionController extends PaginationController {
 		List<Room> rooms;
 
 		if (!"".equals(username)) {
+			final String userId = userService.getByUsername(username).getId();
 			try {
 				if (ownedOnly && !visitedOnly) {
-					rooms = roomService.getUserSessions(username);
+					rooms = roomService.getUserSessions(userId);
 				} else if (visitedOnly && !ownedOnly) {
 					rooms = roomService.getUserVisitedSessions(username);
 				} else {
diff --git a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
index b9e577ab3..d7b5d111d 100644
--- a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
@@ -29,14 +29,14 @@ import java.util.List;
 public interface RoomRepository extends CrudRepository<Room, String> {
 	Room findByKeyword(String keyword);
 	List<Room> findInactiveGuestSessionsMetadata(long lastActivityBefore);
-	List<Room> findByUser(UserAuthentication user, int start, int limit);
-	List<Room> findByUsername(String username, int start, int limit);
+	List<Room> findByOwner(UserAuthentication owner, int start, int limit);
+	List<Room> findByOwnerId(String ownerId, int start, int limit);
 	List<Room> findAllForPublicPool();
-	List<Room> findForPublicPoolByUser(UserAuthentication user);
-	List<Room> getRoomsWithStatsForUser(UserAuthentication user, int start, int limit);
-	List<Room> getVisitedRoomsWithStatsForUser(List<Room> rooms, UserAuthentication user);
+	List<Room> findForPublicPoolByOwner(UserAuthentication owner);
+	List<Room> getRoomsWithStatsForOwner(UserAuthentication owner, int start, int limit);
+	List<Room> getVisitedRoomsWithStatsForOwner(List<Room> rooms, UserAuthentication owner);
 	List<Room> findInfosForPublicPool();
-	List<Room> findInfosForPublicPoolByUser(UserAuthentication user);
+	List<Room> findInfosForPublicPoolByOwner(UserAuthentication owner);
 	List<Room> findSessionsByCourses(List<Course> courses);
 	Room importSession(UserAuthentication user, ImportExportSession importSession);
 	ImportExportSession exportSession(String sessionkey, Boolean withAnswer, Boolean withFeedbackQuestions);
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 0a3a18a10..af61629e0 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
@@ -268,22 +268,22 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	@Override
-	public List<Room> findByUser(final UserAuthentication user, final int start, final int limit) {
-		return findByUsername(user.getUsername(), start, limit);
+	public List<Room> findByOwner(final UserAuthentication owner, final int start, final int limit) {
+		return findByOwnerId(owner.getId(), start, limit);
 	}
 
 	@Override
-	public List<Room> findByUsername(final String username, final int start, final int limit) {
+	public List<Room> findByOwnerId(final String ownerId, final int start, final int limit) {
 		final int qSkip = start > 0 ? start : -1;
 		final int qLimit = limit > 0 ? limit : -1;
 
 		/* TODO: Only load IDs and check against cache for data. */
 		return db.queryView(
-				createQuery("partial_by_sessiontype_creator_name")
+				createQuery("partial_by_pool_ownerid_name")
 						.skip(qSkip)
 						.limit(qLimit)
-						.startKey(ComplexKey.of(null, username))
-						.endKey(ComplexKey.of(null, username, ComplexKey.emptyObject()))
+						.startKey(ComplexKey.of(false, ownerId))
+						.endKey(ComplexKey.of(false, ownerId, ComplexKey.emptyObject()))
 						.includeDocs(true),
 				Room.class);
 	}
@@ -301,20 +301,20 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	@Override
-	public List<Room> findForPublicPoolByUser(final UserAuthentication user) {
+	public List<Room> findForPublicPoolByOwner(final UserAuthentication owner) {
 		/* TODO: Only load IDs and check against cache for data. */
 		return db.queryView(
-				createQuery("partial_by_sessiontype_creator_name")
-						.startKey(ComplexKey.of("public_pool", user.getUsername()))
-						.endKey(ComplexKey.of("public_pool", user.getUsername(), ComplexKey.emptyObject()))
+				createQuery("partial_by_pool_ownerid_name")
+						.startKey(ComplexKey.of(true, owner.getId()))
+						.endKey(ComplexKey.of(true, owner.getId(), ComplexKey.emptyObject()))
 						.includeDocs(true),
 				Room.class);
 	}
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<Room> findInfosForPublicPoolByUser(final UserAuthentication user) {
-		final List<Room> rooms = this.findForPublicPoolByUser(user);
+	public List<Room> findInfosForPublicPoolByOwner(final UserAuthentication owner) {
+		final List<Room> rooms = this.findForPublicPoolByOwner(owner);
 		if (rooms.isEmpty()) {
 			return new ArrayList<>();
 		}
@@ -323,8 +323,8 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<Room> getRoomsWithStatsForUser(final UserAuthentication user, final int start, final int limit) {
-		final List<Room> sessions = this.findByUser(user, start, limit);
+	public List<Room> getRoomsWithStatsForOwner(final UserAuthentication owner, final int start, final int limit) {
+		final List<Room> sessions = this.findByOwner(owner, start, limit);
 		if (sessions.isEmpty()) {
 			return new ArrayList<>();
 		}
@@ -347,9 +347,9 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	/* TODO: Move to service layer. */
-	public List<Room> getVisitedRoomsWithStatsForUser(final List<Room> rooms, final UserAuthentication user) {
+	public List<Room> getVisitedRoomsWithStatsForOwner(final List<Room> rooms, final UserAuthentication owner) {
 		final ViewQuery answeredQuestionsView = createQuery("by_user_sessionid").designDocId("_design/Answer")
-				.keys(rooms.stream().map(session -> ComplexKey.of(user.getUsername(), session.getId())).collect(Collectors.toList()));
+				.keys(rooms.stream().map(session -> ComplexKey.of(owner.getUsername(), session.getId())).collect(Collectors.toList()));
 		final ViewQuery contentIdsView = createQuery("by_sessionid").designDocId("_design/Content")
 				.keys(rooms.stream().map(Room::getId).collect(Collectors.toList()));
 
diff --git a/src/main/java/de/thm/arsnova/services/RoomService.java b/src/main/java/de/thm/arsnova/services/RoomService.java
index 683fbc7c3..87ec7bdc3 100644
--- a/src/main/java/de/thm/arsnova/services/RoomService.java
+++ b/src/main/java/de/thm/arsnova/services/RoomService.java
@@ -42,7 +42,7 @@ public interface RoomService extends EntityService<Room> {
 
 	String generateKey();
 
-	List<Room> getUserSessions(String username);
+	List<Room> getUserSessions(String userId);
 
 	List<Room> getUserVisitedSessions(String username);
 
diff --git a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
index 0e1eb28a7..8b16210cb 100644
--- a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
@@ -254,14 +254,14 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 
 	@Override
 	@PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')")
-	public List<Room> getUserSessions(String username) {
-		return roomRepository.findByUsername(username, 0, 0);
+	public List<Room> getUserSessions(String userId) {
+		return roomRepository.findByOwnerId(userId, 0, 0);
 	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMySessions(final int offset, final int limit) {
-		return roomRepository.findByUser(userService.getCurrentUser(), offset, limit);
+		return roomRepository.findByOwner(userService.getCurrentUser(), offset, limit);
 	}
 
 	@Override
@@ -273,14 +273,14 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyPublicPoolSessionsInfo() {
-		return roomRepository.findInfosForPublicPoolByUser(userService.getCurrentUser());
+		return roomRepository.findInfosForPublicPoolByOwner(userService.getCurrentUser());
 	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMySessionsInfo(final int offset, final int limit) {
 		final UserAuthentication user = userService.getCurrentUser();
-		return roomRepository.getRoomsWithStatsForUser(user, offset, limit);
+		return roomRepository.getRoomsWithStatsForOwner(user, offset, limit);
 	}
 
 	@Override
@@ -306,7 +306,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyVisitedSessionsInfo(final int offset, final int limit) {
 		List<Room> rooms = getMyVisitedSessions(0, 0);
-		roomRepository.getVisitedRoomsWithStatsForUser(rooms, userService.getCurrentUser());
+		roomRepository.getVisitedRoomsWithStatsForOwner(rooms, userService.getCurrentUser());
 
 		return rooms;
 	}
diff --git a/src/main/resources/couchdb/Room.design.js b/src/main/resources/couchdb/Room.design.js
index 8f29c8607..bde7ba5bf 100644
--- a/src/main/resources/couchdb/Room.design.js
+++ b/src/main/resources/couchdb/Room.design.js
@@ -4,46 +4,45 @@ var designDoc = {
 	"views": {
 		"by_courseid": {
 			"map": function (doc) {
-				if (doc.type === "Room" && doc.courseId  && doc.sessionType !== "public_pool") {
+				if (doc.type === "Room" && doc.courseId  && !doc.poolProperties) {
 					emit(doc.courseId, {_rev: doc._rev});
 				}
 			}
 		},
-		"by_keyword": {
+		"by_shortid": {
 			"map": function (doc) {
 				if (doc.type === "Room") {
-					emit(doc.keyword, {_rev: doc._rev});
+					emit(doc.shortId, {_rev: doc._rev});
 				}
 			}
 		},
-		"by_lastactivity_for_guests": {
+		"by_lastactivity_for_guests": { /* needs rewrite */
 			"map": function (doc) {
-				if (doc.type === "Room" && doc.sessionType !== "public_pool" && doc.creator.indexOf("Guest") === 0) {
-					emit(doc.lastOwnerActivity || doc.creationTime, {_rev: doc._rev});
+				if (doc.type === "Room" && !doc.poolProperties && doc.creator.indexOf("Guest") === 0) {
+					emit(doc.lastOwnerActivity || doc.creationTimestamp, {_rev: doc._rev});
 				}
 			}
 		},
-		"partial_by_sessiontype_creator_name": {
+		"partial_by_pool_ownerid_name": {
 			"map": function (doc) {
 				if (doc.type === "Room") {
-					emit([doc.sessionType, doc.creator, doc.name], {
-						shortName: doc.shortName,
-						keyword: doc.keyword,
-						active: doc.active,
+					emit([!!doc.poolProperties, doc.ownerId, doc.name], {
+						abbreviation: doc.abbreviation,
+						shortId: doc.shortId,
+						locked: doc.locked,
 						courseType: doc.courseType,
-						creationTime: doc.creationTime
+						creationTimestamp: doc.creationTimestamp
 					});
 				}
 			}
 		},
 		"partial_by_subject_name_for_publicpool": {
 			"map": function (doc) {
-				if (doc.type === "Room" && doc.sessiontype === "public_pool") {
-					emit([doc.ppSubject, doc.name], {
-						ppSubject: doc.ppSubject,
+				if (doc.type === "Room" && doc.poolProperties) {
+					emit([doc.poolProperties.category, doc.name], {
 						name: doc.name,
-						keyword: doc.keyword,
-						ppLevel: doc.ppLevel
+						shortId: doc.shortId,
+						poolProperties: doc.poolProperties
 					});
 				}
 			}
-- 
GitLab