From 4ced0863dbb09d081782600c456d55f4fd8e37fc Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Wed, 30 Oct 2013 12:55:05 +0100
Subject: [PATCH] Create question variants, added several question filter
 functions

---
 .../LecturerQuestionController.java           | 29 ++++++++-
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 35 ++++++++++
 .../java/de/thm/arsnova/dao/IDatabaseDao.java | 10 +++
 .../de/thm/arsnova/entities/Question.java     |  9 +++
 .../arsnova/services/IQuestionService.java    | 10 +++
 .../thm/arsnova/services/QuestionService.java | 64 +++++++++++++++----
 .../webapp/WEB-INF/spring/spring-main.xml     |  4 +-
 .../de/thm/arsnova/dao/StubDatabaseDao.java   | 30 +++++++++
 8 files changed, 172 insertions(+), 19 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
index 5042f201..04102ddd 100644
--- a/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/LecturerQuestionController.java
@@ -156,8 +156,22 @@ public class LecturerQuestionController extends AbstractController {
 
 	@RequestMapping(value = { "/" }, method = RequestMethod.DELETE)
 	@ResponseBody
-	public final void deleteSkillQuestions(@RequestParam final String sessionkey, final HttpServletResponse response) {
-		this.questionService.deleteAllQuestions(sessionkey);
+	public final void deleteSkillQuestions(
+			@RequestParam final String sessionkey,
+			@RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureQuestionsOnly,
+			@RequestParam(value = "flashcardsonly", defaultValue = "false") final boolean flashcardsOnly,
+			@RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationQuestionsOnly,
+			final HttpServletResponse response
+	) {
+		if (lectureQuestionsOnly) {
+			this.questionService.deleteLectureQuestions(sessionkey);
+		} else if (flashcardsOnly) {
+			this.questionService.deleteFlashcards(sessionkey);
+		} else if (preparationQuestionsOnly) {
+			this.questionService.deletePreparationQuestions(sessionkey);
+		} else {
+			this.questionService.deleteAllQuestions(sessionkey);
+		}
 	}
 
 	@RequestMapping(value = "/count", method = RequestMethod.GET)
@@ -194,9 +208,18 @@ public class LecturerQuestionController extends AbstractController {
 	@ResponseBody
 	public final List<String> getUnAnsweredSkillQuestionIds(
 			@RequestParam final String sessionkey,
+			@RequestParam(value = "lecturequestionsonly", defaultValue = "false") final boolean lectureQuestionsOnly,
+			@RequestParam(value = "preparationquestionsonly", defaultValue = "false") final boolean preparationQuestionsOnly,
 			final HttpServletResponse response
 	) {
-		List<String> answers = questionService.getUnAnsweredQuestionIds(sessionkey);
+		List<String> answers;
+		if (lectureQuestionsOnly) {
+			answers = questionService.getUnAnsweredLectureQuestionIds(sessionkey);
+		} else if (preparationQuestionsOnly) {
+			answers = questionService.getUnAnsweredPreparationQuestionIds(sessionkey);
+		} else {
+			answers = questionService.getUnAnsweredQuestionIds(sessionkey);
+		}
 		if (answers == null || answers.isEmpty()) {
 			throw new NoContentException();
 		}
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index e612893e..58f5ba49 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -262,6 +262,7 @@ public class CouchDBDao implements IDatabaseDao {
 		Document q = new Document();
 		q.put("type", "skill_question");
 		q.put("questionType", question.getQuestionType());
+		q.put("questionVariant", question.getQuestionVariant());
 		q.put("sessionId", session.get_id());
 		q.put("subject", question.getSubject());
 		q.put("text", question.getText());
@@ -457,6 +458,10 @@ public class CouchDBDao implements IDatabaseDao {
 	@Override
 	public final void deleteAllQuestionsWithAnswers(Session session) {
 		NovaView view = new NovaView("skill_question/by_session");
+		deleteAllQuestionDocumentsWithAnswers(session, view);
+	}
+
+	private void deleteAllQuestionDocumentsWithAnswers(Session session, NovaView view) {
 		view.setStartKeyArray(session.get_id());
 		view.setEndKey(session.get_id(), "{}");
 		ViewResults results = this.getDatabase().view(view);
@@ -1217,4 +1222,34 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return results.getJSONArray("rows").optJSONObject(0).optInt("value");
 	}
+
+	@Override
+	public void deleteAllLectureQuestionsWithAnswers(Session session) {
+		NovaView view = new NovaView("skill_question/lecture_question_by_session");
+		deleteAllQuestionDocumentsWithAnswers(session, view);
+	}
+
+	@Override
+	public void deleteAllFlashcardsWithAnswers(Session session) {
+		NovaView view = new NovaView("skill_question/flashcard_by_session");
+		deleteAllQuestionDocumentsWithAnswers(session, view);
+	}
+
+	@Override
+	public void deleteAllPreparationQuestionsWithAnswers(Session session) {
+		NovaView view = new NovaView("skill_question/preparation_question_by_session");
+		deleteAllQuestionDocumentsWithAnswers(session, view);
+	}
+
+	@Override
+	public List<String> getUnAnsweredLectureQuestionIds(Session session, User user) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<String> getUnAnsweredPreparationQuestionIds(Session session, User user) {
+		// TODO Auto-generated method stub
+		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 897e09ee..56490bb4 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -145,4 +145,14 @@ public interface IDatabaseDao {
 	int countLectureQuestionAnswers(Session session);
 
 	int countPreparationQuestionAnswers(Session session);
+
+	void deleteAllLectureQuestionsWithAnswers(Session session);
+
+	void deleteAllFlashcardsWithAnswers(Session session);
+
+	void deleteAllPreparationQuestionsWithAnswers(Session session);
+
+	List<String> getUnAnsweredLectureQuestionIds(Session session, User user);
+
+	List<String> getUnAnsweredPreparationQuestionIds(Session session, User user);
 }
diff --git a/src/main/java/de/thm/arsnova/entities/Question.java b/src/main/java/de/thm/arsnova/entities/Question.java
index de56243c..33c2e59a 100644
--- a/src/main/java/de/thm/arsnova/entities/Question.java
+++ b/src/main/java/de/thm/arsnova/entities/Question.java
@@ -24,6 +24,7 @@ public class Question {
 
 	private String type;
 	private String questionType;
+	private String questionVariant;
 	private String subject;
 	private String text;
 	private boolean active;
@@ -59,6 +60,14 @@ public class Question {
 		this.questionType = questionType;
 	}
 
+	public final String getQuestionVariant() {
+		return questionVariant;
+	}
+
+	public final void setQuestionVariant(final String questionVariant) {
+		this.questionVariant = questionVariant;
+	}
+
 	public final String getSubject() {
 		return subject;
 	}
diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java
index 33239d8e..da43d6a3 100644
--- a/src/main/java/de/thm/arsnova/services/IQuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java
@@ -95,4 +95,14 @@ public interface IQuestionService {
 
 	int countPreparationQuestionAnswers(String sessionkey);
 
+	void deleteLectureQuestions(String sessionkey);
+
+	void deleteFlashcards(String sessionkey);
+
+	void deletePreparationQuestions(String sessionkey);
+
+	List<String> getUnAnsweredLectureQuestionIds(String sessionkey);
+
+	List<String> getUnAnsweredPreparationQuestionIds(String sessionkey);
+
 }
diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java
index 2162802b..04bf16eb 100644
--- a/src/main/java/de/thm/arsnova/services/QuestionService.java
+++ b/src/main/java/de/thm/arsnova/services/QuestionService.java
@@ -116,10 +116,7 @@ public class QuestionService implements IQuestionService {
 	@Override
 	@Authenticated
 	public List<String> getQuestionIds(String sessionKey) {
-		User user = userService.getCurrentUser();
-		if (user == null) {
-			throw new UnauthorizedException();
-		}
+		User user = getCurrentUser();
 		Session session = databaseDao.getSessionFromKeyword(sessionKey);
 		if (session == null) {
 			throw new NotFoundException();
@@ -146,12 +143,17 @@ public class QuestionService implements IQuestionService {
 	@Override
 	@Authenticated
 	public void deleteAllQuestions(String sessionKeyword) {
+		Session session = getSessionWithAuthCheck(sessionKeyword);
+		databaseDao.deleteAllQuestionsWithAnswers(session);
+	}
+
+	private Session getSessionWithAuthCheck(String sessionKeyword) {
 		User user = userService.getCurrentUser();
 		Session session = databaseDao.getSession(sessionKeyword);
 		if (user == null || session == null || !session.isCreator(user)) {
 			throw new UnauthorizedException();
 		}
-		databaseDao.deleteAllQuestionsWithAnswers(session);
+		return session;
 	}
 
 	@Override
@@ -188,15 +190,17 @@ public class QuestionService implements IQuestionService {
 	@Override
 	@Authenticated
 	public List<String> getUnAnsweredQuestionIds(String sessionKey) {
+		User user = getCurrentUser();
+		Session session = getSession(sessionKey);
+		return databaseDao.getUnAnsweredQuestionIds(session, user);
+	}
+
+	private User getCurrentUser() {
 		User user = userService.getCurrentUser();
 		if (user == null) {
 			throw new UnauthorizedException();
 		}
-		Session session = databaseDao.getSessionFromKeyword(sessionKey);
-		if (session == null) {
-			throw new NotFoundException();
-		}
-		return databaseDao.getUnAnsweredQuestionIds(session, user);
+		return user;
 	}
 
 	@Override
@@ -337,10 +341,7 @@ public class QuestionService implements IQuestionService {
 	@Override
 	@Authenticated
 	public Answer saveAnswer(Answer answer) {
-		User user = userService.getCurrentUser();
-		if (user == null) {
-			throw new UnauthorizedException();
-		}
+		User user = getCurrentUser();
 		Question question = this.getQuestion(answer.getQuestionId());
 		if (question == null) {
 			throw new NotFoundException();
@@ -445,4 +446,39 @@ public class QuestionService implements IQuestionService {
 	public int countPreparationQuestionAnswers(String sessionkey) {
 		return databaseDao.countPreparationQuestionAnswers(getSession(sessionkey));
 	}
+
+	@Override
+	@Authenticated
+	public void deleteLectureQuestions(String sessionkey) {
+		Session session = getSessionWithAuthCheck(sessionkey);
+		databaseDao.deleteAllLectureQuestionsWithAnswers(session);
+	}
+
+	@Override
+	@Authenticated
+	public void deleteFlashcards(String sessionkey) {
+		Session session = getSessionWithAuthCheck(sessionkey);
+		databaseDao.deleteAllFlashcardsWithAnswers(session);
+	}
+
+	@Override
+	@Authenticated
+	public void deletePreparationQuestions(String sessionkey) {
+		Session session = getSessionWithAuthCheck(sessionkey);
+		databaseDao.deleteAllPreparationQuestionsWithAnswers(session);
+	}
+
+	@Override
+	public List<String> getUnAnsweredLectureQuestionIds(String sessionkey) {
+		User user = getCurrentUser();
+		Session session = getSession(sessionkey);
+		return databaseDao.getUnAnsweredLectureQuestionIds(session, user);
+	}
+
+	@Override
+	public List<String> getUnAnsweredPreparationQuestionIds(String sessionkey) {
+		User user = getCurrentUser();
+		Session session = getSession(sessionkey);
+		return databaseDao.getUnAnsweredPreparationQuestionIds(session, user);
+	}
 }
diff --git a/src/main/webapp/WEB-INF/spring/spring-main.xml b/src/main/webapp/WEB-INF/spring/spring-main.xml
index b8d4d669..9d40e5a7 100644
--- a/src/main/webapp/WEB-INF/spring/spring-main.xml
+++ b/src/main/webapp/WEB-INF/spring/spring-main.xml
@@ -54,11 +54,11 @@
 
 	<!-- Example of connector client configuration -->
 	<!-- Uncomment bean definition to activate connector -->
-	<bean id="connectorClient" scope="singleton" class="de.thm.arsnova.connector.client.ConnectorClientImpl">
+	<!-- bean id="connectorClient" scope="singleton" class="de.thm.arsnova.connector.client.ConnectorClientImpl">
 		<property name="serviceLocation" value="${connector.uri}"></property>
 		<property name="username" value="${connector.username}"></property>
 		<property name="password" value="${connector.password}"></property>
-	</bean>
+	</bean -->
 	
 	<http:access-control allow-origin="*" allow-methods="GET" />
 </beans>
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index c5c5cdc6..140f36b3 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -451,4 +451,34 @@ public class StubDatabaseDao implements IDatabaseDao {
 		// TODO Auto-generated method stub
 		return 0;
 	}
+
+	@Override
+	public void deleteAllLectureQuestionsWithAnswers(Session session) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void deleteAllFlashcardsWithAnswers(Session session) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void deleteAllPreparationQuestionsWithAnswers(Session session) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public List<String> getUnAnsweredLectureQuestionIds(Session session, User user) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public List<String> getUnAnsweredPreparationQuestionIds(Session session, User user) {
+		// TODO Auto-generated method stub
+		return null;
+	}
 }
-- 
GitLab