moved logic from User and Session into services

This commit is contained in:
Patrick Haßel 2024-10-24 15:54:05 +02:00
parent 76405329f8
commit 7ff944dec4
3 changed files with 18 additions and 11 deletions

View File

@ -47,22 +47,18 @@ public abstract class AbstractSession implements IWebSocketMessage {
protected AbstractSession(@NonNull final User user) { protected AbstractSession(@NonNull final User user) {
this.owner = user; this.owner = user;
this.join(user);
} }
public void join(@NonNull final User user) { public void join(@NonNull final User user) {
synchronized (uuid) { synchronized (uuid) {
users.add(user); users.add(user);
touch(); touch();
user.join(this);
} }
} }
public void leave(@NonNull final User user) { public void leave(@NonNull final User user) {
synchronized (uuid) { synchronized (uuid) {
users.remove(user); users.remove(user);
touch();
user.leave(this);
} }
} }

View File

@ -39,9 +39,15 @@ public abstract class AbstractSessionController<SESSION extends AbstractSession>
@Scheduled(timeUnit = TimeUnit.MINUTES, initialDelay = 5, fixedRate = 5) @Scheduled(timeUnit = TimeUnit.MINUTES, initialDelay = 5, fixedRate = 5)
public void cleanUp() { public void cleanUp() {
final ZonedDateTime deadline = ZonedDateTime.now().minusDays(1); final ZonedDateTime deadline = ZonedDateTime.now().minusDays(30);
synchronized (sessions) { synchronized (sessions) {
sessions.removeIf(session -> session.getLastAccess().isBefore(deadline)); sessions.stream().filter(session -> session.getLastAccess().isBefore(deadline)).forEach(this::delete);
}
}
private void delete(@NonNull final SESSION session) {
for (final User user : session.getUsers()) {
user.leave(session);
} }
} }
@ -61,9 +67,7 @@ public abstract class AbstractSessionController<SESSION extends AbstractSession>
sessions.add(session); sessions.add(session);
} }
applicationEventPublisher.publishEvent(session); return join(session, user);
applicationEventPublisher.publishEvent(user);
return toDto(session, user);
} }
@PostMapping("canAccess") @PostMapping("canAccess")
@ -89,7 +93,14 @@ public abstract class AbstractSessionController<SESSION extends AbstractSession>
log.error("Wrong password: user={}, session={}", user, session); log.error("Wrong password: user={}, session={}", user, session);
throw new ResponseStatusException(HttpStatus.FORBIDDEN); throw new ResponseStatusException(HttpStatus.FORBIDDEN);
} }
return join(session, user);
}
@NonNull
private AbstractSessionDto join(@NonNull final SESSION session, @NonNull final User user) {
session.join(user); session.join(user);
user.join(session);
log.info("User joined Session: user={}, session={}", user, session);
applicationEventPublisher.publishEvent(session); applicationEventPublisher.publishEvent(session);
applicationEventPublisher.publishEvent(user); applicationEventPublisher.publishEvent(user);
return toDto(session, user); return toDto(session, user);
@ -124,6 +135,7 @@ public abstract class AbstractSessionController<SESSION extends AbstractSession>
final User user = userService.getByPrivateUuidOrThrow(userUuid); final User user = userService.getByPrivateUuidOrThrow(userUuid);
final SESSION session = getSessionByUuid(sessionUuid); final SESSION session = getSessionByUuid(sessionUuid);
session.leave(user); session.leave(user);
user.leave(session);
applicationEventPublisher.publishEvent(session); applicationEventPublisher.publishEvent(session);
applicationEventPublisher.publishEvent(user); applicationEventPublisher.publishEvent(user);
} }

View File

@ -48,9 +48,8 @@ public class User implements IWebSocketMessage {
} }
public void leave(@NonNull final AbstractSession session) { public void leave(@NonNull final AbstractSession session) {
synchronized (privateUuid) { synchronized (sessions) {
sessions.remove(session); sessions.remove(session);
touch();
} }
} }