From 73e56c24bf442f2a4cc452a55205980432026b87 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:40:28 +0900 Subject: [PATCH 01/16] =?UTF-8?q?[feat]=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API=20swagge?= =?UTF-8?q?r=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/controller/MemberApi.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java index 6aa2e2a..ffd6805 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java @@ -3,11 +3,15 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.sopt.sweet.global.common.SuccessResponse; +import org.sopt.sweet.global.config.auth.UserId; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; @Tag(name = "회원", description = "회원 관련 API") public interface MemberApi { @@ -33,4 +37,32 @@ ResponseEntity> getToken( @Parameter(description = "멤버 고유 id", required = true) Long memberId ); + + @Operation( + summary = "종료된 선물방 조회 API", + responses = { + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized", + content = @Content + ) + }, + security = @SecurityRequirement(name = "token") + ) + @GetMapping("closed-room") + public ResponseEntity> getClosedRoom( + @Parameter( + description = "Authorization token에서 얻은 userId, 임의입력하면 대체됩니다.", + required = true, + example = "12345" + ) @UserId Long userId + ); + } From d176a1fd4136dd39495c2714efb3adf024eeb675 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:41:27 +0900 Subject: [PATCH 02/16] =?UTF-8?q?[feat]=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API=20Dto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/dto/response/ClosedRoomResponseDto.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/org/sopt/sweet/domain/member/dto/response/ClosedRoomResponseDto.java diff --git a/src/main/java/org/sopt/sweet/domain/member/dto/response/ClosedRoomResponseDto.java b/src/main/java/org/sopt/sweet/domain/member/dto/response/ClosedRoomResponseDto.java new file mode 100644 index 0000000..49a8098 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/member/dto/response/ClosedRoomResponseDto.java @@ -0,0 +1,10 @@ +package org.sopt.sweet.domain.member.dto.response; + +public record ClosedRoomResponseDto( + Long roomId, + String imageUrl, + String gifteeName, + int gifterNumber +) { + +} From 3e028cad4aa82d7f5382656deb02ba014b5dac8f Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:41:44 +0900 Subject: [PATCH 03/16] =?UTF-8?q?[feat]=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API=20Contro?= =?UTF-8?q?ller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/controller/MemberController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java index 5f3785d..7e5a261 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java @@ -1,12 +1,16 @@ package org.sopt.sweet.domain.member.controller; import lombok.RequiredArgsConstructor; +import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; import org.sopt.sweet.domain.member.service.MemberService; import org.sopt.sweet.global.common.SuccessResponse; +import org.sopt.sweet.global.config.auth.UserId; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RequiredArgsConstructor @RequestMapping("/api/member") @RestController @@ -27,5 +31,11 @@ public ResponseEntity> getToken(@PathVariable Long memberId){ return SuccessResponse.created(memberTokenResponseDto); } + @GetMapping("closed-room") + public ResponseEntity> getClosedRoom(@UserId Long userId) { + final List closedRoomResponseDto = memberService.getClosedRoom(userId); + return SuccessResponse.ok(closedRoomResponseDto); + } + } From 44e5e23a937895e0b66ffbae34b5e44770affd01 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:42:06 +0900 Subject: [PATCH 04/16] =?UTF-8?q?[feat]=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API=20Servic?= =?UTF-8?q?e=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/service/MemberService.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java index d9c9bea..daeb933 100644 --- a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java @@ -1,12 +1,22 @@ package org.sopt.sweet.domain.member.service; import lombok.RequiredArgsConstructor; +import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; import org.sopt.sweet.domain.member.repository.MemberRepository; +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.config.auth.jwt.JwtProvider; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + @RequiredArgsConstructor @Service @Transactional @@ -14,6 +24,8 @@ public class MemberService { private final JwtProvider jwtProvider; private final MemberRepository memberRepository; + private final RoomRepository roomRepository; + private final RoomMemberRepository roomMemberRepository; public MemberTokenResponseDto getToken(Long memberId) { String accessToken = issueNewAccessToken(memberId); @@ -30,4 +42,28 @@ private String issueNewRefreshToken(Long memberId) { } + public List getClosedRoom(Long memberId) { + List roomMembers = roomMemberRepository.findByMemberId(memberId); + System.out.println(memberId); + System.out.println("/"+ LocalDateTime.now()); + List closedRooms = roomMembers.stream() + .map(RoomMember::getRoom) + .filter(room -> room.getDeliveryDate().isBefore(LocalDateTime.now())) + .sorted(Comparator.comparing(Room::getDeliveryDate).reversed()) + .map(this::mapToClosedRoomResponseDto) + .collect(Collectors.toList()); + return closedRooms; + } + + private ClosedRoomResponseDto mapToClosedRoomResponseDto(Room room) { + return new ClosedRoomResponseDto( + room.getId(), + room.getImageUrl(), + room.getGifteeName(), + room.getGifterNumber() + ); + } + + + } \ No newline at end of file From 0249585ac956dae98c635dbf7f99a5850eaae55a Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:42:45 +0900 Subject: [PATCH 05/16] =?UTF-8?q?[feat]=20=EC=A2=85=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=84=A0=EB=AC=BC=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API=20Reposi?= =?UTF-8?q?tory=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/repository/RoomMemberRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java b/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java index 4f7eead..7c38c69 100644 --- a/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java +++ b/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java @@ -14,4 +14,6 @@ public interface RoomMemberRepository extends JpaRepository { int countByRoomIdAndTournamentParticipationIsTrue(Long roomId); RoomMember findByRoomIdAndMemberId(Long roomId, Long memberId); + + List findByMemberId(Long memberId); } From dced19da7b5602b8a7304e6438acc0b4317ab8c4 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 14:43:34 +0900 Subject: [PATCH 06/16] =?UTF-8?q?[feat]=20room=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20BaseTimeEntity=20=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/sweet/domain/room/entity/Room.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/sweet/domain/room/entity/Room.java b/src/main/java/org/sopt/sweet/domain/room/entity/Room.java index 5175a80..7e448d4 100644 --- a/src/main/java/org/sopt/sweet/domain/room/entity/Room.java +++ b/src/main/java/org/sopt/sweet/domain/room/entity/Room.java @@ -4,6 +4,7 @@ import lombok.*; import org.sopt.sweet.domain.room.constant.TournamentDuration; import org.sopt.sweet.domain.member.entity.Member; +import org.sopt.sweet.global.common.BaseTimeEntity; import java.time.LocalDateTime; @@ -11,7 +12,7 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "room") @Entity -public class Room { +public class Room extends BaseTimeEntity { private static final int DEFAULT_NUMBER = 1; From 017138021772e52a55088b702962b2e27383cc94 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:48:38 +0900 Subject: [PATCH 07/16] =?UTF-8?q?[feat]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EC=84=A0=EB=AC=BC=EB=B0=A9=20API=20swagger=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/controller/MemberApi.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java index ffd6805..6b4c03d 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java @@ -65,4 +65,31 @@ public ResponseEntity> getClosedRoom( ) @UserId Long userId ); + @Operation( + summary = "진행중인 선물방 조회 API", + responses = { + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized", + content = @Content + ) + }, + security = @SecurityRequirement(name = "token") + ) + @GetMapping("active-room") + public ResponseEntity> getActiveRoom( + @Parameter( + description = "Authorization token에서 얻은 userId, 임의입력하면 대체됩니다.", + required = true, + example = "12345" + ) @UserId Long userId + ); + } From 81ffae5424e4e7c7250d5df22c72f63e6278ffde Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:48:48 +0900 Subject: [PATCH 08/16] =?UTF-8?q?[feat]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EC=84=A0=EB=AC=BC=EB=B0=A9=20API=20dto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ActiveRoomResponseDto.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/org/sopt/sweet/domain/member/dto/response/ActiveRoomResponseDto.java diff --git a/src/main/java/org/sopt/sweet/domain/member/dto/response/ActiveRoomResponseDto.java b/src/main/java/org/sopt/sweet/domain/member/dto/response/ActiveRoomResponseDto.java new file mode 100644 index 0000000..20b8fb3 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/member/dto/response/ActiveRoomResponseDto.java @@ -0,0 +1,18 @@ +package org.sopt.sweet.domain.member.dto.response; + +import java.time.LocalDateTime; + +; + +public record ActiveRoomResponseDto( + Long roomId, + String imageUrl, + String gifteeName, + int gifterNumber, + LocalDateTime tournamentStartDate, + Boolean isOwner + +) { + + +} \ No newline at end of file From 285fd8046270283cfbabd4e4897d2a8d55575bf6 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:50:10 +0900 Subject: [PATCH 09/16] =?UTF-8?q?[feat]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EC=84=A0=EB=AC=BC=EB=B0=A9=20API=20controller=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweet/domain/member/controller/MemberController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java index 7e5a261..d522735 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java @@ -1,6 +1,7 @@ package org.sopt.sweet.domain.member.controller; import lombok.RequiredArgsConstructor; +import org.sopt.sweet.domain.member.dto.response.ActiveRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; import org.sopt.sweet.domain.member.service.MemberService; @@ -31,11 +32,16 @@ public ResponseEntity> getToken(@PathVariable Long memberId){ return SuccessResponse.created(memberTokenResponseDto); } - @GetMapping("closed-room") + @GetMapping("/closed-room") public ResponseEntity> getClosedRoom(@UserId Long userId) { final List closedRoomResponseDto = memberService.getClosedRoom(userId); return SuccessResponse.ok(closedRoomResponseDto); } + @GetMapping("/active-room") + public ResponseEntity> getActiveRoom(@UserId Long userId) { + final ListactiveRoomResponseDto = memberService.getActiveRoom(userId); + return SuccessResponse.ok(activeRoomResponseDto); + } } From 80ddf63f3207a3c19620e7d131516139905634e6 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:50:25 +0900 Subject: [PATCH 10/16] =?UTF-8?q?[feat]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EC=84=A0=EB=AC=BC=EB=B0=A9=20API=20service=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/service/MemberService.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java index daeb933..a81fe2f 100644 --- a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java @@ -1,8 +1,10 @@ package org.sopt.sweet.domain.member.service; import lombok.RequiredArgsConstructor; +import org.sopt.sweet.domain.member.dto.response.ActiveRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; +import org.sopt.sweet.domain.member.entity.Member; import org.sopt.sweet.domain.member.repository.MemberRepository; import org.sopt.sweet.domain.room.entity.Room; import org.sopt.sweet.domain.room.entity.RoomMember; @@ -15,6 +17,7 @@ import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RequiredArgsConstructor @@ -65,5 +68,37 @@ private ClosedRoomResponseDto mapToClosedRoomResponseDto(Room room) { } + public List getActiveRoom(Long memberId) { + List roomMembers = roomMemberRepository.findByMemberId(memberId); + List activeRooms = roomMembers.stream() + .map(RoomMember::getRoom) + .filter(room -> room.getDeliveryDate().isAfter(LocalDateTime.now())) + .sorted(Comparator.comparing(room -> getRoomMemberCreationTime(room, memberId), Comparator.reverseOrder())) + .map(room -> mapToActiveRoomResponseDto(room, memberId)) + .collect(Collectors.toList()); + return activeRooms; + } + + private ActiveRoomResponseDto mapToActiveRoomResponseDto(Room room, Long memberId) { + return new ActiveRoomResponseDto( + room.getId(), + room.getImageUrl(), + room.getGifteeName(), + room.getGifterNumber(), + room.getTournamentStartDate(), + isOwner(memberId, room.getId()) + ); + } + private LocalDateTime getRoomMemberCreationTime(Room room, Long memberId) { + Optional roomMember = roomMemberRepository.findByMemberIdAndRoom(memberId, room); + return roomMember.map(RoomMember::getCreateDate).orElse(LocalDateTime.MIN); + } + + public Boolean isOwner(Long memberId, Long roomId) { + Optional member = memberRepository.findById(memberId); + Optional room = roomRepository.findById(roomId); + Boolean isOwner = member.get().getId().equals(room.get().getHost().getId()); + return isOwner; + } } \ No newline at end of file From 33bf8c8d07829a66e4b5928b4be542d1032a3887 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:50:55 +0900 Subject: [PATCH 11/16] =?UTF-8?q?[feat]=20=EC=A7=84=ED=96=89=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EC=84=A0=EB=AC=BC=EB=B0=A9=20API=20repository=20?= =?UTF-8?q?=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/repository/RoomMemberRepository.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java b/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java index 7c38c69..83b658a 100644 --- a/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java +++ b/src/main/java/org/sopt/sweet/domain/room/repository/RoomMemberRepository.java @@ -16,4 +16,6 @@ public interface RoomMemberRepository extends JpaRepository { RoomMember findByRoomIdAndMemberId(Long roomId, Long memberId); List findByMemberId(Long memberId); + + Optional findByMemberIdAndRoom(Long memberId, Room room); } From b5caba0e4fbd2597953a62d24955f80ab7164732 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 17:51:29 +0900 Subject: [PATCH 12/16] =?UTF-8?q?[feat]=20RoomMember=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20BaseTimeEntity=EC=83=81=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/sweet/domain/room/entity/RoomMember.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/sweet/domain/room/entity/RoomMember.java b/src/main/java/org/sopt/sweet/domain/room/entity/RoomMember.java index ed59a37..b5f654c 100644 --- a/src/main/java/org/sopt/sweet/domain/room/entity/RoomMember.java +++ b/src/main/java/org/sopt/sweet/domain/room/entity/RoomMember.java @@ -3,11 +3,12 @@ import jakarta.persistence.*; import lombok.*; import org.sopt.sweet.domain.member.entity.Member; +import org.sopt.sweet.global.common.BaseTimeEntity; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class RoomMember { +public class RoomMember extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From e83bf39b5356125ea2dfe3ba7a4bdc0c4b4037c3 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 19:44:23 +0900 Subject: [PATCH 13/16] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20API=20swagger=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/controller/MemberApi.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java index 6b4c03d..36d950a 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberApi.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.sopt.sweet.domain.member.dto.response.MyPageResponseDto; import org.sopt.sweet.global.common.SuccessResponse; import org.sopt.sweet.global.config.auth.UserId; import org.springframework.http.ResponseEntity; @@ -92,4 +93,31 @@ public ResponseEntity> getActiveRoom( ) @UserId Long userId ); + @Operation( + summary = "마이페이지 조회 API", + responses = { + @ApiResponse( + responseCode = "200", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = SuccessResponse.class) + ) + ), + @ApiResponse( + responseCode = "401", + description = "Unauthorized", + content = @Content + ) + }, + security = @SecurityRequirement(name = "token") + ) + @GetMapping("/mypage") + public MyPageResponseDto getMyPage( + @Parameter( + description = "Authorization token에서 얻은 userId, 임의입력하면 대체됩니다.", + required = true, + example = "12345" + ) @UserId Long userId + ); + } From 864b35c1c92660bdb97f3ea5522ec31c8c71756a Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 19:44:37 +0900 Subject: [PATCH 14/16] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20API=20controller=20=EC=88=98=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java index d522735..e3f88d4 100644 --- a/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/sweet/domain/member/controller/MemberController.java @@ -1,9 +1,7 @@ package org.sopt.sweet.domain.member.controller; import lombok.RequiredArgsConstructor; -import org.sopt.sweet.domain.member.dto.response.ActiveRoomResponseDto; -import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; -import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; +import org.sopt.sweet.domain.member.dto.response.*; import org.sopt.sweet.domain.member.service.MemberService; import org.sopt.sweet.global.common.SuccessResponse; import org.sopt.sweet.global.config.auth.UserId; @@ -44,4 +42,17 @@ public ResponseEntity> getActiveRoom(@UserId Long userId) { return SuccessResponse.ok(activeRoomResponseDto); } + @GetMapping("/mypage") + public MyPageResponseDto getMyPage(@UserId Long userId) { + List top2ClosedRooms = memberService.getTop2ClosedRooms(userId); + List top2ActiveRooms = memberService.getTop2ActiveRooms(userId); + MemberInfoDto MemberInfo = memberService.getMemberInfo(userId); + + return new MyPageResponseDto( + MemberInfo, + top2ClosedRooms, + top2ActiveRooms + ); + } + } From a1bef9846b776e971b52c58201c1e4b8a75ea2e6 Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 19:45:09 +0900 Subject: [PATCH 15/16] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20API=20Dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sweet/domain/member/dto/response/MemberInfoDto.java | 7 +++++++ .../domain/member/dto/response/MyPageResponseDto.java | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/main/java/org/sopt/sweet/domain/member/dto/response/MemberInfoDto.java create mode 100644 src/main/java/org/sopt/sweet/domain/member/dto/response/MyPageResponseDto.java diff --git a/src/main/java/org/sopt/sweet/domain/member/dto/response/MemberInfoDto.java b/src/main/java/org/sopt/sweet/domain/member/dto/response/MemberInfoDto.java new file mode 100644 index 0000000..a6a39e0 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/member/dto/response/MemberInfoDto.java @@ -0,0 +1,7 @@ +package org.sopt.sweet.domain.member.dto.response; + +public record MemberInfoDto( + String nickname, + String profileImage +) { +} diff --git a/src/main/java/org/sopt/sweet/domain/member/dto/response/MyPageResponseDto.java b/src/main/java/org/sopt/sweet/domain/member/dto/response/MyPageResponseDto.java new file mode 100644 index 0000000..a2f0197 --- /dev/null +++ b/src/main/java/org/sopt/sweet/domain/member/dto/response/MyPageResponseDto.java @@ -0,0 +1,9 @@ +package org.sopt.sweet.domain.member.dto.response; + +import java.util.List; + +public record MyPageResponseDto( + MemberInfoDto memberInfo, + List closedRooms, + List activeRooms) { +} From b97f37276f5c70b6a1d04a4b7f74fb6c09879f6b Mon Sep 17 00:00:00 2001 From: hysong4u Date: Sat, 13 Jan 2024 19:45:24 +0900 Subject: [PATCH 16/16] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20API=20service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/service/MemberService.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java index a81fe2f..119b2af 100644 --- a/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/sweet/domain/member/service/MemberService.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.sopt.sweet.domain.member.dto.response.ActiveRoomResponseDto; import org.sopt.sweet.domain.member.dto.response.ClosedRoomResponseDto; +import org.sopt.sweet.domain.member.dto.response.MemberInfoDto; import org.sopt.sweet.domain.member.dto.response.MemberTokenResponseDto; import org.sopt.sweet.domain.member.entity.Member; import org.sopt.sweet.domain.member.repository.MemberRepository; @@ -47,8 +48,6 @@ private String issueNewRefreshToken(Long memberId) { public List getClosedRoom(Long memberId) { List roomMembers = roomMemberRepository.findByMemberId(memberId); - System.out.println(memberId); - System.out.println("/"+ LocalDateTime.now()); List closedRooms = roomMembers.stream() .map(RoomMember::getRoom) .filter(room -> room.getDeliveryDate().isBefore(LocalDateTime.now())) @@ -101,4 +100,22 @@ public Boolean isOwner(Long memberId, Long roomId) { return isOwner; } + public List getTop2ClosedRooms(Long memberId) { + List closedRooms = getClosedRoom(memberId); + return closedRooms.size() > 2 ? closedRooms.subList(0, 2) : closedRooms; + } + + public List getTop2ActiveRooms(Long memberId) { + List activeRooms = getActiveRoom(memberId); + return activeRooms.size() > 2 ? activeRooms.subList(0, 2) : activeRooms; + } + + + public MemberInfoDto getMemberInfo(Long memberId) { + Optional member = memberRepository.findById(memberId); + return new MemberInfoDto( + member.get().getNickName(), + member.get().getProfileImg() + ); + } } \ No newline at end of file