From 6ee8f8e7ec1ba2f2b83292d6cce47dd660f7e6b6 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Thu, 31 Oct 2024 15:41:22 +0900 Subject: [PATCH 01/12] =?UTF-8?q?Fix:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=B1=84=EB=84=90=20=EC=B0=B8=EC=97=AC=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bookwoori/core/domain/climbing/facade/ClimbingFacade.java | 3 +++ .../java/org/bookwoori/core/global/exception/ErrorCode.java | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java index c9a5d946..c9766471 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java @@ -60,6 +60,9 @@ public boolean toggleParticipation(Long climbingId) { Climbing climbing = climbingService.getClimbingById(climbingId); boolean isJoined = climbingMemberService.isJoined(currentMember, climbing); if (isJoined) { + if (climbingMemberService.isOwner(currentMember, climbing)) { + throw new CustomException(ErrorCode.OWNER_CANNOT_LEAVE); + } climbingMemberService.removeMember(currentMember, climbing); return false; } else { diff --git a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java index 4522af41..4a300bbc 100644 --- a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java +++ b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java @@ -55,14 +55,16 @@ public enum ErrorCode { CLIMBING_NOT_FOUND(404, 3400, "클라이밍 채널을 찾을 수 없습니다."), ALREADY_JOINED_CLIMBING(409, 3401, "이미 참여하고 있는 클라이밍 채널입니다."), CLIMBING_NOT_READY(409, 3402, "모집 중인 클라이밍 채널만 편집할 수 있습니다."), + OWNER_CANNOT_LEAVE(409, 3403, "OWNER는 클라이밍 채널을 떠날 수 없습니다."), // Book (3500 ~ 3599) - BOOK_NOT_FOUND(404, 3500, "책을 찾을 수 없습니다."), + BOOK_NOT_FOUND(404, 3500, "책을 찾을 수 없습니다.") // Record (3600 ~ 3699) ; + private final int status; private final int code; private final String message; From 1b153668f6a514abdeeb9a9a5e8934ffb39cc5ce Mon Sep 17 00:00:00 2001 From: gkdudans Date: Sat, 2 Nov 2024 17:39:39 +0900 Subject: [PATCH 02/12] =?UTF-8?q?Feat:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=B1=84=EB=84=90=20=EA=B6=8C=ED=95=9C=20=EC=9C=84?= =?UTF-8?q?=EC=9E=84=20/=20=EC=B0=B8=EC=97=AC=EC=9E=90=20=EB=8F=85?= =?UTF-8?q?=EC=84=9C=20=ED=98=84=ED=99=A9=20=EC=A1=B0=ED=9A=8C=20/=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=20=EB=A9=94=EB=AA=A8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ClimbingController.java | 27 ++++++++ .../request/ClimbingMemoUpdateRequestDto.java | 9 +++ .../ClimbingRoleDelegateRequestDto.java | 6 ++ .../dto/response/ClimbingMemberUnitDto.java | 28 +++++++++ .../climbing/facade/ClimbingFacade.java | 2 + .../climbing/facade/ClimbingMemberFacade.java | 61 +++++++++++++++++++ .../climbingMember/entity/ClimbingMember.java | 8 +++ .../repository/ClimbingMemberRepository.java | 5 ++ .../service/ClimbingMemberService.java | 25 ++++++++ .../core/domain/member/entity/Member.java | 12 ++-- .../domain/record/entity/ReadingStatus.java | 2 +- .../record/repository/RecordRepository.java | 4 ++ .../domain/record/service/RecordService.java | 10 +++ .../server/controller/ServerController.java | 1 + .../core/global/exception/ErrorCode.java | 1 + 15 files changed, 196 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingMemoUpdateRequestDto.java create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingRoleDelegateRequestDto.java create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java index 04d1b4d2..133fde35 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java @@ -6,7 +6,10 @@ import lombok.RequiredArgsConstructor; import org.bookwoori.core.domain.climbing.dto.request.ClimbingChannelCreateRequestDto; import org.bookwoori.core.domain.climbing.dto.request.ClimbingChannelUpdateRequestDto; +import org.bookwoori.core.domain.climbing.dto.request.ClimbingMemoUpdateRequestDto; +import org.bookwoori.core.domain.climbing.dto.request.ClimbingRoleDelegateRequestDto; import org.bookwoori.core.domain.climbing.facade.ClimbingFacade; +import org.bookwoori.core.domain.climbing.facade.ClimbingMemberFacade; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -25,6 +28,7 @@ public class ClimbingController { private final ClimbingFacade climbingFacade; + private final ClimbingMemberFacade climbingMemberFacade; @Operation(summary = "클라이밍 채널 생성", description = "클라이밍 채널을 생성합니다.") @PostMapping @@ -62,5 +66,28 @@ public ResponseEntity getClimbingDetails( return ResponseEntity.ok(climbingFacade.getClimbingDetails(climbingId)); } + @Operation(summary = "클라이밍 채널 권한 위임", description = "클라이밍 채널의 OWNER가 권한을 위임합니다.") + @PatchMapping("/{climbingId}/members") + public ResponseEntity delegateClimbingRole( + @PathVariable("climbingId") final Long climbingId, + @RequestBody ClimbingRoleDelegateRequestDto requestDto) { + climbingMemberFacade.delegateClimbingRole(climbingId, requestDto); + return ResponseEntity.ok().build(); + } + @Operation(summary = "클라이밍 채널 참여자 조회", description = "클라이밍 채널 참여자 목록 / 참여자 독서 현황을 조회합니다.") + @GetMapping("/{climbingId}/members") + public ResponseEntity getClimbingMembers( + @PathVariable("climbingId") final Long climbingId) { + return ResponseEntity.ok(climbingMemberFacade.getClimbingMembers(climbingId)); + } + + @Operation(summary = "클라이밍 채널 참여자 메모 수정", description = "클라이밍 채널 참여자의 메모를 수정합니다.") + @GetMapping("/{climbingId}/members/memo") + public ResponseEntity getClimbingMemberMemo( + @PathVariable("climbingId") final Long climbingId, + @RequestBody @Valid ClimbingMemoUpdateRequestDto requestDto) { + climbingMemberFacade.updateClimbingMemberMemo(climbingId, requestDto); + return ResponseEntity.ok().build(); + } } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingMemoUpdateRequestDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingMemoUpdateRequestDto.java new file mode 100644 index 00000000..85cdc4a5 --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingMemoUpdateRequestDto.java @@ -0,0 +1,9 @@ +package org.bookwoori.core.domain.climbing.dto.request; + +import jakarta.validation.constraints.Size; + +public record ClimbingMemoUpdateRequestDto( + @Size(max = 10, message = "INVALID_INPUT_LENGTH-메모는 10자 이내여야 합니다.") + String memo) { + +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingRoleDelegateRequestDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingRoleDelegateRequestDto.java new file mode 100644 index 00000000..9fdbc6fb --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/request/ClimbingRoleDelegateRequestDto.java @@ -0,0 +1,6 @@ +package org.bookwoori.core.domain.climbing.dto.request; + +public record ClimbingRoleDelegateRequestDto( + Long memberId) { + +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java new file mode 100644 index 00000000..1c28f184 --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java @@ -0,0 +1,28 @@ +package org.bookwoori.core.domain.climbing.dto.response; + +import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; +import org.bookwoori.core.domain.record.entity.ReadingStatus; + +public record ClimbingMemberUnitDto( + Long memberId, + String profileImg, + int level, + String mountain, + ReadingStatus status, + int currentPage, + String memo +) { + + public static ClimbingMemberUnitDto from(ClimbingMember member, ReadingStatus status, + int currentPage) { + return new ClimbingMemberUnitDto( + member.getMember().getMemberId(), + member.getMember().getProfileImg(), + member.getMember().getGrade().getLevel(), + member.getMember().getGrade().getMountain(), + status, + currentPage, + member.getMemo() + ); + } +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java index c9766471..e58a4a57 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java @@ -16,6 +16,7 @@ import org.bookwoori.core.domain.climbingMember.service.ClimbingMemberService; import org.bookwoori.core.domain.member.entity.Member; import org.bookwoori.core.domain.member.service.MemberService; +import org.bookwoori.core.domain.record.service.RecordService; import org.bookwoori.core.domain.server.entity.Server; import org.bookwoori.core.domain.server.service.ServerService; import org.bookwoori.core.global.exception.CustomException; @@ -33,6 +34,7 @@ public class ClimbingFacade { private final ServerService serverService; private final BookService bookService; private final ClimbingMemberService climbingMemberService; + private final RecordService recordService; public void createClimbing(ClimbingChannelCreateRequestDto requestDto) { Member currentMember = memberService.getCurrentMember(); diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java new file mode 100644 index 00000000..1c895094 --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java @@ -0,0 +1,61 @@ +package org.bookwoori.core.domain.climbing.facade; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.bookwoori.core.domain.climbing.dto.request.ClimbingMemoUpdateRequestDto; +import org.bookwoori.core.domain.climbing.dto.request.ClimbingRoleDelegateRequestDto; +import org.bookwoori.core.domain.climbing.dto.response.ClimbingMemberUnitDto; +import org.bookwoori.core.domain.climbing.entity.Climbing; +import org.bookwoori.core.domain.climbing.service.ClimbingService; +import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; +import org.bookwoori.core.domain.climbingMember.service.ClimbingMemberService; +import org.bookwoori.core.domain.member.entity.Member; +import org.bookwoori.core.domain.member.service.MemberService; +import org.bookwoori.core.domain.record.entity.ReadingStatus; +import org.bookwoori.core.domain.record.entity.Record; +import org.bookwoori.core.domain.record.service.RecordService; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@RequiredArgsConstructor +@Transactional +public class ClimbingMemberFacade { + + private final MemberService memberService; + private final ClimbingService climbingService; + private final ClimbingMemberService climbingMemberService; + private final RecordService recordService; + + @Transactional(readOnly = true) + public List getClimbingMembers(Long climbingId) { + Climbing climbing = climbingService.getClimbingById(climbingId); + List climbingMemberList = climbingMemberService.findMembersByClimbing( + climbing); + return climbingMemberList.stream() + .map(member -> { + Optional record = recordService.getClimbingMemerRecord(member, + climbing.getBook()); + ReadingStatus status = record.map(Record::getStatus).orElse(ReadingStatus.UNREAD); + int currentPage = record.map(Record::getCurrentPage).orElse(0); + return ClimbingMemberUnitDto.from(member, status, currentPage); + }) + .collect(Collectors.toList()); + } + + + public void updateClimbingMemberMemo(Long climbingId, ClimbingMemoUpdateRequestDto requestDto) { + Member currentMember = memberService.getCurrentMember(); + ClimbingMember climbingMember = climbingMemberService.findByMemberAndClimbing(currentMember, + climbingId); + climbingMember.updateMemo(requestDto.memo()); + } + + public void delegateClimbingRole(Long climbingId, ClimbingRoleDelegateRequestDto requestDto) { + Member currentMember = memberService.getCurrentMember(); + Member newOwner = memberService.getMemberById(requestDto.memberId()); + climbingMemberService.delegateClimbingRole(climbingId, currentMember, newOwner); + } +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/entity/ClimbingMember.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/entity/ClimbingMember.java index 949bb4ee..ff1675aa 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/entity/ClimbingMember.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/entity/ClimbingMember.java @@ -62,4 +62,12 @@ public ClimbingMember(Member member, Climbing climbing, ClimbingRole role) { this.hasShared = false; this.memo = null; } + + public void updateMemo(String memo) { + this.memo = memo; + } + + public void updateRole(ClimbingRole climbingRole) { + this.role = climbingRole; + } } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java index 4bb92b5a..af52dd08 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java @@ -1,5 +1,6 @@ package org.bookwoori.core.domain.climbingMember.repository; +import java.util.List; import java.util.Optional; import org.bookwoori.core.domain.climbing.entity.Climbing; import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; @@ -13,4 +14,8 @@ public interface ClimbingMemberRepository extends JpaRepository findByClimbing(Climbing climbing); + + Optional findByMemberAndClimbing_Id(Member member, Long climbingId); } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java index 7e917af6..d2890cc6 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java @@ -1,11 +1,14 @@ package org.bookwoori.core.domain.climbingMember.service; +import java.util.List; import lombok.RequiredArgsConstructor; import org.bookwoori.core.domain.climbing.entity.Climbing; import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; import org.bookwoori.core.domain.climbingMember.entity.ClimbingRole; import org.bookwoori.core.domain.climbingMember.repository.ClimbingMemberRepository; import org.bookwoori.core.domain.member.entity.Member; +import org.bookwoori.core.global.exception.CustomException; +import org.bookwoori.core.global.exception.ErrorCode; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,4 +45,26 @@ public boolean isOwner(Member member, Climbing climbing) { public int getMemberCount(Climbing climbing) { return climbingMemberRepository.countByClimbing(climbing); } + + @Transactional(readOnly = true) + public List findMembersByClimbing(Climbing climbing) { + return climbingMemberRepository.findByClimbing(climbing); + } + + @Transactional(readOnly = true) + public ClimbingMember findByMemberAndClimbing(Member member, Long climbingId) { + return climbingMemberRepository.findByMemberAndClimbing_Id(member, climbingId) + .orElseThrow(() -> new CustomException(ErrorCode.CLIMBINGMEMBER_NOT_FOUND)); + } + + public void delegateClimbingRole(Long climbingId, Member currentMember, + Member newOwner) { + ClimbingMember currentClimbingMember = findByMemberAndClimbing(currentMember, climbingId); + ClimbingMember newClimbingOwner = findByMemberAndClimbing(newOwner, climbingId); + if (currentClimbingMember.getRole() != ClimbingRole.OWNER) { + throw new CustomException(ErrorCode.ACCESS_DENIED); + } + currentClimbingMember.updateRole(ClimbingRole.MEMBER); + newClimbingOwner.updateRole(ClimbingRole.OWNER); + } } diff --git a/core/src/main/java/org/bookwoori/core/domain/member/entity/Member.java b/core/src/main/java/org/bookwoori/core/domain/member/entity/Member.java index 3da3f0d3..1ee5bbe2 100644 --- a/core/src/main/java/org/bookwoori/core/domain/member/entity/Member.java +++ b/core/src/main/java/org/bookwoori/core/domain/member/entity/Member.java @@ -1,14 +1,19 @@ package org.bookwoori.core.domain.member.entity; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.bookwoori.core.global.BaseTimeEntity; -import org.bookwoori.core.global.s3.S3Util; -import org.springframework.web.multipart.MultipartFile; @Entity @Table(name = "member") @@ -66,5 +71,4 @@ public void updateMember(String nickname, String profileImgUrl) { this.nickname = nickname; this.profileImg = profileImgUrl; } - } diff --git a/core/src/main/java/org/bookwoori/core/domain/record/entity/ReadingStatus.java b/core/src/main/java/org/bookwoori/core/domain/record/entity/ReadingStatus.java index 292bd8c3..ceb422b4 100644 --- a/core/src/main/java/org/bookwoori/core/domain/record/entity/ReadingStatus.java +++ b/core/src/main/java/org/bookwoori/core/domain/record/entity/ReadingStatus.java @@ -1,11 +1,11 @@ package org.bookwoori.core.domain.record.entity; import com.fasterxml.jackson.annotation.JsonCreator; -import org.bookwoori.core.domain.member.entity.Grade; import org.bookwoori.core.global.exception.CustomException; import org.bookwoori.core.global.exception.ErrorCode; public enum ReadingStatus { + UNREAD, WISH, READING, FINISHED; diff --git a/core/src/main/java/org/bookwoori/core/domain/record/repository/RecordRepository.java b/core/src/main/java/org/bookwoori/core/domain/record/repository/RecordRepository.java index 477bbde1..b02b4cd5 100644 --- a/core/src/main/java/org/bookwoori/core/domain/record/repository/RecordRepository.java +++ b/core/src/main/java/org/bookwoori/core/domain/record/repository/RecordRepository.java @@ -1,8 +1,12 @@ package org.bookwoori.core.domain.record.repository; +import java.util.Optional; +import org.bookwoori.core.domain.book.entity.Book; +import org.bookwoori.core.domain.member.entity.Member; import org.bookwoori.core.domain.record.entity.Record; import org.springframework.data.jpa.repository.JpaRepository; public interface RecordRepository extends JpaRepository { + Optional findByMemberAndBook(Member climbingMember, Book book); } diff --git a/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java b/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java index b13c0d7d..233554e3 100644 --- a/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java +++ b/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java @@ -1,12 +1,22 @@ package org.bookwoori.core.domain.record.service; +import java.util.Optional; import lombok.RequiredArgsConstructor; +import org.bookwoori.core.domain.book.entity.Book; +import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; +import org.bookwoori.core.domain.record.entity.Record; import org.bookwoori.core.domain.record.repository.RecordRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class RecordService { private final RecordRepository recordRepository; + + @Transactional(readOnly = true) + public Optional getClimbingMemerRecord(ClimbingMember climbingMember, Book book) { + return recordRepository.findByMemberAndBook(climbingMember.getMember(), book); + } } diff --git a/core/src/main/java/org/bookwoori/core/domain/server/controller/ServerController.java b/core/src/main/java/org/bookwoori/core/domain/server/controller/ServerController.java index a9444ec3..74d29edc 100644 --- a/core/src/main/java/org/bookwoori/core/domain/server/controller/ServerController.java +++ b/core/src/main/java/org/bookwoori/core/domain/server/controller/ServerController.java @@ -71,6 +71,7 @@ public ResponseEntity getMyClimbingChannelList( public ResponseEntity getReadyClimbingChannelList( @PathVariable final Long serverId) { return ResponseEntity.ok(climbingFacade.getReadyClimbingList(serverId)); + } @Operation(summary = "초대코드 조회 또는 생성", description = "특정 서버에 대한 초대 코드를 조회 또는 생성합니다.") @PostMapping("/{serverId}/code") diff --git a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java index a457572d..95c944f8 100644 --- a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java +++ b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java @@ -57,6 +57,7 @@ public enum ErrorCode { ALREADY_JOINED_CLIMBING(409, 3401, "이미 참여하고 있는 클라이밍 채널입니다."), CLIMBING_NOT_READY(409, 3402, "모집 중인 클라이밍 채널만 편집할 수 있습니다."), OWNER_CANNOT_LEAVE(409, 3403, "OWNER는 클라이밍 채널을 떠날 수 없습니다."), + CLIMBINGMEMBER_NOT_FOUND(404, 3404, "클라이밍 멤버를 찾을 수 없습니다."), // Book (3500 ~ 3599) BOOK_NOT_FOUND(404, 3500, "책을 찾을 수 없습니다.") From decb0b2fd9c71c6068529ac42986f61505976217 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Sat, 2 Nov 2024 20:03:42 +0900 Subject: [PATCH 03/12] =?UTF-8?q?Refactor:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=83=81=ED=83=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../climbing/facade/ClimbingFacade.java | 30 +++++++++++++++++++ .../climbing/facade/ClimbingMemberFacade.java | 2 +- .../climbing/service/ClimbingService.java | 21 ++----------- .../domain/record/service/RecordService.java | 2 +- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java index e58a4a57..4ffcbc96 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java @@ -1,5 +1,6 @@ package org.bookwoori.core.domain.climbing.facade; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -12,15 +13,18 @@ import org.bookwoori.core.domain.climbing.entity.Climbing; import org.bookwoori.core.domain.climbing.entity.ClimbingStatus; import org.bookwoori.core.domain.climbing.service.ClimbingService; +import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; import org.bookwoori.core.domain.climbingMember.entity.ClimbingRole; import org.bookwoori.core.domain.climbingMember.service.ClimbingMemberService; import org.bookwoori.core.domain.member.entity.Member; import org.bookwoori.core.domain.member.service.MemberService; +import org.bookwoori.core.domain.record.entity.ReadingStatus; import org.bookwoori.core.domain.record.service.RecordService; import org.bookwoori.core.domain.server.entity.Server; import org.bookwoori.core.domain.server.service.ServerService; import org.bookwoori.core.global.exception.CustomException; import org.bookwoori.core.global.exception.ErrorCode; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -36,6 +40,32 @@ public class ClimbingFacade { private final ClimbingMemberService climbingMemberService; private final RecordService recordService; + @Scheduled(cron = "0 0 0 * * *") + public void updateClimbingStatus() { + LocalDate today = LocalDate.now(); + List climbingList = climbingService.getAllClimbings(); + for (Climbing climbing : climbingList) { + if (climbing.getStartDate().isAfter(today) && climbing.getEndDate() + .isAfter(today)) { + climbing.updateStatus(ClimbingStatus.RUNNING); + } else if (climbing.getEndDate().isBefore(today)) { + List climbingMemberList = climbingMemberService.findMembersByClimbing( + climbing); + boolean allFinished = climbingMemberList.stream() + .allMatch( + member -> recordService.getClimbingMemberRecord(member, climbing.getBook()) + .map(record -> record.getStatus() == ReadingStatus.FINISHED) + .orElse(false)); + if (allFinished) { + climbing.updateStatus(ClimbingStatus.FINISHED); + } else { + climbing.updateStatus(ClimbingStatus.FAILED); + } + } + climbingService.saveClimbingChannel(climbing); + } + } + public void createClimbing(ClimbingChannelCreateRequestDto requestDto) { Member currentMember = memberService.getCurrentMember(); Server server = serverService.getServerById(requestDto.serverId()); diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java index 1c895094..6b8fd282 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java @@ -36,7 +36,7 @@ public List getClimbingMembers(Long climbingId) { climbing); return climbingMemberList.stream() .map(member -> { - Optional record = recordService.getClimbingMemerRecord(member, + Optional record = recordService.getClimbingMemberRecord(member, climbing.getBook()); ReadingStatus status = record.map(Record::getStatus).orElse(ReadingStatus.UNREAD); int currentPage = record.map(Record::getCurrentPage).orElse(0); diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java b/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java index ca85ff14..5c436de9 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java @@ -1,15 +1,12 @@ package org.bookwoori.core.domain.climbing.service; -import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; import org.bookwoori.core.domain.climbing.entity.Climbing; -import org.bookwoori.core.domain.climbing.entity.ClimbingStatus; import org.bookwoori.core.domain.climbing.repository.ClimbingRepository; import org.bookwoori.core.domain.member.entity.Member; import org.bookwoori.core.global.exception.CustomException; import org.bookwoori.core.global.exception.ErrorCode; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,21 +37,9 @@ public List getReadyClimbings(Long serverId) { return climbingRepository.findReadyClimbings(serverId); } - @Scheduled(cron = "0 0 0 * * *") - public void updateClimbingStatus() { - LocalDate today = LocalDate.now(); - List climbingList = climbingRepository.findAll(); - - for (Climbing climbing : climbingList) { - if (climbing.getStartDate().isAfter(today) && climbing.getEndDate() - .isAfter(today)) { - climbing.updateStatus(ClimbingStatus.RUNNING); - } -// } else if (climbing.getEndDate().isBefore(today)) { -// climbing.updateStatus(ClimbingStatus.COMPLETED); -// } - climbingRepository.save(climbing); - } + @Transactional(readOnly = true) + public List getAllClimbings() { + return climbingRepository.findAll(); } } diff --git a/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java b/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java index 233554e3..4b185497 100644 --- a/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java +++ b/core/src/main/java/org/bookwoori/core/domain/record/service/RecordService.java @@ -16,7 +16,7 @@ public class RecordService { private final RecordRepository recordRepository; @Transactional(readOnly = true) - public Optional getClimbingMemerRecord(ClimbingMember climbingMember, Book book) { + public Optional getClimbingMemberRecord(ClimbingMember climbingMember, Book book) { return recordRepository.findByMemberAndBook(climbingMember.getMember(), book); } } From b64c352bbfb4fc874a9146a389dd9af5ba70767a Mon Sep 17 00:00:00 2001 From: gkdudans Date: Sun, 3 Nov 2024 02:01:41 +0900 Subject: [PATCH 04/12] =?UTF-8?q?Fix:=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=EB=8F=85=EC=84=9C=20=ED=98=84=ED=99=A9=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?/=20=EB=A9=94=EB=AA=A8=20=EC=88=98=EC=A0=95=20API=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/climbing/controller/ClimbingController.java | 2 +- .../climbingMember/repository/ClimbingMemberRepository.java | 2 +- .../domain/climbingMember/service/ClimbingMemberService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java index 133fde35..5aec60bd 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java @@ -83,7 +83,7 @@ public ResponseEntity getClimbingMembers( } @Operation(summary = "클라이밍 채널 참여자 메모 수정", description = "클라이밍 채널 참여자의 메모를 수정합니다.") - @GetMapping("/{climbingId}/members/memo") + @PatchMapping("/{climbingId}/members/memo") public ResponseEntity getClimbingMemberMemo( @PathVariable("climbingId") final Long climbingId, @RequestBody @Valid ClimbingMemoUpdateRequestDto requestDto) { diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java index af52dd08..b5446832 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java @@ -17,5 +17,5 @@ public interface ClimbingMemberRepository extends JpaRepository findByClimbing(Climbing climbing); - Optional findByMemberAndClimbing_Id(Member member, Long climbingId); + Optional findByMemberAndClimbing_ClimbingId(Member member, Long climbingId); } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java index d2890cc6..9773f713 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java @@ -53,7 +53,7 @@ public List findMembersByClimbing(Climbing climbing) { @Transactional(readOnly = true) public ClimbingMember findByMemberAndClimbing(Member member, Long climbingId) { - return climbingMemberRepository.findByMemberAndClimbing_Id(member, climbingId) + return climbingMemberRepository.findByMemberAndClimbing_ClimbingId(member, climbingId) .orElseThrow(() -> new CustomException(ErrorCode.CLIMBINGMEMBER_NOT_FOUND)); } From 61bc1ff49699c91b39dfc5758d7cd684a41504c0 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Tue, 5 Nov 2024 21:46:29 +0900 Subject: [PATCH 05/12] =?UTF-8?q?Fix:=20=EA=B3=84=EC=A0=95=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20API=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/member/service/MemberService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/member/service/MemberService.java b/core/src/main/java/org/bookwoori/core/domain/member/service/MemberService.java index 20a42d88..9928f076 100644 --- a/core/src/main/java/org/bookwoori/core/domain/member/service/MemberService.java +++ b/core/src/main/java/org/bookwoori/core/domain/member/service/MemberService.java @@ -32,11 +32,10 @@ public Member getCurrentMember() throws CustomException { return member; } - @Transactional(readOnly = true) - public void getMemberStatus(Long kakaoId){ + public void getMemberStatus(Long kakaoId) { memberRepository.findByKakaoId(kakaoId) - .filter(member -> member.getStatus() != Status.INACTIVE) - .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_INACTIVE)); + .filter(member -> member.getStatus() != Status.INACTIVE) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_INACTIVE)); } public void saveMember(Member member) { From 9beceb9c3f8f1313b5c1cec574d28ce64869967d Mon Sep 17 00:00:00 2001 From: gkdudans Date: Tue, 5 Nov 2024 21:51:58 +0900 Subject: [PATCH 06/12] =?UTF-8?q?Style:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=B3=B4=EB=8B=A4=20=EB=AA=85=ED=99=95=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/climbing/controller/ClimbingController.java | 2 +- .../climbingMember/service/ClimbingMemberService.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java index 5aec60bd..5ddaa32c 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/controller/ClimbingController.java @@ -84,7 +84,7 @@ public ResponseEntity getClimbingMembers( @Operation(summary = "클라이밍 채널 참여자 메모 수정", description = "클라이밍 채널 참여자의 메모를 수정합니다.") @PatchMapping("/{climbingId}/members/memo") - public ResponseEntity getClimbingMemberMemo( + public ResponseEntity updateClimbingMemberMemo( @PathVariable("climbingId") final Long climbingId, @RequestBody @Valid ClimbingMemoUpdateRequestDto requestDto) { climbingMemberFacade.updateClimbingMemberMemo(climbingId, requestDto); diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java index 9773f713..00f7f170 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java @@ -52,15 +52,15 @@ public List findMembersByClimbing(Climbing climbing) { } @Transactional(readOnly = true) - public ClimbingMember findByMemberAndClimbing(Member member, Long climbingId) { + public ClimbingMember findByClimbing(Member member, Long climbingId) { return climbingMemberRepository.findByMemberAndClimbing_ClimbingId(member, climbingId) .orElseThrow(() -> new CustomException(ErrorCode.CLIMBINGMEMBER_NOT_FOUND)); } public void delegateClimbingRole(Long climbingId, Member currentMember, Member newOwner) { - ClimbingMember currentClimbingMember = findByMemberAndClimbing(currentMember, climbingId); - ClimbingMember newClimbingOwner = findByMemberAndClimbing(newOwner, climbingId); + ClimbingMember currentClimbingMember = findByClimbing(currentMember, climbingId); + ClimbingMember newClimbingOwner = findByClimbing(newOwner, climbingId); if (currentClimbingMember.getRole() != ClimbingRole.OWNER) { throw new CustomException(ErrorCode.ACCESS_DENIED); } From 7005d50e1b05a9fa2b464bc30d3798926d619824 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Tue, 5 Nov 2024 22:13:52 +0900 Subject: [PATCH 07/12] =?UTF-8?q?Style:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=B3=B4=EB=8B=A4=20=EB=AA=85=ED=99=95=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/climbing/facade/ClimbingMemberFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java index 6b8fd282..1a62af46 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java @@ -48,7 +48,7 @@ public List getClimbingMembers(Long climbingId) { public void updateClimbingMemberMemo(Long climbingId, ClimbingMemoUpdateRequestDto requestDto) { Member currentMember = memberService.getCurrentMember(); - ClimbingMember climbingMember = climbingMemberService.findByMemberAndClimbing(currentMember, + ClimbingMember climbingMember = climbingMemberService.findByClimbing(currentMember, climbingId); climbingMember.updateMemo(requestDto.memo()); } From 64f4e9c7a1f84ba9c02fd890f2e6380ec50511a3 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Wed, 6 Nov 2024 19:08:51 +0900 Subject: [PATCH 08/12] =?UTF-8?q?Refactor:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ClimbingMemberResponseDto.java | 9 +++++++++ .../dto/response/MyClimbingListResponseDto.java | 9 +++++++++ .../dto/response/ReadyClimbingListResponseDto.java | 9 +++++++++ .../domain/climbing/facade/ClimbingFacade.java | 14 +++++++++----- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberResponseDto.java create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/MyClimbingListResponseDto.java create mode 100644 core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ReadyClimbingListResponseDto.java diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberResponseDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberResponseDto.java new file mode 100644 index 00000000..4ace5e1b --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberResponseDto.java @@ -0,0 +1,9 @@ +package org.bookwoori.core.domain.climbing.dto.response; + +import java.util.List; + +public record ClimbingMemberResponseDto( + List climbingMemberList +) { + +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/MyClimbingListResponseDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/MyClimbingListResponseDto.java new file mode 100644 index 00000000..d14fb2e5 --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/MyClimbingListResponseDto.java @@ -0,0 +1,9 @@ +package org.bookwoori.core.domain.climbing.dto.response; + +import java.util.List; + +public record MyClimbingListResponseDto( + List myClimbingList +) { + +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ReadyClimbingListResponseDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ReadyClimbingListResponseDto.java new file mode 100644 index 00000000..3354ad4e --- /dev/null +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ReadyClimbingListResponseDto.java @@ -0,0 +1,9 @@ +package org.bookwoori.core.domain.climbing.dto.response; + +import java.util.List; + +public record ReadyClimbingListResponseDto( + List readyClimbingList +) { + +} diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java index 4ffcbc96..26db1348 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingFacade.java @@ -9,6 +9,8 @@ import org.bookwoori.core.domain.climbing.dto.request.ClimbingChannelCreateRequestDto; import org.bookwoori.core.domain.climbing.dto.request.ClimbingChannelUpdateRequestDto; import org.bookwoori.core.domain.climbing.dto.response.ClimbingDetailsResponseDto; +import org.bookwoori.core.domain.climbing.dto.response.MyClimbingListResponseDto; +import org.bookwoori.core.domain.climbing.dto.response.ReadyClimbingListResponseDto; import org.bookwoori.core.domain.climbing.dto.response.ServerClimbingListDto; import org.bookwoori.core.domain.climbing.entity.Climbing; import org.bookwoori.core.domain.climbing.entity.ClimbingStatus; @@ -134,16 +136,18 @@ public ServerClimbingListDto getClimbingList(Long serverId) { } @Transactional(readOnly = true) - public List getMyClimbingList(Long serverId) { + public MyClimbingListResponseDto getMyClimbingList(Long serverId) { Member currentMember = memberService.getCurrentMember(); List myClimbings = climbingService.getMyClimbings(currentMember, serverId); - return convertToDto(myClimbings); + List myClimbingList = convertToDto(myClimbings); + return new MyClimbingListResponseDto(myClimbingList); } @Transactional(readOnly = true) - public List getReadyClimbingList(Long serverId) { - List readyClimbs = climbingService.getReadyClimbings(serverId); - return convertToDto(readyClimbs); + public ReadyClimbingListResponseDto getReadyClimbingList(Long serverId) { + List readyClimbings = climbingService.getReadyClimbings(serverId); + List readyClimbingList = convertToDto(readyClimbings); + return new ReadyClimbingListResponseDto(readyClimbingList); } @Transactional(readOnly = true) From ba400bc656122e7a1b148c3a64c2bce6f2e8c59f Mon Sep 17 00:00:00 2001 From: gkdudans Date: Wed, 6 Nov 2024 19:12:16 +0900 Subject: [PATCH 09/12] =?UTF-8?q?Fix:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=A9=A4=EB=B2=84=20=EC=A1=B0=ED=9A=8C=20Dto?= =?UTF-8?q?=EC=97=90=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/climbing/dto/response/ClimbingMemberUnitDto.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java index 1c28f184..d6474851 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java @@ -5,6 +5,7 @@ public record ClimbingMemberUnitDto( Long memberId, + String nickname, String profileImg, int level, String mountain, @@ -17,6 +18,7 @@ public static ClimbingMemberUnitDto from(ClimbingMember member, ReadingStatus st int currentPage) { return new ClimbingMemberUnitDto( member.getMember().getMemberId(), + member.getMember().getNickname(), member.getMember().getProfileImg(), member.getMember().getGrade().getLevel(), member.getMember().getGrade().getMountain(), From c9e09271ea890f0de680adf7a91834d05f86e82e Mon Sep 17 00:00:00 2001 From: gkdudans Date: Wed, 6 Nov 2024 19:23:49 +0900 Subject: [PATCH 10/12] =?UTF-8?q?Refactor:=20DTO=EC=97=90=EC=84=9C=20build?= =?UTF-8?q?er=20=ED=8C=A8=ED=84=B4=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/book/dto/response/BookInfoDto.java | 22 +++++++++------- .../response/ClimbingDetailsResponseDto.java | 26 ++++++++++--------- .../dto/response/ClimbingMemberUnitDto.java | 22 +++++++++------- 3 files changed, 38 insertions(+), 32 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/book/dto/response/BookInfoDto.java b/core/src/main/java/org/bookwoori/core/domain/book/dto/response/BookInfoDto.java index cfb9f499..b5092c49 100644 --- a/core/src/main/java/org/bookwoori/core/domain/book/dto/response/BookInfoDto.java +++ b/core/src/main/java/org/bookwoori/core/domain/book/dto/response/BookInfoDto.java @@ -1,8 +1,10 @@ package org.bookwoori.core.domain.book.dto.response; import java.time.LocalDate; +import lombok.Builder; import org.bookwoori.core.domain.book.entity.Book; +@Builder public record BookInfoDto( String title, String author, @@ -14,15 +16,15 @@ public record BookInfoDto( String cover) { public static BookInfoDto from(Book book) { - return new BookInfoDto( - book.getTitle(), - book.getAuthor(), - book.getPublisher(), - book.getPubDate(), - book.getItemPage(), - book.getDescription(), - book.getIsbn13(), - book.getCoverImg() - ); + return BookInfoDto.builder() + .title(book.getTitle()) + .author(book.getAuthor()) + .publisher(book.getPublisher()) + .pubDate(book.getPubDate()) + .itemPage(book.getItemPage()) + .description(book.getDescription()) + .isbn13(book.getIsbn13()) + .cover(book.getCoverImg()) + .build(); } } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingDetailsResponseDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingDetailsResponseDto.java index 0c8687be..5923a325 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingDetailsResponseDto.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingDetailsResponseDto.java @@ -1,10 +1,12 @@ package org.bookwoori.core.domain.climbing.dto.response; import java.time.LocalDate; +import lombok.Builder; import org.bookwoori.core.domain.book.dto.response.BookInfoDto; import org.bookwoori.core.domain.climbing.entity.Climbing; import org.bookwoori.core.domain.climbing.entity.ClimbingStatus; +@Builder public record ClimbingDetailsResponseDto( Long climbingId, ClimbingStatus status, @@ -19,17 +21,17 @@ public record ClimbingDetailsResponseDto( public static ClimbingDetailsResponseDto from(Climbing climbing, int memberCount, boolean isJoined, boolean isOWner) { - return new ClimbingDetailsResponseDto( - climbing.getClimbingId(), - climbing.getStatus(), - climbing.getName(), - climbing.getStartDate(), - climbing.getEndDate(), - climbing.getDescription(), - memberCount, - isJoined, - isOWner, - BookInfoDto.from(climbing.getBook()) - ); + return ClimbingDetailsResponseDto.builder() + .climbingId(climbing.getClimbingId()) + .status(climbing.getStatus()) + .name(climbing.getName()) + .startDate(climbing.getStartDate()) + .endDate(climbing.getEndDate()) + .description(climbing.getDescription()) + .memberCount(memberCount) + .isJoined(isJoined) + .isOWner(isOWner) + .bookInfo(BookInfoDto.from(climbing.getBook())) + .build(); } } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java index d6474851..e6a6c6ed 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/dto/response/ClimbingMemberUnitDto.java @@ -1,8 +1,10 @@ package org.bookwoori.core.domain.climbing.dto.response; +import lombok.Builder; import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; import org.bookwoori.core.domain.record.entity.ReadingStatus; +@Builder public record ClimbingMemberUnitDto( Long memberId, String nickname, @@ -16,15 +18,15 @@ public record ClimbingMemberUnitDto( public static ClimbingMemberUnitDto from(ClimbingMember member, ReadingStatus status, int currentPage) { - return new ClimbingMemberUnitDto( - member.getMember().getMemberId(), - member.getMember().getNickname(), - member.getMember().getProfileImg(), - member.getMember().getGrade().getLevel(), - member.getMember().getGrade().getMountain(), - status, - currentPage, - member.getMemo() - ); + return ClimbingMemberUnitDto.builder() + .memberId(member.getMember().getMemberId()) + .nickname(member.getMember().getNickname()) + .profileImg(member.getMember().getProfileImg()) + .level(member.getMember().getGrade().getLevel()) + .mountain(member.getMember().getGrade().getMountain()) + .status(status) + .currentPage(currentPage) + .memo(member.getMemo()) + .build(); } } From 317a0cffef9dd3ca825db2de90a4b772a0ebe83b Mon Sep 17 00:00:00 2001 From: gkdudans Date: Wed, 6 Nov 2024 19:37:09 +0900 Subject: [PATCH 11/12] =?UTF-8?q?Fix:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=A9=A4=EB=B2=84=20=EC=A1=B0=ED=9A=8C=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit join fetch 사용해서 N+1 문제 해결 --- .../climbingMember/repository/ClimbingMemberRepository.java | 5 ++++- .../domain/climbingMember/service/ClimbingMemberService.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java index b5446832..756af51c 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/repository/ClimbingMemberRepository.java @@ -6,6 +6,8 @@ import org.bookwoori.core.domain.climbingMember.entity.ClimbingMember; import org.bookwoori.core.domain.member.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface ClimbingMemberRepository extends JpaRepository { @@ -15,7 +17,8 @@ public interface ClimbingMemberRepository extends JpaRepository findByClimbing(Climbing climbing); + @Query("SELECT cm FROM ClimbingMember cm JOIN FETCH cm.member WHERE cm.climbing = :climbing") + List findByClimbingWithMember(@Param("climbing") Climbing climbing); Optional findByMemberAndClimbing_ClimbingId(Member member, Long climbingId); } diff --git a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java index 00f7f170..ad99f138 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbingMember/service/ClimbingMemberService.java @@ -48,7 +48,7 @@ public int getMemberCount(Climbing climbing) { @Transactional(readOnly = true) public List findMembersByClimbing(Climbing climbing) { - return climbingMemberRepository.findByClimbing(climbing); + return climbingMemberRepository.findByClimbingWithMember(climbing); } @Transactional(readOnly = true) From 44d22d39a8a7b835eada89401705d4c164d4a079 Mon Sep 17 00:00:00 2001 From: gkdudans Date: Thu, 7 Nov 2024 14:19:26 +0900 Subject: [PATCH 12/12] =?UTF-8?q?Fix:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=84=90=20=EC=B1=84=EB=84=90=20=ED=8E=B8=EC=A7=91=20API=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 진행 종료된 클라이밍 채널 편집 불가능 --- .../domain/climbing/facade/ClimbingMemberFacade.java | 1 + .../core/domain/climbing/service/ClimbingService.java | 9 +++++++++ .../org/bookwoori/core/global/exception/ErrorCode.java | 3 ++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java index 1a62af46..b47c3367 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/facade/ClimbingMemberFacade.java @@ -47,6 +47,7 @@ public List getClimbingMembers(Long climbingId) { public void updateClimbingMemberMemo(Long climbingId, ClimbingMemoUpdateRequestDto requestDto) { + climbingService.isRunning(climbingId); Member currentMember = memberService.getCurrentMember(); ClimbingMember climbingMember = climbingMemberService.findByClimbing(currentMember, climbingId); diff --git a/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java b/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java index 5c436de9..0c85f0a3 100644 --- a/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java +++ b/core/src/main/java/org/bookwoori/core/domain/climbing/service/ClimbingService.java @@ -3,6 +3,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.bookwoori.core.domain.climbing.entity.Climbing; +import org.bookwoori.core.domain.climbing.entity.ClimbingStatus; import org.bookwoori.core.domain.climbing.repository.ClimbingRepository; import org.bookwoori.core.domain.member.entity.Member; import org.bookwoori.core.global.exception.CustomException; @@ -41,5 +42,13 @@ public List getReadyClimbings(Long serverId) { public List getAllClimbings() { return climbingRepository.findAll(); } + + @Transactional(readOnly = true) + public void isRunning(Long climbingId) { + Climbing climbing = getClimbingById(climbingId); + if (climbing.getStatus() != ClimbingStatus.RUNNING) { + throw new CustomException(ErrorCode.CLIMBING_NOT_RUNNING); + } + } } diff --git a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java index 95c944f8..cde650c2 100644 --- a/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java +++ b/core/src/main/java/org/bookwoori/core/global/exception/ErrorCode.java @@ -58,9 +58,10 @@ public enum ErrorCode { CLIMBING_NOT_READY(409, 3402, "모집 중인 클라이밍 채널만 편집할 수 있습니다."), OWNER_CANNOT_LEAVE(409, 3403, "OWNER는 클라이밍 채널을 떠날 수 없습니다."), CLIMBINGMEMBER_NOT_FOUND(404, 3404, "클라이밍 멤버를 찾을 수 없습니다."), + CLIMBING_NOT_RUNNING(409, 3405, "진행 중인 클라이밍이 아닙니다."), // Book (3500 ~ 3599) - BOOK_NOT_FOUND(404, 3500, "책을 찾을 수 없습니다.") + BOOK_NOT_FOUND(404, 3500, "책을 찾을 수 없습니다."), // Record (3600 ~ 3699)