From 8d145037d6ebd92b4a234d55aa991d67d67d359b Mon Sep 17 00:00:00 2001
From: tekay <tom.kaesler@mni.thm.de>
Date: Fri, 29 Apr 2016 09:07:54 +0200
Subject: [PATCH] add api functionality to change session creator

---
 .../thm/arsnova/controller/SessionController.java |  9 +++++++++
 src/main/java/de/thm/arsnova/dao/CouchDBDao.java  | 15 +++++++++++++++
 .../java/de/thm/arsnova/dao/IDatabaseDao.java     |  2 ++
 .../de/thm/arsnova/services/ISessionService.java  |  2 ++
 .../de/thm/arsnova/services/SessionService.java   | 10 ++++++++++
 5 files changed, 38 insertions(+)

diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 7c6db97f..1db2a8e3 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -146,6 +146,15 @@ public class SessionController extends PaginationController {
 		return sessionService.updateSession(sessionkey, session);
 	}
 
+	@ApiOperation(value = "change the session creator (owner)", nickname = "changeSessionCreator")
+	@RequestMapping(value = "/{sessionkey}/changecreator", method = RequestMethod.PUT)
+	public Session changeSessionCreator(
+			@ApiParam(value = "session-key from current session", required = true) @PathVariable final String sessionkey,
+			@ApiParam(value = "new session creator", required = true) @RequestBody final String newCreator
+			) {
+		return sessionService.changeSessionCreator(sessionkey, newCreator);
+	}
+
 	@ApiOperation(value = "Retrieves a list of Sessions",
 			nickname = "getSessions")
 	@ApiResponses(value = {
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 7e0b8d3e..3ada67b9 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -1657,6 +1657,21 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 	@Override
 	@Caching(evict = { @CacheEvict("sessions"), @CacheEvict(cacheNames = "sessions", key = "#p0.keyword") })
+	public Session changeSessionCreator(Session session, final String newCreator) {
+		try {
+			final Document s = database.getDocument(session.get_id());
+			s.put("creator", newCreator);
+			database.saveDocument(s);
+			session.set_rev(s.getRev());
+		} catch (final IOException e) {
+			LOGGER.error("Could not lock session {}", session);
+		}
+
+		return session;
+	}
+
+	@Override
+	@Caching(evict = { @CacheEvict("sessions"), @CacheEvict(cacheNames="sessions", key="#p0.keyword") })
 	public void deleteSession(final Session session) {
 		try {
 			deleteDocument(session.get_id());
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 1a77eb88..378d6ae6 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -143,6 +143,8 @@ public interface IDatabaseDao {
 
 	Session updateSession(Session session);
 
+	Session changeSessionCreator(Session session, String newCreator);
+
 	void deleteSession(Session session);
 
 	List<Question> getLectureQuestionsForUsers(Session session);
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index 0a1ce00f..10f06e39 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -62,6 +62,8 @@ public interface ISessionService {
 
 	Session updateSession(String sessionkey, Session session);
 
+	Session changeSessionCreator(String sessionkey, String newCreator);
+
 	Session updateSessionInternal(Session session, User user);
 
 	void deleteSession(String sessionkey);
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 8ed52c43..2e44e2aa 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -345,6 +345,16 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		return databaseDao.updateSession(existingSession);
 	}
 
+	@Override
+	@PreAuthorize("isAuthenticated() and hasPermission(1,'motd','admin')")
+	public Session changeSessionCreator(String sessionkey, String newCreator) {
+		final Session existingSession = databaseDao.getSessionFromKeyword(sessionkey);
+		if (existingSession == null) {
+			throw new RuntimeException("Error while trying to get the session with sessionkey: " + sessionkey);
+		}
+		return databaseDao.changeSessionCreator(existingSession, newCreator);
+	}
+
 	/*
 	 * The "internal" suffix means it is called by internal services that have no authentication!
 	 * TODO: Find a better way of doing this...
-- 
GitLab