diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java index 875b999c37a97d50ad1ec54f6769be7f6bc85a16..b2e63abd9e01fddddf7a0d306c459c53c0cc59de 100644 --- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java +++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java @@ -2212,6 +2212,36 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware return false; } + @Override + public boolean deleteInactiveUsers(long lastActivityBefore) { + try { + NovaView view = new NovaView("user/inactive_by_creation"); + 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 user document {} for deletion.", oldDoc.getId()); + } + + if (newDocs.size() > 0) { + getDatabase().bulkSaveDocuments(newDocs.toArray(new Document[newDocs.size()])); + LOGGER.info("Deleted {} inactive users.", newDocs.size()); + } + + return true; + } catch (IOException e) { + LOGGER.error("Could not delete inactive users."); + } + + return false; + } + @Override public SessionInfo importSession(User user, ImportExportSession importSession) { final Session session = this.saveSession(user, importSession.generateSessionEntity(user)); diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java index f5d2d2fb6af9bc0041e163a0586213cceb06a4d4..f1ed738724e9378a729998e945de8277915a3054 100644 --- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java +++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java @@ -196,6 +196,8 @@ public interface IDatabaseDao { boolean deleteUser(DbUser dbUser); + boolean deleteInactiveUsers(long lastActivityBefore); + CourseScore getLearningProgress(Session session); List<SessionInfo> getMySessionsInfo(User user, final int start, final int limit); diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java index 37d054ca57bf40a15d4780c86c6418d7bd870d29..3ca5022eae0e182ccdd5a57e4d1bb82e8f20833a 100644 --- a/src/main/java/de/thm/arsnova/services/UserService.java +++ b/src/main/java/de/thm/arsnova/services/UserService.java @@ -56,15 +56,8 @@ import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.UnsupportedEncodingException; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; @@ -82,6 +75,9 @@ public class UserService implements IUserService { private static final int PASSWORD_RESET_KEY_DURABILITY_MS = 2 * 60 * 60 * 1000; + private static final long ACTIVATION_KEY_CHECK_INTERVAL_MS = 30 * 60 * 1000L; + private static final long ACTIVATION_KEY_DURABILITY_MS = 6 * 60 * 60 * 1000L; + public static final Logger LOGGER = LoggerFactory.getLogger(UserService.class); private static final ConcurrentHashMap<UUID, User> socketid2user = new ConcurrentHashMap<UUID, User>(); @@ -161,6 +157,14 @@ public class UserService implements IUserService { } } + @Scheduled(fixedDelay = ACTIVATION_KEY_CHECK_INTERVAL_MS) + public void deleteInactiveUsers() { + LOGGER.info("Delete inactive users."); + long unixTime = System.currentTimeMillis(); + long lastActivityBefore = unixTime - ACTIVATION_KEY_DURABILITY_MS; + databaseDao.deleteInactiveUsers(lastActivityBefore); + } + @Override public User getCurrentUser() { final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java index c9bae3974ac242ad2b8cda3fb89a61ba839e40e6..675efb8a5bedaa4647105aa1fc3a805abfbb820d 100644 --- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java +++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java @@ -458,6 +458,12 @@ public class StubDatabaseDao implements IDatabaseDao { return false; } + @Override + public boolean deleteInactiveUsers(long lastActivityBefore) { + // TODO Auto-generated method stub + return false; + } + @Override public List<InterposedQuestion> getInterposedQuestions(Session session, User user, final int start, final int limit) { // TODO Auto-generated method stub