diff --git a/pom.xml b/pom.xml index 897842bf55e13ca9c45dab99c143f2a70c92ab51..7699138070609225357fa41715d5df8d83406179 100644 --- a/pom.xml +++ b/pom.xml @@ -313,6 +313,12 @@ <version>2.25.0</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-all</artifactId> + <version>1.9.5</version> + <scope>test</scope> + </dependency> <!-- <dependency> <groupId>org.codehaus.groovy</groupId> diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java index cbd791bb65e9644ccb7ca4503bb655e368f0c710..6d46ace9596a0a11ab8de143bce45c90349229b2 100644 --- a/src/main/java/de/thm/arsnova/controller/SessionController.java +++ b/src/main/java/de/thm/arsnova/controller/SessionController.java @@ -64,6 +64,13 @@ public class SessionController extends AbstractController { return sessionService.joinSession(sessionkey); } + @RequestMapping(value = "/{sessionkey}", method = RequestMethod.DELETE) + @ResponseBody + public final void deleteSession(@PathVariable final String sessionkey) { + User user = userService.getCurrentUser(); + sessionService.deleteSession(sessionkey, user); + } + @RequestMapping(value = "/{sessionkey}/online", method = RequestMethod.POST) @ResponseBody @ResponseStatus(HttpStatus.CREATED) diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 956a45ae16da68690c43c10058e42800d5841100..a48c1f0eae6e240f2062cca9194808cc835c7c8e 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -773,7 +773,7 @@ public class CouchDBDao implements IDatabaseDao { } @Override - public final void deleteQuestion(final Question question) { + public final void deleteQuestionWithAnswers(final Question question) { try { this.deleteAnswers(question); this.deleteDocument(question.get_id()); @@ -1508,4 +1508,13 @@ public class CouchDBDao implements IDatabaseDao { } return null; } + + @Override + public void deleteSession(Session session) { + try { + this.deleteDocument(session.get_id()); + } catch (IOException e) { + LOGGER.error("Could not delete session {}", session); + } + } } diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index e9ce0c34e097af2c19596cdfc380fa524644b43b..72afe35aef7a11305700c3c69915b7c30fe3659e 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -68,7 +68,7 @@ public interface IDatabaseDao { List<String> getQuestionIds(Session session, User user); - void deleteQuestion(Question question); + void deleteQuestionWithAnswers(Question question); List<String> getUnAnsweredQuestionIds(Session session, User user); @@ -135,4 +135,6 @@ public interface IDatabaseDao { Session lockSession(Session session, Boolean lock); List<String> getActiveUsers(int timeDifference); + + void deleteSession(Session session); } diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java index 5687d1172bbc249d207eb0c62fff1cd586e087cb..7efe5e0491ac75935814e5b3af7c07b2822590ef 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -49,4 +49,6 @@ public interface ISessionService { Session setActive(String sessionkey, Boolean lock); Session joinSession(String keyword, UUID socketId); + + void deleteSession(String sessionkey, User user); } diff --git a/src/main/java/de/thm/arsnova/services/QuestionService.java b/src/main/java/de/thm/arsnova/services/QuestionService.java index 35ab9abc17410b6761223cf1a08ad5bb714f23c3..b1efb373be88e396240eec04d50eae175ab247aa 100644 --- a/src/main/java/de/thm/arsnova/services/QuestionService.java +++ b/src/main/java/de/thm/arsnova/services/QuestionService.java @@ -146,7 +146,7 @@ public class QuestionService implements IQuestionService { if (user == null || session == null || !session.isCreator(user)) { throw new UnauthorizedException(); } - databaseDao.deleteQuestion(question); + databaseDao.deleteQuestionWithAnswers(question); } @Override diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index a003462b49082e5841a85034c4989115860e6e37..1a4473b3f81de6dca9f56b6a98f12b9459c4038b 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -21,7 +21,6 @@ package de.thm.arsnova.services; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -36,6 +35,7 @@ import de.thm.arsnova.connector.client.ConnectorClient; import de.thm.arsnova.connector.model.Course; import de.thm.arsnova.dao.IDatabaseDao; import de.thm.arsnova.entities.LoggedIn; +import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; import de.thm.arsnova.exceptions.ForbiddenException; @@ -56,7 +56,7 @@ public class SessionService implements ISessionService { @Autowired private ARSnovaSocketIOServer socketIoServer; - @Autowired(required=false) + @Autowired(required = false) private ConnectorClient connectorClient; public void setDatabaseDao(final IDatabaseDao newDatabaseDao) { @@ -117,26 +117,22 @@ public class SessionService implements ISessionService { if (connectorClient == null) { return mySessions; } - + List<Session> courseSessions = databaseDao.getCourseSessions( connectorClient.getCourses(user.getUsername()).getCourse() ); - + Map<String, Session> allAvailableSessions = new HashMap<String, Session>(); - + for (Session session : mySessions) { allAvailableSessions.put(session.get_id(), session); } - for (Session session : courseSessions) { allAvailableSessions.put(session.get_id(), session); } - - List<Session> result = new ArrayList<Session>(allAvailableSessions.values()); - - return result; + return new ArrayList<Session>(allAvailableSessions.values()); } - + @Override public final List<Session> getMyVisitedSessions(final User user) { return databaseDao.getMyVisitedSessions(user); @@ -152,7 +148,6 @@ public class SessionService implements ISessionService { throw new ForbiddenException(); } } - return databaseDao.saveSession(session); } @@ -196,7 +191,7 @@ public class SessionService implements ISessionService { Session session = databaseDao.getSessionFromKeyword(sessionkey); return databaseDao.countActiveUsers(session, since); } - + public static class SessionNameComperator implements Comparator<Session>, Serializable { private static final long serialVersionUID = 1L; @@ -205,8 +200,8 @@ public class SessionService implements ISessionService { return session1.getName().compareToIgnoreCase(session2.getName()); } } - - public static class SessionShortNameComperator implements Comparator<Session>, Serializable{ + + public static class SessionShortNameComperator implements Comparator<Session>, Serializable { private static final long serialVersionUID = 1L; @Override @@ -229,4 +224,17 @@ public class SessionService implements ISessionService { Session session = databaseDao.getSessionFromKeyword(sessionkey); return databaseDao.lockSession(session, lock); } + + @Override + @Authenticated + public void deleteSession(String sessionkey, User user) { + Session session = databaseDao.getSession(sessionkey); + if (!session.isCreator(user)) { + throw new ForbiddenException(); + } + for (Question q : databaseDao.getSkillQuestions(sessionkey)) { + databaseDao.deleteQuestionWithAnswers(q); + } + databaseDao.deleteSession(session); + } } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index af6a51ffe93b340295441a699812c629fd7b3969..37750ff80cbf436768c341d0ff483e2a30e2e9ec 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -379,7 +379,7 @@ public class StubDatabaseDao implements IDatabaseDao { } @Override - public void deleteQuestion(Question question) { + public void deleteQuestionWithAnswers(Question question) { // TODO Auto-generated method stub } @@ -432,4 +432,9 @@ public class StubDatabaseDao implements IDatabaseDao { // TODO Auto-generated method stub return null; } + + @Override + public void deleteSession(Session session) { + // TODO Auto-generated method stub + } } diff --git a/src/test/java/de/thm/arsnova/services/SessionServiceTest.java b/src/test/java/de/thm/arsnova/services/SessionServiceTest.java index f7c4a52f6628a93398d3601ce5ccc934a4bd7386..fa5500863772c3beb351c498c41e9939317ab932 100644 --- a/src/test/java/de/thm/arsnova/services/SessionServiceTest.java +++ b/src/test/java/de/thm/arsnova/services/SessionServiceTest.java @@ -22,14 +22,23 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.util.Arrays; + +import static org.mockito.Mockito.*; + import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.aop.framework.Advised; +import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.util.ReflectionTestUtils; +import de.thm.arsnova.dao.IDatabaseDao; import de.thm.arsnova.dao.StubDatabaseDao; +import de.thm.arsnova.entities.Question; import de.thm.arsnova.entities.Session; import de.thm.arsnova.exceptions.NotFoundException; import de.thm.arsnova.exceptions.UnauthorizedException; @@ -55,7 +64,7 @@ public class SessionServiceTest { databaseDao.cleanupTestData(); userService.setUserAuthenticated(false); } - + @Test public void testShouldGenerateSessionKeyword() { System.out.println(sessionService.generateKeyword()); @@ -104,4 +113,37 @@ public class SessionServiceTest { sessionService.saveSession(session); assertNotNull(sessionService.joinSession("11111111")); } + + @Test + public void testShouldDeleteAllSessionData() { + userService.setUserAuthenticated(true); + + Session session = new Session(); + session.setCreator(userService.getCurrentUser().getUsername()); + Question q1 = new Question(); + Question q2 = new Question(); + + IDatabaseDao mockDatabase = mock(IDatabaseDao.class); + when(mockDatabase.getSkillQuestions(anyString())).thenReturn(Arrays.asList(q1, q2)); + when(mockDatabase.getSession(anyString())).thenReturn(session); + ReflectionTestUtils.setField(getTargetObject(sessionService), "databaseDao", mockDatabase); + + sessionService.deleteSession(session.getKeyword(), userService.getCurrentUser()); + + verify(mockDatabase).deleteQuestionWithAnswers(q1); + verify(mockDatabase).deleteQuestionWithAnswers(q2); + verify(mockDatabase).deleteSession(session); + } + + @SuppressWarnings("unchecked") + public static <T> T getTargetObject(Object proxy) { + if ((AopUtils.isJdkDynamicProxy(proxy))) { + try { + return (T) getTargetObject(((Advised) proxy).getTargetSource().getTarget()); + } catch (Exception e) { + throw new RuntimeException("Failed to unproxy target.", e); + } + } + return (T) proxy; + } } \ No newline at end of file