From db95930a096f343059be607f5900a1b8fe5b79ff Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Fri, 9 Feb 2018 13:21:28 +0100
Subject: [PATCH] Reimplement /userlist for /v2

Additionally, remove obsolete MotdListRepository.
---
 .../thm/arsnova/config/PersistanceConfig.java |  5 ---
 .../arsnova/controller/v2/MotdController.java | 29 +++++++++++++
 .../entities/migration/FromV2Migrator.java    |  7 ++-
 .../persistance/MotdListRepository.java       |  8 ----
 .../couchdb/CouchDbMotdListRepository.java    | 43 -------------------
 .../arsnova/config/TestPersistanceConfig.java |  5 ---
 6 files changed, 35 insertions(+), 62 deletions(-)
 delete mode 100644 src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
 delete mode 100644 src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java

diff --git a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
index 8dda92a9e..34bf32e53 100644
--- a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
+++ b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
@@ -95,11 +95,6 @@ public class PersistanceConfig {
 		return new CouchDbMotdRepository(couchDbConnector(), false);
 	}
 
-	@Bean
-	public MotdListRepository motdListRepository() throws Exception {
-		return new CouchDbMotdListRepository(couchDbConnector(), false);
-	}
-
 	@Bean
 	public VisitedSessionRepository visitedSessionRepository() throws Exception {
 		return new CouchDbVisitedSessionRepository(couchDbConnector(), false);
diff --git a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
index 572c7f6fd..141cdea0c 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
@@ -18,10 +18,15 @@
 package de.thm.arsnova.controller.v2;
 
 import de.thm.arsnova.controller.AbstractController;
+import de.thm.arsnova.entities.UserProfile;
 import de.thm.arsnova.entities.migration.FromV2Migrator;
 import de.thm.arsnova.entities.migration.ToV2Migrator;
 import de.thm.arsnova.entities.migration.v2.Motd;
+import de.thm.arsnova.entities.migration.v2.MotdList;
+import de.thm.arsnova.exceptions.ForbiddenException;
+import de.thm.arsnova.security.User;
 import de.thm.arsnova.services.MotdService;
+import de.thm.arsnova.services.UserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -29,6 +34,7 @@ import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -52,6 +58,9 @@ public class MotdController extends AbstractController {
 	@Autowired
 	private MotdService motdService;
 
+	@Autowired
+	private UserService userService;
+
 	@Autowired
 	private ToV2Migrator toV2Migrator;
 
@@ -139,4 +148,24 @@ public class MotdController extends AbstractController {
 			motdService.delete(motd);
 		}
 	}
+
+	@RequestMapping(value = "/userlist", method =  RequestMethod.GET)
+	public MotdList getAcknowledgedIds(@AuthenticationPrincipal User user, @RequestParam final String username) {
+		if (user == null || !user.getUsername().equals(username)) {
+			throw new ForbiddenException();
+		}
+		UserProfile profile = userService.get(user.getId());
+
+		return toV2Migrator.migrateMotdList(profile);
+	}
+
+	@RequestMapping(value = "/userlist", method =  RequestMethod.PUT)
+	public void putAcknowledgedIds(@AuthenticationPrincipal User user, @RequestBody final MotdList motdList) {
+		if (user == null || !user.getUsername().equals(motdList.getUsername())) {
+			throw new ForbiddenException();
+		}
+		UserProfile profile = userService.get(user.getId());
+		profile.setAcknowledgedMotds(fromV2Migrator.migrate(motdList));
+		userService.update(profile);
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
index 29793bb61..cb515d594 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
@@ -28,6 +28,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -79,12 +80,16 @@ public class FromV2Migrator {
 			profile.setRoomHistory(sessionHistory);
 		}
 		if (motdList != null && motdList.getMotdkeys() != null) {
-			profile.setAcknowledgedMotds(Arrays.stream(motdList.getMotdkeys().split(",")).collect(Collectors.toSet()));
+			profile.setAcknowledgedMotds(migrate(motdList));
 		}
 
 		return profile;
 	}
 
+	public Set<String> migrate(final MotdList motdList) {
+		return Arrays.stream(motdList.getMotdkeys().split(",")).collect(Collectors.toSet());
+	}
+
 	public de.thm.arsnova.entities.Room migrate(final Room from, final Optional<UserProfile> owner) {
 		if (!owner.isPresent() && from.getCreator() != null ||
 				owner.isPresent() && !owner.get().getLoginId().equals(from.getCreator())) {
diff --git a/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java b/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
deleted file mode 100644
index a407c7ecc..000000000
--- a/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.thm.arsnova.persistance;
-
-import de.thm.arsnova.entities.migration.v2.MotdList;
-
-public interface MotdListRepository {
-	MotdList findByUsername(String username);
-	MotdList save(MotdList motdlist);
-}
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java
deleted file mode 100644
index dcdb8ead1..000000000
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package de.thm.arsnova.persistance.couchdb;
-
-import de.thm.arsnova.entities.migration.v2.MotdList;
-import de.thm.arsnova.persistance.MotdListRepository;
-import org.ektorp.CouchDbConnector;
-import org.ektorp.DbAccessException;
-import org.ektorp.support.CouchDbRepositorySupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-public class CouchDbMotdListRepository extends CouchDbRepositorySupport<MotdList> implements MotdListRepository {
-	private static final Logger logger = LoggerFactory.getLogger(CouchDbMotdListRepository.class);
-
-	public CouchDbMotdListRepository(final CouchDbConnector db, final boolean createIfNotExists) {
-		super(MotdList.class, db, createIfNotExists);
-	}
-
-	@Override
-	public MotdList findByUsername(final String username) {
-		final List<MotdList> motdListList = queryView("by_username", username);
-		return motdListList.isEmpty() ? new MotdList() : motdListList.get(0);
-	}
-
-	/* TODO: Move to service layer. */
-	@Override
-	public MotdList save(final MotdList motdlist) {
-		try {
-			if (motdlist.getId() != null) {
-				update(motdlist);
-			} else {
-				db.create(motdlist);
-			}
-
-			return motdlist;
-		} catch (final DbAccessException e) {
-			logger.error("Could not save MotD list {}.", motdlist, e);
-		}
-
-		return null;
-	}
-}
diff --git a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
index 75c66ee2a..78f1a311e 100644
--- a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
+++ b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
@@ -49,11 +49,6 @@ public class TestPersistanceConfig {
 		return Mockito.mock(MotdRepository.class);
 	}
 
-	@Bean
-	public MotdListRepository motdListRepository() {
-		return Mockito.mock(MotdListRepository.class);
-	}
-
 	@Bean
 	public VisitedSessionRepository visitedSessionRepository() {
 		return Mockito.mock(VisitedSessionRepository.class);
-- 
GitLab