diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java index e96e332c3f324e158d7db3c86f03b392b225f748..f34b9b771b3fa9ef8fad5a60a377510893805e8a 100644 --- a/src/main/java/de/thm/arsnova/controller/QuestionController.java +++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java @@ -268,8 +268,17 @@ public class QuestionController extends AbstractController { ) { return questionService.getInterposedQuestions(sessionKey); } - - + + @RequestMapping(value = "/session/{sessionKey}/interposed/{questionId}", method = RequestMethod.GET) + @ResponseBody + public final InterposedQuestion getInterposedQuestions( + @PathVariable final String sessionKey, + @PathVariable final String questionId, + final HttpServletResponse response + ) { + return questionService.readInterposedQuestion(sessionKey, questionId); + } + @RequestMapping(value = "/session/{sessionkey}/interposed", method = RequestMethod.POST) @ResponseBody public final void postInterposedQuestion( @@ -277,7 +286,7 @@ public class QuestionController extends AbstractController { @RequestBody final InterposedQuestion question, final HttpServletResponse response ) { - if (!sessionkey.equals(question.getSession())) { + if (!sessionkey.equals(question.getSessionId())) { response.setStatus(HttpStatus.PRECONDITION_FAILED.value()); return; } @@ -290,5 +299,15 @@ public class QuestionController extends AbstractController { response.setStatus(HttpStatus.BAD_REQUEST.value()); return; } + + @RequestMapping(value = "/session/{sessionkey}/interposed/{questionId}", method = RequestMethod.DELETE) + @ResponseBody + public final void deleteInterposedQuestion( + @PathVariable final String sessionkey, + @PathVariable final String questionId, + final HttpServletResponse response + ) { + questionService.deleteQuestion(sessionkey, questionId); + } } diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index d73b11bbc71bc2a16aef14cf47cfec42f54b1367..5efcbde1502a955106433060e3381c7eacae8f34 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -481,20 +481,12 @@ public class CouchDBDao implements IDatabaseDao { return results.getJSONArray("rows").optJSONObject(0).optJSONObject("value").getString("_id"); } - private String getSessionKeyword(final String internalSessionId) { - try { - View view = new View("session/by_id"); - view.setKey(URLEncoder.encode("\"" + internalSessionId + "\"", "UTF-8")); - ViewResults results = this.getDatabase().view(view); - for (Document d : results.getResults()) { - Document arsSession = this.getDatabase().getDocument(d.getId()); - return arsSession.get("keyword").toString(); - } - } catch (UnsupportedEncodingException e) { - return null; - } catch (IOException e) { - return null; + private String getSessionKeyword(final String internalSessionId) throws IOException { + Document document = this.getDatabase().getDocument(internalSessionId); + if (document.has("keyword")) { + return (String) document.get("keyword"); } + LOGGER.error("No session found for internal id: {}", internalSessionId); return null; } @@ -1066,7 +1058,7 @@ public class CouchDBDao implements IDatabaseDao { document.getJSONObject().getJSONObject("value"), InterposedQuestion.class ); - question.setSession(sessionKey); + question.setSessionId(sessionKey); question.set_id(document.getId()); result.add(question); } @@ -1206,4 +1198,23 @@ public class CouchDBDao implements IDatabaseDao { } return 0; } + + @Override + public InterposedQuestion getInterposedQuestion(String questionId) throws IOException { + Document document = this.getDatabase().getDocument(questionId); + InterposedQuestion question = (InterposedQuestion) JSONObject.toBean( + document.getJSONObject(), + InterposedQuestion.class + ); + question.setSessionId(getSessionKeyword(question.getSessionId())); + return question; + } + + @Override + public void markInterposedQuestionAsRead(InterposedQuestion question) throws IOException { + question.setRead(true); + Document document = this.getDatabase().getDocument(question.get_id()); + document.put("read", question.isRead()); + this.getDatabase().saveDocument(document); + } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index 374fe7170b7034e009bbd951713740a7936725e8..a3592cfc0864210cc72fcb5e1ec06ce874318e7d 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -19,6 +19,7 @@ package de.thm.arsnova.dao; +import java.io.IOException; import java.util.List; import de.thm.arsnova.entities.Answer; @@ -105,4 +106,8 @@ public interface IDatabaseDao { int countQuestions(); + InterposedQuestion getInterposedQuestion(String questionId) throws IOException; + + void markInterposedQuestionAsRead(InterposedQuestion question) throws IOException; + } diff --git a/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java index 477cf799b2216dd5b222b105525fa417722923bd..ca004b761299c13ec73335ae02094543027d95d8 100644 --- a/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java +++ b/src/main/java/de/thm/arsnova/entities/InterposedQuestion.java @@ -27,7 +27,7 @@ public class InterposedQuestion { private String type; private String subject; private String text; - private String session; + private String sessionId; private long timestamp; private boolean read; @@ -67,11 +67,11 @@ public class InterposedQuestion { public void setText(String text) { this.text = text; } - public String getSession() { - return session; + public String getSessionId() { + return sessionId; } - public void setSession(String session) { - this.session = session; + public void setSessionId(String sessionId) { + this.sessionId = sessionId; } public long getTimestamp() { return timestamp; diff --git a/src/main/java/de/thm/arsnova/entities/Session.java b/src/main/java/de/thm/arsnova/entities/Session.java index a9a508a3abeb1af335a8feab3ba39ab3702df1fb..2e24fc60b45d42ebef1c9638f5ceb806c9e6c2a5 100644 --- a/src/main/java/de/thm/arsnova/entities/Session.java +++ b/src/main/java/de/thm/arsnova/entities/Session.java @@ -101,4 +101,8 @@ public class Session { public String get_rev() { return _rev; } + + public boolean isCreator(User user) { + return user.getUsername().equals(this.creator); + } } diff --git a/src/main/java/de/thm/arsnova/services/IQuestionService.java b/src/main/java/de/thm/arsnova/services/IQuestionService.java index 7b9ce1fb3e844b06dc64be70a9062b08eb6a6925..6962b1cd13db69530a53813d20a479e20117c8fa 100644 --- a/src/main/java/de/thm/arsnova/services/IQuestionService.java +++ b/src/main/java/de/thm/arsnova/services/IQuestionService.java @@ -19,6 +19,8 @@ package de.thm.arsnova.services; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.List; import de.thm.arsnova.entities.Answer; @@ -27,7 +29,7 @@ import de.thm.arsnova.entities.Question; public interface IQuestionService { boolean saveQuestion(Question question); - + boolean saveQuestion(InterposedQuestion question); Question getQuestion(String id, String sessionkey); @@ -58,4 +60,6 @@ public interface IQuestionService { List<InterposedQuestion> getInterposedQuestions(String sessionKey); + InterposedQuestion readInterposedQuestion(String sessionKey, String questionId); + } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index 879180c7893edbe3e1776d62ab5e9511da5e739d..0fa208dfa0aed89ec6902bd0c8bcd0adc6ef8d02 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 THM webMedia - * + * * This file is part of ARSnova. * * ARSnova is free software: you can redistribute it and/or modify @@ -19,6 +19,7 @@ package de.thm.arsnova.services; +import java.io.IOException; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +31,9 @@ import de.thm.arsnova.entities.Answer; import de.thm.arsnova.entities.InterposedQuestion; import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; +import de.thm.arsnova.entities.User; import de.thm.arsnova.exceptions.NoContentException; +import de.thm.arsnova.exceptions.NotFoundException; @Service public class QuestionService implements IQuestionService { @@ -38,6 +41,9 @@ public class QuestionService implements IQuestionService { @Autowired private IDatabaseDao databaseDao; + @Autowired + private IUserService userService; + public void setDatabaseDao(IDatabaseDao databaseDao) { this.databaseDao = databaseDao; } @@ -68,17 +74,16 @@ public class QuestionService implements IQuestionService { @Override @Authenticated public boolean saveQuestion(InterposedQuestion question) { - Session session = this.databaseDao.getSessionFromKeyword(question.getSession()); + Session session = this.databaseDao.getSessionFromKeyword(question.getSessionId()); return this.databaseDao.saveQuestion(session, question); } - @Override @Authenticated public Question getQuestion(String id, String sessionKey) { return databaseDao.getQuestion(id, sessionKey); } - + @Override @Authenticated public List<String> getQuestionIds(String sessionKey) { @@ -89,7 +94,6 @@ public class QuestionService implements IQuestionService { @Authenticated public void deleteQuestion(String sessionKey, String questionId) { databaseDao.deleteQuestion(sessionKey, questionId); - } @Override @@ -109,40 +113,59 @@ public class QuestionService implements IQuestionService { public List<Answer> getAnswers(String sessionKey, String questionId) { return databaseDao.getAnswers(sessionKey, questionId); } - + @Override @Authenticated public int getAnswerCount(String sessionKey, String questionId) { return databaseDao.getAnswerCount(sessionKey, questionId); } - + @Override @Authenticated public List<Answer> getFreetextAnswers(String sessionKey, String questionId) { return databaseDao.getFreetextAnswers(sessionKey, questionId); } - + @Override @Authenticated public List<Answer> getMytAnswers(String sessionKey) { return databaseDao.getMyAnswers(sessionKey); } - + @Override @Authenticated public int getTotalAnswerCount(String sessionKey) { return databaseDao.getTotalAnswerCount(sessionKey); } - + @Override @Authenticated public int getInterposedCount(String sessionKey) { return databaseDao.getInterposedCount(sessionKey); } - + @Override @Authenticated public List<InterposedQuestion> getInterposedQuestions(String sessionKey) { return databaseDao.getInterposedQuestions(sessionKey); } + + @Override + public InterposedQuestion readInterposedQuestion(String sessionKey, String questionId) { + try { + InterposedQuestion question = databaseDao.getInterposedQuestion(questionId); + Session session = this.databaseDao.getSessionFromKeyword(sessionKey); + if (session == null || !session.getKeyword().equals(question.getSessionId())) { + throw new NotFoundException(); + } + + User user = this.userService.getCurrentUser(); + if (session.isCreator(user)) { + this.databaseDao.markInterposedQuestionAsRead(question); + } + return question; + } catch (IOException e) { + throw new NotFoundException(); + } + } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 1446cc8a814621ff793ac9a1b87c41c519aa5b0c..256a271d1170aa521719931dace4555d2d70994a 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -1,5 +1,6 @@ package de.thm.arsnova.dao; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -330,4 +331,16 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub return false; } + + @Override + public InterposedQuestion getInterposedQuestion(String questionId) throws IOException { + // TODO Auto-generated method stub + return null; + } + + @Override + public void markInterposedQuestionAsRead(InterposedQuestion question) throws IOException { + // TODO Auto-generated method stub + + } }