Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: 처리 제한을 초과한 사용자의 요청은 대기열로 들어가야 한다. #36

Merged
merged 6 commits into from
Aug 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.thirdparty.ticketing.domain.waitingroom;

public interface RunningRoom {
boolean contains(UserInfo userInfo);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.thirdparty.ticketing.domain.waitingroom;

import lombok.Data;

@Data
public class UserInfo {
hseong3243 marked this conversation as resolved.
Show resolved Hide resolved
private final String email;
}
Original file line number Diff line number Diff line change
@@ -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();
hseong3243 marked this conversation as resolved.
Show resolved Hide resolved
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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.thirdparty.ticketing.domain.waitingroom;

public interface WaitingCounter {

/**
* @return 사용자에게 부여되는 고유한 카운트를 반환한다.
*/
long getNextCount();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.thirdparty.ticketing.domain.waitingroom;

public interface WaitingLine {

/**
* 사용자를 대기열에 넣는다.
*
* @param userInfo 사용자의 정보
* @param waitingCounter 사용자의 고유한 카운트 값
*/
void enter(UserInfo userInfo, long waitingCounter);
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Loading