From 7122395613de9f050dfae17b16b875d2ae5cb771 Mon Sep 17 00:00:00 2001 From: chaewonkim Date: Thu, 22 Aug 2024 16:22:23 +0900 Subject: [PATCH 1/4] [feat] #98 add errorCode in MemberErrorCode --- .../org/kkumulkkum/server/exception/code/MemberErrorCode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/kkumulkkum/server/exception/code/MemberErrorCode.java b/src/main/java/org/kkumulkkum/server/exception/code/MemberErrorCode.java index 07755e5..2ef9cd2 100644 --- a/src/main/java/org/kkumulkkum/server/exception/code/MemberErrorCode.java +++ b/src/main/java/org/kkumulkkum/server/exception/code/MemberErrorCode.java @@ -9,6 +9,8 @@ public enum MemberErrorCode implements DefaultErrorCode { // 403 FORBIDDEN NOT_JOINED_MEMBER(HttpStatus.FORBIDDEN, 40340, "모임에 참여하지 않은 회원입니다."), + // 404 NOT_FOUND + NOT_FOUND_MEMBER(HttpStatus.NOT_FOUND, 40440, "멤버를 찾을 수 없습니다.") ; private HttpStatus httpStatus; From 0ff01ebceede37fce772acf775cbe058be7b5e8e Mon Sep 17 00:00:00 2001 From: chaewonkim Date: Thu, 22 Aug 2024 16:26:06 +0900 Subject: [PATCH 2/4] [feat] #98 create member find method --- .../server/repository/MemberRepository.java | 8 ++++++++ .../server/service/member/MemberRetreiver.java | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/org/kkumulkkum/server/repository/MemberRepository.java b/src/main/java/org/kkumulkkum/server/repository/MemberRepository.java index 9674e55..7952cbc 100644 --- a/src/main/java/org/kkumulkkum/server/repository/MemberRepository.java +++ b/src/main/java/org/kkumulkkum/server/repository/MemberRepository.java @@ -36,4 +36,12 @@ SELECT CASE WHEN EXISTS ( Member findByMeetingIdAndUserId(Long meetingId, Long userId); List findByUserId(Long userId); + + @Query(""" + SELECT m FROM Member m + JOIN m.meeting mt + JOIN m.user u + JOIN Promise p ON p.meeting.id = mt.id + WHERE p.id = :promiseId AND u.id = :userId""") + Member findByUserIdAndPromiseId(Long userId, Long promiseId); } diff --git a/src/main/java/org/kkumulkkum/server/service/member/MemberRetreiver.java b/src/main/java/org/kkumulkkum/server/service/member/MemberRetreiver.java index 9bab1d4..e891e0c 100644 --- a/src/main/java/org/kkumulkkum/server/service/member/MemberRetreiver.java +++ b/src/main/java/org/kkumulkkum/server/service/member/MemberRetreiver.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.kkumulkkum.server.domain.Member; import org.kkumulkkum.server.dto.member.response.MemberDto; +import org.kkumulkkum.server.exception.MemberException; +import org.kkumulkkum.server.exception.code.MemberErrorCode; import org.kkumulkkum.server.repository.MemberRepository; import org.springframework.stereotype.Component; @@ -14,6 +16,11 @@ public class MemberRetreiver { private final MemberRepository memberRepository; + public Member findById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MemberErrorCode.NOT_FOUND_MEMBER)); + } + public boolean existsByMeetingIdAndUserId( final Long meetingId, final Long userId @@ -39,4 +46,11 @@ public Member findByMeetingIdAndUserId(Long meetingId, Long userId) { public List findByUserId(final Long userId) { return memberRepository.findByUserId(userId); } + + public Member findByUserIdAndPromiseId( + final Long userId, + final Long promiseId + ) { + return memberRepository.findByUserIdAndPromiseId(userId, promiseId); + } } From a98754416335ad8f9d7d0d3e3677a6ce232d628b Mon Sep 17 00:00:00 2001 From: chaewonkim Date: Thu, 22 Aug 2024 16:26:16 +0900 Subject: [PATCH 3/4] [feat] #98 create participant find method --- .../kkumulkkum/server/repository/ParticipantRepository.java | 2 ++ .../server/service/participant/ParticipantRetriever.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/org/kkumulkkum/server/repository/ParticipantRepository.java b/src/main/java/org/kkumulkkum/server/repository/ParticipantRepository.java index f38c93d..82a946e 100644 --- a/src/main/java/org/kkumulkkum/server/repository/ParticipantRepository.java +++ b/src/main/java/org/kkumulkkum/server/repository/ParticipantRepository.java @@ -73,4 +73,6 @@ SELECT COUNT(p) FROM Participant p List findFcmTokenByPromiseId(Long promiseId, Long userId); void deleteByMemberId(Long memberId); + + Participant findByMemberIdAndPromiseId(Long memberId, Long promiseId); } diff --git a/src/main/java/org/kkumulkkum/server/service/participant/ParticipantRetriever.java b/src/main/java/org/kkumulkkum/server/service/participant/ParticipantRetriever.java index 363b05f..8cf537c 100644 --- a/src/main/java/org/kkumulkkum/server/service/participant/ParticipantRetriever.java +++ b/src/main/java/org/kkumulkkum/server/service/participant/ParticipantRetriever.java @@ -60,4 +60,7 @@ public List findFcmTokenByPromiseId(final Long promiseId, final Long use return participantRepository.findFcmTokenByPromiseId(promiseId, userId); } + public Participant findByMemberIdAndPromiseId(final Long memberId, final Long promiseId) { + return participantRepository.findByMemberIdAndPromiseId(memberId, promiseId); + } } From 35e96685d2fc028cef23765f76a4c382c2d00892 Mon Sep 17 00:00:00 2001 From: chaewonkim Date: Thu, 22 Aug 2024 16:26:55 +0900 Subject: [PATCH 4/4] [feat] #98 create promise edit logic --- .../server/controller/PromiseController.java | 10 ++++ .../org/kkumulkkum/server/domain/Promise.java | 18 ++++++ .../server/service/promise/PromiseEditor.java | 17 ++++++ .../service/promise/PromiseService.java | 58 +++++++++++++++++++ 4 files changed, 103 insertions(+) diff --git a/src/main/java/org/kkumulkkum/server/controller/PromiseController.java b/src/main/java/org/kkumulkkum/server/controller/PromiseController.java index 716df3c..1013d89 100644 --- a/src/main/java/org/kkumulkkum/server/controller/PromiseController.java +++ b/src/main/java/org/kkumulkkum/server/controller/PromiseController.java @@ -73,6 +73,16 @@ public ResponseEntity getUpcomingPromise( return ResponseEntity.ok().body(promiseService.getUpcomingPromises(userId)); } + @IsParticipant(promiseIdParamIndex = 1) + @PutMapping("/v1/promises/{promiseId}") + public ResponseEntity updatePromise( + @UserId final Long userId, + @PathVariable final Long promiseId, + @Valid @RequestBody final PromiseCreateDto updatePromiseDto + ) { + return ResponseEntity.ok(promiseService.updatePromise(userId, promiseId, updatePromiseDto)); + } + @IsParticipant(promiseIdParamIndex = 0) @DeleteMapping("/v1/promises/{promiseId}") public ResponseEntity deletePromise( diff --git a/src/main/java/org/kkumulkkum/server/domain/Promise.java b/src/main/java/org/kkumulkkum/server/domain/Promise.java index 86833cf..0b08961 100644 --- a/src/main/java/org/kkumulkkum/server/domain/Promise.java +++ b/src/main/java/org/kkumulkkum/server/domain/Promise.java @@ -73,4 +73,22 @@ public void complete() { this.isCompleted = true; } + public void updatePromise( + String name, + String placeName, + Double x, + Double y, + String address, + String roadAddress, + DressUpLevel dressUpLevel, + String penalty) { + this.name = name; + this.placeName = placeName; + this.x = x; + this.y = y; + this.address = address; + this.roadAddress = roadAddress; + this.dressUpLevel = dressUpLevel; + this.penalty = penalty; + } } diff --git a/src/main/java/org/kkumulkkum/server/service/promise/PromiseEditor.java b/src/main/java/org/kkumulkkum/server/service/promise/PromiseEditor.java index 71b3df5..746b764 100644 --- a/src/main/java/org/kkumulkkum/server/service/promise/PromiseEditor.java +++ b/src/main/java/org/kkumulkkum/server/service/promise/PromiseEditor.java @@ -1,6 +1,7 @@ package org.kkumulkkum.server.service.promise; import org.kkumulkkum.server.domain.Promise; +import org.kkumulkkum.server.dto.promise.PromiseCreateDto; import org.springframework.stereotype.Component; @Component @@ -9,4 +10,20 @@ public class PromiseEditor { public void completePromise(final Promise promise) { promise.complete(); } + + public void updatePromise( + final Promise promise, + final PromiseCreateDto updatePromiseDto + ) { + promise.updatePromise( + updatePromiseDto.name(), + updatePromiseDto.placeName(), + updatePromiseDto.x(), + updatePromiseDto.y(), + updatePromiseDto.address(), + updatePromiseDto.roadAddress(), + updatePromiseDto.dressUpLevel(), + updatePromiseDto.penalty() + ); + } } diff --git a/src/main/java/org/kkumulkkum/server/service/promise/PromiseService.java b/src/main/java/org/kkumulkkum/server/service/promise/PromiseService.java index 6750f5f..43ff55b 100644 --- a/src/main/java/org/kkumulkkum/server/service/promise/PromiseService.java +++ b/src/main/java/org/kkumulkkum/server/service/promise/PromiseService.java @@ -147,6 +147,31 @@ public MainPromisesDto getUpcomingPromises(final Long userId) { return MainPromisesDto.from(promiseRetriever.findUpcomingPromises(userId, 4)); } + @Transactional + public PromiseAddDto updatePromise( + final Long userId, + final Long promiseId, + final PromiseCreateDto updatePromiseDto + ) { + // 약속 정보 수정 + Promise promise = promiseRetriever.findById(promiseId); + promiseEditor.updatePromise(promise, updatePromiseDto); + + // 참여자 목록 수정 + Member member = memberRetreiver.findByUserIdAndPromiseId(userId, promiseId); + updatePromiseDto.participants().add(member.getId()); + + List currentMembers = participantRetriever.findAllByPromiseId(promiseId).stream() + .map(participant -> participant.getMember().getId()) + .toList(); + List newMembers = updatePromiseDto.participants(); + + saveNewParticipants(promise, newMembers, currentMembers); + removeOldParticipants(promiseId, newMembers, currentMembers); + + return PromiseAddDto.from(promise); + } + @Transactional public void deletePromise(final Long promiseId) { Promise promise = promiseRetriever.findById(promiseId); @@ -173,4 +198,37 @@ private void updateUserInfo( } } + private void saveNewParticipants( + final Promise promise, + final List newMembers, + final List currentMembers + ) { + participantSaver.saveAll( + newMembers.stream() + .filter(memberId -> !currentMembers.contains(memberId)) + .map(memberId -> { + Member member = memberRetreiver.findById(memberId); + return Participant.builder() + .promise(promise) + .member(member) + .build(); + }).toList() + ); + } + + private void removeOldParticipants( + final Long promiseId, + final List newMembers, + final List currentMembers + ) { + participantRemover.deleteAll( + currentMembers.stream() + .filter(memberId -> !newMembers.contains(memberId)) + .map(memberId -> { + memberRetreiver.findById(memberId); + return participantRetriever.findByMemberIdAndPromiseId(memberId, promiseId); + }).toList() + ); + } + }