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 + ); + } 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); + } + } 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 +) { + +} 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 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; 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); }