Skip to content

Commit aadc5b2

Browse files
authored
Feat: 방 비밀번호 제거 및 수정 기능 (#215) (#216)
1 parent 13af9c4 commit aadc5b2

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed

src/main/java/com/back/domain/studyroom/controller/RoomController.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,59 @@ public ResponseEntity<RsData<Void>> updateRoom(
370370
.body(RsData.success("방 설정 변경 완료", null));
371371
}
372372

373+
@PutMapping("/{roomId}/password")
374+
@Operation(
375+
summary = "방 비밀번호 변경",
376+
description = "비공개 방의 비밀번호를 변경합니다. 현재 비밀번호 확인 후 새 비밀번호로 변경합니다. 방장만 실행 가능합니다."
377+
)
378+
@ApiResponses({
379+
@ApiResponse(responseCode = "200", description = "비밀번호 변경 성공"),
380+
@ApiResponse(responseCode = "400", description = "현재 비밀번호 불일치"),
381+
@ApiResponse(responseCode = "403", description = "방장 권한 없음"),
382+
@ApiResponse(responseCode = "404", description = "존재하지 않는 방"),
383+
@ApiResponse(responseCode = "401", description = "인증 실패")
384+
})
385+
public ResponseEntity<RsData<Void>> updateRoomPassword(
386+
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
387+
@Valid @RequestBody UpdateRoomPasswordRequest request) {
388+
389+
Long currentUserId = currentUser.getUserId();
390+
391+
roomService.updateRoomPassword(
392+
roomId,
393+
request.getCurrentPassword(),
394+
request.getNewPassword(),
395+
currentUserId
396+
);
397+
398+
return ResponseEntity
399+
.status(HttpStatus.OK)
400+
.body(RsData.success("방 비밀번호 변경 완료", null));
401+
}
402+
403+
@DeleteMapping("/{roomId}/password")
404+
@Operation(
405+
summary = "방 비밀번호 제거",
406+
description = "방의 비밀번호를 제거합니다. 비밀번호가 제거되면 누구나 자유롭게 입장할 수 있습니다. 방장만 실행 가능합니다."
407+
)
408+
@ApiResponses({
409+
@ApiResponse(responseCode = "200", description = "비밀번호 제거 성공"),
410+
@ApiResponse(responseCode = "403", description = "방장 권한 없음"),
411+
@ApiResponse(responseCode = "404", description = "존재하지 않는 방"),
412+
@ApiResponse(responseCode = "401", description = "인증 실패")
413+
})
414+
public ResponseEntity<RsData<Void>> removeRoomPassword(
415+
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {
416+
417+
Long currentUserId = currentUser.getUserId();
418+
419+
roomService.removeRoomPassword(roomId, currentUserId);
420+
421+
return ResponseEntity
422+
.status(HttpStatus.OK)
423+
.body(RsData.success("방 비밀번호 제거 완료", null));
424+
}
425+
373426
@DeleteMapping("/{roomId}")
374427
@Operation(
375428
summary = "방 종료",
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.back.domain.studyroom.dto;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.Size;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class UpdateRoomPasswordRequest {
13+
@NotBlank(message = "현재 비밀번호는 필수입니다")
14+
private String currentPassword;
15+
16+
@NotBlank(message = "새 비밀번호는 필수입니다")
17+
@Size(min = 4, max = 20, message = "비밀번호는 4~20자여야 합니다")
18+
private String newPassword;
19+
}

src/main/java/com/back/domain/studyroom/service/RoomService.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,58 @@ public void updateRoomSettings(Long roomId, String title, String description,
291291
log.info("방 설정 변경 완료 - RoomId: {}, UserId: {}", roomId, userId);
292292
}
293293

294+
/**
295+
* 방 비밀번호 변경
296+
* - 방장만 변경 가능
297+
* - 현재 비밀번호 검증 후 변경
298+
* @param roomId 방 ID
299+
* @param currentPassword 현재 비밀번호
300+
* @param newPassword 새 비밀번호
301+
* @param userId 요청자 ID (방장)
302+
*/
303+
@Transactional
304+
public void updateRoomPassword(Long roomId, String currentPassword, String newPassword, Long userId) {
305+
Room room = roomRepository.findById(roomId)
306+
.orElseThrow(() -> new CustomException(ErrorCode.ROOM_NOT_FOUND));
307+
308+
// 방장 권한 확인
309+
if (!room.isOwner(userId)) {
310+
throw new CustomException(ErrorCode.NOT_ROOM_HOST);
311+
}
312+
313+
// 현재 비밀번호 검증
314+
if (!currentPassword.equals(room.getPassword())) {
315+
throw new CustomException(ErrorCode.ROOM_PASSWORD_MISMATCH);
316+
}
317+
318+
// 새 비밀번호 설정
319+
room.updatePassword(newPassword);
320+
321+
log.info("방 비밀번호 변경 완료 - RoomId: {}, UserId: {}", roomId, userId);
322+
}
323+
324+
/**
325+
* 방 비밀번호 제거 (공개방으로 전환)
326+
* - 방장만 제거 가능
327+
* @param roomId 방 ID
328+
* @param userId 요청자 ID (방장)
329+
*/
330+
@Transactional
331+
public void removeRoomPassword(Long roomId, Long userId) {
332+
Room room = roomRepository.findById(roomId)
333+
.orElseThrow(() -> new CustomException(ErrorCode.ROOM_NOT_FOUND));
334+
335+
// 방장 권한 확인
336+
if (!room.isOwner(userId)) {
337+
throw new CustomException(ErrorCode.NOT_ROOM_HOST);
338+
}
339+
340+
// 비밀번호 제거
341+
room.updatePassword(null);
342+
343+
log.info("방 비밀번호 제거 완료 - RoomId: {}, UserId: {}", roomId, userId);
344+
}
345+
294346
@Transactional
295347
public void terminateRoom(Long roomId, Long userId) {
296348

src/main/java/com/back/global/exception/ErrorCode.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public enum ErrorCode {
3737
CHAT_DELETE_FORBIDDEN(HttpStatus.FORBIDDEN, "ROOM_014", "채팅 삭제 권한이 없습니다. 방장 또는 부방장만 가능합니다."),
3838
INVALID_DELETE_CONFIRMATION(HttpStatus.BAD_REQUEST, "ROOM_015", "삭제 확인 메시지가 일치하지 않습니다."),
3939
CHAT_DELETE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "ROOM_016", "채팅 삭제 중 오류가 발생했습니다."),
40+
ROOM_PASSWORD_MISMATCH(HttpStatus.BAD_REQUEST, "ROOM_017", "현재 비밀번호가 일치하지 않습니다."),
41+
NOT_ROOM_HOST(HttpStatus.FORBIDDEN, "ROOM_018", "방장 권한이 필요합니다."),
42+
4043

4144
// ======================== 스터디 플래너 관련 ========================
4245
PLAN_NOT_FOUND(HttpStatus.NOT_FOUND, "PLAN_001", "존재하지 않는 학습 계획입니다."),

0 commit comments

Comments
 (0)