diff --git a/gg-data/src/main/java/gg/data/party/Room.java b/gg-data/src/main/java/gg/data/party/Room.java index fe3b624c7..2182bac8e 100644 --- a/gg-data/src/main/java/gg/data/party/Room.java +++ b/gg-data/src/main/java/gg/data/party/Room.java @@ -96,4 +96,8 @@ public void updateStatus(RoomType status) { public void updateHost(User host) { this.host = host; } + + public void updateRoomStatus(RoomType status) { + this.status = status; + } } diff --git a/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/RoomAdminController.java b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/RoomAdminController.java index 0a1a38515..9eec231ef 100644 --- a/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/RoomAdminController.java +++ b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/RoomAdminController.java @@ -1,7 +1,40 @@ -package gg.pingpong.api.party.admin.room.controller; +package gg.party.api.admin.room.controller; +import javax.validation.Valid; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import gg.data.party.type.RoomType; +import gg.party.api.admin.room.controller.request.RoomShowChangeReqDto; +import gg.party.api.admin.room.service.RoomAdminService; +import gg.utils.exception.ErrorCode; +import gg.utils.exception.party.RoomStatNotFoundException; +import lombok.RequiredArgsConstructor; + @RestController +@RequiredArgsConstructor +@RequestMapping("/party/admin/rooms") public class RoomAdminController { + + private final RoomAdminService roomAdminService; + + @PatchMapping("/{roomId}") + public ResponseEntity changeRoomVisibility(@PathVariable Long roomId, + @Valid @RequestBody RoomShowChangeReqDto reqDto) throws RoomStatNotFoundException { + + RoomType roomType; + try { + roomType = RoomType.valueOf(reqDto.getStatus().toUpperCase()); + } catch (IllegalArgumentException e) { + throw new RoomStatNotFoundException(); + } + + roomAdminService.modifyRoomStatus(roomId, roomType); + return ResponseEntity.ok().build(); + } } diff --git a/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/request/RoomShowChangeReqDto.java b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/request/RoomShowChangeReqDto.java new file mode 100644 index 000000000..7b0dded19 --- /dev/null +++ b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/controller/request/RoomShowChangeReqDto.java @@ -0,0 +1,13 @@ +package gg.party.api.admin.room.controller.request; + +import javax.validation.constraints.NotNull; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class RoomShowChangeReqDto { + @NotNull + private String status; +} diff --git a/gg-pingpong-api/src/main/java/gg/party/api/admin/room/service/RoomAdminService.java b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/service/RoomAdminService.java new file mode 100644 index 000000000..37d72ae98 --- /dev/null +++ b/gg-pingpong-api/src/main/java/gg/party/api/admin/room/service/RoomAdminService.java @@ -0,0 +1,30 @@ +package gg.party.api.admin.room.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import gg.data.party.Room; +import gg.data.party.type.RoomType; +import gg.repo.party.RoomRepository; +import gg.utils.exception.party.RoomAlreadyHiddenException; +import gg.utils.exception.party.RoomNotFoundException; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class RoomAdminService { + private final RoomRepository roomRepository; + + @Transactional + public void modifyRoomStatus(Long roomId, RoomType newStatus) { + Room room = roomRepository.findById(roomId) + .orElseThrow(RoomNotFoundException::new); + + if (RoomType.HIDDEN == room.getStatus() && RoomType.HIDDEN == newStatus) { + throw new RoomAlreadyHiddenException(); + } + + room.updateRoomStatus(newStatus); + roomRepository.save(room); + } +} diff --git a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java index 7934acf14..bdc376156 100644 --- a/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java +++ b/gg-utils/src/main/java/gg/utils/exception/ErrorCode.java @@ -161,8 +161,10 @@ public enum ErrorCode { USER_NOT_EXIST(404, "PT105", "방에 유저가 존재하지 않습니다."), COMMENT_TOO_LONG(400, "PT201", "댓글은 100자 이하로 작성해주세요."), ROOM_FINISHED(403, "PT501", "마감된 방입니다."), - ROOM_NOT_PARTICIPANT(400, "PT002", "해당 방의 참여자가 아닙니다."), - ROOM_NOT_OPEN(400, "PT003", "해당 방의 참여자가 아닙니다."); + ROOM_NOT_PARTICIPANT(400, "PT202", "해당 방의 참여자가 아닙니다."), + ROOM_NOT_OPEN(400, "PT203", "해당 방의 참여자가 아닙니다."), + ROOM_ALREADY_HIDDEN(400, "PT204", "이미 숨겨진 방입니다."), + ROOMSTAT_NOT_FOUND(404, "PT106", "존재하지 않는 방 status입니다."); private final int status; private final String errCode; diff --git a/gg-utils/src/main/java/gg/utils/exception/party/RoomAlreadyHiddenException.java b/gg-utils/src/main/java/gg/utils/exception/party/RoomAlreadyHiddenException.java new file mode 100644 index 000000000..c923da4f5 --- /dev/null +++ b/gg-utils/src/main/java/gg/utils/exception/party/RoomAlreadyHiddenException.java @@ -0,0 +1,14 @@ +package gg.utils.exception.party; + +import gg.utils.exception.ErrorCode; +import gg.utils.exception.custom.DuplicationException; + +public class RoomAlreadyHiddenException extends DuplicationException { + public RoomAlreadyHiddenException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public RoomAlreadyHiddenException() { + super(ErrorCode.ROOM_ALREADY_HIDDEN.getMessage(), ErrorCode.ROOM_ALREADY_HIDDEN); + } +} diff --git a/gg-utils/src/main/java/gg/utils/exception/party/RoomStatNotFoundException.java b/gg-utils/src/main/java/gg/utils/exception/party/RoomStatNotFoundException.java new file mode 100644 index 000000000..7406251d1 --- /dev/null +++ b/gg-utils/src/main/java/gg/utils/exception/party/RoomStatNotFoundException.java @@ -0,0 +1,14 @@ +package gg.utils.exception.party; + +import gg.utils.exception.ErrorCode; +import gg.utils.exception.custom.NotExistException; + +public class RoomStatNotFoundException extends NotExistException { + public RoomStatNotFoundException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public RoomStatNotFoundException() { + super(ErrorCode.ROOMSTAT_NOT_FOUND.getMessage(), ErrorCode.ROOMSTAT_NOT_FOUND); + } +}