From e8fd01596d3d75786a8f9fe1bfa335d6694ff9ad Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 18:37:12 +0900 Subject: [PATCH 1/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/dto/response/HotProductGiftDto.java | 22 ++++++++++++ .../room/dto/response/RoomFriendsGiftDto.java | 24 +++++++++++++ .../dto/response/RoomMainResponseDto.java | 34 +++++++++++++++++++ .../room/dto/response/RoomMyGiftDto.java | 22 ++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/main/java/org/sopt/sweet/domain/room/dto/response/HotProductGiftDto.java create mode 100644 src/main/java/org/sopt/sweet/domain/room/dto/response/RoomFriendsGiftDto.java create mode 100644 src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMainResponseDto.java create mode 100644 src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMyGiftDto.java diff --git a/src/main/java/org/sopt/sweet/domain/room/dto/response/HotProductGiftDto.java b/src/main/java/org/sopt/sweet/domain/room/dto/response/HotProductGiftDto.java new file mode 100644 index 0000000..85a199c --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/room/dto/response/HotProductGiftDto.java @@ -0,0 +1,22 @@ +package org.sopt.sweet.domain.room.dto.response; + +import lombok.Builder; + +@Builder +public record HotProductGiftDto( + Long productId, + String imageUrl, + String name, + String url, + int cost +) { + public static HotProductGiftDto of(Long productId, String imageUrl, String name, String url, int cost){ + return HotProductGiftDto.builder() + .productId(productId) + .imageUrl(imageUrl) + .name(name) + .url(url) + .cost(cost) + .build(); + } +} diff --git a/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomFriendsGiftDto.java b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomFriendsGiftDto.java new file mode 100644 index 0000000..3c8fca3 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomFriendsGiftDto.java @@ -0,0 +1,24 @@ +package org.sopt.sweet.domain.room.dto.response; + +import lombok.Builder; + +@Builder +public record RoomFriendsGiftDto( + Long giftId, + String imageUrl, + String name, + String url, + int cost, + String ownerName +) { + public static RoomFriendsGiftDto of(Long giftId, String imageUrl, String name, String url, int cost, String ownerName) { + return RoomFriendsGiftDto.builder() + .giftId(giftId) + .imageUrl(imageUrl) + .name(name) + .url(url) + .cost(cost) + .ownerName(ownerName) + .build(); + } +} diff --git a/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMainResponseDto.java b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMainResponseDto.java new file mode 100644 index 0000000..c0375db --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMainResponseDto.java @@ -0,0 +1,34 @@ +package org.sopt.sweet.domain.room.dto.response; + +import lombok.Builder; + +import java.time.LocalDateTime; +import java.util.List; +@Builder +public record RoomMainResponseDto( + int gifterNumber, + String gifteeName, + String invitationCode, + LocalDateTime tournamentStartDate, + List roomMyGiftDtoList, + List roomFriendsGiftDtoList, + List hotProductGiftDtoList +) { + public static RoomMainResponseDto of(int gifterNumber, + String gifteeName, + String invitationCode, + LocalDateTime tournamentStartDate, + List roomMyGiftDtoList, + List roomFriendsGiftDtoList, + List hotProductGiftDtoList){ + return RoomMainResponseDto.builder() + .gifterNumber(gifterNumber) + .gifteeName(gifteeName) + .invitationCode(invitationCode) + .tournamentStartDate(tournamentStartDate) + .roomMyGiftDtoList(roomMyGiftDtoList) + .roomFriendsGiftDtoList(roomFriendsGiftDtoList) + .hotProductGiftDtoList(hotProductGiftDtoList) + .build(); + } +} diff --git a/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMyGiftDto.java b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMyGiftDto.java new file mode 100644 index 0000000..d862d4f --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomMyGiftDto.java @@ -0,0 +1,22 @@ +package org.sopt.sweet.domain.room.dto.response; + +import lombok.Builder; + +@Builder +public record RoomMyGiftDto( + Long giftId, + String imageUrl, + String name, + String url, + int cost +) { + public static RoomMyGiftDto of(Long giftId, String imageUrl, String name, String url, int cost){ + return RoomMyGiftDto.builder() + .giftId(giftId) + .imageUrl(imageUrl) + .name(name) + .url(url) + .cost(cost) + .build(); + } +} From fa1e90522ead670859419348ff57a34251edb073 Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 18:37:24 +0900 Subject: [PATCH 2/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/sweet/domain/room/controller/RoomController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java b/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java index ec39136..0017abc 100644 --- a/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java +++ b/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java @@ -6,6 +6,7 @@ import org.sopt.sweet.domain.room.dto.response.CreateRoomResponseDto; import org.sopt.sweet.domain.room.dto.response.JoinRoomResponseDto; import org.sopt.sweet.domain.room.dto.response.RoomInviteResponseDto; +import org.sopt.sweet.domain.room.dto.response.RoomMainResponseDto; import org.sopt.sweet.domain.room.service.RoomService; import org.sopt.sweet.global.common.SuccessResponse; import org.sopt.sweet.global.config.auth.UserId; @@ -36,4 +37,10 @@ public ResponseEntity> joinRoom(@UserId Long userId, @Request final JoinRoomResponseDto joinRoomResponseDto = roomService.findAndJoinRoom(userId, joinRoomRequestDto); return SuccessResponse.ok(joinRoomResponseDto); } + + @GetMapping("/{roomId}") + public ResponseEntity> getRoomMainInfo(@UserId Long userId, @PathVariable Long roomId){ + final RoomMainResponseDto roomMainResponseDto = roomService.getRoomMainInfo(userId, roomId); + return SuccessResponse.ok(roomMainResponseDto); + } } From 880822065ebc29f1ff15efad0a324be98b1d2dc7 Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 18:37:34 +0900 Subject: [PATCH 3/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gift/repository/GiftRepository.java | 7 ++ .../product/repository/ProductRepository.java | 6 ++ .../domain/room/service/RoomService.java | 80 ++++++++++++++++++- 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/sweet/domain/gift/repository/GiftRepository.java b/src/main/java/org/sopt/sweet/domain/gift/repository/GiftRepository.java index f1d0359..3d3422e 100644 --- a/src/main/java/org/sopt/sweet/domain/gift/repository/GiftRepository.java +++ b/src/main/java/org/sopt/sweet/domain/gift/repository/GiftRepository.java @@ -3,11 +3,18 @@ import org.sopt.sweet.domain.gift.entity.Gift; import org.sopt.sweet.domain.member.entity.Member; import org.sopt.sweet.domain.room.entity.Room; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface GiftRepository extends JpaRepository { long countByRoomAndMember(Room room, Member member); + List findByRoomAndMember(Room room, Member member); + + @Query("SELECT g FROM Gift g WHERE g.room = :room AND g.member <> :member ORDER BY g.id DESC") + List findLatestGiftsByRoomAndNotMember(@Param("room") Room room, @Param("member") Member member, Pageable pageable); } diff --git a/src/main/java/org/sopt/sweet/domain/product/repository/ProductRepository.java b/src/main/java/org/sopt/sweet/domain/product/repository/ProductRepository.java index b6120b4..4c94ddf 100644 --- a/src/main/java/org/sopt/sweet/domain/product/repository/ProductRepository.java +++ b/src/main/java/org/sopt/sweet/domain/product/repository/ProductRepository.java @@ -2,6 +2,12 @@ import org.sopt.sweet.domain.product.entity.Product; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface ProductRepository extends JpaRepository { + @Query(value = "SELECT p FROM Product p ORDER BY RAND() LIMIT :limit") + List findRandomProducts(@Param("limit") int limit); } diff --git a/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java b/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java index c013018..14899da 100644 --- a/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java +++ b/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java @@ -1,24 +1,30 @@ package org.sopt.sweet.domain.room.service; import lombok.RequiredArgsConstructor; +import org.sopt.sweet.domain.gift.entity.Gift; +import org.sopt.sweet.domain.gift.repository.GiftRepository; import org.sopt.sweet.domain.member.entity.Member; import org.sopt.sweet.domain.member.repository.MemberRepository; +import org.sopt.sweet.domain.product.entity.Product; +import org.sopt.sweet.domain.product.repository.ProductRepository; import org.sopt.sweet.domain.room.dto.request.CreateRoomRequestDto; import org.sopt.sweet.domain.room.dto.request.JoinRoomRequestDto; -import org.sopt.sweet.domain.room.dto.response.CreateRoomResponseDto; -import org.sopt.sweet.domain.room.dto.response.JoinRoomResponseDto; -import org.sopt.sweet.domain.room.dto.response.RoomInviteResponseDto; +import org.sopt.sweet.domain.room.dto.response.*; import org.sopt.sweet.domain.room.entity.Room; import org.sopt.sweet.domain.room.entity.RoomMember; import org.sopt.sweet.domain.room.repository.RoomMemberRepository; import org.sopt.sweet.domain.room.repository.RoomRepository; import org.sopt.sweet.global.error.exception.*; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.security.SecureRandom; import java.time.LocalDateTime; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import static org.sopt.sweet.global.error.ErrorCode.*; @@ -30,6 +36,8 @@ public class RoomService { private final RoomRepository roomRepository; private final MemberRepository memberRepository; private final RoomMemberRepository roomMemberRepository; + private final GiftRepository giftRepository; + private final ProductRepository productRepository; private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyz0123456789"; private static final int CODE_LENGTH = 6; private static final int MAX_GIFTER_NUMBER = 8; @@ -71,7 +79,8 @@ public RoomInviteResponseDto getRoomInviteInfo(String invitationCode) { room.getDeliveryDate(), room.getTournamentStartDate(), room.getTournamentDuration(), - room.getInvitationCode()); + room.getInvitationCode() + ); } public JoinRoomResponseDto findAndJoinRoom(Long memberId, JoinRoomRequestDto joinRoomRequestDto) { @@ -81,6 +90,63 @@ public JoinRoomResponseDto findAndJoinRoom(Long memberId, JoinRoomRequestDto joi return JoinRoomResponseDto.of(room.getId()); } + @Transactional(readOnly = true) + public RoomMainResponseDto getRoomMainInfo(Long memberId, Long roomId) { + Member member = findMemberByIdOrThrow(memberId); + Room room = findByIdOrThrow(roomId); + checkRoomMemberNotExists(room, member); + List roomMyGiftDtoList = buildRoomMyGiftDtoList(member, room); + List roomFriendsGiftDtoList = buildRoomFriendsGiftDtoList(member, room); + List hotProductGiftDtoList = buildHotProductGiftDtoList(); + return RoomMainResponseDto.of(room.getGifterNumber(), + room.getGifteeName(), + room.getInvitationCode(), + room.getTournamentStartDate(), + roomMyGiftDtoList, + roomFriendsGiftDtoList, + hotProductGiftDtoList); + } + + private List buildRoomMyGiftDtoList(Member member, Room room) { + List roomGifts = giftRepository.findByRoomAndMember(room, member); + return roomGifts.stream() + .map(gift -> RoomMyGiftDto.of( + gift.getId(), + gift.getImageUrl(), + gift.getName(), + gift.getUrl(), + gift.getCost() + )) + .collect(Collectors.toList()); + } + + private List buildRoomFriendsGiftDtoList(Member member, Room room) { + List roomGifts = giftRepository.findLatestGiftsByRoomAndNotMember(room, member, PageRequest.of(0, 5)); + return roomGifts.stream() + .map(gift -> RoomFriendsGiftDto.of( + gift.getId(), + gift.getImageUrl(), + gift.getName(), + gift.getUrl(), + gift.getCost(), + gift.getMember().getNickName() + )) + .collect(Collectors.toList()); + } + + private List buildHotProductGiftDtoList() { + List randomProducts = productRepository.findRandomProducts(5); + return randomProducts.stream() + .map(product -> HotProductGiftDto.of( + product.getId(), + product.getImageUrl(), + product.getName(), + product.getUrl(), + product.getCost() + )) + .collect(Collectors.toList()); + } + private void joinRoom(Member member, Room room) { checkRoomMemberExists(room, member); checkMaxParticipants(room); @@ -106,6 +172,12 @@ private void checkRoomMemberExists(Room room, Member member) { } } + private void checkRoomMemberNotExists(Room room, Member member) { + if (!isRoomMemberExists(room, member)) { + throw new BusinessException(MEMBER_NOT_IN_ROOM); + } + } + public void checkTournamentStartDate(Room room) { LocalDateTime currentDateTime = LocalDateTime.now(); if (room.getTournamentStartDate().isBefore(currentDateTime)) { From 4a156918a6d6f560a9b01dd7fb4e22c4bd492219 Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 18:37:44 +0900 Subject: [PATCH 4/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20swagger=20code=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweet/domain/room/controller/RoomApi.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java b/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java index 2515a08..c3decc1 100644 --- a/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java +++ b/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java @@ -81,6 +81,32 @@ ResponseEntity> joinRoom( example = "12345" ) @UserId Long userId, @Valid @RequestBody JoinRoomRequestDto joinRoomRequestDto - ); + ); + + @Operation( + summary = "선물방 메인 조회 API", + responses = { + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class) + ) + ) + }, + security = @SecurityRequirement(name = "token") + ) + ResponseEntity> getRoomMainInfo( + @Parameter( + description = "authorization token에서 얻은 userId, 임의입력하면 대체됩니다.", + required = true, + example = "12345" + ) @UserId Long userId, + @Parameter( + description = "room 고유 id", + required = true, + example = "1" + ) @PathVariable Long roomId + ); } From dcb5e32082287c03177407fa1cada1eb83770ae5 Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 19:44:23 +0900 Subject: [PATCH 5/8] =?UTF-8?q?[feat]=20#27=20=ED=86=A0=EB=84=88=EB=A8=BC?= =?UTF-8?q?=ED=8A=B8=20=EC=8B=9C=EC=9E=91=20=EB=82=A0=EC=A7=9C=EA=B0=80=20?= =?UTF-8?q?=EC=A7=80=EB=82=98=EB=A9=B4=20=EC=84=A0=EB=AC=BC=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=AA=BB=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/sweet/domain/gift/service/GiftService.java | 10 ++++++++++ .../java/org/sopt/sweet/global/error/ErrorCode.java | 1 + 2 files changed, 11 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/gift/service/GiftService.java b/src/main/java/org/sopt/sweet/domain/gift/service/GiftService.java index 0db24e1..ca6cd88 100644 --- a/src/main/java/org/sopt/sweet/domain/gift/service/GiftService.java +++ b/src/main/java/org/sopt/sweet/domain/gift/service/GiftService.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -40,6 +41,7 @@ public void createNewGift(Long memberId, CreateGiftRequestDto createGiftRequestD Room room = findRoomByIdOrThrow(createGiftRequestDto.roomId()); checkRoomMemberNotExists(room, member); checkGiftCountNotExceeded(room, member); + checkTournamentStartDatePassed(room); Gift gift = buildGift(member, room, createGiftRequestDto); giftRepository.save(gift); } @@ -78,6 +80,14 @@ private List mapGiftsToMyGiftDtoList(List gifts) { .collect(Collectors.toList()); } + private void checkTournamentStartDatePassed(Room room) { + LocalDateTime tournamentStartDate = room.getTournamentStartDate(); + LocalDateTime currentDateTime = LocalDateTime.now(); + if (currentDateTime.isAfter(tournamentStartDate)) { + throw new BusinessException(TOURNAMENT_START_DATE_PASSED); + } + } + private void checkGiftCountNotExceeded(Room room, Member member) { long giftCount = giftRepository.countByRoomAndMember(room, member); if (giftCount >= MAX_GIFT_COUNT) { diff --git a/src/main/java/org/sopt/sweet/global/error/ErrorCode.java b/src/main/java/org/sopt/sweet/global/error/ErrorCode.java index 50b6140..d68106d 100644 --- a/src/main/java/org/sopt/sweet/global/error/ErrorCode.java +++ b/src/main/java/org/sopt/sweet/global/error/ErrorCode.java @@ -16,6 +16,7 @@ public enum ErrorCode { MEMBER_NUMBER_EXCEEDED(HttpStatus.BAD_REQUEST, "해당 선물방의 최대 인원을 초과하였습니다."), INVITATION_CLOSED(HttpStatus.BAD_REQUEST, "초대가 마감되었습니다."), MEMBER_GIFT_COUNT_EXCEEDED(HttpStatus.BAD_REQUEST, "최대 선물 등록 개수를 초과하였습니다."), + TOURNAMENT_START_DATE_PASSED(HttpStatus.BAD_REQUEST, "토너먼트 시작 날짜가 지났습니다"), /** * 401 Unauthorized From 9f470c338620cd45108ff450a3f61e8db15b04ba Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 20:44:32 +0900 Subject: [PATCH 6/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=ED=8E=B8=EC=A7=91=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/controller/RoomController.java | 11 +++--- .../dto/response/RoomDetailResponseDto.java | 36 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/sopt/sweet/domain/room/dto/response/RoomDetailResponseDto.java diff --git a/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java b/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java index 0017abc..0803d8f 100644 --- a/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java +++ b/src/main/java/org/sopt/sweet/domain/room/controller/RoomController.java @@ -3,10 +3,7 @@ import lombok.RequiredArgsConstructor; import org.sopt.sweet.domain.room.dto.request.CreateRoomRequestDto; import org.sopt.sweet.domain.room.dto.request.JoinRoomRequestDto; -import org.sopt.sweet.domain.room.dto.response.CreateRoomResponseDto; -import org.sopt.sweet.domain.room.dto.response.JoinRoomResponseDto; -import org.sopt.sweet.domain.room.dto.response.RoomInviteResponseDto; -import org.sopt.sweet.domain.room.dto.response.RoomMainResponseDto; +import org.sopt.sweet.domain.room.dto.response.*; import org.sopt.sweet.domain.room.service.RoomService; import org.sopt.sweet.global.common.SuccessResponse; import org.sopt.sweet.global.config.auth.UserId; @@ -43,4 +40,10 @@ public ResponseEntity> getRoomMainInfo(@UserId Long userId, @ final RoomMainResponseDto roomMainResponseDto = roomService.getRoomMainInfo(userId, roomId); return SuccessResponse.ok(roomMainResponseDto); } + + @GetMapping("/detail/{roomId}") + public ResponseEntity> getRoomDetailInfo(@UserId Long userId, @PathVariable Long roomId){ + final RoomDetailResponseDto roomDetailResponseDto = roomService.getRoomDetailInfo(userId, roomId); + return SuccessResponse.ok(roomDetailResponseDto); + } } diff --git a/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomDetailResponseDto.java b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomDetailResponseDto.java new file mode 100644 index 0000000..886f9a0 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/room/dto/response/RoomDetailResponseDto.java @@ -0,0 +1,36 @@ +package org.sopt.sweet.domain.room.dto.response; + +import lombok.Builder; +import org.sopt.sweet.domain.room.constant.TournamentDuration; + +import java.time.LocalDateTime; + +@Builder +public record RoomDetailResponseDto( + Long roomId, + String imageUrl, + String gifteeName, + int gifterNumber, + LocalDateTime deliveryDate, + LocalDateTime tournamentStartDate, + TournamentDuration tournamentDuration +) { + public static RoomDetailResponseDto of(Long roomId, + String imageUrl, + String gifteeName, + int gifterNumber, + LocalDateTime deliveryDate, + LocalDateTime tournamentStartDate, + TournamentDuration tournamentDuration){ + return RoomDetailResponseDto.builder() + .roomId(roomId) + .imageUrl(imageUrl) + .gifteeName(gifteeName) + .gifterNumber(gifterNumber) + .deliveryDate(deliveryDate) + .tournamentStartDate(tournamentStartDate) + .tournamentDuration(tournamentDuration) + .build(); + } + +} From 4c399dd6a780a5c4f209bcb0633109b31ea1ec4d Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 20:44:42 +0900 Subject: [PATCH 7/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=ED=8E=B8=EC=A7=91=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/room/service/RoomService.java | 25 ++++++++++++++++++- .../sopt/sweet/global/error/ErrorCode.java | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java b/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java index 14899da..b60de7b 100644 --- a/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java +++ b/src/main/java/org/sopt/sweet/domain/room/service/RoomService.java @@ -98,7 +98,8 @@ public RoomMainResponseDto getRoomMainInfo(Long memberId, Long roomId) { List roomMyGiftDtoList = buildRoomMyGiftDtoList(member, room); List roomFriendsGiftDtoList = buildRoomFriendsGiftDtoList(member, room); List hotProductGiftDtoList = buildHotProductGiftDtoList(); - return RoomMainResponseDto.of(room.getGifterNumber(), + return RoomMainResponseDto.of( + room.getGifterNumber(), room.getGifteeName(), room.getInvitationCode(), room.getTournamentStartDate(), @@ -107,6 +108,28 @@ public RoomMainResponseDto getRoomMainInfo(Long memberId, Long roomId) { hotProductGiftDtoList); } + @Transactional(readOnly = true) + public RoomDetailResponseDto getRoomDetailInfo(Long memberId, Long roomId){ + Member member = findMemberByIdOrThrow(memberId); + Room room = findByIdOrThrow(roomId); + checkRoomHost(member, room); + return RoomDetailResponseDto.of( + roomId, + room.getImageUrl(), + room.getGifteeName(), + room.getGifterNumber(), + room.getDeliveryDate(), + room.getTournamentStartDate(), + room.getTournamentDuration() + ); + } + + private void checkRoomHost(Member member, Room room){ + if (!member.equals(room.getHost())) { + throw new ForbiddenException(ROOM_OWNER_MISMATCH); + } + } + private List buildRoomMyGiftDtoList(Member member, Room room) { List roomGifts = giftRepository.findByRoomAndMember(room, member); return roomGifts.stream() diff --git a/src/main/java/org/sopt/sweet/global/error/ErrorCode.java b/src/main/java/org/sopt/sweet/global/error/ErrorCode.java index d68106d..ac56e76 100644 --- a/src/main/java/org/sopt/sweet/global/error/ErrorCode.java +++ b/src/main/java/org/sopt/sweet/global/error/ErrorCode.java @@ -36,6 +36,7 @@ public enum ErrorCode { FORBIDDEN(HttpStatus.FORBIDDEN, "리소스 접근 권한이 없습니다."), MEMBER_NOT_IN_ROOM(HttpStatus.FORBIDDEN, "해당 선물 방에 존재하지 않는 멤버입니다."), MEMBER_NOT_GIFT_OWNER(HttpStatus.FORBIDDEN, "해당 선물을 등록하지 않은 멤버입니다."), + ROOM_OWNER_MISMATCH(HttpStatus.FORBIDDEN, "해당 선물방의 개설자가 아닙니다."), /** * 404 Not Found From ae7b7a1922370bbeb66911e0bf1ac9141b494edd Mon Sep 17 00:00:00 2001 From: ziiyouth Date: Tue, 9 Jan 2024 20:44:53 +0900 Subject: [PATCH 8/8] =?UTF-8?q?[feat]=20#27=20=EC=84=A0=EB=AC=BC=EB=B0=A9?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=ED=8E=B8=EC=A7=91=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20swagger=20code=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweet/domain/room/controller/RoomApi.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java b/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java index c3decc1..cfdea2e 100644 --- a/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java +++ b/src/main/java/org/sopt/sweet/domain/room/controller/RoomApi.java @@ -109,4 +109,30 @@ ResponseEntity> getRoomMainInfo( ) @PathVariable Long roomId ); + @Operation( + summary = "선물방 설정 편집 조회 API", + responses = { + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class) + ) + ) + }, + security = @SecurityRequirement(name = "token") + ) + ResponseEntity> getRoomDetailInfo( + @Parameter( + description = "authorization token에서 얻은 userId, 임의입력하면 대체됩니다.", + required = true, + example = "12345" + ) @UserId Long userId, + @Parameter( + description = "room 고유 id", + required = true, + example = "1" + ) @PathVariable Long roomId + ); + }