diff --git a/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java b/src/main/java/de/thm/arsnova/controller/QuestionByLecturerController.java index 831f8f2a58180c71f0469c986a2ae0b350f246f5..34d81844ba258b06391126475f93e4e8822fee12 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 53d97105c7ec77847915f57d1ad0bb8da12f5cdc..a7ad2d809986b325b3babe43115a8e799de6fdf7 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 cd60837e1a2c5329342cecaeb0c21ceba4b00a29..9ef8ba099f70043fd2de1bf396839daae12a02cb 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 226e4a04be1f16d6a85c1f2a36cbc3857411668e..7c6f91f5fa9d2ce51fe09e3df688575f7df617e9 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 6d4fe7bc435d2754d2f609fb4fecdeda8692af2d..afdc047bedd55a45c7e1a0cdb3367f956d41fcf6 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 056f699940bba1c3af5599c30fc81c656f5ca02f..e80b28c334f08ae3bc4cd4221e58351311b53afb 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 + } }