Skip to content

Commit

Permalink
Feature: 처리 제한을 초과한 사용자의 요청은 대기열로 들어가야 한다. (#36)
Browse files Browse the repository at this point in the history
  • Loading branch information
hseong3243 authored Aug 14, 2024
2 parents 0796d7d + 73e5ea3 commit 5fed00a
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 0 deletions.
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 {
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();
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);
}

0 comments on commit 5fed00a

Please sign in to comment.