From 11b6b4b0edc682bd2f8e7cf3f03a37a6673ac2af Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Mon, 19 Dec 2016 16:05:38 +0100 Subject: [PATCH] Delete inactive guest sessions Lists of visited sessions for guest users which have not been active for a fixed amount of time are now automatically deleted. --- .../java/de/thm/arsnova/dao/CouchDBDao.java | 30 +++++++++++++++++++ .../java/de/thm/arsnova/dao/IDatabaseDao.java | 2 ++ .../thm/arsnova/services/ISessionService.java | 2 ++ .../thm/arsnova/services/SessionService.java | 10 +++++++ .../de/thm/arsnova/dao/StubDatabaseDao.java | 6 ++++ 5 files changed, 50 insertions(+) diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 62848230..e3f87fd8 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 c8ccf8c3..a7372b08 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 7b6c7420..5c20b4c3 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 8d7b93de..8ac0aa34 100644 --- a/src/main/java/de/thm/arsnova/services/SessionService.java +++ b/src/main/java/de/thm/arsnova/services/SessionService.java @@ -139,6 +139,16 @@ public class SessionService implements ISessionService, ApplicationEventPublishe } } + @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) { databaseDao = newDatabaseDao; } diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index 1a1c4c66..acfabb8c 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 -- GitLab