From 458f04184590cf07886ef41fb6a4d0896f927423 Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Thu, 14 Feb 2013 22:51:56 +0100
Subject: [PATCH] Delete answers

---
 .../QuestionByLecturerController.java         | 11 ++++++++
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 28 +++++++++++++++++++
 .../java/de/thm/arsnova/dao/IDatabaseDao.java |  4 +++
 .../arsnova/services/IQuestionService.java    |  2 ++
 .../thm/arsnova/services/QuestionService.java | 15 ++++++++++
 .../de/thm/arsnova/dao/StubDatabaseDao.java   | 11 ++++++++
 6 files changed, 71 insertions(+)

diff --git a/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java b/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
index 831f8f2a5..34d81844b 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java
@@ -261,12 +261,23 @@ public class QuestionByLecturerController extends AbstractController {
 	@ResponseBody
 	public final Answer updateAnswer(
 			@PathVariable final String questionId,
+			@PathVariable final String answerId,
 			@RequestBody final Answer answer,
 			final HttpServletResponse response
 		) {
 		return questionService.updateAnswer(answer);
 	}
 
+	@RequestMapping(value = "/{questionId}/answer/{answerId}", method = RequestMethod.DELETE)
+	@ResponseBody
+	public final void deleteAnswer(
+			@PathVariable final String questionId,
+			@PathVariable final String answerId,
+			final HttpServletResponse response
+		) {
+		questionService.deleteAnswer(questionId, answerId);
+	}
+
 	@RequestMapping(value = "/{questionId}/answers", method = RequestMethod.DELETE)
 	@ResponseBody
 	public final void deleteAnswers(
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 53d97105c..a7ad2d809 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -297,6 +297,25 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 	}
 
+	@Override
+	public final Session getSessionFromId(final String sessionId) {
+		try {
+			View view = new View("session/by_id");
+			view.setKey(URLEncoder.encode("\"" + sessionId + "\"", "UTF-8"));
+			ViewResults results = this.getDatabase().view(view);
+
+			if (results.getJSONArray("rows").optJSONObject(0) == null) {
+				return null;
+			}
+			return (Session) JSONObject.toBean(
+					results.getJSONArray("rows").optJSONObject(0).optJSONObject("value"),
+					Session.class
+			);
+		} catch (UnsupportedEncodingException e) {
+			return null;
+		}
+	}
+
 	@Override
 	public final Session saveSession(final Session session) {
 
@@ -1301,4 +1320,13 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return null;
 	}
+
+	@Override
+	public void deleteAnswer(String answerId) {
+		try {
+			this.database.deleteDocument(this.database.getDocument(answerId));
+		} catch (IOException e) {
+			LOGGER.error("Could not delete answer {} because of {}", answerId, e.getMessage());
+		}
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index cd60837e1..9ef8ba099 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -122,4 +122,8 @@ public interface IDatabaseDao {
 	Answer saveAnswer(Answer answer, User user);
 
 	Answer updateAnswer(Answer answer);
+
+	Session getSessionFromId(String sessionId);
+
+	void deleteAnswer(String answerId);
 }
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index 226e4a04b..7c6f91f5f 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -71,4 +71,6 @@ public interface IQuestionService {
 
 	Answer updateAnswer(Answer answer);
 
+	void deleteAnswer(String questionId, String answerId);
+
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index 6d4fe7bc4..afdc047be 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -258,4 +258,19 @@ public class QuestionService implements IQuestionService {
 		}
 		return this.databaseDao.updateAnswer(answer);
 	}
+
+	@Override
+	@Authenticated
+	public void deleteAnswer(String questionId, String answerId) {
+		Question question = this.databaseDao.getQuestion(questionId);
+		if (question == null) {
+			throw new NotFoundException();
+		}
+		User user = userService.getCurrentUser();
+		Session session = this.databaseDao.getSessionFromId(question.getSessionId());
+		if (user == null || session == null || !session.isCreator(user)) {
+			throw new UnauthorizedException();
+		}
+		this.databaseDao.deleteAnswer(answerId);
+	}
 }
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index 056f69994..e80b28c33 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -397,4 +397,15 @@ public class StubDatabaseDao implements IDatabaseDao {
 		// TODO Auto-generated method stub
 		return null;
 	}
+
+	@Override
+	public Session getSessionFromId(String sessionId) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void deleteAnswer(String answerId) {
+		// TODO Auto-generated method stub
+	}
 }
-- 
GitLab