From 8dd99726cebc70945693b30646f36502bf498d98 Mon Sep 17 00:00:00 2001 From: Lars Simon Winzer Date: Sun, 15 Mar 2026 19:29:25 +0100 Subject: [PATCH] Add: UserCleanupJob as runnable to remove all expired users --- .../server/domain/user/UserCleanupJob.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserCleanupJob.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserCleanupJob.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserCleanupJob.java new file mode 100644 index 0000000..d39db57 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/UserCleanupJob.java @@ -0,0 +1,39 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.domain.user; + +import java.time.Duration; +import java.time.Instant; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class UserCleanupJob implements Runnable { + private static final Logger logger = LogManager.getLogger(UserCleanupJob.class); + + private final UserRegistry registry; + private final Duration reconnectThreshold; + + public UserCleanupJob(UserRegistry registry, Duration reconnectThreshold) { + this.registry = registry; + this.reconnectThreshold = reconnectThreshold; + } + + @Override + public void run() { + logger.debug("Job started."); + Instant threshold = Instant.now().minus(reconnectThreshold); + + for (User user : registry.getAllUsers()) { + if (user.getDisconnectedAt().isEmpty()) { + continue; + } + + Instant disconnectedAt = user.getDisconnectedAt().get(); + if (disconnectedAt.isBefore(threshold)) { + if (registry.removeIfStillDisconnected(user.getId())) { + logger.info("Removed expired user {} ({})", user.getName(), user.getId().value()); + } + } + } + + logger.debug("Job finished."); + } +}