Skip to content

Commit 1af4d1e

Browse files
committed
fix: 에러 번호 수정
1 parent ad752e7 commit 1af4d1e

File tree

3 files changed

+133
-22
lines changed

3 files changed

+133
-22
lines changed

src/main/java/com/back/domain/studyroom/repository/RoomMemberRepositoryImpl.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,116 @@ public List<RoomMember> findByRoomIdAndUserIdIn(Long roomId, java.util.Set<Long>
100100
)
101101
.fetch();
102102
}
103+
104+
/**
105+
* 사용자가 참여 중인 모든 방의 멤버십 조회
106+
* DB에 저장된 멤버십만 조회 (MEMBER 이상)
107+
* @param userId 사용자 ID
108+
* @return 멤버십 목록
109+
*/
110+
@Override
111+
public List<RoomMember> findActiveByUserId(Long userId) {
112+
return queryFactory
113+
.selectFrom(roomMember)
114+
.where(roomMember.user.id.eq(userId))
115+
.fetch();
116+
}
117+
118+
/**
119+
* 특정 역할의 멤버 조회
120+
* - 방장(HOST) 찾기
121+
* - 부방장(SUB_HOST) 목록 조회
122+
* - 역할별 멤버 필터링
123+
* @param roomId 방 ID
124+
* @param role 역할 (HOST, SUB_HOST, MEMBER, VISITOR)
125+
* @return 해당 역할의 멤버 목록
126+
*/
127+
@Override
128+
public List<RoomMember> findByRoomIdAndRole(Long roomId, RoomRole role) {
129+
return queryFactory
130+
.selectFrom(roomMember)
131+
.where(
132+
roomMember.room.id.eq(roomId),
133+
roomMember.role.eq(role)
134+
)
135+
.fetch();
136+
}
137+
138+
/**
139+
* 방장 조회
140+
* - 방장 권한 확인
141+
* - 방 소유자 정보 표시
142+
* @param roomId 방 ID
143+
* @return 방장 멤버십 (Optional)
144+
*/
145+
@Override
146+
public Optional<RoomMember> findHostByRoomId(Long roomId) {
147+
RoomMember host = queryFactory
148+
.selectFrom(roomMember)
149+
.where(
150+
roomMember.room.id.eq(roomId),
151+
roomMember.role.eq(RoomRole.HOST)
152+
)
153+
.fetchOne();
154+
155+
return Optional.ofNullable(host);
156+
}
157+
158+
/**
159+
* 관리자 권한을 가진 멤버들 조회 (HOST, SUB_HOST)
160+
* @param roomId 방 ID
161+
* @return 관리자 멤버 목록 (HOST, SUB_HOST)
162+
*/
163+
@Override
164+
public List<RoomMember> findManagersByRoomId(Long roomId) {
165+
return queryFactory
166+
.selectFrom(roomMember)
167+
.where(
168+
roomMember.room.id.eq(roomId),
169+
roomMember.role.in(RoomRole.HOST, RoomRole.SUB_HOST)
170+
)
171+
.orderBy(roomMember.role.asc()) // HOST가 먼저
172+
.fetch();
173+
}
174+
175+
/**
176+
* 사용자가 특정 방에서 관리자 권한을 가지고 있는지 확인
177+
* @param roomId 방 ID
178+
* @param userId 사용자 ID
179+
* @return 관리자 권한 여부
180+
*/
181+
@Override
182+
public boolean isManager(Long roomId, Long userId) {
183+
Long count = queryFactory
184+
.select(roomMember.count())
185+
.from(roomMember)
186+
.where(
187+
roomMember.room.id.eq(roomId),
188+
roomMember.user.id.eq(userId),
189+
roomMember.role.in(RoomRole.HOST, RoomRole.SUB_HOST)
190+
)
191+
.fetchOne();
192+
193+
return count != null && count > 0;
194+
}
195+
196+
/**
197+
* 사용자가 이미 해당 방의 멤버인지 확인
198+
* @param roomId 방 ID
199+
* @param userId 사용자 ID
200+
* @return 멤버 여부
201+
*/
202+
@Override
203+
public boolean existsByRoomIdAndUserId(Long roomId, Long userId) {
204+
Long count = queryFactory
205+
.select(roomMember.count())
206+
.from(roomMember)
207+
.where(
208+
roomMember.room.id.eq(roomId),
209+
roomMember.user.id.eq(userId)
210+
)
211+
.fetchOne();
212+
213+
return count != null && count > 0;
214+
}
103215
}

