Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] 방 상세 조회 api #671

Merged
merged 20 commits into from
Mar 4, 2024
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
2 changes: 1 addition & 1 deletion gg-data/src/main/java/gg/data/party/Comment.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class Comment extends BaseTimeEntity {
private String content;

@Column(name = "is_hidden", nullable = false)
private Boolean isHidden;
private boolean isHidden;

public Comment(User user, UserRoom userRoom, Room room, String content) {
this.user = user;
Expand Down
8 changes: 6 additions & 2 deletions gg-data/src/main/java/gg/data/party/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ public class Room extends BaseTimeEntity {
@JoinColumn(name = "category_id")
private Category category;

@Column(name = "current_people")
private Integer currentPeople;

@Column(name = "title", length = 15)
private String title;

Expand All @@ -68,13 +71,14 @@ public class Room extends BaseTimeEntity {
private RoomType status;

@Builder
public Room(User host, User creator, Category category, String title, String content, Integer maxPeople,
Integer minPeople, LocalDateTime dueDate, RoomType status) {
public Room(User host, User creator, Category category, String title, String content, Integer currentPeople,
Integer maxPeople, Integer minPeople, LocalDateTime dueDate, RoomType status) {
this.host = host;
this.creator = creator;
this.category = category;
this.title = title;
this.content = content;
this.currentPeople = currentPeople;
this.maxPeople = maxPeople;
this.minPeople = minPeople;
this.dueDate = dueDate;
Expand Down
6 changes: 5 additions & 1 deletion gg-data/src/main/java/gg/data/party/UserRoom.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,16 @@ public class UserRoom extends BaseTimeEntity {
private String nickname;

@Column(name = "is_exist")
private Boolean isExist;
private boolean isExist;

public UserRoom(User user, Room room, String randomNickname) {
this.user = user;
this.room = room;
this.nickname = randomNickname;
this.isExist = true;
}

public boolean getIsExist() {
return this.isExist;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class CommentService {
@Transactional
public void createComment(Long roomId, CommentCreateReqDto reqDto, Long userId) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new RoomNotFoundException(ErrorCode.ROOM_NOT_FOUND));
.orElseThrow(() -> new RoomNotFoundException("방을 찾을 수 없습니다."));
if (LocalDateTime.now().isAfter(room.getDueDate())) {
throw new RoomUpdateException(ErrorCode.ROOM_FINISHED);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import gg.party.api.user.room.controller.request.RoomCreateReqDto;
import gg.party.api.user.room.controller.response.RoomDetailResDto;
import gg.party.api.user.room.controller.response.RoomListResDto;
import gg.party.api.user.room.service.RoomService;
import gg.pingpong.api.global.utils.argumentresolver.Login;
Expand Down Expand Up @@ -64,4 +66,17 @@ public ResponseEntity<RoomListResDto> myHistoryRoomList(@Parameter(hidden = true
RoomListResDto roomListResDto = roomService.findOrderMyHistoryRoomList(user.getId());
return ResponseEntity.status(HttpStatus.OK).body(roomListResDto);
}

/**
* 방의 상세정보를 조회한다
* @param roomId 방 id
* 익명성을 지키기 위해 nickname을 리턴
* @return 방 상세정보 dto
*/
@GetMapping("/{room_id}")
public ResponseEntity<RoomDetailResDto> roomDetailInfo(@Parameter(hidden = true) @Login UserDto user,
@PathVariable("room_id") Long roomId) {
RoomDetailResDto roomDetailResDto = roomService.findOrderRoomDetail(user.getId(), roomId);
return ResponseEntity.status(HttpStatus.OK).body(roomDetailResDto);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static Room toEntity(RoomCreateReqDto dto, User user, Category category)
.category(category)
.title(dto.getTitle())
.content(dto.getContent())
.currentPeople(1)
.maxPeople(dto.getMaxPeople())
.minPeople(dto.getMinPeople())
.dueDate(dto.getDueDate())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package gg.party.api.user.room.controller.response;

import java.time.LocalDateTime;

import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class CommentResDto {
private Long commentId;
private String nickname;
private String content;
private Boolean isHidden;
private LocalDateTime createDate;

public CommentResDto(Long id, String nickname, String content, boolean hidden, LocalDateTime createdAt) {
this.commentId = id;
this.nickname = nickname;
this.content = content;
this.isHidden = hidden;
this.createDate = createdAt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package gg.party.api.user.room.controller.response;

import java.time.LocalDateTime;
import java.util.List;

import gg.data.party.Room;
import gg.data.party.type.RoomType;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@Getter
public class RoomDetailResDto {
private Long roomId;
private String title;
private Long categoryId;
private Integer currentPeople;
private Integer minPeople;
private Integer maxPeople;
private RoomType status;
private LocalDateTime dueDate;
private LocalDateTime createDate;
private String myNickname;
private String hostNickname;
private List<UserRoomResDto> roomUsers;
private List<CommentResDto> comments;

public RoomDetailResDto(Room room, String myNickname, String hostNickname,
List<UserRoomResDto> roomUsers,
List<CommentResDto> comments) {
this.roomId = room.getId();
this.title = room.getTitle();
this.categoryId = room.getCategory().getId();
this.currentPeople = room.getCurrentPeople();
this.minPeople = room.getMinPeople();
this.maxPeople = room.getMaxPeople();
this.status = room.getStatus();
this.dueDate = room.getDueDate();
this.createDate = room.getCreatedAt();
this.myNickname = myNickname;
this.hostNickname = hostNickname;
this.roomUsers = roomUsers;
this.comments = comments;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class RoomResDto {
private Long categoryId;
private String title;
private String content;
private Integer currentPeople;
private Integer maxPeople;
private Integer minPeople;
private LocalDateTime dueDate;
Expand All @@ -28,6 +29,7 @@ public RoomResDto(Room room) {
this.categoryId = room.getCategory().getId();
this.title = room.getTitle();
this.content = room.getContent();
this.currentPeople = room.getCurrentPeople();
this.maxPeople = room.getMaxPeople();
this.minPeople = room.getMinPeople();
this.dueDate = room.getDueDate();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package gg.party.api.user.room.controller.response;

import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)
@Getter
public class UserRoomResDto {
private Long roomUserId;
private String nickname;

public UserRoomResDto(Long id, String nickname) {
this.roomUserId = id;
this.nickname = nickname;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.transaction.Transactional;
Expand All @@ -18,14 +19,20 @@
import gg.data.party.type.RoomType;
import gg.data.user.User;
import gg.party.api.user.room.controller.request.RoomCreateReqDto;
import gg.party.api.user.room.controller.response.CommentResDto;
import gg.party.api.user.room.controller.response.RoomDetailResDto;
import gg.party.api.user.room.controller.response.RoomListResDto;
import gg.party.api.user.room.controller.response.RoomResDto;
import gg.party.api.user.room.controller.response.UserRoomResDto;
import gg.pingpong.api.user.user.dto.UserDto;
import gg.repo.party.CategoryRepository;
import gg.repo.party.CommentRepository;
import gg.repo.party.RoomRepository;
import gg.repo.party.UserRoomRepository;
import gg.repo.user.UserRepository;
import gg.utils.exception.party.CategoryNotFoundException;
import gg.utils.exception.party.RoomNotFoundException;
import gg.utils.exception.party.RoomReportedException;
import gg.utils.exception.user.UserNotFoundException;
import lombok.RequiredArgsConstructor;

Expand All @@ -36,6 +43,7 @@ public class RoomService {
private final UserRepository userRepository;
private final CategoryRepository categoryRepository;
private final UserRoomRepository userRoomRepository;
private final CommentRepository commentRepository;

/**
* 시작하지 않은 방과 시작한 방을 모두 조회한다
Expand Down Expand Up @@ -123,4 +131,46 @@ public RoomListResDto findOrderMyHistoryRoomList(Long userId) {

return new RoomListResDto(roomListResDto);
}

/**
* 방의 상세정보를 조회한다
* @param userId 자신의 id
* @param roomId 방 id
* @exception RoomNotFoundException 유효하지 않은 방 입력
* @exception RoomReportedException 신고 받은 방 처리
* 익명성을 지키기 위해 nickname을 리턴
* @return 방 상세정보 dto
*/
@Transactional
public RoomDetailResDto findOrderRoomDetail(Long userId, Long roomId) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new RoomNotFoundException(roomId + "번 방을 찾을 수 없습니다."));
if (room.getStatus() == RoomType.HIDDEN) {
throw new RoomReportedException(roomId + "번방은 신고 상태로 접근이 불가능합니다.");
}

List<UserRoomResDto> roomUsers = userRoomRepository.findByRoomId(roomId).stream()
.filter(userRoom -> userRoom.getIsExist())
.map(userRoom -> new UserRoomResDto(userRoom.getId(), userRoom.getNickname()))
.collect(Collectors.toList());

List<CommentResDto> comments = commentRepository.findByRoomId(roomId).stream()
.map(
comment -> new CommentResDto(comment.getId(), comment.getUserRoom().getNickname(), comment.getContent(),
comment.isHidden(), comment.getCreatedAt()))
.collect(Collectors.toList());

Optional<UserRoom> userRoomOptional = userRoomRepository.findByUserIdAndRoomIdAndIsExistTrue(userId, roomId);
String myNickname = null;
if (userRoomOptional.isPresent()) {
UserRoom userRoom = userRoomOptional.get();
myNickname = userRoom.getNickname();
}

Optional<UserRoom> hostUserRoomOptional = userRoomRepository.findByUserIdAndRoomIdAndIsExistTrue(
room.getHost().getId(), roomId);
String hostNickname = hostUserRoomOptional.get().getNickname();

return new RoomDetailResDto(room, myNickname, hostNickname, roomUsers, comments);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ CREATE TABLE room (
category_id BIGINT NOT NULL,
title VARCHAR(15) NOT NULL,
content VARCHAR(100) NOT NULL,
current_people INT NOT NULL,
max_people INT NOT NULL,
min_people INT NOT NULL DEFAULT 2,
due_date DATETIME NOT NULL,
Expand Down
4 changes: 3 additions & 1 deletion gg-repo/src/main/java/gg/repo/party/CommentRepository.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package gg.repo.party;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import gg.data.party.Comment;

public interface CommentRepository extends JpaRepository<Comment, Long> {

List<Comment> findByRoomId(Long roomId);
}
6 changes: 5 additions & 1 deletion gg-repo/src/main/java/gg/repo/party/UserRoomRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,13 @@
public interface UserRoomRepository extends JpaRepository<UserRoom, Long> {
List<UserRoom> findByUserId(Long userId);

List<UserRoom> findByRoomId(Long roomId);

Optional<UserRoom> findByUserAndRoom(User user, Room room);

@Query("SELECT ur.room FROM UserRoom ur WHERE ur.user.id = :userId AND ur.isExist = true "
+ "AND ur.room.status = :status AND ur.room.dueDate IS NOT NULL ORDER BY ur.room.dueDate ASC")
+ "AND ur.room.status = :status ORDER BY ur.room.dueDate ASC")
List<Room> findFinishRoomsByUserId(@Param("userId") Long userId, @Param("status") RoomType status);

Optional<UserRoom> findByUserIdAndRoomIdAndIsExistTrue(Long userId, Long roomId);
}
9 changes: 5 additions & 4 deletions gg-utils/src/main/java/gg/utils/exception/ErrorCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -154,11 +154,12 @@ public enum ErrorCode {
TOURNAMENT_IS_BEFORE(403, "TN017", "before인 토너먼트에서 점수 수정할 수 없습니다."),

// Party
COMMENT_TOO_LONG(400, "PT201", "댓글은 100자 이하로 작성해 주세요."),
ROOM_FINISHED(403, "PT501", "마감된 방입니다."),
CATEGORY_NOT_FOUND(404, "PT101", "유효하지 않은 카테고리입니다."),
CATEGORY_NOT_FOUND(404, "PT101", "유효하지 않은 카테고리 입니다."),
ROOM_NOT_FOUND(404, "PT102", "존재하지 않는 방입니다."),
USER_NOT_IN_ROOM(404, "PT103", "방에 존재하지 않는 유저입니다.");
USER_NOT_IN_ROOM(404, "PT103", "방에 존재하지 않는 유저입니다."),
ROOM_REPORTED_ERROR(404, "PT104", "신고 상태로 접근이 불가능합니다."),
COMMENT_TOO_LONG(400, "PT201", "댓글은 100자 이하로 작성해주세요."),
ROOM_FINISHED(403, "PT501", "마감된 방입니다.");

private final int status;
private final String errCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import gg.utils.exception.custom.NotExistException;

public class RoomNotFoundException extends NotExistException {
public RoomNotFoundException(ErrorCode errorCode) {
super(errorCode.getMessage(), errorCode);
public RoomNotFoundException(String message) {
super(message, ErrorCode.ROOM_NOT_FOUND);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package gg.utils.exception.party;

import gg.utils.exception.ErrorCode;
import gg.utils.exception.custom.NotExistException;

public class RoomReportedException extends NotExistException {
public RoomReportedException(String message) {
super(message, ErrorCode.ROOM_REPORTED_ERROR);
}
}
Loading