diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java new file mode 100644 index 00000000..259cf690 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/RunningRoom.java @@ -0,0 +1,5 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface RunningRoom { + boolean contains(UserInfo userInfo); +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java new file mode 100644 index 00000000..39a26ff9 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/UserInfo.java @@ -0,0 +1,8 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.Data; + +@Data +public class UserInfo { + private final String email; +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java new file mode 100644 index 00000000..0708c607 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingAspect.java @@ -0,0 +1,27 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class WaitingAspect { + + private final WaitingManager waitingManager; + + private Object waitingRequest(ProceedingJoinPoint joinPoint) throws Throwable { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String email = (String) authentication.getPrincipal(); + UserInfo userInfo = new UserInfo(email); + if (waitingManager.isReadyToHandle(userInfo)) { + return joinPoint.proceed(); + } else { + long waitingNumber = waitingManager.enterWaitingRoom(userInfo); + return ResponseEntity.status(HttpStatus.TEMPORARY_REDIRECT).body(waitingNumber); + } + } +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java new file mode 100644 index 00000000..d45374db --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingCounter.java @@ -0,0 +1,9 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface WaitingCounter { + + /** + * @return 사용자에게 부여되는 고유한 카운트를 반환한다. + */ + long getNextCount(); +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java new file mode 100644 index 00000000..dcf007f5 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingLine.java @@ -0,0 +1,12 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +public interface WaitingLine { + + /** + * 사용자를 대기열에 넣는다. + * + * @param userInfo 사용자의 정보 + * @param waitingCounter 사용자의 고유한 카운트 값 + */ + void enter(UserInfo userInfo, long waitingCounter); +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java new file mode 100644 index 00000000..07e31811 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingManager.java @@ -0,0 +1,18 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class WaitingManager { + + private final RunningRoom runningRoom; + private final WaitingRoom waitingRoom; + + public boolean isReadyToHandle(UserInfo userInfo) { + return runningRoom.contains(userInfo); + } + + public long enterWaitingRoom(UserInfo userInfo) { + return waitingRoom.enter(userInfo); + } +} diff --git a/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java new file mode 100644 index 00000000..6580c680 --- /dev/null +++ b/src/main/java/com/thirdparty/ticketing/domain/waitingroom/WaitingRoom.java @@ -0,0 +1,18 @@ +package com.thirdparty.ticketing.domain.waitingroom; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public abstract class WaitingRoom { + + private final WaitingLine waitingLine; + private final WaitingCounter waitingCounter; + + /** + * 사용자를 대기열에 넣고, 대기공간에 보관한다. + * + * @param userInfo 사용자의 정보 + * @return 사용자의 남은 순번을 반환한다. + */ + public abstract long enter(UserInfo userInfo); +}