src/main/java/com/back/domain/studyroom/repository/RoomRepositoryImpl.java

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public class RoomRepositoryImpl implements RoomRepositoryCustom {
3838
* - 비공개가 아닌 방 (isPrivate = false)
3939
* - 활성화된 방 (isActive = true)
4040
* - 입장 가능한 상태 (WAITING 또는 ACTIVE)
41-
* - 정원이 가득 차지 않은 방
41+
*
42+
* 참고: 정원 체크는 Redis 기반으로 프론트엔드/서비스에서 수행
4243
* @param pageable 페이징 정보
4344
* @return 페이징된 방 목록
4445
*/
@@ -51,8 +52,7 @@ public Page<Room> findJoinablePublicRooms(Pageable pageable) {
5152
.where(
5253
room.isPrivate.eq(false),
5354
room.isActive.eq(true),
54-
room.status.in(RoomStatus.WAITING, RoomStatus.ACTIVE),
55-
room.currentParticipants.lt(room.maxParticipants)
55+
room.status.in(RoomStatus.WAITING, RoomStatus.ACTIVE)
5656
)
5757
.orderBy(room.createdAt.desc())
5858
.offset(pageable.getOffset())
@@ -66,8 +66,7 @@ public Page<Room> findJoinablePublicRooms(Pageable pageable) {
6666
.where(
6767
room.isPrivate.eq(false),
6868
room.isActive.eq(true),
69-
room.status.in(RoomStatus.WAITING, RoomStatus.ACTIVE),
70-
room.currentParticipants.lt(room.maxParticipants)
69+
room.status.in(RoomStatus.WAITING, RoomStatus.ACTIVE)
7170
)
7271
.fetchOne();
7372

@@ -159,11 +158,15 @@ public Page<Room> findRoomsWithFilters(String title, RoomStatus status, Boolean
159158

160159
/**
161160
* 인기 방 조회 (참가자 수 기준)
161+
*
162+
* 참고: 참가자 수는 Redis에서 조회하므로 DB에서는 정렬 불가
163+
* 서비스 레이어에서 Redis 데이터로 정렬 필요
164+
*
162165
* 조회 조건:
163166
* - 공개 방만 (isPrivate = false)
164167
* - 활성화된 방만 (isActive = true)
165168
* @param pageable 페이징 정보
166-
* @return 페이징된 인기 방 목록
169+
* @return 페이징된 방 목록 (최신순 정렬)
167170
*/
168171
@Override
169172
public Page<Room> findPopularRooms(Pageable pageable) {
@@ -174,10 +177,7 @@ public Page<Room> findPopularRooms(Pageable pageable) {
174177
room.isPrivate.eq(false),
175178
room.isActive.eq(true)
176179
)
177-
.orderBy(
178-
room.currentParticipants.desc(), // 참가자 수 많은 순
179-
room.createdAt.desc() // 최신순
180-
)
180+
.orderBy(room.createdAt.desc()) // 최신순 (서비스에서 Redis 기반으로 재정렬)
181181
.offset(pageable.getOffset())
182182
.limit(pageable.getPageSize())
183183
.fetch();
@@ -197,20 +197,20 @@ public Page<Room> findPopularRooms(Pageable pageable) {
197197

198198
/**
199199
* 비활성 방 정리 (배치 작업용)
200+
*
201+
* 참고: 참가자 수는 Redis에서 관리하므로 DB에서 직접 확인 불가
202+
* 이 메서드는 Redis와 연동하여 사용해야 함
203+
*
200204
* 대상:
201-
* - 참가자가 0명인 방
202205
* - ACTIVE 상태인 방
203206
* - cutoffTime 이전에 마지막으로 업데이트된 방
207+
*
204208
* 처리:
205209
* - 상태를 TERMINATED로 변경
206210
* - isActive를 false로 변경
207-
* 사용 예시:
208-
* ```
209-
* // 1시간 이상 비어있는 방 정리
210-
* LocalDateTime cutoff = LocalDateTime.now().minusHours(1);
211-
* int count = terminateInactiveRooms(cutoff);
212-
* log.info("정리된 방 개수: {}", count);
213-
* ```
211+
*
212+
* TODO: Redis에서 참가자 0명인 방 확인 후 호출
213+
*
214214
* @param cutoffTime 기준 시간 (이 시간 이전에 업데이트된 방 정리)
215215
* @return 정리된 방 개수
216216
*/
@@ -221,7 +221,6 @@ public int terminateInactiveRooms(LocalDateTime cutoffTime) {
221221
.set(room.status, RoomStatus.TERMINATED)
222222
.set(room.isActive, false)
223223
.where(
224-
room.currentParticipants.eq(0),
225224
room.status.eq(RoomStatus.ACTIVE),
226225
room.updatedAt.lt(cutoffTime)
227226
)

src/test/java/com/back/domain/chat/room/controller/RoomChatApiControllerTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ void t8() throws Exception {
290290
.contentType(MediaType.APPLICATION_JSON)
291291
.content(requestBody))
292292
.andExpect(status().isForbidden())
293-
.andExpect(jsonPath("$.code").value("ROOM_013"))
293+
.andExpect(jsonPath("$.code").value("ROOM_014"))
294294
.andExpect(jsonPath("$.message").value("채팅 삭제 권한이 없습니다. 방장 또는 부방장만 가능합니다."));
295295
}
296296

@@ -364,7 +364,7 @@ void t10() throws Exception {
364364
.contentType(MediaType.APPLICATION_JSON)
365365
.content(requestBody))
366366
.andExpect(status().isBadRequest())
367-
.andExpect(jsonPath("$.code").value("ROOM_014"))
367+
.andExpect(jsonPath("$.code").value("ROOM_015"))
368368
.andExpect(jsonPath("$.message").value("삭제 확인 메시지가 일치하지 않습니다."));
369369
}
370370

@@ -434,7 +434,7 @@ void t12() throws Exception {
434434
.contentType(MediaType.APPLICATION_JSON)
435435
.content(requestBody))
436436
.andExpect(status().isForbidden())
437-
.andExpect(jsonPath("$.code").value("ROOM_008"))
437+
.andExpect(jsonPath("$.code").value("ROOM_009"))
438438
.andExpect(jsonPath("$.message").value("방 멤버가 아닙니다."));
439439
}
440440
}

0 commit comments

Comments
 (0)