diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index 525bd65ddea5469aed9cca1da4301d66c3749d3a..b8443784bf35398a46b3845e246b7f97b5ae019e 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -191,6 +191,24 @@ public class SessionController extends AbstractController { return null; } + @RequestMapping(value = "/{sessionkey}/learningprogress", method = RequestMethod.GET) + @ResponseBody + public final int learningProgress( + @PathVariable final String sessionkey, + final HttpServletResponse response + ) { + return sessionService.getLearningProgress(sessionkey); + } + + @RequestMapping(value = "/{sessionkey}/mylearningprogress", method = RequestMethod.GET) + @ResponseBody + public final int myLearningProgress( + @PathVariable final String sessionkey, + final HttpServletResponse response + ) { + return sessionService.getMyLearningProgress(sessionkey); + } + /* internal redirections */ @RequestMapping(value = "/{sessionKey}/lecturerquestion") diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 30089aa489467a55b2261995e134a695921eec12..4e5e0d77f08edf70ae65994935167f71d2c0ecd1 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -926,6 +926,7 @@ public class CouchDBDao implements IDatabaseDao { a.put("questionId", answer.getQuestionId()); a.put("answerSubject", answer.getAnswerSubject()); a.put("questionVariant", answer.getQuestionVariant()); + a.put("questionValue", answer.getQuestionValue()); a.put("answerText", answer.getAnswerText()); a.put("timestamp", answer.getTimestamp()); a.put("user", user.getUsername()); @@ -949,6 +950,7 @@ public class CouchDBDao implements IDatabaseDao { a.put("answerText", answer.getAnswerText()); a.put("timestamp", answer.getTimestamp()); a.put("abstention", answer.isAbstention()); + a.put("questionValue", answer.getQuestionValue()); this.database.saveDocument(a); answer.set_rev(a.getRev()); return answer; @@ -1351,4 +1353,39 @@ public class CouchDBDao implements IDatabaseDao { this.deleteAnswers(q); } } + + @Override + public int getLearningProgress(Session session) { + NovaView courseView = new NovaView("learning_progress/course_value"); + NovaView maximumView = new NovaView("learning_progress/maximum_value"); + courseView.setKey(session.get_id()); + maximumView.setKey(session.get_id()); + + return getProgressPercentage(courseView, maximumView); + } + + @Override + public int getMyLearningProgress(Session session, User user) { + NovaView userView = new NovaView("learning_progress/user_value"); + NovaView maximumView = new NovaView("learning_progress/maximum_value"); + userView.setKey(session.get_id(), user.getUsername()); + maximumView.setKey(session.get_id()); + + return getProgressPercentage(userView, maximumView); + } + + private int getProgressPercentage(NovaView progressView, NovaView maximumView) { + List<Document> progressValue = this.getDatabase().view(progressView).getResults(); + List<Document> maximumValue = this.getDatabase().view(maximumView).getResults(); + if (maximumValue.isEmpty()) { + return 0; + } + int maximum = maximumValue.get(0).getInt("value"); + int progress = 0; + if (!progressValue.isEmpty()) { + progress = progressValue.get(0).getInt("value"); + } + int percentage = (int)((progress * 100.0f) / maximum); + return percentage < 0 ? 0 : percentage; + } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index b7f153c1f8487c8b9d2fa99fc4e0466a3f514b61..b4c9c3003b345bacdefed2fe06ed5113bb44d0a1 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -161,4 +161,8 @@ public interface IDatabaseDao { void publishAllQuestions(Session session, boolean publish); void deleteAllQuestionsAnswers(Session session); + + int getLearningProgress(Session session); + + int getMyLearningProgress(Session session, User user); } diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index aed482cfba76aac0f3f915fcba3d21b117af4579..d2361ed901256dfb1906f059d87ef92d6ffea750 100644 --- a/src/main/java/de/thm/arsnova/entities/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/Answer.java @@ -10,6 +10,7 @@ public class Answer { private String answerText; private String answerSubject; private String questionVariant; + private int questionValue; private int piRound; private String user; private long timestamp; @@ -133,6 +134,14 @@ public class Answer { this.questionVariant = questionVariant; } + public int getQuestionValue() { + return questionValue; + } + + public void setQuestionValue(int questionValue) { + this.questionValue = questionValue; + } + @Override public final String toString() { return "Answer type:'" + type + "'" diff --git a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java b/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java index acfea0d3de09a13c2d1e469de0963c85714d110d..ebc36f98e9c2f88d9ac05668ae808a01170289fb 100644 --- a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java +++ b/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java @@ -23,6 +23,7 @@ public class PossibleAnswer { private String id; private String text; private boolean correct; + private int value; public String getId() { return this.id; @@ -48,6 +49,14 @@ public class PossibleAnswer { this.correct = correct; } + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + @Override public String toString() { return "PossibleAnswer [id=" + id + ", text=" + text + ", correct=" + correct + "]"; diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index d868e4bc1b75c68de8986bcdb7f5bb9fb2f85f7a..611f3ce91aece07210e2472c8f709316a05f80ad 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -51,4 +51,8 @@ public interface ISessionService { Session updateSession(String sessionkey, Session session); void deleteSession(String sessionkey, User user); + + int getLearningProgress(String sessionkey); + + int getMyLearningProgress(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 e9e6af9b97eb11a115f681484eebdfca9a5ecc57..205ee49b743cfafe17347bbed23d3c8deca2323e 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -256,4 +256,19 @@ public class SessionService implements ISessionService { } databaseDao.deleteSession(session); } + + @Override + @Authenticated + public int getLearningProgress(String sessionkey) { + Session session = databaseDao.getSession(sessionkey); + return databaseDao.getLearningProgress(session); + } + + @Override + @Authenticated + public int getMyLearningProgress(String sessionkey) { + Session session = databaseDao.getSession(sessionkey); + User user = userService.getCurrentUser(); + return databaseDao.getMyLearningProgress(session, user); + } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 8e354540801597bbedda9e3cf505295dcf207b4f..bfd23302b147be58f012b22e2b8dcec6380d9c35 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -497,4 +497,16 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub } + + @Override + public int getLearningProgress(Session session) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getMyLearningProgress(Session session, User user) { + // TODO Auto-generated method stub + return 0; + } }