From 1a847feb7cea9fb35cdc56a4182b633685ce2b1e Mon Sep 17 00:00:00 2001
From: Paul-Christian Volkmer <paul-christian.volkmer@mni.thm.de>
Date: Tue, 16 Oct 2012 10:14:33 +0200
Subject: [PATCH] Task #4027: User is able to request a question by its id

The URI to be used contains the session id the question is linked to. If
the resulting question object did not match the given session id an error
HTTP - NOT FOUND will be send. This will also be done if no question was
found.
---
 .../de/thm/arsnova/SessionController.java     | 11 ++++++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 22 +++++++++++++++++++
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  1 +
 .../thm/arsnova/services/ISessionService.java |  1 +
 .../thm/arsnova/services/SessionService.java  |  5 +++++
 5 files changed, 40 insertions(+)

diff --git a/src/main/java/de/thm/arsnova/SessionController.java b/src/main/java/de/thm/arsnova/SessionController.java
index 01429397..fff51bb9 100644
--- a/src/main/java/de/thm/arsnova/SessionController.java
+++ b/src/main/java/de/thm/arsnova/SessionController.java
@@ -127,6 +127,17 @@ public class SessionController {
 		return null;
 	}
 
+	@RequestMapping(value="/session/{sessionkey}/question/{questionId}", method=RequestMethod.GET)
+	@ResponseBody
+	public Question getQuestion(@PathVariable String sessionkey, @PathVariable String questionId, HttpServletResponse response) {
+		Question question = sessionService.getQuestion(questionId);
+		if (question != null && question.getSession().equals(sessionkey)) {
+			return question;
+		}
+		
+		response.setStatus(HttpStatus.NOT_FOUND.value());
+		return null;
+	}
 	
 	@RequestMapping(value="/session/{sessionkey}/question", method=RequestMethod.POST)
 	@ResponseBody
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 65772653..e6175ad6 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -405,4 +405,26 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return false;
 	}
+	
+	
+	@Override
+	public Question getQuestion(String id) {
+		try {
+			View view = new View("skill_question/by_id");
+			view.setKey(URLEncoder.encode("\"" + id + "\"", "UTF-8"));
+			ViewResults results = this.getDatabase().view(view);
+			
+			if (results.getJSONArray("rows").optJSONObject(0) == null) {
+				return null;
+			}
+			
+			return (Question) JSONObject.toBean(
+					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Question.class
+			);
+		} catch (IOException e) {
+			logger.error("Could not get question with id {}", id);
+		}
+		return null;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 84bd0a7b..13825abc 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -34,4 +34,5 @@ public interface IDatabaseDao {
 	public boolean sessionKeyAvailable(String keyword);
 	
 	public boolean saveQuestion(Session session, Question question);
+	public Question getQuestion(String id);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index 0dfb1c8d..83f9d40d 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -45,4 +45,5 @@ public interface ISessionService {
 	public void broadcastFeedbackChanges(Map<String, Set<String>> affectedUsers, Set<String> allAffectedSessions);
 	
 	public boolean saveQuestion(Question question);
+	public Question getQuestion(String id);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index e169cb00..29f2eee1 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -148,4 +148,9 @@ public class SessionService implements ISessionService {
 		Session session = this.databaseDao.getSessionFromKeyword(question.getSession());
 		return this.databaseDao.saveQuestion(session, question);
 	}
+	
+	@Override
+	public Question getQuestion(String id) {
+		return databaseDao.getQuestion(id);
+	}
 }
-- 
GitLab