diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 6284823036cb4f9e2f9ee8a706d7e4854c38c038..e3f87fd89aae34d90a6421adf3ea10659d1d664e 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -1703,6 +1703,36 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return false; } + @Override + public boolean deleteInactiveGuestVisitedSessionLists(long lastActivityBefore) { + try { + NovaView view = new NovaView("logged_in/by_last_activity_for_guests"); + view.setEndKey(lastActivityBefore); + List<Document> results = this.getDatabase().view(view).getResults(); + + final List<Document> newDocs = new ArrayList<Document>(); + for (Document oldDoc : results) { + final Document newDoc = new Document(); + newDoc.setId(oldDoc.getId()); + newDoc.setRev(oldDoc.getJSONObject("value").getString("_rev")); + newDoc.put("_deleted", true); + newDocs.add(newDoc); + LOGGER.debug("Marked logged_in document {} for deletion.", oldDoc.getId()); + } + + if (newDocs.size() > 0) { + getDatabase().bulkSaveDocuments(newDocs.toArray(new Document[newDocs.size()])); + LOGGER.info("Deleted {} visited session lists of inactive users.", newDocs.size()); + } + + return true; + } catch (IOException e) { + LOGGER.error("Could not delete visited session lists of inactive users."); + } + + return false; + } + @Cacheable("lecturequestions") @Override public List<Question> getLectureQuestionsForUsers(final 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 c8ccf8c3c3aa95c3eefd7091cf591be2a9380252..a7372b085f4883efca0df69ee15d3e4746994f00 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -148,6 +148,8 @@ public interface IDatabaseDao { boolean deleteInactiveGuestSessions(long lastActivityBefore); + boolean deleteInactiveGuestVisitedSessionLists(long lastActivityBefore); + List<Question> getLectureQuestionsForUsers(Session session); List<Question> getLectureQuestionsForTeachers(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 7b6c742068adb955a7e43845ac1ab90a88f7227d..5c20b4c3ecdf3d0e41dcbd693ccda4d2c692e500 100644 --- a/src/main/java/de/thm/arsnova/services/ISessionService.java +++ b/src/main/java/de/thm/arsnova/services/ISessionService.java @@ -95,4 +95,6 @@ public interface ISessionService { boolean flipFlashcards(String sessionkey, Boolean flip); void deleteInactiveSessions(); + + void deleteInactiveVisitedSessionLists(); } diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java index a9aa671c9c0b3d70a35df770925d389499413074..8ac0aa34702e610b509f910e7ea663e1c7f9dded 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -100,7 +100,6 @@ public class SessionService implements ISessionService, ApplicationEventPublishe } private static final long SESSION_INACTIVITY_CHECK_INTERVAL_MS = 30 * 60 * 1000L; - private static final long SESSION_INACTIVITY_THRESHOLD_MS = 90 * 24 * 60 * 60 * 1000L; @Autowired private IDatabaseDao databaseDao; @@ -120,6 +119,9 @@ public class SessionService implements ISessionService, ApplicationEventPublishe @Autowired private ImageUtils imageUtils; + @Value("${session.guest-session.cleanup-days:0}") + private int guestSessionInactivityThresholdDays; + @Value("${pp.logofilesize_b}") private int uploadFileSizeByte; @@ -129,10 +131,22 @@ public class SessionService implements ISessionService, ApplicationEventPublishe @Scheduled(fixedDelay = SESSION_INACTIVITY_CHECK_INTERVAL_MS) public void deleteInactiveSessions() { - LOGGER.info("Delete inactive sessions."); - long unixTime = System.currentTimeMillis(); - long lastActivityBefore = unixTime - SESSION_INACTIVITY_THRESHOLD_MS; - databaseDao.deleteInactiveGuestSessions(lastActivityBefore); + if (guestSessionInactivityThresholdDays > 0) { + LOGGER.info("Delete inactive sessions."); + long unixTime = System.currentTimeMillis(); + long lastActivityBefore = unixTime - guestSessionInactivityThresholdDays * 24 * 60 * 60 * 1000L; + databaseDao.deleteInactiveGuestSessions(lastActivityBefore); + } + } + + @Scheduled(fixedDelay = SESSION_INACTIVITY_CHECK_INTERVAL_MS) + public void deleteInactiveVisitedSessionLists() { + if (guestSessionInactivityThresholdDays > 0) { + LOGGER.info("Delete lists of visited session for inactive users."); + long unixTime = System.currentTimeMillis(); + long lastActivityBefore = unixTime - guestSessionInactivityThresholdDays * 24 * 60 * 60 * 1000L; + databaseDao.deleteInactiveGuestVisitedSessionLists(lastActivityBefore); + } } public void setDatabaseDao(final IDatabaseDao newDatabaseDao) { diff --git a/src/main/resources/arsnova.properties.example b/src/main/resources/arsnova.properties.example index 294847eaf28d4b9f2e1482058f845219fcf6fcea..34fa9b0a1d80f6a0a91fa1bbd5e3d77c239494e8 100644 --- a/src/main/resources/arsnova.properties.example +++ b/src/main/resources/arsnova.properties.example @@ -243,6 +243,9 @@ question.parse-answer-option-formatting=false # https://github.com/thm-projects/arsnova-mobile/tree/master/demo-sessions session.demo-id= +# Delete guest sessions automatically after X days of owner inactivity. +#session.guest-session.cleanup-days=180 + # Label underneath ARSnova logo ui.slogan=Audience Response System diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 1a1c4c6688daa283a8b6f210d4309a6e1d5b69c7..acfabb8c7905fb8d16739f26bf4103622d1a61e6 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -351,6 +351,12 @@ public class StubDatabaseDao implements IDatabaseDao { return false; } + @Override + public boolean deleteInactiveGuestVisitedSessionLists(long lastActivityBefore) { + // TODO Auto-generated method stub + return false; + } + @Override public void deleteAllQuestionsWithAnswers(Session session) { // TODO Auto-generated method stub diff --git a/src/test/resources/arsnova.properties.example b/src/test/resources/arsnova.properties.example index 294847eaf28d4b9f2e1482058f845219fcf6fcea..34fa9b0a1d80f6a0a91fa1bbd5e3d77c239494e8 100644 --- a/src/test/resources/arsnova.properties.example +++ b/src/test/resources/arsnova.properties.example @@ -243,6 +243,9 @@ question.parse-answer-option-formatting=false # https://github.com/thm-projects/arsnova-mobile/tree/master/demo-sessions session.demo-id= +# Delete guest sessions automatically after X days of owner inactivity. +#session.guest-session.cleanup-days=180 + # Label underneath ARSnova logo ui.slogan=Audience Response System