Skip to content
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
Expand Up @@ -370,6 +370,59 @@ public ResponseEntity<RsData<Void>> updateRoom(
.body(RsData.success("방 설정 변경 완료", null));
}

@PutMapping("/{roomId}/password")
@Operation(
summary = "방 비밀번호 변경",
description = "비공개 방의 비밀번호를 변경합니다. 현재 비밀번호 확인 후 새 비밀번호로 변경합니다. 방장만 실행 가능합니다."
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "비밀번호 변경 성공"),
@ApiResponse(responseCode = "400", description = "현재 비밀번호 불일치"),
@ApiResponse(responseCode = "403", description = "방장 권한 없음"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 방"),
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<Void>> updateRoomPassword(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId,
@Valid @RequestBody UpdateRoomPasswordRequest request) {

Long currentUserId = currentUser.getUserId();

roomService.updateRoomPassword(
roomId,
request.getCurrentPassword(),
request.getNewPassword(),
currentUserId
);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("방 비밀번호 변경 완료", null));
}

@DeleteMapping("/{roomId}/password")
@Operation(
summary = "방 비밀번호 제거",
description = "방의 비밀번호를 제거합니다. 비밀번호가 제거되면 누구나 자유롭게 입장할 수 있습니다. 방장만 실행 가능합니다."
)
@ApiResponses({
@ApiResponse(responseCode = "200", description = "비밀번호 제거 성공"),
@ApiResponse(responseCode = "403", description = "방장 권한 없음"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 방"),
@ApiResponse(responseCode = "401", description = "인증 실패")
})
public ResponseEntity<RsData<Void>> removeRoomPassword(
@Parameter(description = "방 ID", required = true) @PathVariable Long roomId) {

Long currentUserId = currentUser.getUserId();

roomService.removeRoomPassword(roomId, currentUserId);

return ResponseEntity
.status(HttpStatus.OK)
.body(RsData.success("방 비밀번호 제거 완료", null));
}

@DeleteMapping("/{roomId}")
@Operation(
summary = "방 종료",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.back.domain.studyroom.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class UpdateRoomPasswordRequest {
@NotBlank(message = "현재 비밀번호는 필수입니다")
private String currentPassword;

@NotBlank(message = "새 비밀번호는 필수입니다")
@Size(min = 4, max = 20, message = "비밀번호는 4~20자여야 합니다")
private String newPassword;
}
52 changes: 52 additions & 0 deletions src/main/java/com/back/domain/studyroom/service/RoomService.java
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,58 @@ public void updateRoomSettings(Long roomId, String title, String description,
log.info("방 설정 변경 완료 - RoomId: {}, UserId: {}", roomId, userId);
}

/**
* 방 비밀번호 변경
* - 방장만 변경 가능
* - 현재 비밀번호 검증 후 변경
* @param roomId 방 ID
* @param currentPassword 현재 비밀번호
* @param newPassword 새 비밀번호
* @param userId 요청자 ID (방장)
*/
@Transactional
public void updateRoomPassword(Long roomId, String currentPassword, String newPassword, Long userId) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new CustomException(ErrorCode.ROOM_NOT_FOUND));

// 방장 권한 확인
if (!room.isOwner(userId)) {
throw new CustomException(ErrorCode.NOT_ROOM_HOST);
}

// 현재 비밀번호 검증
if (!currentPassword.equals(room.getPassword())) {
throw new CustomException(ErrorCode.ROOM_PASSWORD_MISMATCH);
}

// 새 비밀번호 설정
room.updatePassword(newPassword);

log.info("방 비밀번호 변경 완료 - RoomId: {}, UserId: {}", roomId, userId);
}

/**
* 방 비밀번호 제거 (공개방으로 전환)
* - 방장만 제거 가능
* @param roomId 방 ID
* @param userId 요청자 ID (방장)
*/
@Transactional
public void removeRoomPassword(Long roomId, Long userId) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new CustomException(ErrorCode.ROOM_NOT_FOUND));

// 방장 권한 확인
if (!room.isOwner(userId)) {
throw new CustomException(ErrorCode.NOT_ROOM_HOST);
}

// 비밀번호 제거
room.updatePassword(null);

log.info("방 비밀번호 제거 완료 - RoomId: {}, UserId: {}", roomId, userId);
}

@Transactional
public void terminateRoom(Long roomId, Long userId) {

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/back/global/exception/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ public enum ErrorCode {
CHAT_DELETE_FORBIDDEN(HttpStatus.FORBIDDEN, "ROOM_014", "채팅 삭제 권한이 없습니다. 방장 또는 부방장만 가능합니다."),
INVALID_DELETE_CONFIRMATION(HttpStatus.BAD_REQUEST, "ROOM_015", "삭제 확인 메시지가 일치하지 않습니다."),
CHAT_DELETE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "ROOM_016", "채팅 삭제 중 오류가 발생했습니다."),
ROOM_PASSWORD_MISMATCH(HttpStatus.BAD_REQUEST, "ROOM_017", "현재 비밀번호가 일치하지 않습니다."),
NOT_ROOM_HOST(HttpStatus.FORBIDDEN, "ROOM_018", "방장 권한이 필요합니다."),


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