From 401ff036ccaf7c62db62d7b6f853015b7f5915fd Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Tue, 30 Jan 2024 20:02:36 +0900 Subject: [PATCH 001/117] =?UTF-8?q?refactor:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=EC=84=9C=20JPA=20=EC=96=91=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/service/ChatValidator.java | 12 ++- .../back/crew/controller/CrewController.java | 13 ++- .../kr/pickple/back/crew/domain/Crew.java | 27 ------ .../pickple/back/crew/domain/CrewMembers.java | 64 -------------- .../pickple/back/crew/domain/CrewStatus.java | 14 +-- .../CrewMemberUpdateStatusRequest.java | 6 +- .../dto/response/CrewProfileResponse.java | 4 +- .../crew/repository/CrewMemberRepository.java | 20 ++++- .../back/crew/repository/CrewRepository.java | 22 +++-- .../back/crew/service/CrewMemberService.java | 88 ++++++++++--------- .../back/crew/service/CrewService.java | 71 +++++++++------ .../member/repository/MemberRepository.java | 12 ++- .../back/member/service/MemberService.java | 21 ++--- 13 files changed, 179 insertions(+), 195 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewMembers.java diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java index 3403b81f..7bc368d5 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java @@ -1,6 +1,7 @@ package kr.pickple.back.chat.service; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import java.util.Optional; @@ -11,6 +12,7 @@ import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.common.util.DateTimeUtil; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; @@ -21,9 +23,10 @@ @RequiredArgsConstructor public class ChatValidator { - private final ChatRoomMemberRepository chatRoomMemberRepository; private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; private final GameRepository gameRepository; + private final ChatRoomMemberRepository chatRoomMemberRepository; public void validateIsSelfChat(Member receiver, Member sender) { if (sender.equals(receiver)) { @@ -62,9 +65,12 @@ private void validateCrewChatRoomLeavingConditions(final Member member, final Ch } final Crew crew = optionalCrew.get(); + validateIsMemberConfirmedCrewMember(crew.getId(), member.getId(), chatRoom.getId()); + } - if (crew.isConfirmedCrewMember(member)) { - throw new ChatException(CHAT_CREW_CHATROOM_NOT_ALLOWED_TO_LEAVE, member.getId(), chatRoom.getId()); + private void validateIsMemberConfirmedCrewMember(final Long crewId, final Long memberId, final Long chatRoomId) { + if (crewMemberRepository.existsByCrewIdAndMemberIdAndStatus(crewId, memberId, CONFIRMED)) { + throw new ChatException(CHAT_CREW_CHATROOM_NOT_ALLOWED_TO_LEAVE, crewId, memberId, chatRoomId); } } diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index ea9f6990..137acd28 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -53,11 +53,11 @@ public ResponseEntity findCrewById( } @PostMapping("/{crewId}/members") - public ResponseEntity applyForCrewMemberShip( + public ResponseEntity registerCrewMember( @Login final Long loggedInMemberId, @PathVariable final Long crewId ) { - crewMemberService.applyForCrewMemberShip(crewId, loggedInMemberId); + crewMemberService.registerCrewMember(crewId, loggedInMemberId); return ResponseEntity.status(NO_CONTENT) .build(); @@ -80,7 +80,12 @@ public ResponseEntity updateCrewMemberRegistrationStatus( @PathVariable final Long memberId, @Valid @RequestBody final CrewMemberUpdateStatusRequest crewMemberStatusUpdateRequest ) { - crewMemberService.crewMemberStatusUpdate(loggedInMemberId, crewId, memberId, crewMemberStatusUpdateRequest); + crewMemberService.updateCrewMemberRegistrationStatus( + loggedInMemberId, + crewId, + memberId, + crewMemberStatusUpdateRequest + ); return ResponseEntity.status(NO_CONTENT) .build(); @@ -105,6 +110,6 @@ public ResponseEntity> findCrewsByAddress( final Pageable pageable ) { return ResponseEntity.status(OK) - .body(crewService.findCrewByAddress(addressDepth1, addressDepth2, pageable)); + .body(crewService.findCrewsByAddress(addressDepth1, addressDepth2, pageable)); } } diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 067a5c9e..c7a51b4f 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -3,11 +3,8 @@ import static kr.pickple.back.crew.domain.CrewStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import java.util.List; - import jakarta.persistence.Column; import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -21,7 +18,6 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.util.CrewStatusConverter; import kr.pickple.back.member.domain.Member; @@ -86,9 +82,6 @@ public class Crew extends BaseEntity { @JoinColumn(name = "address_depth2_id") private AddressDepth2 addressDepth2; - @Embedded - private CrewMembers crewMembers = new CrewMembers(); - @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chat_room_id") private ChatRoom chatRoom; @@ -116,18 +109,6 @@ private Crew( updateStatusIfCrewMemberFull(); } - public List getMembersByStatus(final RegistrationStatus status) { - return crewMembers.getCrewMembers(status); - } - - public List getCrewMembers() { - return crewMembers.getCrewMembers(); - } - - public void addCrewMember(final Member member) { - crewMembers.addCrewMember(this, member); - } - public void increaseMemberCount() { validateCrewIsClosedOrFull(); @@ -179,12 +160,4 @@ public void makeNewCrewChatRoom(final ChatRoom chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); this.chatRoom = chatRoom; } - - public Boolean isConfirmedCrewMember(final Member member) { - return crewMembers.isAlreadyConfirmed(member); - } - - public List getCrewMembers(RegistrationStatus status) { - return crewMembers.getCrewMembers(status); - } } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMembers.java b/src/main/java/kr/pickple/back/crew/domain/CrewMembers.java deleted file mode 100644 index 313b44f9..00000000 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMembers.java +++ /dev/null @@ -1,64 +0,0 @@ -package kr.pickple.back.crew.domain; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.member.domain.Member; -import lombok.Getter; - -import java.util.ArrayList; -import java.util.List; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_MEMBER_ALREADY_EXISTED; - -@Embeddable -public class CrewMembers { - - @Getter - @OneToMany(mappedBy = "crew", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List crewMembers = new ArrayList<>(); - - public List getCrewMembers(final RegistrationStatus status) { - return crewMembers.stream() - .filter(crewMember -> crewMember.equalsStatus(status)) - .map(CrewMember::getMember) - .toList(); - } - - public void addCrewMember(final Crew crew, final Member member) { - validateIsAlreadyRegisteredCrewMember(member); - - final CrewMember crewMember = buildCrewMember(crew, member); - if (member.equals(crew.getLeader())) { - crewMember.confirmRegistration(); - } - - crewMembers.add(crewMember); - } - - private void validateIsAlreadyRegisteredCrewMember(final Member member) { - if (isAlreadyRegistered(member)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, member.getId()); - } - } - - private Boolean isAlreadyRegistered(final Member member) { - return crewMembers.stream() - .anyMatch(crewMember -> member.equals(crewMember.getMember())); - } - - private CrewMember buildCrewMember(final Crew crew, final Member member) { - return CrewMember.builder() - .member(member) - .crew(crew) - .build(); - } - - public Boolean isAlreadyConfirmed(final Member member) { - return crewMembers.stream() - .anyMatch(crewMember -> member.equals(crewMember.getMember()) && crewMember.equalsStatus(CONFIRMED)); - } -} diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewStatus.java b/src/main/java/kr/pickple/back/crew/domain/CrewStatus.java index 87b2ccea..18175f70 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewStatus.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewStatus.java @@ -1,10 +1,6 @@ package kr.pickple.back.crew.domain; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.crew.exception.CrewException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import java.util.Collections; import java.util.Map; @@ -12,7 +8,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_STATUS_NOT_FOUND; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import kr.pickple.back.crew.exception.CrewException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor @@ -33,6 +34,7 @@ public static CrewStatus from(final String description) { if (crewStatusMap.containsKey(description)) { return crewStatusMap.get(description); } + throw new CrewException(CREW_STATUS_NOT_FOUND, description); } } diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewMemberUpdateStatusRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewMemberUpdateStatusRequest.java index b7073739..5df65e8d 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewMemberUpdateStatusRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewMemberUpdateStatusRequest.java @@ -2,7 +2,11 @@ import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.RegistrationStatus; -import lombok.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @Builder diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index 643587c1..96eb7ab3 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -27,7 +27,7 @@ public class CrewProfileResponse { private String addressDepth2; private List members; - public static CrewProfileResponse of(final Crew crew, final List crewMemberList) { + public static CrewProfileResponse of(final Crew crew, final List memberResponses) { return CrewProfileResponse.builder() .id(crew.getId()) .name(crew.getName()) @@ -42,7 +42,7 @@ public static CrewProfileResponse of(final Crew crew, final List .leader(MemberResponse.from(crew.getLeader())) .addressDepth1(crew.getAddressDepth1().getName()) .addressDepth2(crew.getAddressDepth2().getName()) - .members(crewMemberList) + .members(memberResponses) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 94b2f2e9..3bf9b6e4 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -1,12 +1,28 @@ package kr.pickple.back.crew.repository; -import kr.pickple.back.crew.domain.CrewMember; -import org.springframework.data.jpa.repository.JpaRepository; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import java.util.List; import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.exception.CrewException; + public interface CrewMemberRepository extends JpaRepository { Optional findByMemberIdAndCrewId(final Long memberId, final Long crewId); + List findAllByCrewIdAndStatus(final Long crewId, final RegistrationStatus status); + + Boolean existsByCrewIdAndMemberId(final Long crewId, final Long memberId); + + Boolean existsByCrewIdAndMemberIdAndStatus(final Long crewId, final Long memberId, final RegistrationStatus status); + + default CrewMember getCrewMemberByCrewIdAndMemberId(final Long memberId, final Long crewId) { + return findByMemberIdAndCrewId(memberId, crewId).orElseThrow( + () -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); + } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 7fe81e3a..49a461b3 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -1,20 +1,32 @@ package kr.pickple.back.crew.repository; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; +import kr.pickple.back.crew.exception.CrewException; public interface CrewRepository extends JpaRepository { - boolean existsByName(final String name); + Boolean existsByName(final String name); - Page findByAddressDepth1AndAddressDepth2(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, final Pageable pageable); + Page findByAddressDepth1AndAddressDepth2( + final AddressDepth1 addressDepth1, + final AddressDepth2 addressDepth2, + final Pageable pageable + ); Optional findByChatRoom(final ChatRoom chatRoom); + + default Crew getCrewById(final Long crewId) { + return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 3cc911e3..cceea1b1 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,5 +1,14 @@ package kr.pickple.back.crew.service; +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + +import java.util.List; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; @@ -14,37 +23,36 @@ import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; -import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service -@Transactional(readOnly = true) @RequiredArgsConstructor +@Transactional(readOnly = true) public class CrewMemberService { - private final CrewRepository crewRepository; private final MemberRepository memberRepository; + private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; + /** + * 크루 가입 신청 + */ @Transactional - public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberId) { - final Crew crew = findCrewById(crewId); - final Member member = findMemberById(loggedInMemberId); + public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { + final Crew crew = crewRepository.getCrewById(crewId); + final Member member = memberRepository.getMemberById(loggedInMemberId); - crew.addCrewMember(member); + validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); + + final CrewMember newCrewMember = CrewMember.builder() + .member(member) + .crew(crew) + .build(); + + crewMemberRepository.save(newCrewMember); eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() .crewId(crewId) @@ -52,41 +60,44 @@ public void applyForCrewMemberShip(final Long crewId, final Long loggedInMemberI .build()); } + private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { + if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); + } + } + + /** + * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 + */ public CrewProfileResponse findAllCrewMembers( final Long loggedInMemberId, final Long crewId, final RegistrationStatus status ) { - final Crew crew = findCrewById(crewId); + final Crew crew = crewRepository.getCrewById(crewId); validateIsLeader(loggedInMemberId, crew); - final List members = crew.getMembersByStatus(status); - final List crewMemberResponses = members.stream() + final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) + .stream() + .map(CrewMember::getMember) .map(MemberResponse::from) .toList(); - return CrewProfileResponse.of(crew, crewMemberResponses); - } - - private Crew findCrewById(final Long crewId) { - return crewRepository.findById(crewId) - .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - } - - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + return CrewProfileResponse.of(crew, memberResponses); } + /** + * 크루 가입 신청 수락 + */ @Transactional - public void crewMemberStatusUpdate( + public void updateCrewMemberRegistrationStatus( final Long loggedInMemberId, final Long crewId, final Long memberId, final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest ) { - final CrewMember crewMember = findCrewMemberByCrewIdAndMemberId(crewId, memberId); + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); final Crew crew = crewMember.getCrew(); validateIsLeader(loggedInMemberId, crew); @@ -95,7 +106,6 @@ public void crewMemberStatusUpdate( enterCrewChatRoom(updateStatus, crewMember); crewMember.updateStatus(updateStatus); - crewMember.updateStatus(crewMemberUpdateStatusRequest.getStatus()); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() .crewId(crewId) @@ -117,9 +127,12 @@ private void enterCrewChatRoom(final RegistrationStatus updateStatus, final Crew } } + /** + * 크루원 가입 신청 거절/취소 + */ @Transactional public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMember crewMember = findCrewMemberByCrewIdAndMemberId(crewId, memberId); + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); final Crew crew = crewMember.getCrew(); if (crew.isLeader(loggedInMemberId)) { @@ -143,11 +156,6 @@ public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, fin throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); } - private CrewMember findCrewMemberByCrewIdAndMemberId(final Long crewId, final Long memberId) { - return crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) - .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - } - private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { if (loggedInMemberId.equals(memberId)) { throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index e52d4dca..489dab96 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -3,7 +3,6 @@ import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.text.MessageFormat; import java.util.List; @@ -20,39 +19,42 @@ import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.request.CrewCreateRequest; import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.crew.exception.CrewExceptionCode; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service -@Transactional(readOnly = true) @RequiredArgsConstructor +@Transactional(readOnly = true) public class CrewService { private static final Integer CREW_IMAGE_START_NUMBER = 1; private static final Integer CREW_IMAGE_END_NUMBER = 20; private static final Integer CREW_CREATE_MAX_SIZE = 3; - private final S3Properties s3Properties; - private final CrewRepository crewRepository; private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; private final AddressService addressService; private final ChatRoomService chatRoomService; + private final S3Properties s3Properties; + /** + * 크루 생성 + */ @Transactional public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); - final Member leader = memberRepository.findById(loggedInMemberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND)); + final Member leader = memberRepository.getMemberById(loggedInMemberId); validateMemberCreatedCrewsCount(leader); @@ -61,8 +63,10 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina crewCreateRequest.getAddressDepth2() ); - final Integer crewImageRandomNumber = RandomUtil.getRandomNumber(CREW_IMAGE_START_NUMBER, - CREW_IMAGE_END_NUMBER); + final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( + CREW_IMAGE_START_NUMBER, + CREW_IMAGE_END_NUMBER + ); final Crew crew = crewCreateRequest.toEntity( leader, @@ -70,7 +74,14 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) ); - crew.addCrewMember(leader); + + final CrewMember crewLeader = CrewMember.builder() + .member(leader) + .crew(crew) + .build(); + + crewLeader.confirmRegistration(); + crewMemberRepository.save(crewLeader); final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); crew.makeNewCrewChatRoom(chatRoom); @@ -80,6 +91,12 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina return CrewIdResponse.from(crewId); } + private void validateIsDuplicatedCrewInfo(final String name) { + if (crewRepository.existsByName(name)) { + throw new CrewException(CREW_IS_EXISTED, name); + } + } + private void validateMemberCreatedCrewsCount(final Member leader) { final Long createdCrewsCount = leader.getCreatedCrewsCount(); @@ -88,19 +105,19 @@ private void validateMemberCreatedCrewsCount(final Member leader) { } } + /** + * 크루 상세 조회 + */ public CrewProfileResponse findCrewById(final Long crewId) { - final Crew crew = crewRepository.findById(crewId) - .orElseThrow(() -> new CrewException(CrewExceptionCode.CREW_NOT_FOUND)); - - final List confirmedCrewMembers = crew.getMembersByStatus(CONFIRMED); - final List crewMembers = confirmedCrewMembers.stream() - .map(MemberResponse::from) - .toList(); + final Crew crew = crewRepository.getCrewById(crewId); - return CrewProfileResponse.of(crew, crewMembers); + return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); } - public List findCrewByAddress( + /** + * 사용자 근처 크루 목록 조회 + */ + public List findCrewsByAddress( final String addressDepth1, final String addressDepth2, final Pageable pageable @@ -115,15 +132,15 @@ public List findCrewByAddress( ); return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, crew.getMembersByStatus(CONFIRMED).stream() - .map(MemberResponse::from) - .toList())) + .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) .toList(); } - private void validateIsDuplicatedCrewInfo(final String name) { - if (crewRepository.existsByName(name)) { - throw new CrewException(CREW_IS_EXISTED, name); - } + private List getConfirmedMemberResponses(final Long crewId) { + return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) + .stream() + .map(CrewMember::getMember) + .map(MemberResponse::from) + .toList(); } } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index 2e332ab6..f03915ac 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -1,13 +1,21 @@ package kr.pickple.back.member.repository; -import kr.pickple.back.member.domain.Member; -import org.springframework.data.jpa.repository.JpaRepository; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; + public interface MemberRepository extends JpaRepository { Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); Optional findByOauthId(final Long oauthId); + + default Member getMemberById(final Long memberId) { + return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index c8c5d224..1c7cd477 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -1,7 +1,6 @@ package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; @@ -20,9 +19,10 @@ import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; @@ -47,11 +47,12 @@ public class MemberService { private static final String REFRESH_TOKEN_KEY = "refresh_token"; - private final AddressService addressService; private final MemberRepository memberRepository; private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; private final GameRepository gameRepository; private final RedisRepository redisRepository; + private final AddressService addressService; private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; @@ -132,13 +133,14 @@ private List convertToCrewProfileResponses( final RegistrationStatus memberStatus ) { return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew.getId(), memberStatus))) .toList(); } - private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { - return crew.getMembersByStatus(memberStatus) + private List getMemberResponsesByCrew(final Long crewId, final RegistrationStatus memberStatus) { + return crewMemberRepository.findAllByCrewIdAndStatus(crewId, memberStatus) .stream() + .map(CrewMember::getMember) .map(MemberResponse::from) .toList(); } @@ -176,11 +178,6 @@ private Member findMemberById(final Long memberId) { .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - private Crew findCrewById(final Long crewId) { - return crewRepository.findById(crewId) - .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - } - private Game findGameById(final Long gameId) { return gameRepository.findById(gameId) .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); @@ -229,7 +226,7 @@ public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = findMemberById(memberId); - final Crew crew = findCrewById(crewId); + final Crew crew = crewRepository.getCrewById(crewId); return CrewMemberRegistrationStatusResponse.from(member.findCrewRegistrationStatus(crew)); } From 2452fe564045136e382e5375979d5ba18f8a95e1 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Tue, 30 Jan 2024 23:29:51 +0900 Subject: [PATCH 002/117] =?UTF-8?q?test:=20=ED=81=AC=EB=A3=A8=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=96=91=EB=B0=A9=ED=96=A5=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=9C,=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/service/CrewMemberService.java | 4 +- .../back/crew/service/CrewService.java | 2 +- .../crew/controller/CrewControllerTest.java | 29 +++++---- .../back/crew/docs/CrewDocumentTest.java | 60 ++++++++++--------- .../back/fixture/domain/CrewFixtures.java | 8 +++ .../pickple/back/fixture/setup/CrewSetup.java | 46 +++++++------- 6 files changed, 83 insertions(+), 66 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index cceea1b1..247b0310 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -97,7 +97,7 @@ public void updateCrewMemberRegistrationStatus( final Long memberId, final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest ) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); final Crew crew = crewMember.getCrew(); validateIsLeader(loggedInMemberId, crew); @@ -132,7 +132,7 @@ private void enterCrewChatRoom(final RegistrationStatus updateStatus, final Crew */ @Transactional public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); final Crew crew = crewMember.getCrew(); if (crew.isLeader(loggedInMemberId)) { diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 489dab96..5ed3946b 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -81,12 +81,12 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina .build(); crewLeader.confirmRegistration(); - crewMemberRepository.save(crewLeader); final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); crew.makeNewCrewChatRoom(chatRoom); final Long crewId = crewRepository.save(crew).getId(); + crewMemberRepository.save(crewLeader); return CrewIdResponse.from(crewId); } diff --git a/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java b/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java index b9d4b53d..2591f3ef 100644 --- a/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java +++ b/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java @@ -6,6 +6,7 @@ import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.IntegrationCrewTest; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.fixture.dto.CrewDtoFixtures; import kr.pickple.back.fixture.setup.AddressSetup; import kr.pickple.back.member.domain.Member; @@ -18,7 +19,7 @@ import java.util.List; -import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static org.springframework.http.HttpHeaders.AUTHORIZATION; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @@ -32,13 +33,16 @@ public class CrewControllerTest extends IntegrationCrewTest { @Autowired private AddressSetup addressSetup; + @Autowired + private CrewMemberRepository crewMemberRepository; + @Test @DisplayName("사용자는 해당 크루의 상세 정보를 조회할 수 있다.") void findCrewDetailsById_ReturnCrewResponse() throws Exception { //given final Crew crew = crewSetup.saveWithConfirmedMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) .getMember(); @@ -100,10 +104,10 @@ void applyForCrewMemberShip_Success() throws Exception { @DisplayName("크루장은 크루 모집글에 참여 신청한 사용자 정보 목록을 조회할 수 있다.") void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { //given - final Crew crew = crewSetup.saveWithConfirmedMembers(2); + final Crew crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .get(0) .getMember(); final String subject = String.valueOf(crewLeader.getId()); @@ -112,7 +116,7 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { //when final ResultActions resultActions = mockMvc.perform( get(BASE_URL + "/{crewId}/members", crew.getId()) - .param("status", CONFIRMED.getDescription()) + .param("status", WAITING.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -140,8 +144,7 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { .andExpect(jsonPath("leader.addressDepth2").value(crewLeader.getAddressDepth2().getName())) .andExpect(jsonPath("leader.positions[0]").value(crewLeader.getPositions().get(0).getAcronym())) .andExpect(jsonPath("leader.positions[1]").value(crewLeader.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("members[0].id").value(crewLeader.getId())) - .andExpect(jsonPath("members[1].id").value(crewMember.getId())) + .andExpect(jsonPath("members[0].id").value(crewMember.getId())) .andDo(print()); } @@ -151,8 +154,8 @@ void updateCrewMemberRegistrationStatus_Success() throws Exception { //given final Crew crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .get(0) .getMember(); final String subject = String.valueOf(crewLeader.getId()); @@ -180,8 +183,8 @@ void deleteCrewMember_CrewLeader_Success() throws Exception { //given final Crew crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .get(0) .getMember(); final String subject = String.valueOf(crewLeader.getId()); @@ -205,7 +208,7 @@ void findCrewsByAddress_Success() throws Exception { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) .getMember(); diff --git a/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java b/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java index 649cfbce..87f2bbd9 100644 --- a/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java +++ b/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java @@ -1,35 +1,39 @@ package kr.pickple.back.crew.docs; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; +import static com.epages.restdocs.apispec.ResourceDocumentation.*; +import static com.epages.restdocs.apispec.Schema.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static org.springframework.http.HttpHeaders.*; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.transaction.annotation.Transactional; + import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.epages.restdocs.apispec.SimpleType; + import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.crew.IntegrationCrewTest; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; -import kr.pickple.back.crew.IntegrationCrewTest; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.fixture.dto.CrewDtoFixtures; import kr.pickple.back.fixture.setup.AddressSetup; import kr.pickple.back.member.domain.Member; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.schema; -import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Transactional public class CrewDocumentTest extends IntegrationCrewTest { @@ -39,6 +43,9 @@ public class CrewDocumentTest extends IntegrationCrewTest { @Autowired private AddressSetup addressSetup; + @Autowired + private CrewMemberRepository crewMemberRepository; + @Test @DisplayName("크루원 모집글 상세 정보 조회") void findCrewById_ReturnCrewResponse() throws Exception { @@ -180,9 +187,6 @@ void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception //given final Crew crew = crewSetup.saveWithConfirmedMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) - .getMember(); final String subject = String.valueOf(crewLeader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -285,8 +289,8 @@ void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { //given final Crew crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .get(0) .getMember(); final String subject = String.valueOf(crewLeader.getId()); @@ -339,8 +343,8 @@ void deleteCrewMember_ReturnVoid() throws Exception { //given final Crew crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers() - .get(1) + final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .get(0) .getMember(); final String subject = String.valueOf(crewLeader.getId()); @@ -383,8 +387,6 @@ void findCrewsByAddress_ReturnCrews() throws Exception { final Crew crew = crewSetup.saveWithConfirmedMembers(2); final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crew.getCrewMembers().get(1).getMember(); //when final ResultActions resultActions = mockMvc.perform( diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java index a9f448de..22e6ec46 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java @@ -10,6 +10,7 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.member.domain.Member; public class CrewFixtures { @@ -31,6 +32,13 @@ public static Crew crewBuild( .build(); } + public static CrewMember crewMemberBuild(final Member member, final Crew crew) { + return CrewMember.builder() + .member(member) + .crew(crew) + .build(); + } + public static ChatRoom crewChatRoomBuild() { return ChatRoom.builder() .name("백둥크루1") diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index fca511e9..b22bc6a7 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -1,20 +1,22 @@ package kr.pickple.back.fixture.setup; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.fixture.domain.CrewFixtures; import kr.pickple.back.member.domain.Member; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; @Component public class CrewSetup { @@ -22,6 +24,9 @@ public class CrewSetup { @Autowired private CrewRepository crewRepository; + @Autowired + private CrewMemberRepository crewMemberRepository; + @Autowired private ChatRoomRepository chatRoomRepository; @@ -38,37 +43,36 @@ public Crew save(final Member leader) { final Crew crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); final ChatRoom savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); - crew.addCrewMember(leader); + final CrewMember crewLeader = CrewFixtures.crewMemberBuild(leader, crew); + crewLeader.confirmRegistration(); + leader.addMemberCrew(crewLeader); + savedChatRoom.updateMaxMemberCount(crew.getMaxMemberCount()); crew.makeNewCrewChatRoom(savedChatRoom); - final CrewMember crewLeader = crew.getCrewMembers().get(0); - leader.addMemberCrew(crewLeader); - crewLeader.updateStatus(CONFIRMED); + final Crew savedCrew = crewRepository.save(crew); + crewMemberRepository.save(crewLeader); - return crewRepository.save(crew); + return savedCrew; } public Crew saveWithWaitingMembers(final Integer memberCount) { final List members = memberSetup.save(memberCount); final Crew crew = save(members.get(0)); - final List crewMembers = members.subList(1, members.size()); - crewMembers.forEach(crew::addCrewMember); + members.subList(1, members.size()) + .stream() + .map(member -> CrewFixtures.crewMemberBuild(member, crew)) + .forEach(crewMemberRepository::save); return crew; } public Crew saveWithConfirmedMembers(final Integer memberCount) { final Crew crew = saveWithWaitingMembers(memberCount); - final Member crewLeader = crew.getLeader(); - final List crewMembers = crew.getCrewMembers(); - - crewMembers.forEach(crewMember -> { - if (!crewLeader.equals(crewMember.getMember())) { - crewMember.updateStatus(CONFIRMED); - } - }); + + crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + .forEach(waitingCrewMember -> waitingCrewMember.updateStatus(CONFIRMED)); return crew; } From 1d22e43218912e64817c82f6d5370a35d4b8b795 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 24 Jan 2024 16:24:27 +0900 Subject: [PATCH 003/117] =?UTF-8?q?refactor:=20MemberService=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20Repository=20default=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=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 --- .../back/crew/repository/CrewRepository.java | 2 +- .../back/game/repository/GameRepository.java | 7 ++ .../member/service_v2/MemberCrewService.java | 95 ++++++++++++++++ .../member/service_v2/MemberGameService.java | 102 ++++++++++++++++++ .../back/member/service_v2/MemberService.java | 96 +++++++++++++++++ 5 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java create mode 100644 src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java create mode 100644 src/main/java/kr/pickple/back/member/service_v2/MemberService.java diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 49a461b3..863dd31a 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -17,7 +17,7 @@ public interface CrewRepository extends JpaRepository { Boolean existsByName(final String name); - + Page findByAddressDepth1AndAddressDepth2( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index 5d4eed5f..09efe99f 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -1,5 +1,7 @@ package kr.pickple.back.game.repository; +import static kr.pickple.back.game.exception.GameExceptionCode.*; + import java.util.Optional; import org.springframework.data.domain.Page; @@ -11,6 +13,7 @@ import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; +import kr.pickple.back.game.exception.GameException; public interface GameRepository extends JpaRepository, GameSearchRepository { @@ -22,4 +25,8 @@ Page findByAddressDepth1AndAddressDepth2AndStatusNot( ); Optional findByChatRoom(final ChatRoom chatRoom); + + default Game getGameById(final Long gameId) { + return findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + } } diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java new file mode 100644 index 00000000..5defe87a --- /dev/null +++ b/src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java @@ -0,0 +1,95 @@ +package kr.pickple.back.member.service_v2; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; +import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberCrewService { + + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + + /** + * 사용자가 가입한 크루 목록 조회 + */ + public List findAllCrewsByMemberId( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = member.getCrewsByStatus(memberStatus); + + return convertToCrewProfileResponses(crews, memberStatus); + } + + /** + * 사용자가 만든 크루 목록 조회 + */ + public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = member.getCreatedCrews(); + + return convertToCrewProfileResponses(crews, CONFIRMED); + } + + /** + * 회원의 크루 가입 신청 여부 조회 + */ + public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( + final Long loggedInMemberId, + final Long memberId, + final Long crewId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final Crew crew = crewRepository.getCrewById(crewId); + + return CrewMemberRegistrationStatusResponse.from(member.findCrewRegistrationStatus(crew)); + } + + private List convertToCrewProfileResponses( + final List crews, + final RegistrationStatus memberStatus + ) { + return crews.stream() + .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .toList(); + } + + private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { + return crew.getMembersByStatus(memberStatus) + .stream() + .map(MemberResponse::from) + .toList(); + } + + private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } +} diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java b/src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java new file mode 100644 index 00000000..69d3bce0 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java @@ -0,0 +1,102 @@ +package kr.pickple.back.member.service_v2; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; +import kr.pickple.back.member.dto.response.MemberGameResponse; +import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberGameService { + + private final MemberRepository memberRepository; + private final GameRepository gameRepository; + + /** + * 사용자의 참여 확정 게스트 모집글 목록 조회 + */ + public List findAllMemberGames( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = member.getMemberGamesByStatus(memberStatus); + + return convertToMemberGameResponses(memberGames, memberStatus); + } + + /** + * 사용자가 만든 게스트 모집글 목록 조회 + */ + public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = member.getCreatedMemberGames(); + + return convertToMemberGameResponses(memberGames, CONFIRMED); + } + + /** + * 회원의 게스트 모집 신청 여부 조회 + */ + public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( + final Long loggedInMemberId, + final Long memberId, + final Long gameId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final Game game = gameRepository.getGameById(gameId); + + final RegistrationStatus memberRegistrationStatus = member.findGameRegistrationStatus(game); + final Boolean isReviewDone = member.isAlreadyReviewDoneInGame(game); + + return GameMemberRegistrationStatusResponse.of(memberRegistrationStatus, isReviewDone); + } + + private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } + + private List convertToMemberGameResponses( + final List memberGames, + final RegistrationStatus memberStatus + ) { + return memberGames.stream() + .map(memberGame -> MemberGameResponse.of( + memberGame, + getMemberResponsesByGame(memberGame.getGame(), memberStatus) + )) + .toList(); + } + + private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { + return game.getMembersByStatus(memberStatus) + .stream() + .map(MemberResponse::from) + .toList(); + } +} diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberService.java b/src/main/java/kr/pickple/back/member/service_v2/MemberService.java new file mode 100644 index 00000000..21aaaedf --- /dev/null +++ b/src/main/java/kr/pickple/back/member/service_v2/MemberService.java @@ -0,0 +1,96 @@ +package kr.pickple.back.member.service_v2; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.service.AddressService; +import kr.pickple.back.auth.config.property.JwtProperties; +import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.auth.domain.token.JwtProvider; +import kr.pickple.back.auth.domain.token.RefreshToken; +import kr.pickple.back.auth.repository.RedisRepository; +import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.dto.request.MemberCreateRequest; +import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; +import kr.pickple.back.member.dto.response.MemberProfileResponse; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberService { + + private static final String REFRESH_TOKEN_KEY = "refresh_token"; + + private final AddressService addressService; + private final MemberRepository memberRepository; + private final RedisRepository redisRepository; + private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; + + /** + * 사용자 회원가입 (카카오) + */ + @Transactional + public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { + validateIsDuplicatedMemberInfo(memberCreateRequest); + + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + memberCreateRequest.getAddressDepth1(), + memberCreateRequest.getAddressDepth2() + ); + + final Member member = memberCreateRequest.toEntity(mainAddressResponse); + final Member savedMember = memberRepository.save(member); + + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); + + final RefreshToken refreshToken = RefreshToken.builder() + .token(loginTokens.getRefreshToken()) + .memberId(savedMember.getId()) + .createdAt(LocalDateTime.now()) + .build(); + + redisRepository.saveHash( + REFRESH_TOKEN_KEY, + refreshToken.getToken(), + refreshToken, + jwtProperties.getRefreshTokenExpirationTime() + ); + + return AuthenticatedMemberResponse.of(savedMember, loginTokens); + } + + /** + * 사용자 프로필 조회 + */ + public MemberProfileResponse findMemberProfileById(final Long memberId) { + final Member member = memberRepository.getMemberById(memberId); + final List crewResponses = member.getCrewsByStatus(CONFIRMED) + .stream() + .map(CrewResponse::from) + .toList(); + + return MemberProfileResponse.of(member, crewResponses); + } + + private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { + final String email = memberCreateRequest.getEmail(); + final String nickname = memberCreateRequest.getNickname(); + final Long oauthId = memberCreateRequest.getOauthId(); + + if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { + throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); + } + } +} From 5acc46ef68f7e8857d827f05898d95159935b26e Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 24 Jan 2024 17:51:19 +0900 Subject: [PATCH 004/117] =?UTF-8?q?refactor:=20=EC=96=91=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=20=EC=97=B0=EA=B4=80=20=EA=B4=80=EA=B3=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/member/domain/Member.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/kr/pickple/back/member/domain/Member.java b/src/main/java/kr/pickple/back/member/domain/Member.java index a14e15e8..fa57dd74 100644 --- a/src/main/java/kr/pickple/back/member/domain/Member.java +++ b/src/main/java/kr/pickple/back/member/domain/Member.java @@ -7,7 +7,6 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; @@ -22,14 +21,8 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.util.MemberStatusConverter; -import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -92,7 +85,7 @@ public class Member extends BaseEntity { @JoinColumn(name = "address_depth2_id") private AddressDepth2 addressDepth2; - @Embedded +/* @Embedded private MemberPositions memberPositions = new MemberPositions(); @Embedded @@ -100,6 +93,7 @@ public class Member extends BaseEntity { @Embedded private MemberGames memberGames = new MemberGames(); +*/ @Builder private Member( @@ -110,8 +104,8 @@ private Member( final Long oauthId, final OauthProvider oauthProvider, final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, - final List positions + final AddressDepth2 addressDepth2 + /* , final List positions*/ ) { this.email = email; this.nickname = nickname; @@ -123,16 +117,29 @@ private Member( this.addressDepth2 = addressDepth2; setDefaultIntroduction(nickname); - updateMemberPositions(positions); + /* updateMemberPositions(positions);*/ + } + + private void setDefaultIntroduction(final String nickname) { + this.introduction = MessageFormat.format("안녕하세요. {0}입니다.", nickname); } + public void updateMannerScore(final Integer mannerScorePoint) { + if (MANNER_SCORE_POINT_RANGE.contains(mannerScorePoint)) { + this.mannerScore += mannerScorePoint; + this.mannerScoreCount += 1; + + return; + } + + throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); + } + + /* private void updateMemberPositions(final List positions) { memberPositions.updateMemberPositions(this, positions); } - private void setDefaultIntroduction(final String nickname) { - this.introduction = MessageFormat.format("안녕하세요. {0}입니다.", nickname); - } public RegistrationStatus findCrewRegistrationStatus(final Crew crew) { return memberCrews.findCrewRegistrationStatus(crew); @@ -170,16 +177,6 @@ public List getPositions() { return memberPositions.getPositions(); } - public void updateMannerScore(final Integer mannerScorePoint) { - if (MANNER_SCORE_POINT_RANGE.contains(mannerScorePoint)) { - this.mannerScore += mannerScorePoint; - this.mannerScoreCount += 1; - - return; - } - - throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); - } public void addMemberCrew(final CrewMember memberCrew) { memberCrews.addMemberCrew(memberCrew); @@ -188,4 +185,5 @@ public void addMemberCrew(final CrewMember memberCrew) { public void addMemberGame(final GameMember memberGame) { memberGames.addMemberGame(memberGame); } + */ } From fc776828ba8dd5d1d147cdaf1ba6bb72beb2b279 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 24 Jan 2024 17:51:58 +0900 Subject: [PATCH 005/117] =?UTF-8?q?refactor:=20Member=20=EC=96=91=EB=B0=A9?= =?UTF-8?q?=ED=96=A5=20=EC=97=B0=EA=B4=80=20=EA=B4=80=EA=B3=84=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=ED=9B=84=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=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 --- .../back/crew/dto/response/CrewResponse.java | 8 +++++++ .../crew/repository/CrewMemberRepository.java | 2 ++ .../dto/request/MemberCreateRequest.java | 11 +++++++++- .../dto/response/MemberProfileResponse.java | 15 +++++++++++-- .../repository/MemberPositionRepository.java | 12 ++++++++++ .../back/member/service_v2/MemberService.java | 22 ++++++++++++++++--- 6 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java index 2d01ee75..b363e4ab 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java @@ -1,5 +1,7 @@ package kr.pickple.back.crew.dto.response; +import java.util.List; + import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; @@ -44,4 +46,10 @@ public static CrewResponse from(final Crew crew) { .addressDepth2(crew.getAddressDepth2().getName()) .build(); } + + public static List from(final List crews) { + return crews.stream() + .map(CrewResponse::from) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 3bf9b6e4..0c8ad0d4 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -17,6 +17,8 @@ public interface CrewMemberRepository extends JpaRepository { List findAllByCrewIdAndStatus(final Long crewId, final RegistrationStatus status); + List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus status); + Boolean existsByCrewIdAndMemberId(final Long crewId, final Long memberId); Boolean existsByCrewIdAndMemberIdAndStatus(final Long crewId, final Long memberId, final RegistrationStatus status); diff --git a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java index 114e928d..dc2087c2 100644 --- a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java +++ b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java @@ -8,6 +8,7 @@ import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -57,7 +58,15 @@ public Member toEntity(final MainAddressResponse mainAddressResponse) { .oauthProvider(oauthProvider) .addressDepth1(mainAddressResponse.getAddressDepth1()) .addressDepth2(mainAddressResponse.getAddressDepth2()) - .positions(positions) .build(); } + + public List toMemberPositionEntities(final Member member) { + return positions.stream() + .map(position -> MemberPosition.builder() + .member(member) + .position(position) + .build() + ).toList(); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java index 038f721d..cae70740 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java @@ -4,6 +4,7 @@ import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -27,7 +28,11 @@ public class MemberProfileResponse { private List positions; private List crews; - public static MemberProfileResponse of(final Member member, final List crewResponses) { + public static MemberProfileResponse of( + final Member member, + final List crewResponses, + final List positions + ) { return MemberProfileResponse.builder() .id(member.getId()) .email(member.getEmail()) @@ -38,8 +43,14 @@ public static MemberProfileResponse of(final Member member, final List fromMemberPositionEntities(final List memberPositions) { + return memberPositions.stream() + .map(MemberPosition::getPosition) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java new file mode 100644 index 00000000..bf013976 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java @@ -0,0 +1,12 @@ +package kr.pickple.back.member.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import kr.pickple.back.member.domain.MemberPosition; + +public interface MemberPositionRepository extends JpaRepository { + + List findAllByMemberId(final Long memberId); +} diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberService.java b/src/main/java/kr/pickple/back/member/service_v2/MemberService.java index 21aaaedf..27538bce 100644 --- a/src/main/java/kr/pickple/back/member/service_v2/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service_v2/MemberService.java @@ -16,13 +16,19 @@ import kr.pickple.back.auth.domain.token.JwtProvider; import kr.pickple.back.auth.domain.token.RefreshToken; import kr.pickple.back.auth.repository.RedisRepository; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -34,6 +40,8 @@ public class MemberService { private final AddressService addressService; private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; + private final CrewMemberRepository crewMemberRepository; private final RedisRepository redisRepository; private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; @@ -53,6 +61,10 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member final Member member = memberCreateRequest.toEntity(mainAddressResponse); final Member savedMember = memberRepository.save(member); + final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); + + memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); final RefreshToken refreshToken = RefreshToken.builder() @@ -76,12 +88,16 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member */ public MemberProfileResponse findMemberProfileById(final Long memberId) { final Member member = memberRepository.getMemberById(memberId); - final List crewResponses = member.getCrewsByStatus(CONFIRMED) + final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); + final List positions = MemberProfileResponse.fromMemberPositionEntities(memberPositions); + + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) .stream() - .map(CrewResponse::from) + .map(CrewMember::getCrew) .toList(); - return MemberProfileResponse.of(member, crewResponses); + final List crewResponses = CrewResponse.from(crews); + return MemberProfileResponse.of(member, crewResponses, positions); } private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { From 0ffd58c6a18d8562182229ac92ad7760f8d8eeaa Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 31 Jan 2024 18:56:22 +0900 Subject: [PATCH 006/117] =?UTF-8?q?refactor:=20Member=EC=99=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EB=90=9C=20Embeddable=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20Member=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=20=EA=B4=80=EA=B3=84=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/member/domain/Member.java | 64 ---------- .../back/member/domain/MemberCrews.java | 51 -------- .../back/member/domain/MemberGames.java | 56 --------- .../back/member/service_v2/MemberService.java | 112 ------------------ 4 files changed, 283 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/member/domain/MemberCrews.java delete mode 100644 src/main/java/kr/pickple/back/member/domain/MemberGames.java delete mode 100644 src/main/java/kr/pickple/back/member/service_v2/MemberService.java diff --git a/src/main/java/kr/pickple/back/member/domain/Member.java b/src/main/java/kr/pickple/back/member/domain/Member.java index fa57dd74..89061335 100644 --- a/src/main/java/kr/pickple/back/member/domain/Member.java +++ b/src/main/java/kr/pickple/back/member/domain/Member.java @@ -85,16 +85,6 @@ public class Member extends BaseEntity { @JoinColumn(name = "address_depth2_id") private AddressDepth2 addressDepth2; -/* @Embedded - private MemberPositions memberPositions = new MemberPositions(); - - @Embedded - private MemberCrews memberCrews = new MemberCrews(); - - @Embedded - private MemberGames memberGames = new MemberGames(); -*/ - @Builder private Member( final String email, @@ -105,7 +95,6 @@ private Member( final OauthProvider oauthProvider, final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 - /* , final List positions*/ ) { this.email = email; this.nickname = nickname; @@ -117,7 +106,6 @@ private Member( this.addressDepth2 = addressDepth2; setDefaultIntroduction(nickname); - /* updateMemberPositions(positions);*/ } private void setDefaultIntroduction(final String nickname) { @@ -134,56 +122,4 @@ public void updateMannerScore(final Integer mannerScorePoint) { throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); } - - /* - private void updateMemberPositions(final List positions) { - memberPositions.updateMemberPositions(this, positions); - } - - - public RegistrationStatus findCrewRegistrationStatus(final Crew crew) { - return memberCrews.findCrewRegistrationStatus(crew); - } - - public RegistrationStatus findGameRegistrationStatus(final Game game) { - return memberGames.findGameRegistrationStatus(game); - } - - public Boolean isAlreadyReviewDoneInGame(final Game game) { - return memberGames.isAlreadyReviewDoneInGame(game); - } - - public List getCrewsByStatus(RegistrationStatus status) { - return memberCrews.getCrewsByStatus(status); - } - - public Long getCreatedCrewsCount() { - return memberCrews.getCreatedCrewsCountByMember(this); - } - - public List getMemberGamesByStatus(final RegistrationStatus status) { - return memberGames.getMemberGamesByStatus(status); - } - - public List getCreatedCrews() { - return memberCrews.getCreatedCrewsByMember(this); - } - - public List getCreatedMemberGames() { - return memberGames.getCreatedMemberGames(this); - } - - public List getPositions() { - return memberPositions.getPositions(); - } - - - public void addMemberCrew(final CrewMember memberCrew) { - memberCrews.addMemberCrew(memberCrew); - } - - public void addMemberGame(final GameMember memberGame) { - memberGames.addMemberGame(memberGame); - } - */ } diff --git a/src/main/java/kr/pickple/back/member/domain/MemberCrews.java b/src/main/java/kr/pickple/back/member/domain/MemberCrews.java deleted file mode 100644 index 39bcc4df..00000000 --- a/src/main/java/kr/pickple/back/member/domain/MemberCrews.java +++ /dev/null @@ -1,51 +0,0 @@ -package kr.pickple.back.member.domain; - -import java.util.ArrayList; -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; - -@Embeddable -public class MemberCrews { - - @OneToMany(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List memberCrews = new ArrayList<>(); - - public RegistrationStatus findCrewRegistrationStatus(final Crew crew) { - return memberCrews.stream() - .filter(memberCrew -> memberCrew.equalsCrew(crew)) - .findFirst() - .map(CrewMember::getStatus) - .orElse(RegistrationStatus.NONE); - } - - public List getCrewsByStatus(final RegistrationStatus status) { - return memberCrews.stream() - .filter(memberCrew -> memberCrew.equalsStatus(status)) - .map(CrewMember::getCrew) - .toList(); - } - - public List getCreatedCrewsByMember(final Member member) { - return memberCrews.stream() - .map(CrewMember::getCrew) - .filter(crew -> crew.isLeader(member)) - .toList(); - } - - public void addMemberCrew(final CrewMember memberCrew) { - memberCrews.add(memberCrew); - } - - public Long getCreatedCrewsCountByMember(final Member member) { - return memberCrews.stream() - .map(CrewMember::getCrew) - .filter(crew -> crew.isLeader(member)) - .count(); - } -} diff --git a/src/main/java/kr/pickple/back/member/domain/MemberGames.java b/src/main/java/kr/pickple/back/member/domain/MemberGames.java deleted file mode 100644 index 0ab5385c..00000000 --- a/src/main/java/kr/pickple/back/member/domain/MemberGames.java +++ /dev/null @@ -1,56 +0,0 @@ -package kr.pickple.back.member.domain; - -import static java.lang.Boolean.*; - -import java.util.ArrayList; -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; - -@Embeddable -public class MemberGames { - - @OneToMany(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List memberGames = new ArrayList<>(); - - public RegistrationStatus findGameRegistrationStatus(final Game game) { - return memberGames.stream() - .filter(memberGame -> memberGame.equalsGame(game)) - .findFirst() - .map(GameMember::getStatus) - .orElse(RegistrationStatus.NONE); - } - - public Boolean isAlreadyReviewDoneInGame(final Game game) { - return memberGames.stream() - .filter(memberGame -> memberGame.equalsGame(game)) - .findFirst() - .map(GameMember::isAlreadyReviewDone) - .orElse(FALSE); - } - - public List getMemberGamesByStatus(final RegistrationStatus status) { - return memberGames.stream() - .filter(memberGame -> memberGame.equalsStatus(status)) - .toList(); - } - - public List getCreatedMemberGames(final Member member) { - return memberGames.stream() - .filter(gameMember -> { - final Game game = gameMember.getGame(); - - return game.isHost(member); - }) - .toList(); - } - - public void addMemberGame(final GameMember memberGame) { - memberGames.add(memberGame); - } -} diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberService.java b/src/main/java/kr/pickple/back/member/service_v2/MemberService.java deleted file mode 100644 index 27538bce..00000000 --- a/src/main/java/kr/pickple/back/member/service_v2/MemberService.java +++ /dev/null @@ -1,112 +0,0 @@ -package kr.pickple.back.member.service_v2; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.time.LocalDateTime; -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import kr.pickple.back.address.dto.response.MainAddressResponse; -import kr.pickple.back.address.service.AddressService; -import kr.pickple.back.auth.config.property.JwtProperties; -import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.auth.domain.token.JwtProvider; -import kr.pickple.back.auth.domain.token.RefreshToken; -import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.request.MemberCreateRequest; -import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.MemberProfileResponse; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberService { - - private static final String REFRESH_TOKEN_KEY = "refresh_token"; - - private final AddressService addressService; - private final MemberRepository memberRepository; - private final MemberPositionRepository memberPositionRepository; - private final CrewMemberRepository crewMemberRepository; - private final RedisRepository redisRepository; - private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; - - /** - * 사용자 회원가입 (카카오) - */ - @Transactional - public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { - validateIsDuplicatedMemberInfo(memberCreateRequest); - - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( - memberCreateRequest.getAddressDepth1(), - memberCreateRequest.getAddressDepth2() - ); - - final Member member = memberCreateRequest.toEntity(mainAddressResponse); - final Member savedMember = memberRepository.save(member); - - final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); - - memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ - - final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); - - final RefreshToken refreshToken = RefreshToken.builder() - .token(loginTokens.getRefreshToken()) - .memberId(savedMember.getId()) - .createdAt(LocalDateTime.now()) - .build(); - - redisRepository.saveHash( - REFRESH_TOKEN_KEY, - refreshToken.getToken(), - refreshToken, - jwtProperties.getRefreshTokenExpirationTime() - ); - - return AuthenticatedMemberResponse.of(savedMember, loginTokens); - } - - /** - * 사용자 프로필 조회 - */ - public MemberProfileResponse findMemberProfileById(final Long memberId) { - final Member member = memberRepository.getMemberById(memberId); - final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); - final List positions = MemberProfileResponse.fromMemberPositionEntities(memberPositions); - - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) - .stream() - .map(CrewMember::getCrew) - .toList(); - - final List crewResponses = CrewResponse.from(crews); - return MemberProfileResponse.of(member, crewResponses, positions); - } - - private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { - final String email = memberCreateRequest.getEmail(); - final String nickname = memberCreateRequest.getNickname(); - final Long oauthId = memberCreateRequest.getOauthId(); - - if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { - throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); - } - } -} From 9e8d445de9a638a12f357be20150c94e8d893c60 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 31 Jan 2024 18:58:28 +0900 Subject: [PATCH 007/117] =?UTF-8?q?refactor:=20Member=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=20=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0=20=ED=9B=84=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EB=90=98=EB=8A=94=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/CrewProfileResponse.java | 8 +- .../back/crew/dto/response/CrewResponse.java | 12 +- .../back/crew/repository/CrewRepository.java | 5 + .../back/game/dto/response/GameResponse.java | 8 +- .../game/repository/GameMemberRepository.java | 5 + .../repository/GamePositionRepository.java | 9 + .../member/controller/MemberController.java | 17 +- .../dto/response/MemberGameResponse.java | 8 +- .../dto/response/MemberProfileResponse.java | 7 - .../member/dto/response/MemberResponse.java | 4 +- .../MemberCrewService.java | 48 ++++- .../MemberGameService.java | 44 +++-- .../back/member/service/MemberService.java | 177 ++++-------------- .../back/position/domain/Position.java | 8 + 14 files changed, 167 insertions(+), 193 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java rename src/main/java/kr/pickple/back/member/{service_v2 => service}/MemberCrewService.java (58%) rename src/main/java/kr/pickple/back/member/{service_v2 => service}/MemberGameService.java (63%) diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index 96eb7ab3..13943274 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -27,7 +27,11 @@ public class CrewProfileResponse { private String addressDepth2; private List members; - public static CrewProfileResponse of(final Crew crew, final List memberResponses) { + public static CrewProfileResponse of( + final Crew crew, + final MemberResponse leader, + final List memberResponses + ) { return CrewProfileResponse.builder() .id(crew.getId()) .name(crew.getName()) @@ -39,7 +43,7 @@ public static CrewProfileResponse of(final Crew crew, final List .status(crew.getStatus()) .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) - .leader(MemberResponse.from(crew.getLeader())) + .leader(leader) .addressDepth1(crew.getAddressDepth1().getName()) .addressDepth2(crew.getAddressDepth2().getName()) .members(memberResponses) diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java index b363e4ab..8700b9a9 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java @@ -1,7 +1,5 @@ package kr.pickple.back.crew.dto.response; -import java.util.List; - import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; @@ -29,7 +27,7 @@ public class CrewResponse { private String addressDepth1; private String addressDepth2; - public static CrewResponse from(final Crew crew) { + public static CrewResponse from(final Crew crew, final MemberResponse leader) { return CrewResponse.builder() .id(crew.getId()) .name(crew.getName()) @@ -41,15 +39,9 @@ public static CrewResponse from(final Crew crew) { .status(crew.getStatus()) .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) - .leader(MemberResponse.from(crew.getLeader())) + .leader(leader) .addressDepth1(crew.getAddressDepth1().getName()) .addressDepth2(crew.getAddressDepth2().getName()) .build(); } - - public static List from(final List crews) { - return crews.stream() - .map(CrewResponse::from) - .toList(); - } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 863dd31a..b92118fa 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -2,11 +2,13 @@ import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; @@ -26,6 +28,9 @@ Page findByAddressDepth1AndAddressDepth2( Optional findByChatRoom(final ChatRoom chatRoom); + @Query("select c from Crew c left join CrewMember cm on c.leader.id = cm.member.id where cm.member.id = :id") + List findCreatedAllByMemberId(final Long id); + default Crew getCrewById(final Long crewId) { return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); } diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index dcf37463..13ea40a5 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -39,7 +39,11 @@ public class GameResponse { private List positions; private List members; - public static GameResponse of(final Game game, final List memberResponses) { + public static GameResponse of( + final Game game, + final MemberResponse host, + final List memberResponses + ) { return GameResponse.builder() .id(game.getId()) .content(game.getContent()) @@ -56,7 +60,7 @@ public static GameResponse of(final Game game, final List member .cost(game.getCost()) .memberCount(game.getMemberCount()) .maxMemberCount(game.getMaxMemberCount()) - .host(MemberResponse.from(game.getHost())) + .host(host) .addressDepth1(game.getAddressDepth1().getName()) .addressDepth2(game.getAddressDepth2().getName()) .positions(game.getPositions()) diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 42fd5c65..e0e38502 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -1,5 +1,6 @@ package kr.pickple.back.game.repository; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -16,4 +17,8 @@ Optional findByMemberIdAndGameIdAndStatus( final Long gameId, final RegistrationStatus status ); + + List findAllByMemberIdAndStatus(final Long id, final RegistrationStatus memberStatus); + + List findAllByMemberId(final Long id); } diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java new file mode 100644 index 00000000..da7a6b18 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java @@ -0,0 +1,9 @@ +package kr.pickple.back.game.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import kr.pickple.back.game.domain.GamePosition; + +public interface GamePositionRepository extends JpaRepository { + +} diff --git a/src/main/java/kr/pickple/back/member/controller/MemberController.java b/src/main/java/kr/pickple/back/member/controller/MemberController.java index ae0ebc8f..76c22e4e 100644 --- a/src/main/java/kr/pickple/back/member/controller/MemberController.java +++ b/src/main/java/kr/pickple/back/member/controller/MemberController.java @@ -30,6 +30,8 @@ import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.service.MemberCrewService; +import kr.pickple.back.member.service.MemberGameService; import kr.pickple.back.member.service.MemberService; import lombok.RequiredArgsConstructor; @@ -39,6 +41,8 @@ public class MemberController { private final MemberService memberService; + private final MemberCrewService memberCrewService; + private final MemberGameService memberGameService; private final JwtProperties jwtProperties; @PostMapping @@ -86,7 +90,7 @@ public ResponseEntity> findAllCrewsByMemberId( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberService.findAllCrewsByMemberId(loggedInMemberId, memberId, status)); + .body(memberCrewService.findAllCrewsByMemberId(loggedInMemberId, memberId, status)); } @GetMapping("/{memberId}/created-crews") @@ -95,7 +99,7 @@ public ResponseEntity> findCreatedCrewsByMemberId( @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberService.findCreatedCrewsByMemberId(loggedInMemberId, memberId)); + .body(memberCrewService.findCreatedCrewsByMemberId(loggedInMemberId, memberId)); } @GetMapping("/{memberId}/games") @@ -105,7 +109,7 @@ public ResponseEntity> findAllMemberGames( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberService.findAllMemberGames(loggedInMemberId, memberId, status)); + .body(memberGameService.findAllMemberGames(loggedInMemberId, memberId, status)); } @GetMapping("/{memberId}/created-games") @@ -114,7 +118,7 @@ public ResponseEntity> findAllCreatedGames( @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberService.findAllCreatedGames(loggedInMemberId, memberId)); + .body(memberGameService.findAllCreatedGames(loggedInMemberId, memberId)); } @GetMapping("/{memberId}/games/{gameId}/registration-status") @@ -124,7 +128,7 @@ public ResponseEntity findMemberRegistrati @PathVariable final Long gameId ) { return ResponseEntity.status(OK) - .body(memberService.findMemberRegistrationStatusForGame(loggedInMemberId, memberId, gameId)); + .body(memberGameService.findMemberRegistrationStatusForGame(loggedInMemberId, memberId, gameId)); } @GetMapping("/{memberId}/crews/{crewId}/registration-status") @@ -134,7 +138,6 @@ public ResponseEntity findMemberRegistrati @PathVariable final Long crewId ) { return ResponseEntity.status(OK) - .body(memberService.findMemberRegistrationStatusForCrew(loggedInMemberId, memberId, crewId)); + .body(memberCrewService.findMemberRegistrationStatusForCrew(loggedInMemberId, memberId, crewId)); } - } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index f2eafd70..f64ac8d4 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -40,7 +40,11 @@ public class MemberGameResponse { private List positions; private List members; - public static MemberGameResponse of(final GameMember gameMember, final List memberResponses) { + public static MemberGameResponse of( + final GameMember gameMember, + final List memberResponses, + final MemberResponse host + ) { final Game game = gameMember.getGame(); return MemberGameResponse.builder() @@ -60,7 +64,7 @@ public static MemberGameResponse of(final GameMember gameMember, final List fromMemberPositionEntities(final List memberPositions) { - return memberPositions.stream() - .map(MemberPosition::getPosition) - .toList(); - } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index 841e8c77..49cbafce 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -25,7 +25,7 @@ public class MemberResponse { private String addressDepth2; private List positions; - public static MemberResponse from(final Member member) { + public static MemberResponse of(final Member member, final List positions) { return MemberResponse.builder() .id(member.getId()) .email(member.getEmail()) @@ -36,7 +36,7 @@ public static MemberResponse from(final Member member) { .mannerScoreCount(member.getMannerScoreCount()) .addressDepth1(member.getAddressDepth1().getName()) .addressDepth2(member.getAddressDepth2().getName()) - .positions(member.getPositions()) + .positions(positions) .build(); } } diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java similarity index 58% rename from src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java rename to src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 5defe87a..14ef51ab 100644 --- a/src/main/java/kr/pickple/back/member/service_v2/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -1,6 +1,7 @@ -package kr.pickple.back.member.service_v2; +package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -10,13 +11,19 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -25,7 +32,9 @@ public class MemberCrewService { private final MemberRepository memberRepository; + private final CrewMemberRepository crewMemberRepository; private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; /** * 사용자가 가입한 크루 목록 조회 @@ -38,7 +47,10 @@ public List findAllCrewsByMemberId( validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberRepository.getMemberById(memberId); - final List crews = member.getCrewsByStatus(memberStatus); + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) + .stream() + .map(CrewMember::getCrew) + .toList(); return convertToCrewProfileResponses(crews, memberStatus); } @@ -50,7 +62,7 @@ public List findCreatedCrewsByMemberId(final Long loggedInM validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberRepository.getMemberById(memberId); - final List crews = member.getCreatedCrews(); + final List crews = crewRepository.findCreatedAllByMemberId(member.getId()); return convertToCrewProfileResponses(crews, CONFIRMED); } @@ -65,10 +77,10 @@ public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); - final Crew crew = crewRepository.getCrewById(crewId); + final CrewMember crewMember = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) + .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - return CrewMemberRegistrationStatusResponse.from(member.findCrewRegistrationStatus(crew)); + return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); } private List convertToCrewProfileResponses( @@ -76,18 +88,36 @@ private List convertToCrewProfileResponses( final RegistrationStatus memberStatus ) { return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .map(crew -> CrewProfileResponse.of( + crew, + getLeaderResponse(crew), + getMemberResponsesByCrew(crew, memberStatus) + ) + ) .toList(); } + private MemberResponse getLeaderResponse(final Crew crew) { + final Member leader = crew.getLeader(); + + return MemberResponse.of(leader, getPositions(leader)); + } + private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { return crew.getMembersByStatus(memberStatus) .stream() - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); } - private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } + + private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { if (!loggedInMemberId.equals(memberId)) { throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); } diff --git a/src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java similarity index 63% rename from src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java rename to src/main/java/kr/pickple/back/member/service/MemberGameService.java index 69d3bce0..0c7285db 100644 --- a/src/main/java/kr/pickple/back/member/service_v2/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -1,4 +1,4 @@ -package kr.pickple.back.member.service_v2; +package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; @@ -11,13 +11,17 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -27,6 +31,8 @@ public class MemberGameService { private final MemberRepository memberRepository; private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; + private final MemberPositionRepository memberPositionRepository; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 @@ -39,7 +45,8 @@ public List findAllMemberGames( validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberRepository.getMemberById(memberId); - final List memberGames = member.getMemberGamesByStatus(memberStatus); + final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), + memberStatus); return convertToMemberGameResponses(memberGames, memberStatus); } @@ -51,7 +58,7 @@ public List findAllCreatedGames(final Long loggedInMemberId, validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberRepository.getMemberById(memberId); - final List memberGames = member.getCreatedMemberGames(); + final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); return convertToMemberGameResponses(memberGames, CONFIRMED); } @@ -69,10 +76,10 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( final Member member = memberRepository.getMemberById(memberId); final Game game = gameRepository.getGameById(gameId); - final RegistrationStatus memberRegistrationStatus = member.findGameRegistrationStatus(game); - final Boolean isReviewDone = member.isAlreadyReviewDoneInGame(game); + final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); - return GameMemberRegistrationStatusResponse.of(memberRegistrationStatus, isReviewDone); + return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); } private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { @@ -86,17 +93,32 @@ private List convertToMemberGameResponses( final RegistrationStatus memberStatus ) { return memberGames.stream() - .map(memberGame -> MemberGameResponse.of( - memberGame, - getMemberResponsesByGame(memberGame.getGame(), memberStatus) - )) + .map(memberGame -> + MemberGameResponse.of( + memberGame, + getMemberResponsesByGame(memberGame.getGame(), memberStatus), + getHostResponseByMemberGame(memberGame)) + ) .toList(); } + private MemberResponse getHostResponseByMemberGame(final GameMember memberGame) { + final Member host = memberGame.getMember(); + + return MemberResponse.of(host, getPositions(host)); + } + private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { return game.getMembersByStatus(memberStatus) .stream() - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 1c7cd477..d538b363 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -1,7 +1,6 @@ package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.game.exception.GameExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.time.LocalDateTime; @@ -17,27 +16,20 @@ import kr.pickple.back.auth.domain.token.JwtProvider; import kr.pickple.back.auth.domain.token.RefreshToken; import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; -import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -48,14 +40,16 @@ public class MemberService { private static final String REFRESH_TOKEN_KEY = "refresh_token"; private final MemberRepository memberRepository; - private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; - private final GameRepository gameRepository; + private final MemberPositionRepository memberPositionRepository; private final RedisRepository redisRepository; private final AddressService addressService; private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; + /** + * 사용자 회원가입 (카카오) + */ @Transactional public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { validateIsDuplicatedMemberInfo(memberCreateRequest); @@ -68,6 +62,10 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member final Member member = memberCreateRequest.toEntity(mainAddressResponse); final Member savedMember = memberRepository.save(member); + final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); + + memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); final RefreshToken refreshToken = RefreshToken.builder() @@ -86,148 +84,45 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member return AuthenticatedMemberResponse.of(savedMember, loginTokens); } - private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { - final String email = memberCreateRequest.getEmail(); - final String nickname = memberCreateRequest.getNickname(); - final Long oauthId = memberCreateRequest.getOauthId(); - - if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { - throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); - } - } - + /** + * 사용자 프로필 조회 + */ public MemberProfileResponse findMemberProfileById(final Long memberId) { - final Member member = findMemberById(memberId); - final List crewResponses = member.getCrewsByStatus(CONFIRMED) - .stream() - .map(CrewResponse::from) - .toList(); + final Member member = memberRepository.getMemberById(memberId); + final List positions = getPositions(member); - return MemberProfileResponse.of(member, crewResponses); - } - - public List findAllCrewsByMemberId( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = findMemberById(memberId); - final List crews = member.getCrewsByStatus(memberStatus); - - return convertToCrewProfileResponses(crews, memberStatus); - } - - public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = findMemberById(memberId); - final List crews = member.getCreatedCrews(); - - return convertToCrewProfileResponses(crews, CONFIRMED); - } - - private List convertToCrewProfileResponses( - final List crews, - final RegistrationStatus memberStatus - ) { - return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew.getId(), memberStatus))) - .toList(); - } - - private List getMemberResponsesByCrew(final Long crewId, final RegistrationStatus memberStatus) { - return crewMemberRepository.findAllByCrewIdAndStatus(crewId, memberStatus) + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) .stream() - .map(CrewMember::getMember) - .map(MemberResponse::from) + .map(CrewMember::getCrew) .toList(); - } - public List findAllMemberGames( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = findMemberById(memberId); - final List memberGames = member.getMemberGamesByStatus(memberStatus); - - return convertToMemberGameResponses(memberGames, memberStatus); - } - - public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = findMemberById(memberId); - final List memberGames = member.getCreatedMemberGames(); - - return convertToMemberGameResponses(memberGames, CONFIRMED); - } - - private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } - - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - - private Game findGameById(final Long gameId) { - return gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - } - - private List convertToMemberGameResponses( - final List memberGames, - final RegistrationStatus memberStatus - ) { - return memberGames.stream() - .map(memberGame -> MemberGameResponse.of( - memberGame, - getMemberResponsesByGame(memberGame.getGame(), memberStatus) - )) + final List crewResponses = crews.stream() + .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) .toList(); - } - private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { - return game.getMembersByStatus(memberStatus) - .stream() - .map(MemberResponse::from) - .toList(); + return MemberProfileResponse.of(member, crewResponses, positions); } - public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( - final Long loggedInMemberId, - final Long memberId, - final Long gameId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); + private MemberResponse getLeaderResponse(final Crew crew) { + final Member member = crew.getLeader(); - final Member member = findMemberById(memberId); - final Game game = findGameById(gameId); + return MemberResponse.of(member, getPositions(member)); + } - final RegistrationStatus memberRegistrationStatus = member.findGameRegistrationStatus(game); - final Boolean isReviewDone = member.isAlreadyReviewDoneInGame(game); + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); - return GameMemberRegistrationStatusResponse.of(memberRegistrationStatus, isReviewDone); + return Position.from(memberPositions); } - public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( - final Long loggedInMemberId, - final Long memberId, - final Long crewId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = findMemberById(memberId); - final Crew crew = crewRepository.getCrewById(crewId); + private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { + final String email = memberCreateRequest.getEmail(); + final String nickname = memberCreateRequest.getNickname(); + final Long oauthId = memberCreateRequest.getOauthId(); - return CrewMemberRegistrationStatusResponse.from(member.findCrewRegistrationStatus(crew)); + if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { + throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); + } } } diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index c9375cf9..fe7cef76 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -3,6 +3,7 @@ import static kr.pickple.back.position.exception.PositionExceptionCode.*; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -11,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.exception.PositionException; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -45,4 +47,10 @@ public static Position from(final String positionAcronym) { throw new PositionException(POSITION_NOT_FOUND, positionAcronym); } + + public static List from(final List memberPositions) { + return memberPositions.stream() + .map(MemberPosition::getPosition) + .toList(); + } } From 3cf5780b5918e68e9deca4176f31a9b3fc83faea Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 31 Jan 2024 18:58:43 +0900 Subject: [PATCH 008/117] =?UTF-8?q?refactor:=20Member=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=20=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0=20=ED=9B=84=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=EB=90=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=97=90=EB=9F=AC=20=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/service/MemberCrewServiceTest.java | 97 +++++++++++++++++++ .../member/service/MemberServiceTest.java | 58 ----------- 2 files changed, 97 insertions(+), 58 deletions(-) create mode 100644 src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java diff --git a/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java new file mode 100644 index 00000000..70fb273f --- /dev/null +++ b/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java @@ -0,0 +1,97 @@ +package kr.pickple.back.member.service; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; + +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import kr.pickple.back.address.domain.AddressDepth1; +import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.fixture.domain.MemberFixtures; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; + +public class MemberCrewServiceTest { + + @InjectMocks + private MemberCrewService memberCrewService; + + @Mock + private MemberRepository memberRepository; + + @Test + @DisplayName("회원이 가입한 크루 목록을 조회할 수 있다.") + void findAllCrewsByMemberId_ReturnCrewProfileResponses() { + // given + final Long memberId = 1L; + final Long loggedInMemberId = 1L; + final Member member = buildMember(); + given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); + + // when + final List crewProfileResponses = memberCrewService.findAllCrewsByMemberId(memberId, + loggedInMemberId, CONFIRMED); + + // then + assertThat(crewProfileResponses).isNotNull(); + } + + @Test + @DisplayName("회원이 만든 크루 목록을 조회할 수 있다.") + void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() { + // given + final Long memberId = 1L; + final Long loggedInMemberId = 1L; + final Member member = buildMember(); + + given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); + + // when + final List crewProfileResponses = memberCrewService.findCreatedCrewsByMemberId( + loggedInMemberId, + memberId + ); + + // then + assertThat(crewProfileResponses).isNotNull(); + } + + @Test + @DisplayName("회원이 만든 크루 목록을 조회할 때 본인이 만든 크루가 아닌 경우 예외가 발생한다.") + void findCreatedCrewsByMemberId_ThrowException() { + // given + final Long memberId = 1L; + final Long loggedInMemberId = 2L; + final Member member = buildMember(); + + // when && then + assertThatThrownBy(() -> memberCrewService.findCreatedCrewsByMemberId( + loggedInMemberId, + memberId + )).isInstanceOf(MemberException.class) + .hasMessage(MEMBER_MISMATCH.getMessage()); + } + + private Member buildMember() { + final AddressDepth1 addressDepth1 = AddressDepth1.builder() + .name("서울시") + .build(); + final AddressDepth2 addressDepth2 = AddressDepth2.builder() + .name("영등포구") + .addressDepth1(addressDepth1) + .build(); + + return MemberFixtures.memberBuild(addressDepth1, addressDepth2); + } +} diff --git a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java index 7185b45a..fccdb6c5 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java +++ b/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java @@ -1,11 +1,8 @@ package kr.pickple.back.member.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.BDDMockito.*; -import java.util.List; import java.util.Optional; import org.junit.jupiter.api.DisplayName; @@ -25,14 +22,12 @@ import kr.pickple.back.auth.domain.token.JwtProvider; import kr.pickple.back.auth.domain.token.RefreshToken; import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; @ExtendWith(MockitoExtension.class) @@ -108,59 +103,6 @@ void findMemberById_ReturnMemberProfileResponse() { assertThat(memberProfileResponse).isNotNull(); } - @Test - @DisplayName("회원이 가입한 크루 목록을 조회할 수 있다.") - void findAllCrewsByMemberId_ReturnCrewProfileResponses() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 1L; - final Member member = buildMember(); - given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); - - // when - final List crewProfileResponses = memberService.findAllCrewsByMemberId(memberId, - loggedInMemberId, CONFIRMED); - - // then - assertThat(crewProfileResponses).isNotNull(); - } - - @Test - @DisplayName("회원이 만든 크루 목록을 조회할 수 있다.") - void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 1L; - final Member member = buildMember(); - - given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); - - // when - final List crewProfileResponses = memberService.findCreatedCrewsByMemberId( - loggedInMemberId, - memberId - ); - - // then - assertThat(crewProfileResponses).isNotNull(); - } - - @Test - @DisplayName("회원이 만든 크루 목록을 조회할 때 본인이 만든 크루가 아닌 경우 예외가 발생한다.") - void findCreatedCrewsByMemberId_ThrowException() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 2L; - final Member member = buildMember(); - - // when && then - assertThatThrownBy(() -> memberService.findCreatedCrewsByMemberId( - loggedInMemberId, - memberId - )).isInstanceOf(MemberException.class) - .hasMessage(MEMBER_MISMATCH.getMessage()); - } - private Member buildMember() { final AddressDepth1 addressDepth1 = AddressDepth1.builder() .name("서울시") From 4ef9ba6a690ccd6ee865c8d76c77b939fde699c3 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Fri, 2 Feb 2024 15:11:45 +0900 Subject: [PATCH 009/117] =?UTF-8?q?refactor:=20rebase=20=ED=9B=84=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/CrewProfileResponse.java | 10 +++++++-- .../back/crew/repository/CrewRepository.java | 8 +++---- .../back/crew/service/CrewMemberService.java | 13 +++++++++++- .../back/crew/service/CrewService.java | 15 +++++++++++-- .../back/game/dto/response/GameResponse.java | 10 +++++++-- .../back/game/service/GameService.java | 15 +++++++++++-- .../member/service/MemberCrewService.java | 21 ++++++------------- 7 files changed, 64 insertions(+), 28 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index 13943274..4ec539df 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -29,7 +29,6 @@ public class CrewProfileResponse { public static CrewProfileResponse of( final Crew crew, - final MemberResponse leader, final List memberResponses ) { return CrewProfileResponse.builder() @@ -43,10 +42,17 @@ public static CrewProfileResponse of( .status(crew.getStatus()) .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) - .leader(leader) + .leader(getLeaderResponse(memberResponses, crew.getLeader().getId())) .addressDepth1(crew.getAddressDepth1().getName()) .addressDepth2(crew.getAddressDepth2().getName()) .members(memberResponses) .build(); } + + private static MemberResponse getLeaderResponse(final List memberResponses, final Long leaderId) { + return memberResponses.stream() + .filter(memberResponse -> memberResponse.getId().equals(leaderId)) + .findFirst() + .orElseThrow(); + } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index b92118fa..2e364a7a 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -8,7 +8,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; @@ -19,7 +18,7 @@ public interface CrewRepository extends JpaRepository { Boolean existsByName(final String name); - + Page findByAddressDepth1AndAddressDepth2( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, @@ -28,8 +27,9 @@ Page findByAddressDepth1AndAddressDepth2( Optional findByChatRoom(final ChatRoom chatRoom); - @Query("select c from Crew c left join CrewMember cm on c.leader.id = cm.member.id where cm.member.id = :id") - List findCreatedAllByMemberId(final Long id); + List findAllByLeaderId(final Long leaderId); + + Integer countByLeaderId(final Long leaderId); default Crew getCrewById(final Long crewId) { return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 247b0310..da6ebd64 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -22,8 +22,11 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -33,6 +36,7 @@ public class CrewMemberService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; private final CrewMemberRepository crewMemberRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; @@ -81,12 +85,19 @@ public CrewProfileResponse findAllCrewMembers( final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) .stream() .map(CrewMember::getMember) - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); return CrewProfileResponse.of(crew, memberResponses); } + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } + /** * 크루 가입 신청 수락 */ diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 5ed3946b..1107af7e 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -27,8 +27,11 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -43,6 +46,7 @@ public class CrewService { private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; + private final MemberPositionRepository memberPositionRepository; private final AddressService addressService; private final ChatRoomService chatRoomService; private final S3Properties s3Properties; @@ -98,7 +102,7 @@ private void validateIsDuplicatedCrewInfo(final String name) { } private void validateMemberCreatedCrewsCount(final Member leader) { - final Long createdCrewsCount = leader.getCreatedCrewsCount(); + final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); @@ -140,7 +144,14 @@ private List getConfirmedMemberResponses(final Long crewId) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) .stream() .map(CrewMember::getMember) - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index 13ea40a5..929ab9b8 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -41,7 +41,6 @@ public class GameResponse { public static GameResponse of( final Game game, - final MemberResponse host, final List memberResponses ) { return GameResponse.builder() @@ -60,11 +59,18 @@ public static GameResponse of( .cost(game.getCost()) .memberCount(game.getMemberCount()) .maxMemberCount(game.getMaxMemberCount()) - .host(host) + .host(getHostResponse(memberResponses, game.getHost().getId())) .addressDepth1(game.getAddressDepth1().getName()) .addressDepth2(game.getAddressDepth2().getName()) .positions(game.getPositions()) .members(memberResponses) .build(); } + + private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { + return memberResponses.stream() + .filter(memberResponse -> memberResponse.getId().equals(hostId)) + .findFirst() + .orElseThrow(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 66eca51b..622edb8e 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -46,9 +46,12 @@ import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -60,6 +63,7 @@ public class GameService { private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; + private final MemberPositionRepository memberPositionRepository; private final MemberRepository memberRepository; private final KakaoAddressSearchClient kakaoAddressSearchClient; private final AddressService addressService; @@ -146,7 +150,7 @@ public GameResponse findGameDetailsById(final Long gameId) { final Game game = findGameById(gameId); final List memberResponses = game.getMembersByStatus(CONFIRMED) .stream() - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); game.increaseViewCount(); @@ -228,7 +232,7 @@ private List findGamesByAddress(final String address, final Pageab private List getMemberResponses(final Game game, final RegistrationStatus status) { return game.getMembersByStatus(status) .stream() - .map(MemberResponse::from) + .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); } @@ -416,4 +420,11 @@ public List findGamesWithInAddress(final MainAddressResponse mainA .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) .toList(); } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 14ef51ab..6fd43308 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -62,7 +62,7 @@ public List findCreatedCrewsByMemberId(final Long loggedInM validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberRepository.getMemberById(memberId); - final List crews = crewRepository.findCreatedAllByMemberId(member.getId()); + final List crews = crewRepository.findAllByLeaderId(member.getId()); return convertToCrewProfileResponses(crews, CONFIRMED); } @@ -87,25 +87,16 @@ private List convertToCrewProfileResponses( final List crews, final RegistrationStatus memberStatus ) { + return crews.stream() - .map(crew -> CrewProfileResponse.of( - crew, - getLeaderResponse(crew), - getMemberResponsesByCrew(crew, memberStatus) - ) - ) + .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) .toList(); } - - private MemberResponse getLeaderResponse(final Crew crew) { - final Member leader = crew.getLeader(); - - return MemberResponse.of(leader, getPositions(leader)); - } - + private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { - return crew.getMembersByStatus(memberStatus) + return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() + .map(CrewMember::getMember) .map(member -> MemberResponse.of(member, getPositions(member))) .toList(); } From d5c9a6f7b5d6acd84d6cec07745a5668490a68bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Fri, 2 Feb 2024 00:18:54 +0900 Subject: [PATCH 010/117] =?UTF-8?q?refactor:=20GameService=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/controller/GameController.java | 14 +- .../back/game/service/GameMemberService.java | 180 ++++++ .../GameReviewMannerScoresService.java | 91 +++ .../back/game/service/GameService.java | 547 ++++++------------ 4 files changed, 459 insertions(+), 373 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/service/GameMemberService.java create mode 100644 src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java diff --git a/src/main/java/kr/pickple/back/game/controller/GameController.java b/src/main/java/kr/pickple/back/game/controller/GameController.java index 88789386..b0932726 100644 --- a/src/main/java/kr/pickple/back/game/controller/GameController.java +++ b/src/main/java/kr/pickple/back/game/controller/GameController.java @@ -28,6 +28,8 @@ import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; import kr.pickple.back.game.service.GameFacadeService; +import kr.pickple.back.game.service.GameMemberService; +import kr.pickple.back.game.service.GameReviewMannerScoresService; import kr.pickple.back.game.service.GameService; import lombok.RequiredArgsConstructor; @@ -37,6 +39,8 @@ public class GameController { private final GameService gameService; + private final GameMemberService gameMemberService; + private final GameReviewMannerScoresService gameReviewMannerScoresService; private final GameFacadeService gameFacadeService; @PostMapping @@ -71,7 +75,7 @@ public ResponseEntity registerGameMember( @Login final Long loggedInMemberId, @PathVariable final Long gameId ) { - gameService.registerGameMember(gameId, loggedInMemberId); + gameMemberService.registerGameMember(gameId, loggedInMemberId); return ResponseEntity.status(NO_CONTENT) .build(); @@ -84,7 +88,7 @@ public ResponseEntity findAllGameMembers( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(gameService.findAllGameMembers(loggedInMemberId, gameId, status)); + .body(gameMemberService.findAllGameMembers(loggedInMemberId, gameId, status)); } @PatchMapping("/{gameId}/members/{memberId}") @@ -94,7 +98,7 @@ public ResponseEntity updateGameMemberRegistrationStatus( @PathVariable final Long memberId, @Valid @RequestBody final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest ) { - gameService.updateGameMemberRegistrationStatus( + gameMemberService.updateGameMemberRegistrationStatus( loggedInMemberId, gameId, memberId, @@ -111,7 +115,7 @@ public ResponseEntity deleteGameMember( @PathVariable final Long gameId, @PathVariable final Long memberId ) { - gameService.deleteGameMember(loggedInMemberId, gameId, memberId); + gameMemberService.deleteGameMember(loggedInMemberId, gameId, memberId); return ResponseEntity.status(NO_CONTENT) .build(); @@ -124,7 +128,7 @@ public ResponseEntity reviewMannerScores( @Valid @RequestBody final MannerScoreReviewsRequest mannerScoreReviewsRequest ) { final List mannerScoreReviews = mannerScoreReviewsRequest.getMannerScoreReviews(); - gameService.reviewMannerScores(loggedInMemberId, gameId, mannerScoreReviews); + gameReviewMannerScoresService.reviewMannerScores(loggedInMemberId, gameId, mannerScoreReviews); return ResponseEntity.status(NO_CONTENT) .build(); diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java new file mode 100644 index 00000000..a903ad73 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -0,0 +1,180 @@ +package kr.pickple.back.game.service; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.game.exception.GameExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; +import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; +import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.chat.service.ChatMessageService; +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; +import kr.pickple.back.game.dto.response.GameResponse; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberRepository; +import lombok.RequiredArgsConstructor; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class GameMemberService { + + private final GameRepository gameRepository; + private final MemberRepository memberRepository; + private final ChatMessageService chatMessageService; + private final ApplicationEventPublisher eventPublisher; + private final GameMemberRepository gameMemberRepository; + + @Transactional + public void registerGameMember(final Long gameId, final Long loggedInMemberId) { + final Game game = findGameById(gameId); + final Member member = findMemberById(loggedInMemberId); + + game.addGameMember(member); + + eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() + .gameId(gameId) + .memberId(game.getHost().getId()) + .build()); + } + + private Game findGameById(final Long gameId) { + return gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + } + + public GameResponse findAllGameMembers( + final Long loggedInMemberId, + final Long gameId, + final RegistrationStatus status + ) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); + final Game game = gameMember.getGame(); + final Member loggedInMember = gameMember.getMember(); + + if (!game.isHost(loggedInMember) && status == WAITING) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); + } + + return GameResponse.of(game, getMemberResponses(game, status)); + } + + private List getMemberResponses(final Game game, final RegistrationStatus status) { + return game.getMembersByStatus(status) + .stream() + .map(MemberResponse::from) + .toList(); + } + + private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { + return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + } + + @Transactional + public void updateGameMemberRegistrationStatus( + final Long loggedInMemberId, + final Long gameId, + final Long memberId, + final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest + ) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); + final Game game = gameMember.getGame(); + + validateIsHost(loggedInMemberId, game); + + final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); + enterGameChatRoom(updateStatus, gameMember); + + gameMember.updateStatus(updateStatus); + + eventPublisher.publishEvent(GameMemberJoinedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); + } + + private void validateIsHost(final Long loggedInMemberId, final Game game) { + final Member loggedInMember = findMemberById(loggedInMemberId); + + if (!game.isHost(loggedInMember)) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); + } + } + + private void enterGameChatRoom(final RegistrationStatus updateStatus, final GameMember gameMember) { + final RegistrationStatus nowStatus = gameMember.getStatus(); + + if (nowStatus == WAITING && updateStatus == CONFIRMED) { + chatMessageService.enterRoomAndSaveEnteringMessages(gameMember.getCrewChatRoom(), gameMember.getMember()); + } + } + + @Transactional + public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); + final Game game = gameMember.getGame(); + final Member member = gameMember.getMember(); + final Member loggedInMember = findMemberById(loggedInMemberId); + + if (game.isHost(loggedInMember)) { + validateIsHostSelfDeleted(loggedInMember, member); + + eventPublisher.publishEvent(GameMemberRejectedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); + + deleteGameMember(gameMember); + + return; + } + + if (loggedInMember.equals(member)) { + cancelGameMember(gameMember); + + return; + } + + throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); + } + + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { + if (loggedInMember.equals(member)) { + throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); + } + } + + private void cancelGameMember(final GameMember gameMember) { + RegistrationStatus status = gameMember.getStatus(); + + if (status != WAITING) { + throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); + } + + deleteGameMember(gameMember); + } + + private void deleteGameMember(final GameMember gameMember) { + gameMemberRepository.delete(gameMember); + } +} diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java new file mode 100644 index 00000000..32ca1b3f --- /dev/null +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -0,0 +1,91 @@ +package kr.pickple.back.game.service; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.common.util.DateTimeUtil; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.dto.request.MannerScoreReview; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.member.domain.Member; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GameReviewMannerScoresService { + + private static final int REVIEW_POSSIBLE_DAYS = 7; + + private final GameMemberRepository gameMemberRepository; + + @Transactional + public void reviewMannerScores( + final Long loggedInMemberId, + final Long gameId, + final List mannerScoreReviews + ) { + final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameIdAndStatus( + loggedInMemberId, + gameId, + CONFIRMED + ) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); + + if (gameMember.isAlreadyReviewDone()) { + throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); + } + + final Game game = gameMember.getGame(); + final Member loggedInMember = gameMember.getMember(); + + if (isNotReviewPeriod(game)) { + throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), + game.getPlayEndTime()); + } + + mannerScoreReviews.forEach(review -> { + final Member reviewedMember = getReviewedMember(game, review.getMemberId()); + validateIsSelfReview(loggedInMember, reviewedMember); + reviewedMember.updateMannerScore(review.getMannerScore()); + }); + + gameMember.updateReviewDone(); + } + + private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { + if (loggedInMember.equals(reviewedMember)) { + throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getId(), reviewedMember.getId()); + } + } + + private Boolean isNotReviewPeriod(final Game game) { + return isBeforeThanPlayEndTime(game) || isAfterReviewPossibleTime(game); + } + + private Boolean isBeforeThanPlayEndTime(final Game game) { + return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); + } + + private Boolean isAfterReviewPossibleTime(final Game game) { + final LocalDateTime reviewDeadlineDatetime = game.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); + + return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); + } + + private Member getReviewedMember(final Game game, final Long reviewedMemberId) { + return game.getMembersByStatus(CONFIRMED) + .stream() + .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) + .findFirst() + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); + } +} diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 622edb8e..3f915076 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -59,372 +59,183 @@ @Transactional(readOnly = true) public class GameService { - private static final int REVIEW_POSSIBLE_DAYS = 7; - - private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final MemberRepository memberRepository; - private final KakaoAddressSearchClient kakaoAddressSearchClient; - private final AddressService addressService; - private final ChatRoomService chatRoomService; - private final ChatMessageService chatMessageService; - private final ApplicationEventPublisher eventPublisher; - private final RedisRepository redisRepository; - - @Transactional - public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final Member host = findMemberById(loggedInMemberId); - final Point point = kakaoAddressSearchClient.fetchAddress( - gameCreateRequest.getMainAddress()); - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( - gameCreateRequest.getMainAddress()); - - final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); - game.addGameMember(host); - - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); - game.makeNewCrewChatRoom(chatRoom); - - final Long savedGameId = gameRepository.save(game).getId(); - saveGameStatusUpdateEventToRedis(game, savedGameId); - - return GameIdResponse.from(savedGameId); - } - - private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { - final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); - - // 경기를 생성한 시각과 경기 시작 시간의 차 - final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, game); - - // 경기를 생성한 시각과 경기 종료 시간의 차 - final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, game); - - final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, savedGameId); - final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, savedGameId); - - redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); - redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); - } - - private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gamePlayDateTime = LocalDateTime.of(game.getPlayDate(), game.getPlayStartTime()); - - return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); - } - - private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gameEndDateTime = game.getPlayEndDatetime(); - - return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); - } - - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - - private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { - return String.format("game:%s:%d", gameStatus.toString(), id); - } - - @Transactional - public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - final Game game = findGameById(gameId); - game.updateGameStatus(gameStatus); - } - - private String makeGameRoomName(final Game game) { - final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); - final String addressDepth2Name = game.getAddressDepth2().getName(); - - return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); - } - - @Transactional - public GameResponse findGameDetailsById(final Long gameId) { - final Game game = findGameById(gameId); - final List memberResponses = game.getMembersByStatus(CONFIRMED) - .stream() - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - - game.increaseViewCount(); - - return GameResponse.of(game, memberResponses); - } - - @Transactional - public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final Game game = findGameById(gameId); - final Member member = findMemberById(loggedInMemberId); - - game.addGameMember(member); - - eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() - .gameId(gameId) - .memberId(game.getHost().getId()) - .build()); - } - - private Game findGameById(final Long gameId) { - return gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - } - - public GameResponse findAllGameMembers( - final Long loggedInMemberId, - final Long gameId, - final RegistrationStatus status - ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); - - if (!game.isHost(loggedInMember) && status == WAITING) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } - - return GameResponse.of(game, getMemberResponses(game, status)); - } - - public List findGamesByCategory( - final Category category, - final String value, - final Pageable pageable - ) { - return switch (category) { - //현호 todo: playDate, positions 조건으로 조회하는 기능 추가 (MVP 미포함 기능) - case ADDRESS -> findGamesByAddress(value, pageable); - default -> throw new GameException(GAME_SEARCH_CATEGORY_IS_INVALID, category); - }; - } - - private List findGamesByAddress(final String address, final Pageable pageable) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); - - final PageRequest pageRequest = PageRequest.of( - pageable.getPageNumber(), - pageable.getPageSize(), - Sort.by( - Sort.Order.asc("playDate"), - Sort.Order.asc("playStartTime"), - Sort.Order.asc("id") - ) - ); - - final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), - GameStatus.ENDED, - pageRequest - ); - - return games.stream() - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) - .toList(); - } - - private List getMemberResponses(final Game game, final RegistrationStatus status) { - return game.getMembersByStatus(status) - .stream() - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } - - @Transactional - public void updateGameMemberRegistrationStatus( - final Long loggedInMemberId, - final Long gameId, - final Long memberId, - final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest - ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); - - validateIsHost(loggedInMemberId, game); - - final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); - enterGameChatRoom(updateStatus, gameMember); - - gameMember.updateStatus(updateStatus); - - eventPublisher.publishEvent(GameMemberJoinedEvent.builder() - .gameId(gameId) - .memberId(memberId) - .build()); - } - - private void validateIsHost(final Long loggedInMemberId, final Game game) { - final Member loggedInMember = findMemberById(loggedInMemberId); - - if (!game.isHost(loggedInMember)) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } - } - - private void enterGameChatRoom(final RegistrationStatus updateStatus, final GameMember gameMember) { - final RegistrationStatus nowStatus = gameMember.getStatus(); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(gameMember.getCrewChatRoom(), gameMember.getMember()); - } - } - - @Transactional - public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); - final Member member = gameMember.getMember(); - final Member loggedInMember = findMemberById(loggedInMemberId); - - if (game.isHost(loggedInMember)) { - validateIsHostSelfDeleted(loggedInMember, member); - - eventPublisher.publishEvent(GameMemberRejectedEvent.builder() - .gameId(gameId) - .memberId(memberId) - .build()); - - deleteGameMember(gameMember); - - return; - } - - if (loggedInMember.equals(member)) { - cancelGameMember(gameMember); - - return; - } - - throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); - } - - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - - private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { - if (loggedInMember.equals(member)) { - throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); - } - } - - private void cancelGameMember(final GameMember gameMember) { - RegistrationStatus status = gameMember.getStatus(); - - if (status != WAITING) { - throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); - } - - deleteGameMember(gameMember); - } - - private void deleteGameMember(final GameMember gameMember) { - gameMemberRepository.delete(gameMember); - } - - @Transactional - public void reviewMannerScores( - final Long loggedInMemberId, - final Long gameId, - final List mannerScoreReviews - ) { - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameIdAndStatus( - loggedInMemberId, - gameId, - CONFIRMED - ) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); - - if (gameMember.isAlreadyReviewDone()) { - throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); - } - - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); - - if (isNotReviewPeriod(game)) { - throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), - game.getPlayEndTime()); - } - - mannerScoreReviews.forEach(review -> { - final Member reviewedMember = getReviewedMember(game, review.getMemberId()); - validateIsSelfReview(loggedInMember, reviewedMember); - reviewedMember.updateMannerScore(review.getMannerScore()); - }); - - gameMember.updateReviewDone(); - } - - private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { - if (loggedInMember.equals(reviewedMember)) { - throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getId(), reviewedMember.getId()); - } - } - - private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { - return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); - } - - private Boolean isNotReviewPeriod(final Game game) { - return isBeforeThanPlayEndTime(game) || isAfterReviewPossibleTime(game); - } - - private Boolean isBeforeThanPlayEndTime(final Game game) { - return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); - } - - private Boolean isAfterReviewPossibleTime(final Game game) { - final LocalDateTime reviewDeadlineDatetime = game.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); - - return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); - } - - private Member getReviewedMember(final Game game, final Long reviewedMemberId) { - return game.getMembersByStatus(CONFIRMED) - .stream() - .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) - .findFirst() - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); - } - - public List findGamesWithInDistance( - final Double latitude, - final Double longitude, - final Double distance - ) { - final List games = gameRepository.findGamesWithInDistance(latitude, longitude, distance); - - return games.stream() - .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) - .toList(); - } - - public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { - final List games = gameRepository.findGamesWithInAddress( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2() - ); - - return games.stream() - .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } + private final GameRepository gameRepository; + private final MemberPositionRepository memberPositionRepository; + private final MemberRepository memberRepository; + private final KakaoAddressSearchClient kakaoAddressSearchClient; + private final AddressService addressService; + private final ChatRoomService chatRoomService; + private final RedisRepository redisRepository; + + @Transactional + public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { + final Member host = findMemberById(loggedInMemberId); + final Point point = kakaoAddressSearchClient.fetchAddress( + gameCreateRequest.getMainAddress()); + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( + gameCreateRequest.getMainAddress()); + + final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); + game.addGameMember(host); + + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); + game.makeNewCrewChatRoom(chatRoom); + + final Long savedGameId = gameRepository.save(game).getId(); + saveGameStatusUpdateEventToRedis(game, savedGameId); + + return GameIdResponse.from(savedGameId); + } + + private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { + final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); + + // 경기를 생성한 시각과 경기 시작 시간의 차 + final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, game); + + // 경기를 생성한 시각과 경기 종료 시간의 차 + final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, game); + + final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, savedGameId); + final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, savedGameId); + + redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); + redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); + } + + private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final Game game) { + final LocalDateTime gamePlayDateTime = LocalDateTime.of(game.getPlayDate(), game.getPlayStartTime()); + + return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); + } + + private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final Game game) { + final LocalDateTime gameEndDateTime = game.getPlayEndDatetime(); + + return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); + } + + private static long getSecondsBetween( + final LocalDateTime gameCreatedDateTime, + final LocalDateTime gamePlayDateTime + ) { + return Duration.between(gameCreatedDateTime, gamePlayDateTime) + .getSeconds(); + } + + private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { + return String.format("game:%s:%d", gameStatus.toString(), id); + } + + @Transactional + public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { + final Game game = findGameById(gameId); + game.updateGameStatus(gameStatus); + } + + private String makeGameRoomName(final Game game) { + final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); + final String addressDepth2Name = game.getAddressDepth2().getName(); + + return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); + } + + @Transactional + public GameResponse findGameDetailsById(final Long gameId) { + final Game game = findGameById(gameId); + final List memberResponses = game.getMembersByStatus(CONFIRMED) + .stream() + .map(member -> MemberResponse.of(member, getPositions(member))) + .toList(); + + game.increaseViewCount(); + + return GameResponse.of(game, memberResponses); + } + + private Game findGameById(final Long gameId) { + return gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + } + + public List findGamesByCategory( + final Category category, + final String value, + final Pageable pageable + ) { + return switch (category) { + //현호 todo: playDate, positions 조건으로 조회하는 기능 추가 (MVP 미포함 기능) + case ADDRESS -> findGamesByAddress(value, pageable); + default -> throw new GameException(GAME_SEARCH_CATEGORY_IS_INVALID, category); + }; + } + + private List findGamesByAddress(final String address, final Pageable pageable) { + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); + + final PageRequest pageRequest = PageRequest.of( + pageable.getPageNumber(), + pageable.getPageSize(), + Sort.by( + Sort.Order.asc("playDate"), + Sort.Order.asc("playStartTime"), + Sort.Order.asc("id") + ) + ); + + final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2(), + GameStatus.ENDED, + pageRequest + ); + + return games.stream() + .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + .toList(); + } + + private List getMemberResponses(final Game game, final RegistrationStatus status) { + return game.getMembersByStatus(status) + .stream() + .map(member -> MemberResponse.of(member, getPositions(member))) + .toList(); + } + + private Member findMemberById(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + public List findGamesWithInDistance( + final Double latitude, + final Double longitude, + final Double distance + ) { + final List games = gameRepository.findGamesWithInDistance(latitude, longitude, distance); + + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + .toList(); + } + + public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { + final List games = gameRepository.findGamesWithInAddress( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2() + ); + + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + .toList(); + } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.from(memberPositions); + } } From f5fcb03dd2c606c17c78eb8bfb00d4fb5cf2a5d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Fri, 2 Feb 2024 15:14:11 +0900 Subject: [PATCH 011/117] =?UTF-8?q?refactor:=20=EC=96=91=EB=B0=A9=ED=96=A5?= =?UTF-8?q?=20=EC=97=B0=EA=B4=80=20=EA=B4=80=EA=B3=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/service/CrewMemberService.java | 300 +++++++++--------- .../back/crew/service/CrewService.java | 230 +++++++------- .../back/game/controller/GameController.java | 2 +- .../kr/pickple/back/game/domain/Game.java | 31 +- .../pickple/back/game/domain/GameMember.java | 4 + .../game/dto/request/GameCreateRequest.java | 12 +- .../back/game/dto/response/GameResponse.java | 7 +- .../game/repository/GameMemberRepository.java | 18 +- .../repository/GamePositionRepository.java | 4 + .../repository/GameSearchRepositoryImpl.java | 159 +++++----- .../back/game/service/GameMemberService.java | 66 ++-- .../GameReviewMannerScoresService.java | 9 +- .../back/game/service/GameService.java | 128 ++++---- .../dto/response/MemberGameResponse.java | 105 +++--- .../member/repository/MemberRepository.java | 10 +- .../member/service/MemberCrewService.java | 165 +++++----- .../member/service/MemberGameService.java | 179 +++++------ .../back/member/service/MemberService.java | 180 ++++++----- .../back/position/domain/Position.java | 57 ++-- .../back/position/util/PositionConverter.java | 16 +- .../back/game/service/GameServiceTest.java | 2 +- 21 files changed, 864 insertions(+), 820 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index da6ebd64..e7cc1f2b 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -34,154 +34,154 @@ @Transactional(readOnly = true) public class CrewMemberService { - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; - private final CrewMemberRepository crewMemberRepository; - private final ChatMessageService chatMessageService; - private final ApplicationEventPublisher eventPublisher; - - /** - * 크루 가입 신청 - */ - @Transactional - public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final Crew crew = crewRepository.getCrewById(crewId); - final Member member = memberRepository.getMemberById(loggedInMemberId); - - validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); - - final CrewMember newCrewMember = CrewMember.builder() - .member(member) - .crew(crew) - .build(); - - crewMemberRepository.save(newCrewMember); - - eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() - .crewId(crewId) - .memberId(crew.getLeader().getId()) - .build()); - } - - private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { - if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); - } - } - - /** - * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 - */ - public CrewProfileResponse findAllCrewMembers( - final Long loggedInMemberId, - final Long crewId, - final RegistrationStatus status - ) { - final Crew crew = crewRepository.getCrewById(crewId); - - validateIsLeader(loggedInMemberId, crew); - - final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - - return CrewProfileResponse.of(crew, memberResponses); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } - - /** - * 크루 가입 신청 수락 - */ - @Transactional - public void updateCrewMemberRegistrationStatus( - final Long loggedInMemberId, - final Long crewId, - final Long memberId, - final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest - ) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); - - validateIsLeader(loggedInMemberId, crew); - - final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); - enterCrewChatRoom(updateStatus, crewMember); - - crewMember.updateStatus(updateStatus); - - eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() - .crewId(crewId) - .memberId(memberId) - .build()); - } - - private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { - if (!crew.isLeader(loggedInMemberId)) { - throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); - } - } - - private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { - final RegistrationStatus nowStatus = crewMember.getStatus(); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), crewMember.getMember()); - } - } - - /** - * 크루원 가입 신청 거절/취소 - */ - @Transactional - public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); - - if (crew.isLeader(loggedInMemberId)) { - validateIsLeaderSelfDeleted(loggedInMemberId, memberId); - - eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() - .crewId(crewId) - .memberId(memberId) - .build()); - - deleteCrewMember(crewMember); - - return; - } - - if (loggedInMemberId.equals(memberId)) { - cancelCrewMember(crewMember); - return; - } - - throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); - } - - private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { - if (loggedInMemberId.equals(memberId)) { - throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); - } - } - - private void cancelCrewMember(final CrewMember crewMember) { - if (crewMember.getStatus() != WAITING) { - throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); - } - - deleteCrewMember(crewMember); - } - - private void deleteCrewMember(final CrewMember crewMember) { - crewMemberRepository.delete(crewMember); - } + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; + private final CrewMemberRepository crewMemberRepository; + private final ChatMessageService chatMessageService; + private final ApplicationEventPublisher eventPublisher; + + /** + * 크루 가입 신청 + */ + @Transactional + public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { + final Crew crew = crewRepository.getCrewById(crewId); + final Member member = memberRepository.getMemberById(loggedInMemberId); + + validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); + + final CrewMember newCrewMember = CrewMember.builder() + .member(member) + .crew(crew) + .build(); + + crewMemberRepository.save(newCrewMember); + + eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() + .crewId(crewId) + .memberId(crew.getLeader().getId()) + .build()); + } + + private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { + if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); + } + } + + /** + * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 + */ + public CrewProfileResponse findAllCrewMembers( + final Long loggedInMemberId, + final Long crewId, + final RegistrationStatus status + ) { + final Crew crew = crewRepository.getCrewById(crewId); + + validateIsLeader(loggedInMemberId, crew); + + final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + + return CrewProfileResponse.of(crew, memberResponses); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + /** + * 크루 가입 신청 수락 + */ + @Transactional + public void updateCrewMemberRegistrationStatus( + final Long loggedInMemberId, + final Long crewId, + final Long memberId, + final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest + ) { + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final Crew crew = crewMember.getCrew(); + + validateIsLeader(loggedInMemberId, crew); + + final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); + enterCrewChatRoom(updateStatus, crewMember); + + crewMember.updateStatus(updateStatus); + + eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); + } + + private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { + if (!crew.isLeader(loggedInMemberId)) { + throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); + } + } + + private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { + final RegistrationStatus nowStatus = crewMember.getStatus(); + + if (nowStatus == WAITING && updateStatus == CONFIRMED) { + chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), crewMember.getMember()); + } + } + + /** + * 크루원 가입 신청 거절/취소 + */ + @Transactional + public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final Crew crew = crewMember.getCrew(); + + if (crew.isLeader(loggedInMemberId)) { + validateIsLeaderSelfDeleted(loggedInMemberId, memberId); + + eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); + + deleteCrewMember(crewMember); + + return; + } + + if (loggedInMemberId.equals(memberId)) { + cancelCrewMember(crewMember); + return; + } + + throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); + } + + private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { + if (loggedInMemberId.equals(memberId)) { + throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); + } + } + + private void cancelCrewMember(final CrewMember crewMember) { + if (crewMember.getStatus() != WAITING) { + throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); + } + + deleteCrewMember(crewMember); + } + + private void deleteCrewMember(final CrewMember crewMember) { + crewMemberRepository.delete(crewMember); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 1107af7e..fd721776 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -39,119 +39,119 @@ @Transactional(readOnly = true) public class CrewService { - private static final Integer CREW_IMAGE_START_NUMBER = 1; - private static final Integer CREW_IMAGE_END_NUMBER = 20; - private static final Integer CREW_CREATE_MAX_SIZE = 3; - - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final AddressService addressService; - private final ChatRoomService chatRoomService; - private final S3Properties s3Properties; - - /** - * 크루 생성 - */ - @Transactional - public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { - validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); - - final Member leader = memberRepository.getMemberById(loggedInMemberId); - - validateMemberCreatedCrewsCount(leader); - - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( - crewCreateRequest.getAddressDepth1(), - crewCreateRequest.getAddressDepth2() - ); - - final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( - CREW_IMAGE_START_NUMBER, - CREW_IMAGE_END_NUMBER - ); - - final Crew crew = crewCreateRequest.toEntity( - leader, - mainAddressResponse, - MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), - MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) - ); - - final CrewMember crewLeader = CrewMember.builder() - .member(leader) - .crew(crew) - .build(); - - crewLeader.confirmRegistration(); - - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); - crew.makeNewCrewChatRoom(chatRoom); - - final Long crewId = crewRepository.save(crew).getId(); - crewMemberRepository.save(crewLeader); - - return CrewIdResponse.from(crewId); - } - - private void validateIsDuplicatedCrewInfo(final String name) { - if (crewRepository.existsByName(name)) { - throw new CrewException(CREW_IS_EXISTED, name); - } - } - - private void validateMemberCreatedCrewsCount(final Member leader) { - final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); - - if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { - throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); - } - } - - /** - * 크루 상세 조회 - */ - public CrewProfileResponse findCrewById(final Long crewId) { - final Crew crew = crewRepository.getCrewById(crewId); - - return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); - } - - /** - * 사용자 근처 크루 목록 조회 - */ - public List findCrewsByAddress( - final String addressDepth1, - final String addressDepth2, - final Pageable pageable - ) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, - addressDepth2); - - final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), - pageable - ); - - return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) - .toList(); - } - - private List getConfirmedMemberResponses(final Long crewId) { - return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } + private static final Integer CREW_IMAGE_START_NUMBER = 1; + private static final Integer CREW_IMAGE_END_NUMBER = 20; + private static final Integer CREW_CREATE_MAX_SIZE = 3; + + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; + private final MemberPositionRepository memberPositionRepository; + private final AddressService addressService; + private final ChatRoomService chatRoomService; + private final S3Properties s3Properties; + + /** + * 크루 생성 + */ + @Transactional + public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { + validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); + + final Member leader = memberRepository.getMemberById(loggedInMemberId); + + validateMemberCreatedCrewsCount(leader); + + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + crewCreateRequest.getAddressDepth1(), + crewCreateRequest.getAddressDepth2() + ); + + final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( + CREW_IMAGE_START_NUMBER, + CREW_IMAGE_END_NUMBER + ); + + final Crew crew = crewCreateRequest.toEntity( + leader, + mainAddressResponse, + MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), + MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) + ); + + final CrewMember crewLeader = CrewMember.builder() + .member(leader) + .crew(crew) + .build(); + + crewLeader.confirmRegistration(); + + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); + crew.makeNewCrewChatRoom(chatRoom); + + final Long crewId = crewRepository.save(crew).getId(); + crewMemberRepository.save(crewLeader); + + return CrewIdResponse.from(crewId); + } + + private void validateIsDuplicatedCrewInfo(final String name) { + if (crewRepository.existsByName(name)) { + throw new CrewException(CREW_IS_EXISTED, name); + } + } + + private void validateMemberCreatedCrewsCount(final Member leader) { + final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); + + if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { + throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); + } + } + + /** + * 크루 상세 조회 + */ + public CrewProfileResponse findCrewById(final Long crewId) { + final Crew crew = crewRepository.getCrewById(crewId); + + return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); + } + + /** + * 사용자 근처 크루 목록 조회 + */ + public List findCrewsByAddress( + final String addressDepth1, + final String addressDepth2, + final Pageable pageable + ) { + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, + addressDepth2); + + final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2(), + pageable + ); + + return crews.stream() + .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) + .toList(); + } + + private List getConfirmedMemberResponses(final Long crewId) { + return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/game/controller/GameController.java b/src/main/java/kr/pickple/back/game/controller/GameController.java index b0932726..f71ab66d 100644 --- a/src/main/java/kr/pickple/back/game/controller/GameController.java +++ b/src/main/java/kr/pickple/back/game/controller/GameController.java @@ -57,7 +57,7 @@ public ResponseEntity findGameDetailsById( @PathVariable final Long gameId ) { return ResponseEntity.status(OK) - .body(gameService.findGameDetailsById(gameId)); + .body(gameService.findGameById(gameId)); } @GetMapping diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index 2e8429b6..2e345313 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -104,12 +104,6 @@ public class Game extends BaseEntity { @JoinColumn(name = "address_depth2_id") private AddressDepth2 addressDepth2; - @Embedded - private GamePositions gamePositions = new GamePositions(); - - @Embedded - private GameMembers gameMembers = new GameMembers(); - @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chat_room_id") private ChatRoom chatRoom; @@ -128,8 +122,7 @@ private Game( final Member host, final Point point, final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, - final List positions + final AddressDepth2 addressDepth2 ) { this.content = content; this.playDate = playDate; @@ -144,38 +137,16 @@ private Game( this.point = point; this.addressDepth1 = addressDepth1; this.addressDepth2 = addressDepth2; - - updateGamePositions(positions); } public void updateGameStatus(final GameStatus gameStatus) { status = gameStatus; } - private void updateGamePositions(final List positions) { - gamePositions.updateGamePositions(this, positions); - } - - public List getPositions() { - return gamePositions.getPositions(); - } - - public List getMembersByStatus(final RegistrationStatus status) { - return gameMembers.getMembersByStatus(status); - } - - public List getGameMembers() { - return gameMembers.getGameMembers(); - } - public LocalDateTime getPlayEndDatetime() { return LocalDateTime.of(playDate, playEndTime); } - public void addGameMember(final Member member) { - gameMembers.addGameMember(this, member); - } - public void increaseMemberCount() { if (isClosedGame()) { throw new GameException(GAME_STATUS_IS_CLOSED, status); diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index b68e6e4c..5bcce6cc 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -51,6 +51,10 @@ private GameMember(final Member member, final Game game) { this.game = game; } + public void confirmRegistration() { + this.status = CONFIRMED; + } + public void updateStatus(final RegistrationStatus status) { if (this.status == WAITING && status == CONFIRMED) { game.increaseMemberCount(); diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index 4a253b6e..4b569c8c 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -17,7 +17,9 @@ import jakarta.validation.constraints.Size; import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -85,7 +87,15 @@ public Game toEntity( .point(point) .addressDepth1(mainAddressResponse.getAddressDepth1()) .addressDepth2(mainAddressResponse.getAddressDepth2()) - .positions(positions) .build(); } + + public List toGamePositionEntities(final Game game) { + return positions.stream() + .map(position -> GamePosition.builder() + .game(game) + .position(position) + .build() + ).toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index 929ab9b8..a85edaed 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -39,10 +39,7 @@ public class GameResponse { private List positions; private List members; - public static GameResponse of( - final Game game, - final List memberResponses - ) { + public static GameResponse of(final Game game, final List memberResponses, List positions) { return GameResponse.builder() .id(game.getId()) .content(game.getContent()) @@ -62,7 +59,7 @@ public static GameResponse of( .host(getHostResponse(memberResponses, game.getHost().getId())) .addressDepth1(game.getAddressDepth1().getName()) .addressDepth2(game.getAddressDepth2().getName()) - .positions(game.getPositions()) + .positions(positions) .members(memberResponses) .build(); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index e0e38502..a427af09 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -10,15 +10,17 @@ public interface GameMemberRepository extends JpaRepository { - Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); + Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); - Optional findByMemberIdAndGameIdAndStatus( - final Long memberId, - final Long gameId, - final RegistrationStatus status - ); + Optional findByMemberIdAndGameIdAndStatus( + final Long memberId, + final Long gameId, + final RegistrationStatus status + ); - List findAllByMemberIdAndStatus(final Long id, final RegistrationStatus memberStatus); + List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); - List findAllByMemberId(final Long id); + List findAllByMemberId(final Long memberId); + + List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); } diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java index da7a6b18..1766361d 100644 --- a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java @@ -4,6 +4,10 @@ import kr.pickple.back.game.domain.GamePosition; +import java.util.List; + public interface GamePositionRepository extends JpaRepository { + List findAllByGameId(final Long gameId); } + diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java index 0d3ac5bd..ced27234 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java @@ -18,84 +18,83 @@ @RequiredArgsConstructor public class GameSearchRepositoryImpl implements GameSearchRepository { - private final JPAQueryFactory jpaQueryFactory; - - @Override - public List findGamesWithInDistance( - final Double latitude, - final Double longitude, - final Double distance - ) { - final String pointWKT = String.format("POINT(%s %s)", latitude, longitude); - - return jpaQueryFactory - .selectFrom(game) - .join(game.host).fetchJoin() - .join(game.addressDepth1).fetchJoin() - .join(game.addressDepth2).fetchJoin() - .leftJoin(game.gameMembers.gameMembers).fetchJoin() - .where(isWithInDistance(pointWKT, distance)) - .orderBy(getOrderByDistance(pointWKT)) - .fetch(); - } - - private BooleanExpression isWithInDistance(final String pointWKT, final Double distance) { - return Expressions.booleanTemplate( - "ST_Contains(ST_Buffer(ST_GeomFromText({0}, 4326), {1}), point)", - pointWKT, - distance - ); - } - - private OrderSpecifier getOrderByDistance(final String pointWKT) { - return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", - pointWKT - ) - .asc(); - } - - @Override - public List findGamesWithInAddress( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 - ) { - return jpaQueryFactory - .select(game) - .from(game) - .join(mapPolygon).on(isWithInAddress()) - .where(isAddress(addressDepth1, addressDepth2)) - .orderBy(getOrderByAddress()) - .fetch(); - } - - private BooleanExpression isWithInAddress() { - return Expressions.booleanTemplate( - "ST_Contains({0}, {1})", - mapPolygon.polygon, - game.point - ); - } - - private BooleanExpression isAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2) { - return isAddressDepth1(addressDepth1).and(isAddressDepth2(addressDepth2)); - } - - private BooleanExpression isAddressDepth1(final AddressDepth1 addressDepth1) { - return mapPolygon.addressDepth1.eq(addressDepth1); - } - - private BooleanExpression isAddressDepth2(final AddressDepth2 addressDepth2) { - return mapPolygon.addressDepth2.eq(addressDepth2); - } - - private OrderSpecifier getOrderByAddress() { - return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", - game.point, mapPolygon.latitude, mapPolygon.longitude - ) - .asc(); - } + private final JPAQueryFactory jpaQueryFactory; + + @Override + public List findGamesWithInDistance( + final Double latitude, + final Double longitude, + final Double distance + ) { + final String pointWKT = String.format("POINT(%s %s)", latitude, longitude); + + return jpaQueryFactory + .selectFrom(game) + .join(game.host).fetchJoin() + .join(game.addressDepth1).fetchJoin() + .join(game.addressDepth2).fetchJoin() + .where(isWithInDistance(pointWKT, distance)) + .orderBy(getOrderByDistance(pointWKT)) + .fetch(); + } + + private BooleanExpression isWithInDistance(final String pointWKT, final Double distance) { + return Expressions.booleanTemplate( + "ST_Contains(ST_Buffer(ST_GeomFromText({0}, 4326), {1}), point)", + pointWKT, + distance + ); + } + + private OrderSpecifier getOrderByDistance(final String pointWKT) { + return Expressions.numberTemplate( + Double.class, + "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", + pointWKT + ) + .asc(); + } + + @Override + public List findGamesWithInAddress( + final AddressDepth1 addressDepth1, + final AddressDepth2 addressDepth2 + ) { + return jpaQueryFactory + .select(game) + .from(game) + .join(mapPolygon).on(isWithInAddress()) + .where(isAddress(addressDepth1, addressDepth2)) + .orderBy(getOrderByAddress()) + .fetch(); + } + + private BooleanExpression isWithInAddress() { + return Expressions.booleanTemplate( + "ST_Contains({0}, {1})", + mapPolygon.polygon, + game.point + ); + } + + private BooleanExpression isAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2) { + return isAddressDepth1(addressDepth1).and(isAddressDepth2(addressDepth2)); + } + + private BooleanExpression isAddressDepth1(final AddressDepth1 addressDepth1) { + return mapPolygon.addressDepth1.eq(addressDepth1); + } + + private BooleanExpression isAddressDepth2(final AddressDepth2 addressDepth2) { + return mapPolygon.addressDepth2.eq(addressDepth2); + } + + private OrderSpecifier getOrderByAddress() { + return Expressions.numberTemplate( + Double.class, + "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", + game.point, mapPolygon.latitude, mapPolygon.longitude + ) + .asc(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index a903ad73..610a2599 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -2,7 +2,6 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -17,15 +16,19 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -35,16 +38,20 @@ public class GameMemberService { private final GameRepository gameRepository; private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; private final GameMemberRepository gameMemberRepository; + private final GamePositionRepository gamePositionRepository; @Transactional public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final Game game = findGameById(gameId); - final Member member = findMemberById(loggedInMemberId); + final Game game = gameRepository.getGameById(gameId); + final Member member = memberRepository.getMemberById(loggedInMemberId); - game.addGameMember(member); + validateIsAlreadyRegisteredGameMember(game, member); + final GameMember gameMember = buildGameMember(game, member); + gameMemberRepository.save(gameMember); eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() .gameId(gameId) @@ -52,9 +59,21 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { .build()); } - private Game findGameById(final Long gameId) { - return gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + private void validateIsAlreadyRegisteredGameMember(final Game game, final Member member) { + if (isAlreadyRegistered(game, member)) { + throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); + } + } + + private boolean isAlreadyRegistered(final Game game, final Member member) { + return gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()).isPresent(); + } + + private GameMember buildGameMember(final Game game, final Member member) { + return GameMember.builder() + .member(member) + .game(game) + .build(); } public GameResponse findAllGameMembers( @@ -70,16 +89,30 @@ public GameResponse findAllGameMembers( throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - return GameResponse.of(game, getMemberResponses(game, status)); + return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game)); } - private List getMemberResponses(final Game game, final RegistrationStatus status) { - return game.getMembersByStatus(status) + private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) .stream() - .map(MemberResponse::from) + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) .toList(); } + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + private List getPositionsByGame(final Game game) { + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + + return Position.fromGamePositions(gamePositions); + } + private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); @@ -109,7 +142,7 @@ public void updateGameMemberRegistrationStatus( } private void validateIsHost(final Long loggedInMemberId, final Game game) { - final Member loggedInMember = findMemberById(loggedInMemberId); + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); if (!game.isHost(loggedInMember)) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); @@ -129,7 +162,7 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); final Game game = gameMember.getGame(); final Member member = gameMember.getMember(); - final Member loggedInMember = findMemberById(loggedInMemberId); + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); if (game.isHost(loggedInMember)) { validateIsHostSelfDeleted(loggedInMember, member); @@ -153,11 +186,6 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); } - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { if (loggedInMember.equals(member)) { throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 32ca1b3f..1cd2e9fa 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -82,10 +82,17 @@ private Boolean isAfterReviewPossibleTime(final Game game) { } private Member getReviewedMember(final Game game, final Long reviewedMemberId) { - return game.getMembersByStatus(CONFIRMED) + return getConfirmedMembers(game) .stream() .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) .findFirst() .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); } + + private List getConfirmedMembers(Game game) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), CONFIRMED) + .stream() + .map(GameMember::getMember) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 3f915076..be6ff383 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -4,7 +4,6 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.game.domain.GameStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.text.MessageFormat; import java.time.Duration; @@ -13,7 +12,6 @@ import java.util.List; import org.locationtech.jts.geom.Point; -import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -24,31 +22,25 @@ import kr.pickple.back.address.dto.response.MainAddressResponse; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; -import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; -import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; -import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.common.util.DateTimeUtil; import kr.pickple.back.game.domain.Category; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.dto.request.GameCreateRequest; -import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; -import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.dto.response.GameIdResponse; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; @@ -66,27 +58,48 @@ public class GameService { private final AddressService addressService; private final ChatRoomService chatRoomService; private final RedisRepository redisRepository; + private final GamePositionRepository gamePositionRepository; + private final GameMemberRepository gameMemberRepository; + /** + * 게임 생성 + */ @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final Member host = findMemberById(loggedInMemberId); + final Member host = memberRepository.getMemberById(loggedInMemberId); final Point point = kakaoAddressSearchClient.fetchAddress( gameCreateRequest.getMainAddress()); final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( gameCreateRequest.getMainAddress()); final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); - game.addGameMember(host); + + final GameMember gameHost = GameMember.builder() + .member(host) + .game(game) + .build(); + gameHost.confirmRegistration(); final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); game.makeNewCrewChatRoom(chatRoom); - final Long savedGameId = gameRepository.save(game).getId(); + final Game savedGame = gameRepository.save(game); + final List gamePositions = gameCreateRequest.toGamePositionEntities(savedGame); + gamePositionRepository.saveAll(gamePositions); + + final Long savedGameId = savedGame.getId(); saveGameStatusUpdateEventToRedis(game, savedGameId); return GameIdResponse.from(savedGameId); } + private String makeGameRoomName(final Game game) { + final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); + final String addressDepth2Name = game.getAddressDepth2().getName(); + + return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); + } + private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); @@ -127,37 +140,29 @@ private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long i return String.format("game:%s:%d", gameStatus.toString(), id); } + /** + * 게임 상태 업데이트 + */ @Transactional public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - final Game game = findGameById(gameId); + final Game game = gameRepository.getGameById(gameId); game.updateGameStatus(gameStatus); } - private String makeGameRoomName(final Game game) { - final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); - final String addressDepth2Name = game.getAddressDepth2().getName(); - - return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); - } - + /** + * 게임 상세 조회 + */ @Transactional - public GameResponse findGameDetailsById(final Long gameId) { - final Game game = findGameById(gameId); - final List memberResponses = game.getMembersByStatus(CONFIRMED) - .stream() - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - + public GameResponse findGameById(final Long gameId) { + final Game game = gameRepository.getGameById(gameId); game.increaseViewCount(); - return GameResponse.of(game, memberResponses); - } - - private Game findGameById(final Long gameId) { - return gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game)); } + /** + * 게임 카테고리별 조회 + */ public List findGamesByCategory( final Category category, final String value, @@ -170,6 +175,9 @@ public List findGamesByCategory( }; } + /** + * 주소별 게스트 모집글 조회 + */ private List findGamesByAddress(final String address, final Pageable pageable) { final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); @@ -191,22 +199,28 @@ private List findGamesByAddress(final String address, final Pageab ); return games.stream() - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) .toList(); } - private List getMemberResponses(final Game game, final RegistrationStatus status) { - return game.getMembersByStatus(status) - .stream() - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } + /** + * 특정 지역의 게스트 모집글 조회 + */ + public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { + final List games = gameRepository.findGamesWithInAddress( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2() + ); - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) + .toList(); } + /** + * 중심 좌표(위도, 경도)로 부터 특정 거리(M) 까지의 게스트 모집글 조회 + */ public List findGamesWithInDistance( final Double latitude, final Double longitude, @@ -216,26 +230,28 @@ public List findGamesWithInDistance( return games.stream() .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) .toList(); } - public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { - final List games = gameRepository.findGamesWithInAddress( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2() - ); - - return games.stream() - .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponses(game, CONFIRMED))) + private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) + .stream() + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) .toList(); } - private List getPositions(final Member member) { + private List getPositionsByMember(final Member member) { final List memberPositions = memberPositionRepository.findAllByMemberId( member.getId()); - return Position.from(memberPositions); + return Position.fromMemberPositions(memberPositions); + } + + private List getPositionsByGame(final Game game) { + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + + return Position.fromGamePositions(gamePositions); } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index f64ac8d4..d672b9f6 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -18,57 +18,60 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public class MemberGameResponse { - private Long id; - private String content; - private LocalDate playDate; - private LocalTime playStartTime; - private LocalTime playEndTime; - private Integer playTimeMinutes; - private String mainAddress; - private String detailAddress; - private Double latitude; - private Double longitude; - private GameStatus status; - private Boolean isReviewDone; - private Integer viewCount; - private Integer cost; - private Integer memberCount; - private Integer maxMemberCount; - private MemberResponse host; - private String addressDepth1; - private String addressDepth2; - private List positions; - private List members; + private Long id; + private String content; + private LocalDate playDate; + private LocalTime playStartTime; + private LocalTime playEndTime; + private Integer playTimeMinutes; + private String mainAddress; + private String detailAddress; + private Double latitude; + private Double longitude; + private GameStatus status; + private Boolean isReviewDone; + private Integer viewCount; + private Integer cost; + private Integer memberCount; + private Integer maxMemberCount; + private MemberResponse host; + private String addressDepth1; + private String addressDepth2; + private List positions; + private List members; - public static MemberGameResponse of( - final GameMember gameMember, - final List memberResponses, - final MemberResponse host - ) { - final Game game = gameMember.getGame(); + public static MemberGameResponse of(final GameMember gameMember, final List memberResponses, List positions) { + final Game game = gameMember.getGame(); - return MemberGameResponse.builder() - .id(game.getId()) - .content(game.getContent()) - .playDate(game.getPlayDate()) - .playStartTime(game.getPlayStartTime()) - .playEndTime(game.getPlayEndTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .mainAddress(game.getMainAddress()) - .detailAddress(game.getDetailAddress()) - .latitude(game.getPoint().getY()) - .longitude(game.getPoint().getX()) - .status(game.getStatus()) - .isReviewDone(gameMember.isAlreadyReviewDone()) - .viewCount(game.getViewCount()) - .cost(game.getCost()) - .memberCount(game.getMemberCount()) - .maxMemberCount(game.getMaxMemberCount()) - .host(host) - .addressDepth1(game.getAddressDepth1().getName()) - .addressDepth2(game.getAddressDepth2().getName()) - .positions(game.getPositions()) - .members(memberResponses) - .build(); - } + return MemberGameResponse.builder() + .id(game.getId()) + .content(game.getContent()) + .playDate(game.getPlayDate()) + .playStartTime(game.getPlayStartTime()) + .playEndTime(game.getPlayEndTime()) + .playTimeMinutes(game.getPlayTimeMinutes()) + .mainAddress(game.getMainAddress()) + .detailAddress(game.getDetailAddress()) + .latitude(game.getPoint().getY()) + .longitude(game.getPoint().getX()) + .status(game.getStatus()) + .isReviewDone(gameMember.isAlreadyReviewDone()) + .viewCount(game.getViewCount()) + .cost(game.getCost()) + .memberCount(game.getMemberCount()) + .maxMemberCount(game.getMaxMemberCount()) + .host(getHostResponse(memberResponses, game.getHost().getId())) + .addressDepth1(game.getAddressDepth1().getName()) + .addressDepth2(game.getAddressDepth2().getName()) + .positions(positions) + .members(memberResponses) + .build(); + } + + private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { + return memberResponses.stream() + .filter(memberResponse -> memberResponse.getId().equals(hostId)) + .findFirst() + .orElseThrow(); + } } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index f03915ac..cb519948 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -11,11 +11,11 @@ public interface MemberRepository extends JpaRepository { - Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); + Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); - Optional findByOauthId(final Long oauthId); + Optional findByOauthId(final Long oauthId); - default Member getMemberById(final Long memberId) { - return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } + default Member getMemberById(final Long memberId) { + return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 6fd43308..b8eb7ff6 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -1,7 +1,6 @@ package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -13,7 +12,6 @@ import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewProfileResponse; -import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; @@ -31,86 +29,85 @@ @Transactional(readOnly = true) public class MemberCrewService { - private final MemberRepository memberRepository; - private final CrewMemberRepository crewMemberRepository; - private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; - - /** - * 사용자가 가입한 크루 목록 조회 - */ - public List findAllCrewsByMemberId( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) - .stream() - .map(CrewMember::getCrew) - .toList(); - - return convertToCrewProfileResponses(crews, memberStatus); - } - - /** - * 사용자가 만든 크루 목록 조회 - */ - public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List crews = crewRepository.findAllByLeaderId(member.getId()); - - return convertToCrewProfileResponses(crews, CONFIRMED); - } - - /** - * 회원의 크루 가입 신청 여부 조회 - */ - public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( - final Long loggedInMemberId, - final Long memberId, - final Long crewId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final CrewMember crewMember = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) - .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - - return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); - } - - private List convertToCrewProfileResponses( - final List crews, - final RegistrationStatus memberStatus - ) { - - return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) - .toList(); - } - - private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { - return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } - - private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } + private final MemberRepository memberRepository; + private final CrewMemberRepository crewMemberRepository; + private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; + + /** + * 사용자가 가입한 크루 목록 조회 + */ + public List findAllCrewsByMemberId( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) + .stream() + .map(CrewMember::getCrew) + .toList(); + + return convertToCrewProfileResponses(crews, memberStatus); + } + + /** + * 사용자가 만든 크루 목록 조회 + */ + public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = crewRepository.findAllByLeaderId(member.getId()); + + return convertToCrewProfileResponses(crews, CONFIRMED); + } + + /** + * 회원의 크루 가입 신청 여부 조회 + */ + public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( + final Long loggedInMemberId, + final Long memberId, + final Long crewId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); + + return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); + } + + private List convertToCrewProfileResponses( + final List crews, + final RegistrationStatus memberStatus + ) { + + return crews.stream() + .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .toList(); + } + + private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { + return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositions(member))) + .toList(); + } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index 0c7285db..f408829a 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -29,96 +29,91 @@ @Transactional(readOnly = true) public class MemberGameService { - private final MemberRepository memberRepository; - private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; - private final MemberPositionRepository memberPositionRepository; - - /** - * 사용자의 참여 확정 게스트 모집글 목록 조회 - */ - public List findAllMemberGames( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), - memberStatus); - - return convertToMemberGameResponses(memberGames, memberStatus); - } - - /** - * 사용자가 만든 게스트 모집글 목록 조회 - */ - public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); - - return convertToMemberGameResponses(memberGames, CONFIRMED); - } - - /** - * 회원의 게스트 모집 신청 여부 조회 - */ - public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( - final Long loggedInMemberId, - final Long memberId, - final Long gameId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final Game game = gameRepository.getGameById(gameId); - - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); - - return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); - } - - private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } - - private List convertToMemberGameResponses( - final List memberGames, - final RegistrationStatus memberStatus - ) { - return memberGames.stream() - .map(memberGame -> - MemberGameResponse.of( - memberGame, - getMemberResponsesByGame(memberGame.getGame(), memberStatus), - getHostResponseByMemberGame(memberGame)) - ) - .toList(); - } - - private MemberResponse getHostResponseByMemberGame(final GameMember memberGame) { - final Member host = memberGame.getMember(); - - return MemberResponse.of(host, getPositions(host)); - } - - private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { - return game.getMembersByStatus(memberStatus) - .stream() - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } + private final MemberRepository memberRepository; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; + private final MemberPositionRepository memberPositionRepository; + + /** + * 사용자의 참여 확정 게스트 모집글 목록 조회 + */ + public List findAllMemberGames( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), + memberStatus); + + return convertToMemberGameResponses(memberGames, memberStatus); + } + + /** + * 사용자가 만든 게스트 모집글 목록 조회 + */ + public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); + + return convertToMemberGameResponses(memberGames, CONFIRMED); + } + + /** + * 회원의 게스트 모집 신청 여부 조회 + */ + public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( + final Long loggedInMemberId, + final Long memberId, + final Long gameId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final Game game = gameRepository.getGameById(gameId); + + final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); + + return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); + } + + private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } + + private List convertToMemberGameResponses( + final List memberGames, + final RegistrationStatus memberStatus + ) { + return memberGames.stream() + .map(memberGame -> + MemberGameResponse.of( + memberGame, + getMemberResponsesByGame(memberGame.getGame(), memberStatus), + getPositionsByMember(memberGame.getMember()) + ) + ) + .toList(); + } + + private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) + .stream() + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index d538b363..9a57566a 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -20,6 +20,8 @@ import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.request.MemberCreateRequest; @@ -37,92 +39,94 @@ @Transactional(readOnly = true) public class MemberService { - private static final String REFRESH_TOKEN_KEY = "refresh_token"; - - private final MemberRepository memberRepository; - private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final RedisRepository redisRepository; - private final AddressService addressService; - private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; - - /** - * 사용자 회원가입 (카카오) - */ - @Transactional - public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { - validateIsDuplicatedMemberInfo(memberCreateRequest); - - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( - memberCreateRequest.getAddressDepth1(), - memberCreateRequest.getAddressDepth2() - ); - - final Member member = memberCreateRequest.toEntity(mainAddressResponse); - final Member savedMember = memberRepository.save(member); - - final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); - - memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ - - final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); - - final RefreshToken refreshToken = RefreshToken.builder() - .token(loginTokens.getRefreshToken()) - .memberId(savedMember.getId()) - .createdAt(LocalDateTime.now()) - .build(); - - redisRepository.saveHash( - REFRESH_TOKEN_KEY, - refreshToken.getToken(), - refreshToken, - jwtProperties.getRefreshTokenExpirationTime() - ); - - return AuthenticatedMemberResponse.of(savedMember, loginTokens); - } - - /** - * 사용자 프로필 조회 - */ - public MemberProfileResponse findMemberProfileById(final Long memberId) { - final Member member = memberRepository.getMemberById(memberId); - final List positions = getPositions(member); - - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) - .stream() - .map(CrewMember::getCrew) - .toList(); - - final List crewResponses = crews.stream() - .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) - .toList(); - - return MemberProfileResponse.of(member, crewResponses, positions); - } - - private MemberResponse getLeaderResponse(final Crew crew) { - final Member member = crew.getLeader(); - - return MemberResponse.of(member, getPositions(member)); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.from(memberPositions); - } - - private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { - final String email = memberCreateRequest.getEmail(); - final String nickname = memberCreateRequest.getNickname(); - final Long oauthId = memberCreateRequest.getOauthId(); - - if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { - throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); - } - } + private static final String REFRESH_TOKEN_KEY = "refresh_token"; + + private final MemberRepository memberRepository; + private final CrewMemberRepository crewMemberRepository; + private final MemberPositionRepository memberPositionRepository; + private final RedisRepository redisRepository; + private final AddressService addressService; + private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; + private final GamePositionRepository gamePositionRepository; + private final GameMemberRepository gameMemberRepository; + + /** + * 사용자 회원가입 (카카오) + */ + @Transactional + public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { + validateIsDuplicatedMemberInfo(memberCreateRequest); + + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + memberCreateRequest.getAddressDepth1(), + memberCreateRequest.getAddressDepth2() + ); + + final Member member = memberCreateRequest.toEntity(mainAddressResponse); + final Member savedMember = memberRepository.save(member); + + final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); + + memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ + + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); + + final RefreshToken refreshToken = RefreshToken.builder() + .token(loginTokens.getRefreshToken()) + .memberId(savedMember.getId()) + .createdAt(LocalDateTime.now()) + .build(); + + redisRepository.saveHash( + REFRESH_TOKEN_KEY, + refreshToken.getToken(), + refreshToken, + jwtProperties.getRefreshTokenExpirationTime() + ); + + return AuthenticatedMemberResponse.of(savedMember, loginTokens); + } + + private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { + final String email = memberCreateRequest.getEmail(); + final String nickname = memberCreateRequest.getNickname(); + final Long oauthId = memberCreateRequest.getOauthId(); + + if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { + throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); + } + } + + /** + * 사용자 프로필 조회 + */ + public MemberProfileResponse findMemberProfileById(final Long memberId) { + final Member member = memberRepository.getMemberById(memberId); + final List positions = getPositionsByMember(member); + + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) + .stream() + .map(CrewMember::getCrew) + .toList(); + + final List crewResponses = crews.stream() + .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) + .toList(); + + return MemberProfileResponse.of(member, crewResponses, positions); + } + + private MemberResponse getLeaderResponse(final Crew crew) { + final Member member = crew.getLeader(); + + return MemberResponse.of(member, getPositionsByMember(member)); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index fe7cef76..8078d5f6 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.exception.PositionException; import lombok.Getter; @@ -21,36 +22,42 @@ @RequiredArgsConstructor public enum Position { - CENTER("센터", "C", "팀의 공격과 수비에서 중추적인 역할"), - POWER_FORWARD("파워 포워드", "PF", "득점, 리바운드, 수비에서의 강인한 플레이를 담당하는 역할"), - SMALL_FORWARD("스몰 포워드", "SF", "공격과 수비 양면에서 다재다능한 역할"), - POINT_GUARD("포인트 가드", "PG", "공격 조직과 전술적인 플레이를 주도하는 주장 역할"), - SHOOTING_GUARD("슈팅 가드", "SG", "주로 3점슛을 통해 팀의 주요 득점 옵션을 담당하는 역할"), - EMPTY("포지션 없음", "없음", "포지션을 별도로 선택하지 않음"), - ; + CENTER("센터", "C", "팀의 공격과 수비에서 중추적인 역할"), + POWER_FORWARD("파워 포워드", "PF", "득점, 리바운드, 수비에서의 강인한 플레이를 담당하는 역할"), + SMALL_FORWARD("스몰 포워드", "SF", "공격과 수비 양면에서 다재다능한 역할"), + POINT_GUARD("포인트 가드", "PG", "공격 조직과 전술적인 플레이를 주도하는 주장 역할"), + SHOOTING_GUARD("슈팅 가드", "SG", "주로 3점슛을 통해 팀의 주요 득점 옵션을 담당하는 역할"), + EMPTY("포지션 없음", "없음", "포지션을 별도로 선택하지 않음"), + ; - private static final Map positionMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(Position::getAcronym, Function.identity()))); + private static final Map positionMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(Position::getAcronym, Function.identity()))); - private final String name; + private final String name; - @JsonValue - private final String acronym; + @JsonValue + private final String acronym; - private final String description; + private final String description; - @JsonCreator - public static Position from(final String positionAcronym) { - if (positionMap.containsKey(positionAcronym)) { - return positionMap.get(positionAcronym); - } + @JsonCreator + public static Position fromGamePositions(final String positionAcronym) { + if (positionMap.containsKey(positionAcronym)) { + return positionMap.get(positionAcronym); + } - throw new PositionException(POSITION_NOT_FOUND, positionAcronym); - } + throw new PositionException(POSITION_NOT_FOUND, positionAcronym); + } - public static List from(final List memberPositions) { - return memberPositions.stream() - .map(MemberPosition::getPosition) - .toList(); - } + public static List fromMemberPositions(final List memberPositions) { + return memberPositions.stream() + .map(MemberPosition::getPosition) + .toList(); + } + + public static List fromGamePositions(final List gamePositions) { + return gamePositions.stream() + .map(GamePosition::getPosition) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/position/util/PositionConverter.java b/src/main/java/kr/pickple/back/position/util/PositionConverter.java index 78ace935..56f10a1d 100644 --- a/src/main/java/kr/pickple/back/position/util/PositionConverter.java +++ b/src/main/java/kr/pickple/back/position/util/PositionConverter.java @@ -7,13 +7,13 @@ @Converter public final class PositionConverter implements AttributeConverter { - @Override - public String convertToDatabaseColumn(final Position position) { - return position.getAcronym(); - } + @Override + public String convertToDatabaseColumn(final Position position) { + return position.getAcronym(); + } - @Override - public Position convertToEntityAttribute(final String acronym) { - return Position.from(acronym); - } + @Override + public Position convertToEntityAttribute(final String acronym) { + return Position.fromGamePositions(acronym); + } } diff --git a/src/test/java/kr/pickple/back/game/service/GameServiceTest.java b/src/test/java/kr/pickple/back/game/service/GameServiceTest.java index 2e9efc8c..7aac58a9 100644 --- a/src/test/java/kr/pickple/back/game/service/GameServiceTest.java +++ b/src/test/java/kr/pickple/back/game/service/GameServiceTest.java @@ -50,7 +50,7 @@ void findGameById_ReturnGameResponse() { given(gameRepository.findById(anyLong())).willReturn(Optional.ofNullable(game)); // when - final GameResponse gameResponse = gameService.findGameDetailsById(1L); + final GameResponse gameResponse = gameService.findGameById(1L); // then assertThat(gameResponse).isNotNull(); From aa2673765ce3d5c1aaa32e0eca23f813d82de631 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 2 Feb 2024 18:07:21 +0900 Subject: [PATCH 012/117] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=84=EC=B2=B4=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8F=AC=EB=A7=A4=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/kakao/KakaoAddressResponse.java | 12 +- .../pickple/back/alarm/config/AsynConfig.java | 7 +- .../alarm/controller/AlarmController.java | 18 +- .../alarm/controller/CrewAlarmController.java | 13 +- .../alarm/controller/GameAlarmController.java | 13 +- .../back/alarm/domain/AlarmExistsStatus.java | 18 +- .../pickple/back/alarm/domain/CrewAlarm.java | 10 +- .../back/alarm/domain/CrewAlarmType.java | 13 +- .../pickple/back/alarm/domain/GameAlarm.java | 10 +- .../back/alarm/domain/GameAlarmType.java | 13 +- .../alarm/dto/response/CrewAlarmResponse.java | 5 +- .../alarm/dto/response/GameAlarmResponse.java | 9 +- .../alarm/exception/AlarmExceptionCode.java | 3 +- .../alarm/handler/CrewAlarmEventHandler.java | 7 +- .../alarm/handler/GameAlarmEventHandler.java | 7 +- .../alarm/repository/CrewAlarmRepository.java | 7 +- .../alarm/repository/GameAlarmRepository.java | 7 +- .../repository/RedisEventCacheRepository.java | 13 +- .../repository/SseEmitterLocalRepository.java | 11 +- .../repository/SseEmitterRepository.java | 4 +- .../back/alarm/service/AlarmService.java | 31 +- .../back/alarm/service/CrewAlarmService.java | 27 +- .../alarm/service/RedisAlarmPublisher.java | 3 +- .../alarm/service/RedisAlarmSubscriber.java | 17 +- .../back/alarm/service/SseEmitterService.java | 13 +- .../pickple/back/alarm/util/CursorResult.java | 4 +- .../back/auth/controller/OauthController.java | 25 +- .../back/auth/service/OauthService.java | 16 +- .../chat/controller/ChatRoomController.java | 2 +- .../chat/exception/ChatExceptionCode.java | 3 +- .../back/chat/service/ChatRoomService.java | 15 +- .../config/property/AsyncProperties.java | 5 +- .../common/config/property/S3Properties.java | 3 +- .../back/common/domain/BaseEntity.java | 11 +- .../back/crew/service/CrewMemberService.java | 300 ++++++------- .../back/crew/service/CrewService.java | 230 +++++----- .../kr/pickple/back/game/domain/Game.java | 4 - .../pickple/back/game/domain/GameMember.java | 18 +- .../game/dto/request/GameCreateRequest.java | 1 - .../back/game/dto/response/GameResponse.java | 3 +- .../game/exception/GameExceptionCode.java | 6 +- .../game/repository/GameMemberRepository.java | 18 +- .../repository/GamePositionRepository.java | 6 +- .../repository/GameSearchRepositoryImpl.java | 158 +++---- .../back/game/service/GameMemberService.java | 328 +++++++------- .../GameReviewMannerScoresService.java | 144 +++--- .../back/game/service/GameService.java | 409 +++++++++--------- .../dto/response/MemberGameResponse.java | 107 ++--- .../member/repository/MemberRepository.java | 10 +- .../member/service/MemberCrewService.java | 162 +++---- .../member/service/MemberGameService.java | 174 ++++---- .../back/member/service/MemberService.java | 180 ++++---- .../back/position/domain/Position.java | 76 ++-- .../back/position/util/PositionConverter.java | 16 +- .../repository/RankingJdbcRepository.java | 8 +- 55 files changed, 1405 insertions(+), 1328 deletions(-) diff --git a/src/main/java/kr/pickple/back/address/dto/kakao/KakaoAddressResponse.java b/src/main/java/kr/pickple/back/address/dto/kakao/KakaoAddressResponse.java index 9cc163cc..8bd7c667 100644 --- a/src/main/java/kr/pickple/back/address/dto/kakao/KakaoAddressResponse.java +++ b/src/main/java/kr/pickple/back/address/dto/kakao/KakaoAddressResponse.java @@ -17,6 +17,12 @@ public class KakaoAddressResponse { private List documents; + public Point toPoint() { + final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); + + return geometryFactory.createPoint(new Coordinate(documents.get(0).x, documents.get(0).y)); + } + @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) static class Document { @@ -25,10 +31,4 @@ static class Document { private Double x; private Double y; } - - public Point toPoint() { - final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); - - return geometryFactory.createPoint(new Coordinate(documents.get(0).x, documents.get(0).y)); - } } diff --git a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java index 2ff06fd1..da891ec0 100644 --- a/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java +++ b/src/main/java/kr/pickple/back/alarm/config/AsynConfig.java @@ -1,13 +1,14 @@ package kr.pickple.back.alarm.config; -import kr.pickple.back.common.config.property.AsyncProperties; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import kr.pickple.back.common.config.property.AsyncProperties; +import lombok.RequiredArgsConstructor; + @Configuration @EnableAsync @RequiredArgsConstructor @@ -25,6 +26,7 @@ public TaskExecutor taskExecutor() { } static class CustomThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { + private CustomThreadPoolTaskExecutor(final int corePoolSize, final int maxPoolSize, final int queueCapacity) { super(); this.setCorePoolSize(corePoolSize); @@ -38,6 +40,7 @@ public static Builder builder() { } public static class Builder { + private int corePoolSize; private int maxPoolSize; private int queueCapacity; diff --git a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java index b64318fd..25e84ef7 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/AlarmController.java @@ -1,18 +1,22 @@ package kr.pickple.back.alarm.controller; +import static org.springframework.http.HttpStatus.*; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; import kr.pickple.back.alarm.dto.response.AlarmResponse; import kr.pickple.back.alarm.service.AlarmService; import kr.pickple.back.alarm.util.CursorResult; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import static org.springframework.http.HttpStatus.NO_CONTENT; -import static org.springframework.http.HttpStatus.OK; @RestController @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java index 12c5d502..cccf8a24 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/CrewAlarmController.java @@ -1,14 +1,19 @@ package kr.pickple.back.alarm.controller; +import static org.springframework.http.HttpStatus.*; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import jakarta.validation.Valid; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.service.CrewAlarmService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import static org.springframework.http.HttpStatus.NO_CONTENT; @RestController @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java index 34be13fe..d6344452 100644 --- a/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java +++ b/src/main/java/kr/pickple/back/alarm/controller/GameAlarmController.java @@ -1,14 +1,19 @@ package kr.pickple.back.alarm.controller; +import static org.springframework.http.HttpStatus.*; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import jakarta.validation.Valid; import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; import kr.pickple.back.alarm.service.GameAlarmService; import kr.pickple.back.auth.config.resolver.Login; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import static org.springframework.http.HttpStatus.NO_CONTENT; @RestController @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java b/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java index 0d3114c9..6cfb7263 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java +++ b/src/main/java/kr/pickple/back/alarm/domain/AlarmExistsStatus.java @@ -1,10 +1,6 @@ package kr.pickple.back.alarm.domain; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.crew.exception.CrewException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.*; import java.util.Collections; import java.util.Map; @@ -12,7 +8,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_EXISTS_STATUS_NOT_FOUND; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import kr.pickple.back.crew.exception.CrewException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor @@ -21,8 +22,9 @@ public enum AlarmExistsStatus { EXISTS("읽지 않은 알람이 있음", true), NOT_EXISTS("읽지 않은 알람이 없음", false); - private static final Map alarmExistsStatusMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(AlarmExistsStatus::getDescription, Function.identity()))); + private static final Map alarmExistsStatusMap = Collections.unmodifiableMap( + Stream.of(values()) + .collect(Collectors.toMap(AlarmExistsStatus::getDescription, Function.identity()))); private final String description; private final Boolean booleanValue; diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index 97d58542..a8a6f71e 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -1,6 +1,14 @@ package kr.pickple.back.alarm.domain; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.CrewAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java index 5c289a5b..5a730a73 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarmType.java @@ -1,10 +1,6 @@ package kr.pickple.back.alarm.domain; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.alarm.exception.AlarmException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.*; import java.util.Collections; import java.util.Map; @@ -12,7 +8,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import kr.pickple.back.alarm.exception.AlarmException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index b5738882..ba0aa8b2 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -1,6 +1,14 @@ package kr.pickple.back.alarm.domain; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.GameAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java index 7ef70be8..f40d98de 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarmType.java @@ -1,10 +1,6 @@ package kr.pickple.back.alarm.domain; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.alarm.exception.AlarmException; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.*; import java.util.Collections; import java.util.Map; @@ -12,7 +8,12 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +import kr.pickple.back.alarm.exception.AlarmException; +import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index 678f1d60..f62a1398 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -1,6 +1,9 @@ package kr.pickple.back.alarm.dto.response; +import java.time.LocalDateTime; + import com.fasterxml.jackson.databind.annotation.JsonSerialize; + import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.domain.CrewAlarmType; import kr.pickple.back.crew.domain.Crew; @@ -8,8 +11,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.time.LocalDateTime; - @Getter @Builder @JsonSerialize diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index a6c35fba..b694576a 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -1,6 +1,11 @@ package kr.pickple.back.alarm.dto.response; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + import com.fasterxml.jackson.databind.annotation.JsonSerialize; + import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.alarm.domain.GameAlarmType; import kr.pickple.back.game.domain.Game; @@ -8,10 +13,6 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; - @Getter @Builder @JsonSerialize diff --git a/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java index 11e742a1..baf1a1f2 100644 --- a/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java +++ b/src/main/java/kr/pickple/back/alarm/exception/AlarmExceptionCode.java @@ -1,9 +1,10 @@ package kr.pickple.back.alarm.exception; +import org.springframework.http.HttpStatus; + import kr.pickple.back.common.exception.ExceptionCode; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java index 474d5f30..6768bcca 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/CrewAlarmEventHandler.java @@ -1,13 +1,14 @@ package kr.pickple.back.alarm.handler; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.service.CrewAlarmService; import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionalEventListener; @Component @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java index e7a7b674..ec827f5d 100644 --- a/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java +++ b/src/main/java/kr/pickple/back/alarm/handler/GameAlarmEventHandler.java @@ -1,13 +1,14 @@ package kr.pickple.back.alarm.handler; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; + import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.alarm.service.GameAlarmService; import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.transaction.event.TransactionalEventListener; @Component @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java index 51c0ab2a..2e82b7cc 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/CrewAlarmRepository.java @@ -1,13 +1,14 @@ package kr.pickple.back.alarm.repository; -import kr.pickple.back.alarm.domain.CrewAlarm; +import java.util.List; +import java.util.Optional; + import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; +import kr.pickple.back.alarm.domain.CrewAlarm; public interface CrewAlarmRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java index 22823773..f8de4cc7 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/GameAlarmRepository.java @@ -1,13 +1,14 @@ package kr.pickple.back.alarm.repository; -import kr.pickple.back.alarm.domain.GameAlarm; +import java.util.List; +import java.util.Optional; + import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.util.List; -import java.util.Optional; +import kr.pickple.back.alarm.domain.GameAlarm; public interface GameAlarmRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/alarm/repository/RedisEventCacheRepository.java b/src/main/java/kr/pickple/back/alarm/repository/RedisEventCacheRepository.java index b2125f77..154fd0bd 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/RedisEventCacheRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/RedisEventCacheRepository.java @@ -1,15 +1,16 @@ package kr.pickple.back.alarm.repository; -import kr.pickple.back.alarm.dto.response.AlarmResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Repository; - import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Repository; + +import kr.pickple.back.alarm.dto.response.AlarmResponse; +import lombok.RequiredArgsConstructor; + @Repository @RequiredArgsConstructor public class RedisEventCacheRepository { @@ -27,7 +28,7 @@ public Map findAllEventCacheByMemberId(final Long memberId) { public List findLatestEventCacheByMemberId(final Long memberId, final int count) { final Map eventCache = findAllEventCacheByMemberId(memberId); return eventCache.values().stream() - .sorted(Comparator.comparing(event -> ((AlarmResponse) event).getCreatedAt()).reversed()) + .sorted(Comparator.comparing(event -> ((AlarmResponse)event).getCreatedAt()).reversed()) .limit(count) .toList(); } diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java index 84ed1b9e..4e6931c8 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterLocalRepository.java @@ -1,14 +1,15 @@ package kr.pickple.back.alarm.repository; -import lombok.NoArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.stereotype.Repository; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.stereotype.Repository; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import lombok.NoArgsConstructor; +import lombok.extern.log4j.Log4j2; + @Log4j2 @Repository @NoArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java index a72bcbc8..2d72df05 100644 --- a/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java +++ b/src/main/java/kr/pickple/back/alarm/repository/SseEmitterRepository.java @@ -1,9 +1,9 @@ package kr.pickple.back.alarm.repository; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - import java.util.Optional; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + public interface SseEmitterRepository { SseEmitter save(final String emitterId, final SseEmitter sseEmitter); diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 5804f2bd..5e56b320 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -1,5 +1,16 @@ package kr.pickple.back.alarm.service; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + import kr.pickple.back.alarm.dto.response.AlarmExistStatusResponse; import kr.pickple.back.alarm.dto.response.AlarmResponse; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; @@ -9,20 +20,11 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; - -import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @RequiredArgsConstructor public class AlarmService { + private final GameAlarmService gameAlarmService; private final CrewAlarmService crewAlarmService; private final MemberRepository memberRepository; @@ -32,12 +34,15 @@ public SseEmitter subscribeToSse(final Long loggedInMemberId) { return sseEmitterService.subscribeToSse(loggedInMemberId); } - public CursorResult findAllAlarms(final Long loggedInMemberId, final Long cursorId, final Integer size) { + public CursorResult findAllAlarms(final Long loggedInMemberId, final Long cursorId, + final Integer size) { final List alarms = new ArrayList<>(); final Integer checkSizeForNextPage = size + 1; - final List crewAlarms = crewAlarmService.findByMemberId(loggedInMemberId, Optional.ofNullable(cursorId), checkSizeForNextPage); - final List gameAlarms = gameAlarmService.findByMemberId(loggedInMemberId, Optional.ofNullable(cursorId), checkSizeForNextPage); + final List crewAlarms = crewAlarmService.findByMemberId(loggedInMemberId, + Optional.ofNullable(cursorId), checkSizeForNextPage); + final List gameAlarms = gameAlarmService.findByMemberId(loggedInMemberId, + Optional.ofNullable(cursorId), checkSizeForNextPage); alarms.addAll(crewAlarms); alarms.addAll(gameAlarms); diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 07777dce..0a5571b6 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -1,5 +1,17 @@ package kr.pickple.back.alarm.service; +import static kr.pickple.back.alarm.domain.CrewAlarmType.*; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; @@ -15,18 +27,6 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; - -import static kr.pickple.back.alarm.domain.CrewAlarmType.*; -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_NOT_FOUND; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_NOT_FOUND; -import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @RequiredArgsConstructor @@ -119,7 +119,8 @@ private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEv } } - public List findByMemberId(final Long loggedInMemberId, final Optional optionalCursorId, final Integer size) { + public List findByMemberId(final Long loggedInMemberId, final Optional optionalCursorId, + final Integer size) { final List crewAlarms = optionalCursorId .map(cursorId -> crewAlarmRepository.findByMemberIdAndIdLessThanOrderByCreatedAtDesc( loggedInMemberId, diff --git a/src/main/java/kr/pickple/back/alarm/service/RedisAlarmPublisher.java b/src/main/java/kr/pickple/back/alarm/service/RedisAlarmPublisher.java index af235813..30325f6f 100644 --- a/src/main/java/kr/pickple/back/alarm/service/RedisAlarmPublisher.java +++ b/src/main/java/kr/pickple/back/alarm/service/RedisAlarmPublisher.java @@ -1,9 +1,10 @@ package kr.pickple.back.alarm.service; -import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; + @Service @RequiredArgsConstructor public class RedisAlarmPublisher implements AlarmPublisher { diff --git a/src/main/java/kr/pickple/back/alarm/service/RedisAlarmSubscriber.java b/src/main/java/kr/pickple/back/alarm/service/RedisAlarmSubscriber.java index cde597e2..d4ba2b15 100644 --- a/src/main/java/kr/pickple/back/alarm/service/RedisAlarmSubscriber.java +++ b/src/main/java/kr/pickple/back/alarm/service/RedisAlarmSubscriber.java @@ -1,20 +1,21 @@ package kr.pickple.back.alarm.service; +import static kr.pickple.back.alarm.exception.AlarmExceptionCode.*; + +import java.util.Map; + +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.stereotype.Service; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; + import kr.pickple.back.alarm.dto.response.AlarmResponse; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.exception.AlarmException; import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.connection.Message; -import org.springframework.data.redis.connection.MessageListener; -import org.springframework.stereotype.Service; - -import java.util.Map; - -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_CONVERT_TYPE_NOT_FOUND; -import static kr.pickple.back.alarm.exception.AlarmExceptionCode.ALARM_TYPE_NOT_FOUND; @Service @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java index dc57c127..ad2a322d 100644 --- a/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java +++ b/src/main/java/kr/pickple/back/alarm/service/SseEmitterService.java @@ -1,15 +1,16 @@ package kr.pickple.back.alarm.service; +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + import kr.pickple.back.alarm.repository.RedisEventCacheRepository; import kr.pickple.back.alarm.repository.SseEmitterRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.io.IOException; -import java.util.List; -import java.util.Optional; @Slf4j @Service diff --git a/src/main/java/kr/pickple/back/alarm/util/CursorResult.java b/src/main/java/kr/pickple/back/alarm/util/CursorResult.java index 358e2bdc..ed0ddade 100644 --- a/src/main/java/kr/pickple/back/alarm/util/CursorResult.java +++ b/src/main/java/kr/pickple/back/alarm/util/CursorResult.java @@ -1,12 +1,12 @@ package kr.pickple.back.alarm.util; +import java.util.List; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @Builder @NoArgsConstructor diff --git a/src/main/java/kr/pickple/back/auth/controller/OauthController.java b/src/main/java/kr/pickple/back/auth/controller/OauthController.java index 111dc8fb..a8e581ec 100644 --- a/src/main/java/kr/pickple/back/auth/controller/OauthController.java +++ b/src/main/java/kr/pickple/back/auth/controller/OauthController.java @@ -1,5 +1,22 @@ package kr.pickple.back.auth.controller; +import static org.springframework.http.HttpHeaders.*; +import static org.springframework.http.HttpStatus.*; + +import java.io.IOException; + +import org.springframework.http.ResponseCookie; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import jakarta.servlet.http.HttpServletResponse; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.Login; @@ -8,14 +25,6 @@ import kr.pickple.back.auth.service.OauthService; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseCookie; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; - -import static org.springframework.http.HttpHeaders.SET_COOKIE; -import static org.springframework.http.HttpStatus.*; @RequiredArgsConstructor @RestController diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index aa368188..fa9fd675 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -1,5 +1,13 @@ package kr.pickple.back.auth.service; +import static kr.pickple.back.auth.exception.AuthExceptionCode.*; + +import java.time.LocalDateTime; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.TokenExtractor; import kr.pickple.back.auth.domain.oauth.OauthMember; @@ -16,14 +24,6 @@ import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Optional; - -import static kr.pickple.back.auth.exception.AuthExceptionCode.AUTH_FAIL_TO_VALIDATE_TOKEN; -import static kr.pickple.back.auth.exception.AuthExceptionCode.AUTH_INVALID_REFRESH_TOKEN; @Service @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java index 1b7a7a27..f1c9169b 100644 --- a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java +++ b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java @@ -17,8 +17,8 @@ import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; -import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; +import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; import kr.pickple.back.chat.service.ChatRoomFindService; import kr.pickple.back.chat.service.ChatRoomService; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/pickple/back/chat/exception/ChatExceptionCode.java b/src/main/java/kr/pickple/back/chat/exception/ChatExceptionCode.java index 5b7299fd..ad06ed06 100644 --- a/src/main/java/kr/pickple/back/chat/exception/ChatExceptionCode.java +++ b/src/main/java/kr/pickple/back/chat/exception/ChatExceptionCode.java @@ -18,7 +18,8 @@ public enum ChatExceptionCode implements ExceptionCode { CHAT_MEMBER_IS_ALREADY_IN_ROOM(HttpStatus.BAD_REQUEST, "CHT-006", "해당 채팅방에 이미 존재하는 사용자"), CHAT_MEMBER_IS_NOT_IN_ROOM(HttpStatus.BAD_REQUEST, "CHT-007", "해당 채팅방에 존재하지 않는 사용자"), CHAT_MEMBER_CANNOT_CHAT_SELF(HttpStatus.BAD_REQUEST, "CHT-008", "사용자는 자기 자신과 채팅할 수 없음"), - CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT(HttpStatus.BAD_REQUEST, "CHT-009", "채팅방 인원제한은 현재 인원수 이상이어야함"), + CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT(HttpStatus.BAD_REQUEST, "CHT-009", + "채팅방 인원제한은 현재 인원수 이상이어야함"), CHAT_CREW_NOT_FOUND(HttpStatus.NOT_FOUND, "CHT-010", "해당 채팅방을 소유한 크루 정보를 찾을 수 없음"), CHAT_GAME_NOT_FOUND(HttpStatus.NOT_FOUND, "CHT-011", "해당 채팅방을 소유한 게스트 모집글 정보를 찾을 수 없음"), CHAT_RECEIVER_NOT_FOUND(HttpStatus.NOT_FOUND, "CHT-012", "해당 1:1 채팅방에 나를 제외한 사용자가 존재하지 않음"), diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index 79051c68..c3490367 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -1,5 +1,13 @@ package kr.pickple.back.chat.service; +import static java.text.MessageFormat.*; +import static kr.pickple.back.chat.domain.RoomType.*; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.RoomType; @@ -13,13 +21,6 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import static java.text.MessageFormat.format; -import static kr.pickple.back.chat.domain.RoomType.PERSONAL; -import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_ROOM_NOT_FOUND; -import static kr.pickple.back.member.exception.MemberExceptionCode.MEMBER_NOT_FOUND; @Service @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/common/config/property/AsyncProperties.java b/src/main/java/kr/pickple/back/common/config/property/AsyncProperties.java index d458d78f..7fae39c3 100644 --- a/src/main/java/kr/pickple/back/common/config/property/AsyncProperties.java +++ b/src/main/java/kr/pickple/back/common/config/property/AsyncProperties.java @@ -1,11 +1,12 @@ package kr.pickple.back.common.config.property; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; @Getter @Setter diff --git a/src/main/java/kr/pickple/back/common/config/property/S3Properties.java b/src/main/java/kr/pickple/back/common/config/property/S3Properties.java index 1cee2921..74c4d96f 100644 --- a/src/main/java/kr/pickple/back/common/config/property/S3Properties.java +++ b/src/main/java/kr/pickple/back/common/config/property/S3Properties.java @@ -1,8 +1,9 @@ package kr.pickple.back.common.config.property; +import org.springframework.boot.context.properties.ConfigurationProperties; + import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.boot.context.properties.ConfigurationProperties; @Getter @RequiredArgsConstructor diff --git a/src/main/java/kr/pickple/back/common/domain/BaseEntity.java b/src/main/java/kr/pickple/back/common/domain/BaseEntity.java index 7c6236ac..e676c6ad 100644 --- a/src/main/java/kr/pickple/back/common/domain/BaseEntity.java +++ b/src/main/java/kr/pickple/back/common/domain/BaseEntity.java @@ -1,14 +1,15 @@ package kr.pickple.back.common.domain; -import jakarta.persistence.Column; -import jakarta.persistence.EntityListeners; -import jakarta.persistence.MappedSuperclass; -import lombok.Getter; +import java.time.LocalDateTime; + import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; @Getter @MappedSuperclass diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index e7cc1f2b..8634bfa7 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -34,154 +34,154 @@ @Transactional(readOnly = true) public class CrewMemberService { - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; - private final CrewMemberRepository crewMemberRepository; - private final ChatMessageService chatMessageService; - private final ApplicationEventPublisher eventPublisher; - - /** - * 크루 가입 신청 - */ - @Transactional - public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final Crew crew = crewRepository.getCrewById(crewId); - final Member member = memberRepository.getMemberById(loggedInMemberId); - - validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); - - final CrewMember newCrewMember = CrewMember.builder() - .member(member) - .crew(crew) - .build(); - - crewMemberRepository.save(newCrewMember); - - eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() - .crewId(crewId) - .memberId(crew.getLeader().getId()) - .build()); - } - - private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { - if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); - } - } - - /** - * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 - */ - public CrewProfileResponse findAllCrewMembers( - final Long loggedInMemberId, - final Long crewId, - final RegistrationStatus status - ) { - final Crew crew = crewRepository.getCrewById(crewId); - - validateIsLeader(loggedInMemberId, crew); - - final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) - .toList(); - - return CrewProfileResponse.of(crew, memberResponses); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - /** - * 크루 가입 신청 수락 - */ - @Transactional - public void updateCrewMemberRegistrationStatus( - final Long loggedInMemberId, - final Long crewId, - final Long memberId, - final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest - ) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); - - validateIsLeader(loggedInMemberId, crew); - - final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); - enterCrewChatRoom(updateStatus, crewMember); - - crewMember.updateStatus(updateStatus); - - eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() - .crewId(crewId) - .memberId(memberId) - .build()); - } - - private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { - if (!crew.isLeader(loggedInMemberId)) { - throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); - } - } - - private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { - final RegistrationStatus nowStatus = crewMember.getStatus(); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), crewMember.getMember()); - } - } - - /** - * 크루원 가입 신청 거절/취소 - */ - @Transactional - public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); - - if (crew.isLeader(loggedInMemberId)) { - validateIsLeaderSelfDeleted(loggedInMemberId, memberId); - - eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() - .crewId(crewId) - .memberId(memberId) - .build()); - - deleteCrewMember(crewMember); - - return; - } - - if (loggedInMemberId.equals(memberId)) { - cancelCrewMember(crewMember); - return; - } - - throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); - } - - private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { - if (loggedInMemberId.equals(memberId)) { - throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); - } - } - - private void cancelCrewMember(final CrewMember crewMember) { - if (crewMember.getStatus() != WAITING) { - throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); - } - - deleteCrewMember(crewMember); - } - - private void deleteCrewMember(final CrewMember crewMember) { - crewMemberRepository.delete(crewMember); - } + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; + private final CrewMemberRepository crewMemberRepository; + private final ChatMessageService chatMessageService; + private final ApplicationEventPublisher eventPublisher; + + /** + * 크루 가입 신청 + */ + @Transactional + public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { + final Crew crew = crewRepository.getCrewById(crewId); + final Member member = memberRepository.getMemberById(loggedInMemberId); + + validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); + + final CrewMember newCrewMember = CrewMember.builder() + .member(member) + .crew(crew) + .build(); + + crewMemberRepository.save(newCrewMember); + + eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() + .crewId(crewId) + .memberId(crew.getLeader().getId()) + .build()); + } + + private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { + if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); + } + } + + /** + * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 + */ + public CrewProfileResponse findAllCrewMembers( + final Long loggedInMemberId, + final Long crewId, + final RegistrationStatus status + ) { + final Crew crew = crewRepository.getCrewById(crewId); + + validateIsLeader(loggedInMemberId, crew); + + final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + + return CrewProfileResponse.of(crew, memberResponses); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + /** + * 크루 가입 신청 수락 + */ + @Transactional + public void updateCrewMemberRegistrationStatus( + final Long loggedInMemberId, + final Long crewId, + final Long memberId, + final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest + ) { + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final Crew crew = crewMember.getCrew(); + + validateIsLeader(loggedInMemberId, crew); + + final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); + enterCrewChatRoom(updateStatus, crewMember); + + crewMember.updateStatus(updateStatus); + + eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); + } + + private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { + if (!crew.isLeader(loggedInMemberId)) { + throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); + } + } + + private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { + final RegistrationStatus nowStatus = crewMember.getStatus(); + + if (nowStatus == WAITING && updateStatus == CONFIRMED) { + chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), crewMember.getMember()); + } + } + + /** + * 크루원 가입 신청 거절/취소 + */ + @Transactional + public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final Crew crew = crewMember.getCrew(); + + if (crew.isLeader(loggedInMemberId)) { + validateIsLeaderSelfDeleted(loggedInMemberId, memberId); + + eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() + .crewId(crewId) + .memberId(memberId) + .build()); + + deleteCrewMember(crewMember); + + return; + } + + if (loggedInMemberId.equals(memberId)) { + cancelCrewMember(crewMember); + return; + } + + throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); + } + + private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { + if (loggedInMemberId.equals(memberId)) { + throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); + } + } + + private void cancelCrewMember(final CrewMember crewMember) { + if (crewMember.getStatus() != WAITING) { + throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); + } + + deleteCrewMember(crewMember); + } + + private void deleteCrewMember(final CrewMember crewMember) { + crewMemberRepository.delete(crewMember); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index fd721776..4521a822 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -39,119 +39,119 @@ @Transactional(readOnly = true) public class CrewService { - private static final Integer CREW_IMAGE_START_NUMBER = 1; - private static final Integer CREW_IMAGE_END_NUMBER = 20; - private static final Integer CREW_CREATE_MAX_SIZE = 3; - - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final AddressService addressService; - private final ChatRoomService chatRoomService; - private final S3Properties s3Properties; - - /** - * 크루 생성 - */ - @Transactional - public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { - validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); - - final Member leader = memberRepository.getMemberById(loggedInMemberId); - - validateMemberCreatedCrewsCount(leader); - - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( - crewCreateRequest.getAddressDepth1(), - crewCreateRequest.getAddressDepth2() - ); - - final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( - CREW_IMAGE_START_NUMBER, - CREW_IMAGE_END_NUMBER - ); - - final Crew crew = crewCreateRequest.toEntity( - leader, - mainAddressResponse, - MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), - MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) - ); - - final CrewMember crewLeader = CrewMember.builder() - .member(leader) - .crew(crew) - .build(); - - crewLeader.confirmRegistration(); - - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); - crew.makeNewCrewChatRoom(chatRoom); - - final Long crewId = crewRepository.save(crew).getId(); - crewMemberRepository.save(crewLeader); - - return CrewIdResponse.from(crewId); - } - - private void validateIsDuplicatedCrewInfo(final String name) { - if (crewRepository.existsByName(name)) { - throw new CrewException(CREW_IS_EXISTED, name); - } - } - - private void validateMemberCreatedCrewsCount(final Member leader) { - final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); - - if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { - throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); - } - } - - /** - * 크루 상세 조회 - */ - public CrewProfileResponse findCrewById(final Long crewId) { - final Crew crew = crewRepository.getCrewById(crewId); - - return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); - } - - /** - * 사용자 근처 크루 목록 조회 - */ - public List findCrewsByAddress( - final String addressDepth1, - final String addressDepth2, - final Pageable pageable - ) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, - addressDepth2); - - final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), - pageable - ); - - return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) - .toList(); - } - - private List getConfirmedMemberResponses(final Long crewId) { - return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } + private static final Integer CREW_IMAGE_START_NUMBER = 1; + private static final Integer CREW_IMAGE_END_NUMBER = 20; + private static final Integer CREW_CREATE_MAX_SIZE = 3; + + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; + private final MemberPositionRepository memberPositionRepository; + private final AddressService addressService; + private final ChatRoomService chatRoomService; + private final S3Properties s3Properties; + + /** + * 크루 생성 + */ + @Transactional + public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { + validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); + + final Member leader = memberRepository.getMemberById(loggedInMemberId); + + validateMemberCreatedCrewsCount(leader); + + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + crewCreateRequest.getAddressDepth1(), + crewCreateRequest.getAddressDepth2() + ); + + final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( + CREW_IMAGE_START_NUMBER, + CREW_IMAGE_END_NUMBER + ); + + final Crew crew = crewCreateRequest.toEntity( + leader, + mainAddressResponse, + MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), + MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) + ); + + final CrewMember crewLeader = CrewMember.builder() + .member(leader) + .crew(crew) + .build(); + + crewLeader.confirmRegistration(); + + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); + crew.makeNewCrewChatRoom(chatRoom); + + final Long crewId = crewRepository.save(crew).getId(); + crewMemberRepository.save(crewLeader); + + return CrewIdResponse.from(crewId); + } + + private void validateIsDuplicatedCrewInfo(final String name) { + if (crewRepository.existsByName(name)) { + throw new CrewException(CREW_IS_EXISTED, name); + } + } + + private void validateMemberCreatedCrewsCount(final Member leader) { + final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); + + if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { + throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); + } + } + + /** + * 크루 상세 조회 + */ + public CrewProfileResponse findCrewById(final Long crewId) { + final Crew crew = crewRepository.getCrewById(crewId); + + return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); + } + + /** + * 사용자 근처 크루 목록 조회 + */ + public List findCrewsByAddress( + final String addressDepth1, + final String addressDepth2, + final Pageable pageable + ) { + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, + addressDepth2); + + final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2(), + pageable + ); + + return crews.stream() + .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) + .toList(); + } + + private List getConfirmedMemberResponses(final Long crewId) { + return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index 2e345313..18ff9aa7 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -6,13 +6,11 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.List; import org.locationtech.jts.geom.Point; import jakarta.persistence.Column; import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -26,11 +24,9 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.util.GameStatusConverter; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 5bcce6cc..9e81d69d 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -1,6 +1,17 @@ package kr.pickple.back.game.domain; -import jakarta.persistence.*; +import static java.lang.Boolean.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; @@ -12,11 +23,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import static java.lang.Boolean.FALSE; -import static java.lang.Boolean.TRUE; -import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; -import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; - @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index 4b569c8c..6739a450 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -19,7 +19,6 @@ import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index a85edaed..7ff61aaa 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -39,7 +39,8 @@ public class GameResponse { private List positions; private List members; - public static GameResponse of(final Game game, final List memberResponses, List positions) { + public static GameResponse of(final Game game, final List memberResponses, + List positions) { return GameResponse.builder() .id(game.getId()) .content(game.getContent()) diff --git a/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java b/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java index c0baaa65..68b41326 100644 --- a/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java +++ b/src/main/java/kr/pickple/back/game/exception/GameExceptionCode.java @@ -1,9 +1,10 @@ package kr.pickple.back.game.exception; +import org.springframework.http.HttpStatus; + import kr.pickple.back.common.exception.ExceptionCode; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; @Getter @RequiredArgsConstructor @@ -17,7 +18,8 @@ public enum GameExceptionCode implements ExceptionCode { GAME_SEARCH_CATEGORY_IS_INVALID(HttpStatus.BAD_REQUEST, "GAM-006", "게스트 모집글의 검색 카테고리 키워드가 유효하지 않음"), GAME_MEMBER_IS_NOT_HOST(HttpStatus.FORBIDDEN, "GAM-007", "해당 게스트 모집글의 호스트 권한이 필요함"), GAME_HOST_CANNOT_BE_DELETED(HttpStatus.BAD_REQUEST, "GAM-008", "호스트는 자신의 게스트 모집글에서 삭제될 수 없음"), - GAME_MEMBER_STATUS_IS_NOT_WAITING(HttpStatus.BAD_REQUEST, "GAM-009", "해당 게스트 모집글에 참여 신청 대기 상태가 아니라면, 참여 신청을 취소할 수 없음"), + GAME_MEMBER_STATUS_IS_NOT_WAITING(HttpStatus.BAD_REQUEST, "GAM-009", + "해당 게스트 모집글에 참여 신청 대기 상태가 아니라면, 참여 신청을 취소할 수 없음"), GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER(HttpStatus.FORBIDDEN, "GAM-010", "해당 사용자의 게스트 모집글 참여 신청을 거절 혹은 취소할 권한이 필요함"), GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD(HttpStatus.BAD_REQUEST, "GAM-011", "리뷰 가능 기간이 아님 (경기 종료 후부터 7일)"), GAME_MEMBER_CANNOT_REVIEW_SELF(HttpStatus.BAD_REQUEST, "GAM-012", "자기 자신에게 리뷰를 남길 수 없음"), diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index a427af09..5805ee34 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -10,17 +10,17 @@ public interface GameMemberRepository extends JpaRepository { - Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); + Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); - Optional findByMemberIdAndGameIdAndStatus( - final Long memberId, - final Long gameId, - final RegistrationStatus status - ); + Optional findByMemberIdAndGameIdAndStatus( + final Long memberId, + final Long gameId, + final RegistrationStatus status + ); - List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); + List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); - List findAllByMemberId(final Long memberId); + List findAllByMemberId(final Long memberId); - List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); + List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); } diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java index 1766361d..9ca9cd1c 100644 --- a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java @@ -1,13 +1,13 @@ package kr.pickple.back.game.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; import kr.pickple.back.game.domain.GamePosition; -import java.util.List; - public interface GamePositionRepository extends JpaRepository { - List findAllByGameId(final Long gameId); + List findAllByGameId(final Long gameId); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java index ced27234..dbd46f25 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java @@ -18,83 +18,83 @@ @RequiredArgsConstructor public class GameSearchRepositoryImpl implements GameSearchRepository { - private final JPAQueryFactory jpaQueryFactory; - - @Override - public List findGamesWithInDistance( - final Double latitude, - final Double longitude, - final Double distance - ) { - final String pointWKT = String.format("POINT(%s %s)", latitude, longitude); - - return jpaQueryFactory - .selectFrom(game) - .join(game.host).fetchJoin() - .join(game.addressDepth1).fetchJoin() - .join(game.addressDepth2).fetchJoin() - .where(isWithInDistance(pointWKT, distance)) - .orderBy(getOrderByDistance(pointWKT)) - .fetch(); - } - - private BooleanExpression isWithInDistance(final String pointWKT, final Double distance) { - return Expressions.booleanTemplate( - "ST_Contains(ST_Buffer(ST_GeomFromText({0}, 4326), {1}), point)", - pointWKT, - distance - ); - } - - private OrderSpecifier getOrderByDistance(final String pointWKT) { - return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", - pointWKT - ) - .asc(); - } - - @Override - public List findGamesWithInAddress( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 - ) { - return jpaQueryFactory - .select(game) - .from(game) - .join(mapPolygon).on(isWithInAddress()) - .where(isAddress(addressDepth1, addressDepth2)) - .orderBy(getOrderByAddress()) - .fetch(); - } - - private BooleanExpression isWithInAddress() { - return Expressions.booleanTemplate( - "ST_Contains({0}, {1})", - mapPolygon.polygon, - game.point - ); - } - - private BooleanExpression isAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2) { - return isAddressDepth1(addressDepth1).and(isAddressDepth2(addressDepth2)); - } - - private BooleanExpression isAddressDepth1(final AddressDepth1 addressDepth1) { - return mapPolygon.addressDepth1.eq(addressDepth1); - } - - private BooleanExpression isAddressDepth2(final AddressDepth2 addressDepth2) { - return mapPolygon.addressDepth2.eq(addressDepth2); - } - - private OrderSpecifier getOrderByAddress() { - return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", - game.point, mapPolygon.latitude, mapPolygon.longitude - ) - .asc(); - } + private final JPAQueryFactory jpaQueryFactory; + + @Override + public List findGamesWithInDistance( + final Double latitude, + final Double longitude, + final Double distance + ) { + final String pointWKT = String.format("POINT(%s %s)", latitude, longitude); + + return jpaQueryFactory + .selectFrom(game) + .join(game.host).fetchJoin() + .join(game.addressDepth1).fetchJoin() + .join(game.addressDepth2).fetchJoin() + .where(isWithInDistance(pointWKT, distance)) + .orderBy(getOrderByDistance(pointWKT)) + .fetch(); + } + + private BooleanExpression isWithInDistance(final String pointWKT, final Double distance) { + return Expressions.booleanTemplate( + "ST_Contains(ST_Buffer(ST_GeomFromText({0}, 4326), {1}), point)", + pointWKT, + distance + ); + } + + private OrderSpecifier getOrderByDistance(final String pointWKT) { + return Expressions.numberTemplate( + Double.class, + "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", + pointWKT + ) + .asc(); + } + + @Override + public List findGamesWithInAddress( + final AddressDepth1 addressDepth1, + final AddressDepth2 addressDepth2 + ) { + return jpaQueryFactory + .select(game) + .from(game) + .join(mapPolygon).on(isWithInAddress()) + .where(isAddress(addressDepth1, addressDepth2)) + .orderBy(getOrderByAddress()) + .fetch(); + } + + private BooleanExpression isWithInAddress() { + return Expressions.booleanTemplate( + "ST_Contains({0}, {1})", + mapPolygon.polygon, + game.point + ); + } + + private BooleanExpression isAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2) { + return isAddressDepth1(addressDepth1).and(isAddressDepth2(addressDepth2)); + } + + private BooleanExpression isAddressDepth1(final AddressDepth1 addressDepth1) { + return mapPolygon.addressDepth1.eq(addressDepth1); + } + + private BooleanExpression isAddressDepth2(final AddressDepth2 addressDepth2) { + return mapPolygon.addressDepth2.eq(addressDepth2); + } + + private OrderSpecifier getOrderByAddress() { + return Expressions.numberTemplate( + Double.class, + "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", + game.point, mapPolygon.latitude, mapPolygon.longitude + ) + .asc(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 610a2599..fd6ccc7d 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -36,173 +36,173 @@ @RequiredArgsConstructor public class GameMemberService { - private final GameRepository gameRepository; - private final MemberRepository memberRepository; - private final MemberPositionRepository memberPositionRepository; - private final ChatMessageService chatMessageService; - private final ApplicationEventPublisher eventPublisher; - private final GameMemberRepository gameMemberRepository; - private final GamePositionRepository gamePositionRepository; - - @Transactional - public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final Game game = gameRepository.getGameById(gameId); - final Member member = memberRepository.getMemberById(loggedInMemberId); - - validateIsAlreadyRegisteredGameMember(game, member); - final GameMember gameMember = buildGameMember(game, member); - gameMemberRepository.save(gameMember); - - eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() - .gameId(gameId) - .memberId(game.getHost().getId()) - .build()); - } - - private void validateIsAlreadyRegisteredGameMember(final Game game, final Member member) { - if (isAlreadyRegistered(game, member)) { - throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); - } - } - - private boolean isAlreadyRegistered(final Game game, final Member member) { - return gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()).isPresent(); - } - - private GameMember buildGameMember(final Game game, final Member member) { - return GameMember.builder() - .member(member) - .game(game) - .build(); - } - - public GameResponse findAllGameMembers( - final Long loggedInMemberId, - final Long gameId, - final RegistrationStatus status - ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); - - if (!game.isHost(loggedInMember) && status == WAITING) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } - - return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game)); - } - - private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) - .stream() - .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - private List getPositionsByGame(final Game game) { - final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); - - return Position.fromGamePositions(gamePositions); - } - - private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { - return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); - } - - @Transactional - public void updateGameMemberRegistrationStatus( - final Long loggedInMemberId, - final Long gameId, - final Long memberId, - final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest - ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); - - validateIsHost(loggedInMemberId, game); - - final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); - enterGameChatRoom(updateStatus, gameMember); - - gameMember.updateStatus(updateStatus); - - eventPublisher.publishEvent(GameMemberJoinedEvent.builder() - .gameId(gameId) - .memberId(memberId) - .build()); - } - - private void validateIsHost(final Long loggedInMemberId, final Game game) { - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - - if (!game.isHost(loggedInMember)) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } - } - - private void enterGameChatRoom(final RegistrationStatus updateStatus, final GameMember gameMember) { - final RegistrationStatus nowStatus = gameMember.getStatus(); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(gameMember.getCrewChatRoom(), gameMember.getMember()); - } - } - - @Transactional - public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); - final Member member = gameMember.getMember(); - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - - if (game.isHost(loggedInMember)) { - validateIsHostSelfDeleted(loggedInMember, member); - - eventPublisher.publishEvent(GameMemberRejectedEvent.builder() - .gameId(gameId) - .memberId(memberId) - .build()); - - deleteGameMember(gameMember); - - return; - } - - if (loggedInMember.equals(member)) { - cancelGameMember(gameMember); - - return; - } + private final GameRepository gameRepository; + private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; + private final ChatMessageService chatMessageService; + private final ApplicationEventPublisher eventPublisher; + private final GameMemberRepository gameMemberRepository; + private final GamePositionRepository gamePositionRepository; + + @Transactional + public void registerGameMember(final Long gameId, final Long loggedInMemberId) { + final Game game = gameRepository.getGameById(gameId); + final Member member = memberRepository.getMemberById(loggedInMemberId); + + validateIsAlreadyRegisteredGameMember(game, member); + final GameMember gameMember = buildGameMember(game, member); + gameMemberRepository.save(gameMember); + + eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() + .gameId(gameId) + .memberId(game.getHost().getId()) + .build()); + } + + private void validateIsAlreadyRegisteredGameMember(final Game game, final Member member) { + if (isAlreadyRegistered(game, member)) { + throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); + } + } + + private boolean isAlreadyRegistered(final Game game, final Member member) { + return gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()).isPresent(); + } + + private GameMember buildGameMember(final Game game, final Member member) { + return GameMember.builder() + .member(member) + .game(game) + .build(); + } + + public GameResponse findAllGameMembers( + final Long loggedInMemberId, + final Long gameId, + final RegistrationStatus status + ) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); + final Game game = gameMember.getGame(); + final Member loggedInMember = gameMember.getMember(); + + if (!game.isHost(loggedInMember) && status == WAITING) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); + } + + return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game)); + } + + private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) + .stream() + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + private List getPositionsByGame(final Game game) { + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + + return Position.fromGamePositions(gamePositions); + } + + private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { + return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + } + + @Transactional + public void updateGameMemberRegistrationStatus( + final Long loggedInMemberId, + final Long gameId, + final Long memberId, + final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest + ) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); + final Game game = gameMember.getGame(); + + validateIsHost(loggedInMemberId, game); + + final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); + enterGameChatRoom(updateStatus, gameMember); + + gameMember.updateStatus(updateStatus); + + eventPublisher.publishEvent(GameMemberJoinedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); + } + + private void validateIsHost(final Long loggedInMemberId, final Game game) { + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); + + if (!game.isHost(loggedInMember)) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); + } + } + + private void enterGameChatRoom(final RegistrationStatus updateStatus, final GameMember gameMember) { + final RegistrationStatus nowStatus = gameMember.getStatus(); + + if (nowStatus == WAITING && updateStatus == CONFIRMED) { + chatMessageService.enterRoomAndSaveEnteringMessages(gameMember.getCrewChatRoom(), gameMember.getMember()); + } + } + + @Transactional + public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { + final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); + final Game game = gameMember.getGame(); + final Member member = gameMember.getMember(); + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); + + if (game.isHost(loggedInMember)) { + validateIsHostSelfDeleted(loggedInMember, member); + + eventPublisher.publishEvent(GameMemberRejectedEvent.builder() + .gameId(gameId) + .memberId(memberId) + .build()); + + deleteGameMember(gameMember); + + return; + } + + if (loggedInMember.equals(member)) { + cancelGameMember(gameMember); + + return; + } - throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); - } - - private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { - if (loggedInMember.equals(member)) { - throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); - } - } + throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); + } + + private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { + if (loggedInMember.equals(member)) { + throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); + } + } - private void cancelGameMember(final GameMember gameMember) { - RegistrationStatus status = gameMember.getStatus(); + private void cancelGameMember(final GameMember gameMember) { + RegistrationStatus status = gameMember.getStatus(); - if (status != WAITING) { - throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); - } + if (status != WAITING) { + throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); + } - deleteGameMember(gameMember); - } + deleteGameMember(gameMember); + } - private void deleteGameMember(final GameMember gameMember) { - gameMemberRepository.delete(gameMember); - } + private void deleteGameMember(final GameMember gameMember) { + gameMemberRepository.delete(gameMember); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 1cd2e9fa..5faf479e 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -23,76 +23,76 @@ @Transactional(readOnly = true) public class GameReviewMannerScoresService { - private static final int REVIEW_POSSIBLE_DAYS = 7; - - private final GameMemberRepository gameMemberRepository; - - @Transactional - public void reviewMannerScores( - final Long loggedInMemberId, - final Long gameId, - final List mannerScoreReviews - ) { - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameIdAndStatus( - loggedInMemberId, - gameId, - CONFIRMED - ) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); - - if (gameMember.isAlreadyReviewDone()) { - throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); - } - - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); - - if (isNotReviewPeriod(game)) { - throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), - game.getPlayEndTime()); - } - - mannerScoreReviews.forEach(review -> { - final Member reviewedMember = getReviewedMember(game, review.getMemberId()); - validateIsSelfReview(loggedInMember, reviewedMember); - reviewedMember.updateMannerScore(review.getMannerScore()); - }); - - gameMember.updateReviewDone(); - } - - private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { - if (loggedInMember.equals(reviewedMember)) { - throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getId(), reviewedMember.getId()); - } - } - - private Boolean isNotReviewPeriod(final Game game) { - return isBeforeThanPlayEndTime(game) || isAfterReviewPossibleTime(game); - } - - private Boolean isBeforeThanPlayEndTime(final Game game) { - return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); - } - - private Boolean isAfterReviewPossibleTime(final Game game) { - final LocalDateTime reviewDeadlineDatetime = game.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); - - return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); - } - - private Member getReviewedMember(final Game game, final Long reviewedMemberId) { - return getConfirmedMembers(game) - .stream() - .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) - .findFirst() - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); - } - - private List getConfirmedMembers(Game game) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), CONFIRMED) - .stream() - .map(GameMember::getMember) - .toList(); - } + private static final int REVIEW_POSSIBLE_DAYS = 7; + + private final GameMemberRepository gameMemberRepository; + + @Transactional + public void reviewMannerScores( + final Long loggedInMemberId, + final Long gameId, + final List mannerScoreReviews + ) { + final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameIdAndStatus( + loggedInMemberId, + gameId, + CONFIRMED + ) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); + + if (gameMember.isAlreadyReviewDone()) { + throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); + } + + final Game game = gameMember.getGame(); + final Member loggedInMember = gameMember.getMember(); + + if (isNotReviewPeriod(game)) { + throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), + game.getPlayEndTime()); + } + + mannerScoreReviews.forEach(review -> { + final Member reviewedMember = getReviewedMember(game, review.getMemberId()); + validateIsSelfReview(loggedInMember, reviewedMember); + reviewedMember.updateMannerScore(review.getMannerScore()); + }); + + gameMember.updateReviewDone(); + } + + private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { + if (loggedInMember.equals(reviewedMember)) { + throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getId(), reviewedMember.getId()); + } + } + + private Boolean isNotReviewPeriod(final Game game) { + return isBeforeThanPlayEndTime(game) || isAfterReviewPossibleTime(game); + } + + private Boolean isBeforeThanPlayEndTime(final Game game) { + return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); + } + + private Boolean isAfterReviewPossibleTime(final Game game) { + final LocalDateTime reviewDeadlineDatetime = game.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); + + return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); + } + + private Member getReviewedMember(final Game game, final Long reviewedMemberId) { + return getConfirmedMembers(game) + .stream() + .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) + .findFirst() + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); + } + + private List getConfirmedMembers(Game game) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), CONFIRMED) + .stream() + .map(GameMember::getMember) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index be6ff383..9b3e5f6a 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -51,207 +51,210 @@ @Transactional(readOnly = true) public class GameService { - private final GameRepository gameRepository; - private final MemberPositionRepository memberPositionRepository; - private final MemberRepository memberRepository; - private final KakaoAddressSearchClient kakaoAddressSearchClient; - private final AddressService addressService; - private final ChatRoomService chatRoomService; - private final RedisRepository redisRepository; - private final GamePositionRepository gamePositionRepository; - private final GameMemberRepository gameMemberRepository; - - /** - * 게임 생성 - */ - @Transactional - public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final Member host = memberRepository.getMemberById(loggedInMemberId); - final Point point = kakaoAddressSearchClient.fetchAddress( - gameCreateRequest.getMainAddress()); - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( - gameCreateRequest.getMainAddress()); - - final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); - - final GameMember gameHost = GameMember.builder() - .member(host) - .game(game) - .build(); - gameHost.confirmRegistration(); - - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); - game.makeNewCrewChatRoom(chatRoom); - - final Game savedGame = gameRepository.save(game); - final List gamePositions = gameCreateRequest.toGamePositionEntities(savedGame); - gamePositionRepository.saveAll(gamePositions); - - final Long savedGameId = savedGame.getId(); - saveGameStatusUpdateEventToRedis(game, savedGameId); - - return GameIdResponse.from(savedGameId); - } - - private String makeGameRoomName(final Game game) { - final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); - final String addressDepth2Name = game.getAddressDepth2().getName(); - - return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); - } - - private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { - final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); - - // 경기를 생성한 시각과 경기 시작 시간의 차 - final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, game); - - // 경기를 생성한 시각과 경기 종료 시간의 차 - final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, game); - - final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, savedGameId); - final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, savedGameId); - - redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); - redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); - } - - private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gamePlayDateTime = LocalDateTime.of(game.getPlayDate(), game.getPlayStartTime()); - - return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); - } - - private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gameEndDateTime = game.getPlayEndDatetime(); - - return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); - } - - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - - private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { - return String.format("game:%s:%d", gameStatus.toString(), id); - } - - /** - * 게임 상태 업데이트 - */ - @Transactional - public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - final Game game = gameRepository.getGameById(gameId); - game.updateGameStatus(gameStatus); - } - - /** - * 게임 상세 조회 - */ - @Transactional - public GameResponse findGameById(final Long gameId) { - final Game game = gameRepository.getGameById(gameId); - game.increaseViewCount(); - - return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game)); - } - - /** - * 게임 카테고리별 조회 - */ - public List findGamesByCategory( - final Category category, - final String value, - final Pageable pageable - ) { - return switch (category) { - //현호 todo: playDate, positions 조건으로 조회하는 기능 추가 (MVP 미포함 기능) - case ADDRESS -> findGamesByAddress(value, pageable); - default -> throw new GameException(GAME_SEARCH_CATEGORY_IS_INVALID, category); - }; - } - - /** - * 주소별 게스트 모집글 조회 - */ - private List findGamesByAddress(final String address, final Pageable pageable) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); - - final PageRequest pageRequest = PageRequest.of( - pageable.getPageNumber(), - pageable.getPageSize(), - Sort.by( - Sort.Order.asc("playDate"), - Sort.Order.asc("playStartTime"), - Sort.Order.asc("id") - ) - ); - - final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), - GameStatus.ENDED, - pageRequest - ); - - return games.stream() - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) - .toList(); - } - - /** - * 특정 지역의 게스트 모집글 조회 - */ - public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { - final List games = gameRepository.findGamesWithInAddress( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2() - ); - - return games.stream() - .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) - .toList(); - } - - /** - * 중심 좌표(위도, 경도)로 부터 특정 거리(M) 까지의 게스트 모집글 조회 - */ - public List findGamesWithInDistance( - final Double latitude, - final Double longitude, - final Double distance - ) { - final List games = gameRepository.findGamesWithInDistance(latitude, longitude, distance); - - return games.stream() - .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game))) - .toList(); - } - - private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) - .stream() - .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - private List getPositionsByGame(final Game game) { - final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); - - return Position.fromGamePositions(gamePositions); - } + private final GameRepository gameRepository; + private final MemberPositionRepository memberPositionRepository; + private final MemberRepository memberRepository; + private final KakaoAddressSearchClient kakaoAddressSearchClient; + private final AddressService addressService; + private final ChatRoomService chatRoomService; + private final RedisRepository redisRepository; + private final GamePositionRepository gamePositionRepository; + private final GameMemberRepository gameMemberRepository; + + private static long getSecondsBetween( + final LocalDateTime gameCreatedDateTime, + final LocalDateTime gamePlayDateTime + ) { + return Duration.between(gameCreatedDateTime, gamePlayDateTime) + .getSeconds(); + } + + /** + * 게임 생성 + */ + @Transactional + public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { + final Member host = memberRepository.getMemberById(loggedInMemberId); + final Point point = kakaoAddressSearchClient.fetchAddress( + gameCreateRequest.getMainAddress()); + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( + gameCreateRequest.getMainAddress()); + + final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); + + final GameMember gameHost = GameMember.builder() + .member(host) + .game(game) + .build(); + gameHost.confirmRegistration(); + + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); + game.makeNewCrewChatRoom(chatRoom); + + final Game savedGame = gameRepository.save(game); + final List gamePositions = gameCreateRequest.toGamePositionEntities(savedGame); + gamePositionRepository.saveAll(gamePositions); + + final Long savedGameId = savedGame.getId(); + saveGameStatusUpdateEventToRedis(game, savedGameId); + + return GameIdResponse.from(savedGameId); + } + + private String makeGameRoomName(final Game game) { + final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); + final String addressDepth2Name = game.getAddressDepth2().getName(); + + return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); + } + + private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { + final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); + + // 경기를 생성한 시각과 경기 시작 시간의 차 + final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, game); + + // 경기를 생성한 시각과 경기 종료 시간의 차 + final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, game); + + final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, savedGameId); + final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, savedGameId); + + redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); + redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); + } + + private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final Game game) { + final LocalDateTime gamePlayDateTime = LocalDateTime.of(game.getPlayDate(), game.getPlayStartTime()); + + return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); + } + + private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final Game game) { + final LocalDateTime gameEndDateTime = game.getPlayEndDatetime(); + + return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); + } + + private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { + return String.format("game:%s:%d", gameStatus.toString(), id); + } + + /** + * 게임 상태 업데이트 + */ + @Transactional + public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { + final Game game = gameRepository.getGameById(gameId); + game.updateGameStatus(gameStatus); + } + + /** + * 게임 상세 조회 + */ + @Transactional + public GameResponse findGameById(final Long gameId) { + final Game game = gameRepository.getGameById(gameId); + game.increaseViewCount(); + + return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game)); + } + + /** + * 게임 카테고리별 조회 + */ + public List findGamesByCategory( + final Category category, + final String value, + final Pageable pageable + ) { + return switch (category) { + //현호 todo: playDate, positions 조건으로 조회하는 기능 추가 (MVP 미포함 기능) + case ADDRESS -> findGamesByAddress(value, pageable); + default -> throw new GameException(GAME_SEARCH_CATEGORY_IS_INVALID, category); + }; + } + + /** + * 주소별 게스트 모집글 조회 + */ + private List findGamesByAddress(final String address, final Pageable pageable) { + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); + + final PageRequest pageRequest = PageRequest.of( + pageable.getPageNumber(), + pageable.getPageSize(), + Sort.by( + Sort.Order.asc("playDate"), + Sort.Order.asc("playStartTime"), + Sort.Order.asc("id") + ) + ); + + final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2(), + GameStatus.ENDED, + pageRequest + ); + + return games.stream() + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game))) + .toList(); + } + + /** + * 특정 지역의 게스트 모집글 조회 + */ + public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { + final List games = gameRepository.findGamesWithInAddress( + mainAddressResponse.getAddressDepth1(), + mainAddressResponse.getAddressDepth2() + ); + + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game))) + .toList(); + } + + /** + * 중심 좌표(위도, 경도)로 부터 특정 거리(M) 까지의 게스트 모집글 조회 + */ + public List findGamesWithInDistance( + final Double latitude, + final Double longitude, + final Double distance + ) { + final List games = gameRepository.findGamesWithInDistance(latitude, longitude, distance); + + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game))) + .toList(); + } + + private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) + .stream() + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + private List getPositionsByGame(final Game game) { + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + + return Position.fromGamePositions(gamePositions); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index d672b9f6..4e85ac76 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -18,60 +18,61 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public class MemberGameResponse { - private Long id; - private String content; - private LocalDate playDate; - private LocalTime playStartTime; - private LocalTime playEndTime; - private Integer playTimeMinutes; - private String mainAddress; - private String detailAddress; - private Double latitude; - private Double longitude; - private GameStatus status; - private Boolean isReviewDone; - private Integer viewCount; - private Integer cost; - private Integer memberCount; - private Integer maxMemberCount; - private MemberResponse host; - private String addressDepth1; - private String addressDepth2; - private List positions; - private List members; + private Long id; + private String content; + private LocalDate playDate; + private LocalTime playStartTime; + private LocalTime playEndTime; + private Integer playTimeMinutes; + private String mainAddress; + private String detailAddress; + private Double latitude; + private Double longitude; + private GameStatus status; + private Boolean isReviewDone; + private Integer viewCount; + private Integer cost; + private Integer memberCount; + private Integer maxMemberCount; + private MemberResponse host; + private String addressDepth1; + private String addressDepth2; + private List positions; + private List members; - public static MemberGameResponse of(final GameMember gameMember, final List memberResponses, List positions) { - final Game game = gameMember.getGame(); + public static MemberGameResponse of(final GameMember gameMember, final List memberResponses, + List positions) { + final Game game = gameMember.getGame(); - return MemberGameResponse.builder() - .id(game.getId()) - .content(game.getContent()) - .playDate(game.getPlayDate()) - .playStartTime(game.getPlayStartTime()) - .playEndTime(game.getPlayEndTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .mainAddress(game.getMainAddress()) - .detailAddress(game.getDetailAddress()) - .latitude(game.getPoint().getY()) - .longitude(game.getPoint().getX()) - .status(game.getStatus()) - .isReviewDone(gameMember.isAlreadyReviewDone()) - .viewCount(game.getViewCount()) - .cost(game.getCost()) - .memberCount(game.getMemberCount()) - .maxMemberCount(game.getMaxMemberCount()) - .host(getHostResponse(memberResponses, game.getHost().getId())) - .addressDepth1(game.getAddressDepth1().getName()) - .addressDepth2(game.getAddressDepth2().getName()) - .positions(positions) - .members(memberResponses) - .build(); - } + return MemberGameResponse.builder() + .id(game.getId()) + .content(game.getContent()) + .playDate(game.getPlayDate()) + .playStartTime(game.getPlayStartTime()) + .playEndTime(game.getPlayEndTime()) + .playTimeMinutes(game.getPlayTimeMinutes()) + .mainAddress(game.getMainAddress()) + .detailAddress(game.getDetailAddress()) + .latitude(game.getPoint().getY()) + .longitude(game.getPoint().getX()) + .status(game.getStatus()) + .isReviewDone(gameMember.isAlreadyReviewDone()) + .viewCount(game.getViewCount()) + .cost(game.getCost()) + .memberCount(game.getMemberCount()) + .maxMemberCount(game.getMaxMemberCount()) + .host(getHostResponse(memberResponses, game.getHost().getId())) + .addressDepth1(game.getAddressDepth1().getName()) + .addressDepth2(game.getAddressDepth2().getName()) + .positions(positions) + .members(memberResponses) + .build(); + } - private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { - return memberResponses.stream() - .filter(memberResponse -> memberResponse.getId().equals(hostId)) - .findFirst() - .orElseThrow(); - } + private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { + return memberResponses.stream() + .filter(memberResponse -> memberResponse.getId().equals(hostId)) + .findFirst() + .orElseThrow(); + } } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index cb519948..f03915ac 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -11,11 +11,11 @@ public interface MemberRepository extends JpaRepository { - Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); + Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); - Optional findByOauthId(final Long oauthId); + Optional findByOauthId(final Long oauthId); - default Member getMemberById(final Long memberId) { - return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } + default Member getMemberById(final Long memberId) { + return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index b8eb7ff6..c9947d83 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -29,85 +29,85 @@ @Transactional(readOnly = true) public class MemberCrewService { - private final MemberRepository memberRepository; - private final CrewMemberRepository crewMemberRepository; - private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; - - /** - * 사용자가 가입한 크루 목록 조회 - */ - public List findAllCrewsByMemberId( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) - .stream() - .map(CrewMember::getCrew) - .toList(); - - return convertToCrewProfileResponses(crews, memberStatus); - } - - /** - * 사용자가 만든 크루 목록 조회 - */ - public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List crews = crewRepository.findAllByLeaderId(member.getId()); - - return convertToCrewProfileResponses(crews, CONFIRMED); - } - - /** - * 회원의 크루 가입 신청 여부 조회 - */ - public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( - final Long loggedInMemberId, - final Long memberId, - final Long crewId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); - - return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); - } - - private List convertToCrewProfileResponses( - final List crews, - final RegistrationStatus memberStatus - ) { - - return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) - .toList(); - } - - private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { - return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) - .stream() - .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member))) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } + private final MemberRepository memberRepository; + private final CrewMemberRepository crewMemberRepository; + private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; + + /** + * 사용자가 가입한 크루 목록 조회 + */ + public List findAllCrewsByMemberId( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) + .stream() + .map(CrewMember::getCrew) + .toList(); + + return convertToCrewProfileResponses(crews, memberStatus); + } + + /** + * 사용자가 만든 크루 목록 조회 + */ + public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List crews = crewRepository.findAllByLeaderId(member.getId()); + + return convertToCrewProfileResponses(crews, CONFIRMED); + } + + /** + * 회원의 크루 가입 신청 여부 조회 + */ + public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( + final Long loggedInMemberId, + final Long memberId, + final Long crewId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); + + return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); + } + + private List convertToCrewProfileResponses( + final List crews, + final RegistrationStatus memberStatus + ) { + + return crews.stream() + .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .toList(); + } + + private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { + return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) + .stream() + .map(CrewMember::getMember) + .map(member -> MemberResponse.of(member, getPositions(member))) + .toList(); + } + + private List getPositions(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } + + private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index f408829a..6dfeb6a2 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -29,91 +29,91 @@ @Transactional(readOnly = true) public class MemberGameService { - private final MemberRepository memberRepository; - private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; - private final MemberPositionRepository memberPositionRepository; - - /** - * 사용자의 참여 확정 게스트 모집글 목록 조회 - */ - public List findAllMemberGames( - final Long loggedInMemberId, - final Long memberId, - final RegistrationStatus memberStatus - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), - memberStatus); - - return convertToMemberGameResponses(memberGames, memberStatus); - } - - /** - * 사용자가 만든 게스트 모집글 목록 조회 - */ - public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); - - return convertToMemberGameResponses(memberGames, CONFIRMED); - } - - /** - * 회원의 게스트 모집 신청 여부 조회 - */ - public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( - final Long loggedInMemberId, - final Long memberId, - final Long gameId - ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - - final Member member = memberRepository.getMemberById(memberId); - final Game game = gameRepository.getGameById(gameId); - - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); - - return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); - } - - private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } - - private List convertToMemberGameResponses( - final List memberGames, - final RegistrationStatus memberStatus - ) { - return memberGames.stream() - .map(memberGame -> - MemberGameResponse.of( - memberGame, - getMemberResponsesByGame(memberGame.getGame(), memberStatus), - getPositionsByMember(memberGame.getMember()) - ) - ) - .toList(); - } - - private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) - .stream() - .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); - - return Position.fromMemberPositions(memberPositions); - } + private final MemberRepository memberRepository; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; + private final MemberPositionRepository memberPositionRepository; + + /** + * 사용자의 참여 확정 게스트 모집글 목록 조회 + */ + public List findAllMemberGames( + final Long loggedInMemberId, + final Long memberId, + final RegistrationStatus memberStatus + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), + memberStatus); + + return convertToMemberGameResponses(memberGames, memberStatus); + } + + /** + * 사용자가 만든 게스트 모집글 목록 조회 + */ + public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); + + return convertToMemberGameResponses(memberGames, CONFIRMED); + } + + /** + * 회원의 게스트 모집 신청 여부 조회 + */ + public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( + final Long loggedInMemberId, + final Long memberId, + final Long gameId + ) { + validateSelfMemberAccess(loggedInMemberId, memberId); + + final Member member = memberRepository.getMemberById(memberId); + final Game game = gameRepository.getGameById(gameId); + + final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); + + return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); + } + + private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } + + private List convertToMemberGameResponses( + final List memberGames, + final RegistrationStatus memberStatus + ) { + return memberGames.stream() + .map(memberGame -> + MemberGameResponse.of( + memberGame, + getMemberResponsesByGame(memberGame.getGame(), memberStatus), + getPositionsByMember(memberGame.getMember()) + ) + ) + .toList(); + } + + private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { + return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) + .stream() + .map(GameMember::getMember) + .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .toList(); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 9a57566a..12714f50 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -39,94 +39,94 @@ @Transactional(readOnly = true) public class MemberService { - private static final String REFRESH_TOKEN_KEY = "refresh_token"; - - private final MemberRepository memberRepository; - private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final RedisRepository redisRepository; - private final AddressService addressService; - private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; - private final GamePositionRepository gamePositionRepository; - private final GameMemberRepository gameMemberRepository; - - /** - * 사용자 회원가입 (카카오) - */ - @Transactional - public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { - validateIsDuplicatedMemberInfo(memberCreateRequest); - - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( - memberCreateRequest.getAddressDepth1(), - memberCreateRequest.getAddressDepth2() - ); - - final Member member = memberCreateRequest.toEntity(mainAddressResponse); - final Member savedMember = memberRepository.save(member); - - final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); - - memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ - - final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); - - final RefreshToken refreshToken = RefreshToken.builder() - .token(loginTokens.getRefreshToken()) - .memberId(savedMember.getId()) - .createdAt(LocalDateTime.now()) - .build(); - - redisRepository.saveHash( - REFRESH_TOKEN_KEY, - refreshToken.getToken(), - refreshToken, - jwtProperties.getRefreshTokenExpirationTime() - ); - - return AuthenticatedMemberResponse.of(savedMember, loginTokens); - } - - private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { - final String email = memberCreateRequest.getEmail(); - final String nickname = memberCreateRequest.getNickname(); - final Long oauthId = memberCreateRequest.getOauthId(); - - if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { - throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); - } - } - - /** - * 사용자 프로필 조회 - */ - public MemberProfileResponse findMemberProfileById(final Long memberId) { - final Member member = memberRepository.getMemberById(memberId); - final List positions = getPositionsByMember(member); - - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) - .stream() - .map(CrewMember::getCrew) - .toList(); - - final List crewResponses = crews.stream() - .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) - .toList(); - - return MemberProfileResponse.of(member, crewResponses, positions); - } - - private MemberResponse getLeaderResponse(final Crew crew) { - final Member member = crew.getLeader(); - - return MemberResponse.of(member, getPositionsByMember(member)); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } + private static final String REFRESH_TOKEN_KEY = "refresh_token"; + + private final MemberRepository memberRepository; + private final CrewMemberRepository crewMemberRepository; + private final MemberPositionRepository memberPositionRepository; + private final RedisRepository redisRepository; + private final AddressService addressService; + private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; + private final GamePositionRepository gamePositionRepository; + private final GameMemberRepository gameMemberRepository; + + /** + * 사용자 회원가입 (카카오) + */ + @Transactional + public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { + validateIsDuplicatedMemberInfo(memberCreateRequest); + + final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + memberCreateRequest.getAddressDepth1(), + memberCreateRequest.getAddressDepth2() + ); + + final Member member = memberCreateRequest.toEntity(mainAddressResponse); + final Member savedMember = memberRepository.save(member); + + final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); + + memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ + + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); + + final RefreshToken refreshToken = RefreshToken.builder() + .token(loginTokens.getRefreshToken()) + .memberId(savedMember.getId()) + .createdAt(LocalDateTime.now()) + .build(); + + redisRepository.saveHash( + REFRESH_TOKEN_KEY, + refreshToken.getToken(), + refreshToken, + jwtProperties.getRefreshTokenExpirationTime() + ); + + return AuthenticatedMemberResponse.of(savedMember, loginTokens); + } + + private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { + final String email = memberCreateRequest.getEmail(); + final String nickname = memberCreateRequest.getNickname(); + final Long oauthId = memberCreateRequest.getOauthId(); + + if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { + throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); + } + } + + /** + * 사용자 프로필 조회 + */ + public MemberProfileResponse findMemberProfileById(final Long memberId) { + final Member member = memberRepository.getMemberById(memberId); + final List positions = getPositionsByMember(member); + + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) + .stream() + .map(CrewMember::getCrew) + .toList(); + + final List crewResponses = crews.stream() + .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) + .toList(); + + return MemberProfileResponse.of(member, crewResponses, positions); + } + + private MemberResponse getLeaderResponse(final Crew crew) { + final Member member = crew.getLeader(); + + return MemberResponse.of(member, getPositionsByMember(member)); + } + + private List getPositionsByMember(final Member member) { + final List memberPositions = memberPositionRepository.findAllByMemberId( + member.getId()); + + return Position.fromMemberPositions(memberPositions); + } } diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index 8078d5f6..01e2a922 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -22,42 +22,42 @@ @RequiredArgsConstructor public enum Position { - CENTER("센터", "C", "팀의 공격과 수비에서 중추적인 역할"), - POWER_FORWARD("파워 포워드", "PF", "득점, 리바운드, 수비에서의 강인한 플레이를 담당하는 역할"), - SMALL_FORWARD("스몰 포워드", "SF", "공격과 수비 양면에서 다재다능한 역할"), - POINT_GUARD("포인트 가드", "PG", "공격 조직과 전술적인 플레이를 주도하는 주장 역할"), - SHOOTING_GUARD("슈팅 가드", "SG", "주로 3점슛을 통해 팀의 주요 득점 옵션을 담당하는 역할"), - EMPTY("포지션 없음", "없음", "포지션을 별도로 선택하지 않음"), - ; - - private static final Map positionMap = Collections.unmodifiableMap(Stream.of(values()) - .collect(Collectors.toMap(Position::getAcronym, Function.identity()))); - - private final String name; - - @JsonValue - private final String acronym; - - private final String description; - - @JsonCreator - public static Position fromGamePositions(final String positionAcronym) { - if (positionMap.containsKey(positionAcronym)) { - return positionMap.get(positionAcronym); - } - - throw new PositionException(POSITION_NOT_FOUND, positionAcronym); - } - - public static List fromMemberPositions(final List memberPositions) { - return memberPositions.stream() - .map(MemberPosition::getPosition) - .toList(); - } - - public static List fromGamePositions(final List gamePositions) { - return gamePositions.stream() - .map(GamePosition::getPosition) - .toList(); - } + CENTER("센터", "C", "팀의 공격과 수비에서 중추적인 역할"), + POWER_FORWARD("파워 포워드", "PF", "득점, 리바운드, 수비에서의 강인한 플레이를 담당하는 역할"), + SMALL_FORWARD("스몰 포워드", "SF", "공격과 수비 양면에서 다재다능한 역할"), + POINT_GUARD("포인트 가드", "PG", "공격 조직과 전술적인 플레이를 주도하는 주장 역할"), + SHOOTING_GUARD("슈팅 가드", "SG", "주로 3점슛을 통해 팀의 주요 득점 옵션을 담당하는 역할"), + EMPTY("포지션 없음", "없음", "포지션을 별도로 선택하지 않음"), + ; + + private static final Map positionMap = Collections.unmodifiableMap(Stream.of(values()) + .collect(Collectors.toMap(Position::getAcronym, Function.identity()))); + + private final String name; + + @JsonValue + private final String acronym; + + private final String description; + + @JsonCreator + public static Position fromGamePositions(final String positionAcronym) { + if (positionMap.containsKey(positionAcronym)) { + return positionMap.get(positionAcronym); + } + + throw new PositionException(POSITION_NOT_FOUND, positionAcronym); + } + + public static List fromMemberPositions(final List memberPositions) { + return memberPositions.stream() + .map(MemberPosition::getPosition) + .toList(); + } + + public static List fromGamePositions(final List gamePositions) { + return gamePositions.stream() + .map(GamePosition::getPosition) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/position/util/PositionConverter.java b/src/main/java/kr/pickple/back/position/util/PositionConverter.java index 56f10a1d..ecfa4d04 100644 --- a/src/main/java/kr/pickple/back/position/util/PositionConverter.java +++ b/src/main/java/kr/pickple/back/position/util/PositionConverter.java @@ -7,13 +7,13 @@ @Converter public final class PositionConverter implements AttributeConverter { - @Override - public String convertToDatabaseColumn(final Position position) { - return position.getAcronym(); - } + @Override + public String convertToDatabaseColumn(final Position position) { + return position.getAcronym(); + } - @Override - public Position convertToEntityAttribute(final String acronym) { - return Position.fromGamePositions(acronym); - } + @Override + public Position convertToEntityAttribute(final String acronym) { + return Position.fromGamePositions(acronym); + } } diff --git a/src/main/java/kr/pickple/back/ranking/repository/RankingJdbcRepository.java b/src/main/java/kr/pickple/back/ranking/repository/RankingJdbcRepository.java index 52a1aba5..a00e9189 100644 --- a/src/main/java/kr/pickple/back/ranking/repository/RankingJdbcRepository.java +++ b/src/main/java/kr/pickple/back/ranking/repository/RankingJdbcRepository.java @@ -74,10 +74,6 @@ DISTINCT CASE WHEN game_member.created_at > DATE_SUB(NOW(), INTERVAL 1 MONTH) private final JdbcTemplate jdbcTemplate; - public List getCrewRankings() { - return jdbcTemplate.query(CREW_RANKING_SQL, crewRankingRowMapper()); - } - private static RowMapper crewRankingRowMapper() { return (rs, rowNum) -> CrewRankingResponse.builder() .id(rs.getLong("id")) @@ -92,4 +88,8 @@ private static RowMapper crewRankingRowMapper() { .rank(rs.getInt("ranking")) .build(); } + + public List getCrewRankings() { + return jdbcTemplate.query(CREW_RANKING_SQL, crewRankingRowMapper()); + } } From 6efa8aadf79784958344f47afb2e520c40a4a70e Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Tue, 6 Feb 2024 00:47:15 +0900 Subject: [PATCH 013/117] =?UTF-8?q?refactor:=20Chat=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=96=91=EB=B0=A9=ED=96=A5=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/chat/domain/ChatMessage.java | 8 -- .../back/chat/domain/ChatMessages.java | 42 -------- .../kr/pickple/back/chat/domain/ChatRoom.java | 58 +---------- .../back/chat/domain/ChatRoomMembers.java | 71 -------------- .../dto/response/ChatRoomDetailResponse.java | 36 ++++--- .../repository/ChatMessageRepository.java | 26 +++++ .../repository/ChatRoomMemberRepository.java | 31 +++++- .../chat/repository/ChatRoomRepository.java | 6 ++ .../back/chat/service/ChatMessageService.java | 97 +++++++++++-------- .../chat/service/ChatRoomFindService.java | 58 +++++------ .../back/chat/service/ChatRoomService.java | 50 ++++++---- .../back/chat/service/ChatValidator.java | 2 +- 12 files changed, 198 insertions(+), 287 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatMessages.java delete mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatRoomMembers.java diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java index c558ea2e..b46e743f 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java @@ -55,12 +55,4 @@ private ChatMessage(final ChatRoom chatRoom, final Member sender, final String c this.chatRoom = chatRoom; this.sender = sender; } - - public void updateContent(final String content) { - this.content = content; - } - - public Boolean isMatchedMessageType(final MessageType type) { - return this.type == type; - } } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessages.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessages.java deleted file mode 100644 index 9ea0f430..00000000 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessages.java +++ /dev/null @@ -1,42 +0,0 @@ -package kr.pickple.back.chat.domain; - -import static kr.pickple.back.chat.domain.MessageType.*; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.member.domain.Member; -import lombok.Getter; - -@Embeddable -public class ChatMessages { - - @Getter - @OneToMany(mappedBy = "chatRoom", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List chatMessages = new ArrayList<>(); - - void addChatMessage(final ChatMessage chatMessage) { - chatMessages.add(chatMessage); - } - - ChatMessage getLastChatMessage() { - return chatMessages.get(chatMessages.size() - 1); - } - - ChatMessage getLastEnteringChatMessageByMember(final Member member) { - return chatMessages.stream() - .filter(chatMessage -> isEnteringMessageByMember(member, chatMessage)) - .max(Comparator.comparing(ChatMessage::getCreatedAt)) - .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, member.getId())); - } - - private Boolean isEnteringMessageByMember(final Member member, final ChatMessage chatMessage) { - return member.equals(chatMessage.getSender()) && chatMessage.isMatchedMessageType(ENTER); - } -} diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java index d0630084..2b6450c3 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java @@ -2,11 +2,8 @@ import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import java.util.List; - import jakarta.persistence.Column; import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -15,7 +12,6 @@ import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.util.RoomTypeAttributeConverter; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -48,12 +44,6 @@ public class ChatRoom extends BaseEntity { @NotNull private Integer maxMemberCount = 2; - @Embedded - private ChatRoomMembers chatRoomMembers = new ChatRoomMembers(); - - @Embedded - private ChatMessages chatMessages = new ChatMessages(); - @Builder private ChatRoom(final String name, final RoomType type) { this.name = name; @@ -73,21 +63,17 @@ private Boolean isFullRoom() { } public void decreaseMemberCount() { - if (isEmptyRoom()) { + if (isEmpty()) { throw new ChatException(CHAT_ROOM_IS_EMPTY, memberCount); } memberCount -= 1; } - public Boolean isEmptyRoom() { + public Boolean isEmpty() { return memberCount == 0; } - public Boolean isEntered(final Member member) { - return chatRoomMembers.isMemberEnteredRoom(member); - } - public Boolean isMatchedRoomType(final RoomType type) { return this.type == type; } @@ -99,44 +85,4 @@ public void updateMaxMemberCount(final Integer maxMemberCount) { this.maxMemberCount = maxMemberCount; } - - public void sendMessage(final ChatMessage chatMessage) { - chatMessages.addChatMessage(chatMessage); - } - - public void enterRoom(final ChatMessage chatMessage) { - final Member newMember = chatMessage.getSender(); - chatRoomMembers.activateChatRoomMember(this, newMember); - - sendMessage(chatMessage); - increaseMemberCount(); - } - - public void leaveRoom(final ChatMessage chatMessage) { - final Member member = chatMessage.getSender(); - chatRoomMembers.deactivateChatRoomMember(this, member); - - sendMessage(chatMessage); - decreaseMemberCount(); - } - - public List getChatMessages() { - return chatMessages.getChatMessages(); - } - - public List getActiveMembersInRoom() { - return chatRoomMembers.getActiveMembers(); - } - - public List getAllMembersInRoom() { - return chatRoomMembers.getAllMembers(); - } - - public ChatMessage getLastChatMessage() { - return chatMessages.getLastChatMessage(); - } - - public ChatMessage getLastEnteringChatMessageByMember(final Member member) { - return chatMessages.getLastEnteringChatMessageByMember(member); - } } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMembers.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMembers.java deleted file mode 100644 index 28f7ae93..00000000 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMembers.java +++ /dev/null @@ -1,71 +0,0 @@ -package kr.pickple.back.chat.domain; - -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - -import java.util.ArrayList; -import java.util.List; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.member.domain.Member; - -@Embeddable -public class ChatRoomMembers { - - @OneToMany(mappedBy = "chatRoom", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List chatRoomMembers = new ArrayList<>(); - - void activateChatRoomMember(final ChatRoom chatRoom, final Member member) { - final ChatRoomMember chatRoomMember = buildChatRoom(chatRoom, member); - - if (chatRoomMembers.contains(chatRoomMember)) { - final ChatRoomMember foundChatRoomMember = findChatRoomMember(chatRoom, member); - foundChatRoomMember.activate(); - - return; - } - - chatRoomMembers.add(chatRoomMember); - } - - void deactivateChatRoomMember(final ChatRoom chatRoom, final Member member) { - final ChatRoomMember foundChatRoomMember = findChatRoomMember(chatRoom, member); - foundChatRoomMember.deactivate(); - } - - private ChatRoomMember findChatRoomMember(final ChatRoom chatRoom, final Member member) { - final ChatRoomMember chatRoomMember = buildChatRoom(chatRoom, member); - - return chatRoomMembers.stream() - .filter(chatRoomMember::equals) - .findFirst() - .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, member.getId(), chatRoom.getId())); - } - - private ChatRoomMember buildChatRoom(final ChatRoom chatRoom, final Member member) { - return ChatRoomMember.builder() - .member(member) - .chatRoom(chatRoom) - .build(); - } - - Boolean isMemberEnteredRoom(final Member member) { - return chatRoomMembers.stream() - .anyMatch(chatRoomMember -> member.equals(chatRoomMember.getMember())); - } - - List getActiveMembers() { - return chatRoomMembers.stream() - .filter(ChatRoomMember::isActive) - .map(ChatRoomMember::getMember) - .toList(); - } - - List getAllMembers() { - return chatRoomMembers.stream() - .map(ChatRoomMember::getMember) - .toList(); - } -} diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java index 689be77f..d323cd18 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java @@ -31,7 +31,11 @@ public class ChatRoomDetailResponse { private List members; private LocalDateTime createdAt; - public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Member receiver) { + public static ChatRoomDetailResponse of( + final ChatRoom chatRoom, + final Member receiver, + final List chatMemberResponses + ) { return ChatRoomDetailResponse.builder() .id(chatRoom.getId()) .roomName(receiver.getNickname()) @@ -40,12 +44,16 @@ public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Member re .domainId(receiver.getId()) .memberCount(chatRoom.getMemberCount()) .maxMemberCount(chatRoom.getMaxMemberCount()) - .members(getChatMemberResponses(chatRoom)) + .members(chatMemberResponses) .createdAt(chatRoom.getCreatedAt()) .build(); } - public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Game game) { + public static ChatRoomDetailResponse of( + final ChatRoom chatRoom, + final Game game, + final List chatMemberResponses + ) { return ChatRoomDetailResponse.builder() .id(chatRoom.getId()) .roomName(chatRoom.getName()) @@ -55,12 +63,16 @@ public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Game game .maxMemberCount(chatRoom.getMaxMemberCount()) .playStartTime(game.getPlayStartTime()) .playTimeMinutes(game.getPlayTimeMinutes()) - .members(getChatMemberResponses(chatRoom)) + .members(chatMemberResponses) .createdAt(chatRoom.getCreatedAt()) .build(); } - public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Crew crew) { + public static ChatRoomDetailResponse of( + final ChatRoom chatRoom, + final Crew crew, + final List chatMemberResponses + ) { return ChatRoomDetailResponse.builder() .id(chatRoom.getId()) .roomName(chatRoom.getName()) @@ -69,15 +81,15 @@ public static ChatRoomDetailResponse of(final ChatRoom chatRoom, final Crew crew .domainId(crew.getId()) .memberCount(chatRoom.getMemberCount()) .maxMemberCount(chatRoom.getMaxMemberCount()) - .members(getChatMemberResponses(chatRoom)) + .members(chatMemberResponses) .createdAt(chatRoom.getCreatedAt()) .build(); } - private static List getChatMemberResponses(final ChatRoom chatRoom) { - return chatRoom.getActiveMembersInRoom() - .stream() - .map(ChatMemberResponse::from) - .toList(); - } + // private static List getChatMemberResponses(final ChatRoom chatRoom) { + // return chatRoom.getActiveMembersInRoom() + // .stream() + // .map(ChatMemberResponse::from) + // .toList(); + // } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 672cbd47..482cf3bd 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -1,9 +1,35 @@ package kr.pickple.back.chat.repository; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.exception.ChatException; public interface ChatMessageRepository extends JpaRepository { + @Query(""" + select cm + from ChatMessage cm + where cm.sender.id = :senderId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER + order by cm.createdAt desc + limit 1 + """) + Optional findLastEnteringChatMessageBySenderId(final Long senderId); + + List findAllByChatRoomIdAndCreatedAtGreaterThanEqual(final Long chatRoomId, + final LocalDateTime createdAt); + + ChatMessage findTopByChatRoomIdOrderByCreatedAtDesc(final Long chatRoomId); + + default ChatMessage getLastEnteringChatMessageBySenderId(final Long senderId) { + return findLastEnteringChatMessageBySenderId(senderId) + .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, senderId)); + } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java index f178eb3d..39fe349d 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java @@ -1,18 +1,39 @@ package kr.pickple.back.chat.repository; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomMember; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.chat.exception.ChatException; public interface ChatRoomMemberRepository extends JpaRepository { - Boolean existsByActiveTrueAndChatRoomAndMember(final ChatRoom chatRoom, final Member member); + Boolean existsByChatRoomIdAndMemberId(final Long chatRoomId, final Long memberId); + + Boolean existsByActiveTrueAndChatRoomIdAndMemberId(final Long chatRoomId, final Long memberId); + + List findAllByMemberId(final Long memberId); + + List findAllByActiveTrueAndMemberId(final Long memberId); + + List findAllByActiveTrueAndChatRoomId(final Long chatRoomId); + + Optional findByMemberIdAndChatRoomId(final Long memberId, final Long chatRoomId); + + // 개인 채팅방에서 상대방에 대한 ChatRoomMember 데이터 조회용 + Optional findByChatRoomIdAndMemberIdNot(final Long chatRoomId, final Long memberId); - List findAllByMember(final Member member); + default ChatRoomMember getByMemberIdAndChatRoomId(final Long memberId, final Long chatRoomId) { + return findByMemberIdAndChatRoomId(memberId, chatRoomId) + .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, memberId, chatRoomId)); + } - List findAllByActiveTrueAndMember(final Member member); + default ChatRoomMember getPersonalChatRoomReceiver(final Long chatRoomId, final Long senderId) { + return findByChatRoomIdAndMemberIdNot(chatRoomId, senderId) + .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); + } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java index bf075cda..d9d21c93 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java @@ -1,9 +1,15 @@ package kr.pickple.back.chat.repository; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + import org.springframework.data.jpa.repository.JpaRepository; import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.exception.ChatException; public interface ChatRoomRepository extends JpaRepository { + default ChatRoom getChatRoomById(final Long chatRoomId) { + return findById(chatRoomId).orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, chatRoomId)); + } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index a3073243..82b27ac5 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -1,8 +1,6 @@ package kr.pickple.back.chat.service; import static kr.pickple.back.chat.domain.MessageType.*; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -11,15 +9,14 @@ import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.dto.request.ChatMessageCreateRequest; import kr.pickple.back.chat.dto.response.ChatMessageResponse; -import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatMessageRepository; +import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.common.util.DateTimeUtil; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -28,19 +25,22 @@ @Transactional(readOnly = true) public class ChatMessageService { - private final ChatValidator chatValidator; - private final ChatMessageRepository chatMessageRepository; private final ChatRoomRepository chatRoomRepository; + private final ChatRoomMemberRepository chatRoomMemberRepository; private final MemberRepository memberRepository; + private final ChatValidator chatValidator; + /** + * 채팅방 입장 + */ @Transactional public ChatMessageResponse enterChatRoom( final Long roomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member member = findMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = findRoomById(roomId); + final Member member = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); final ChatMessage enteringMessage = enterRoomAndSaveEnteringMessages(chatRoom, member); return ChatMessageResponse.from(enteringMessage); @@ -51,50 +51,74 @@ public ChatMessage enterRoomAndSaveEnteringMessages(final ChatRoom chatRoom, fin chatValidator.validateIsNotExistedRoomMember(chatRoom, member); final String content = MessageType.makeEnterMessage(member.getNickname()); - final ChatMessage chatMessage = buildChatMessage(ENTER, content, chatRoom, member); - chatRoom.enterRoom(chatMessage); + final ChatRoomMember chatRoomMember = chatRoomMemberRepository.findByMemberIdAndChatRoomId(member.getId(), + chatRoom.getId()) + .orElseGet(() -> buildChatRoomMember(chatRoom, member)); - return chatMessageRepository.save(chatMessage); + chatRoomMember.activate(); + chatRoomMemberRepository.save(chatRoomMember); + chatRoom.increaseMemberCount(); + + final ChatMessage enteringMessage = buildChatMessage(ENTER, content, chatRoom, member); + + return chatMessageRepository.save(enteringMessage); } + private ChatRoomMember buildChatRoomMember(final ChatRoom chatRoom, final Member member) { + return ChatRoomMember.builder() + .chatRoom(chatRoom) + .member(member) + .build(); + } + + /** + * 채팅 메시지 전송 + */ @Transactional public ChatMessageResponse sendMessage( final Long roomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member sender = findMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = findRoomById(roomId); + final Member sender = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); chatValidator.validateIsExistedRoomMember(sender, chatRoom); final String content = chatMessageCreateRequest.getContent(); final ChatMessage chatMessage = buildChatMessage(TALK, content, chatRoom, sender); - chatRoom.sendMessage(chatMessage); final ChatMessage sendingMessage = chatMessageRepository.save(chatMessage); return ChatMessageResponse.from(sendingMessage); } + /** + * 채팅방 퇴장 + */ @Transactional public ChatMessageResponse leaveChatRoom( final Long roomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member member = findMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = findRoomById(roomId); + final Member member = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); chatValidator.validateIsExistedRoomMember(member, chatRoom); chatValidator.validateChatRoomLeavingConditions(member, chatRoom); final String content = MessageType.makeLeaveMessage(member.getNickname()); - final ChatMessage chatMessage = buildChatMessage(LEAVE, content, chatRoom, member); - chatRoom.leaveRoom(chatMessage); - final ChatMessage leavingMessage = chatMessageRepository.save(chatMessage); + final ChatRoomMember chatRoomMember = chatRoomMemberRepository.getByMemberIdAndChatRoomId(member.getId(), + chatRoom.getId()); - if (chatRoom.isEmptyRoom()) { + chatRoomMember.deactivate(); + chatRoom.decreaseMemberCount(); + + if (chatRoom.isEmpty()) { chatRoomRepository.delete(chatRoom); } + final ChatMessage chatMessage = buildChatMessage(LEAVE, content, chatRoom, member); + final ChatMessage leavingMessage = chatMessageRepository.save(chatMessage); + return ChatMessageResponse.from(leavingMessage); } @@ -112,35 +136,22 @@ private ChatMessage buildChatMessage( .build(); } + /** + * 특정 채팅방의 모든 메시지 목록 조회 + */ public List findAllMessagesInRoom(final Long loggedInMemberId, final Long roomId) { - final ChatRoom chatRoom = findRoomById(roomId); - final Member loggedInMember = findMemberById(loggedInMemberId); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); chatValidator.validateIsExistedRoomMember(loggedInMember, chatRoom); - final ChatMessage lastEnteringMessage = chatRoom.getLastEnteringChatMessageByMember(loggedInMember); + final ChatMessage lastEnteringMessage = chatMessageRepository.getLastEnteringChatMessageBySenderId( + loggedInMember.getId()); - return chatRoom.getChatMessages() + return chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual(chatRoom.getId(), + lastEnteringMessage.getCreatedAt()) .stream() - .filter(thisChatMessage -> isEqualOrAfterThanLastEnteringMessage(lastEnteringMessage, thisChatMessage)) .map(ChatMessageResponse::from) .toList(); } - - private Boolean isEqualOrAfterThanLastEnteringMessage( - final ChatMessage lastEnteringMessage, - final ChatMessage thisChatMessage - ) { - return DateTimeUtil.isEqualOrAfter(lastEnteringMessage.getCreatedAt(), thisChatMessage.getCreatedAt()); - } - - private ChatRoom findRoomById(final Long roomId) { - return chatRoomRepository.findById(roomId) - .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, roomId)); - } - - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index 7715988d..250e5be0 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -1,20 +1,21 @@ package kr.pickple.back.chat.service; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; -import java.time.LocalDateTime; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.RoomType; +import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.domain.Crew; @@ -22,7 +23,6 @@ import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -31,16 +31,20 @@ @Transactional(readOnly = true) public class ChatRoomFindService { + private final ChatMessageRepository chatMessageRepository; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final GameRepository gameRepository; + /** + * 채팅방 타입에 따른 참여중인 모든 채팅방 목록 조회 + */ public List findAllActiveChatRoomsByType(final Long loggedInMemberId, final RoomType type) { - final Member loggedInMember = findMemberById(loggedInMemberId); + final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - return chatRoomMemberRepository.findAllByActiveTrueAndMember(loggedInMember) + return chatRoomMemberRepository.findAllByActiveTrueAndMemberId(loggedInMember.getId()) .stream() .map(ChatRoomMember::getChatRoom) .filter(chatRoom -> chatRoom.isMatchedRoomType(type)) @@ -49,20 +53,19 @@ public List findAllActiveChatRoomsByType(final Long loggedInMe } private ChatRoomResponse getChatRoomResponse(final Long loggedInMemberId, final ChatRoom chatRoom) { - final String lastMessageContent = chatRoom.getLastChatMessage().getContent(); - final LocalDateTime lastMessageCreatedAt = chatRoom.getLastChatMessage().getCreatedAt(); + final ChatMessage lastMessage = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc(chatRoom.getId()); final ChatRoomDetailResponse chatRoomDetail = getChatRoomDetailResponse(loggedInMemberId, chatRoom); - return ChatRoomResponse.of(chatRoomDetail, lastMessageContent, lastMessageCreatedAt); + return ChatRoomResponse.of(chatRoomDetail, lastMessage.getContent(), lastMessage.getCreatedAt()); } + /** + * 단일 채팅방 정보 상세 조회 + */ public ChatRoomDetailResponse findChatRoomById(final Long loggedInMemberId, final Long roomId) { - return getChatRoomDetailResponse(loggedInMemberId, findRoomById(roomId)); - } + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); - private ChatRoom findRoomById(final Long roomId) { - return chatRoomRepository.findById(roomId) - .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, roomId)); + return getChatRoomDetailResponse(loggedInMemberId, chatRoom); } private ChatRoomDetailResponse getChatRoomDetailResponse(final Long loggedInMemberId, final ChatRoom chatRoom) { @@ -74,33 +77,32 @@ private ChatRoomDetailResponse getChatRoomDetailResponse(final Long loggedInMemb } private ChatRoomDetailResponse getPersonalChatRoomDetailResponse(final Long memberId, final ChatRoom chatRoom) { - final Member sender = findMemberById(memberId); - - final Member receiver = chatRoom.getAllMembersInRoom() - .stream() - .filter(roomMember -> !roomMember.equals(sender)) - .findFirst() - .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); - - return ChatRoomDetailResponse.of(chatRoom, receiver); - } + final Member sender = memberRepository.getMemberById(memberId); + final Member receiver = chatRoomMemberRepository.getPersonalChatRoomReceiver(chatRoom.getId(), sender.getId()) + .getMember(); - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + return ChatRoomDetailResponse.of(chatRoom, receiver, getChatMemberResponses(chatRoom)); } private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { final Crew crew = crewRepository.findByChatRoom(chatRoom) .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoom.getId())); - return ChatRoomDetailResponse.of(chatRoom, crew); + return ChatRoomDetailResponse.of(chatRoom, crew, getChatMemberResponses(chatRoom)); } private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chatRoom) { final Game game = gameRepository.findByChatRoom(chatRoom) .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getId())); - return ChatRoomDetailResponse.of(chatRoom, game); + return ChatRoomDetailResponse.of(chatRoom, game, getChatMemberResponses(chatRoom)); + } + + private List getChatMemberResponses(final ChatRoom chatRoom) { + return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) + .stream() + .map(ChatRoomMember::getMember) + .map(ChatMemberResponse::from) + .toList(); } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index c3490367..907fcaf7 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -3,7 +3,8 @@ import static java.text.MessageFormat.*; import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,13 +13,13 @@ import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; +import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -27,21 +28,23 @@ @Transactional(readOnly = true) public class ChatRoomService { - private final ChatMessageService chatMessageService; - private final ChatValidator chatValidator; - private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; private final MemberRepository memberRepository; + private final ChatMessageService chatMessageService; + private final ChatValidator chatValidator; + /** + * 새 1:1 채팅방 생성 + */ @Transactional public ChatRoomDetailResponse createPersonalRoom( final Long senderId, final PersonalChatRoomCreateRequest personalChatRoomCreateRequest ) { final Long receiverId = personalChatRoomCreateRequest.getReceiverId(); - final Member receiver = findMemberById(receiverId); - final Member sender = findMemberById(senderId); + final Member receiver = memberRepository.getMemberById(receiverId); + final Member sender = memberRepository.getMemberById(senderId); chatValidator.validateIsSelfChat(receiver, sender); @@ -49,7 +52,15 @@ public ChatRoomDetailResponse createPersonalRoom( final ChatRoom savedChatRoom = saveNewChatRoom(sender, personalRoomName, PERSONAL); chatMessageService.enterRoomAndSaveEnteringMessages(savedChatRoom, receiver); - return ChatRoomDetailResponse.of(savedChatRoom, receiver); + return ChatRoomDetailResponse.of(savedChatRoom, receiver, getChatMemberResponses(savedChatRoom)); + } + + private List getChatMemberResponses(final ChatRoom chatRoom) { + return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) + .stream() + .map(ChatRoomMember::getMember) + .map(ChatMemberResponse::from) + .toList(); } @Transactional @@ -65,18 +76,21 @@ public ChatRoom saveNewChatRoom(final Member member, final String roomName, fina return savedChatRoom; } + /** + * 특정 사용자와의 1:1 채팅방 존재 여부 조회 + */ public PersonalChatRoomExistedResponse findActivePersonalChatRoomWithReceiver( final Long senderId, final Long receiverId ) { - final Member sender = findMemberById(senderId); - final Member receiver = findMemberById(receiverId); + final Member sender = memberRepository.getMemberById(senderId); + final Member receiver = memberRepository.getMemberById(receiverId); chatValidator.validateIsSelfChat(receiver, sender); - final ChatRoomMember foundChatRoomMember = chatRoomMemberRepository.findAllByMember(sender) + final ChatRoomMember foundChatRoomMember = chatRoomMemberRepository.findAllByMemberId(sender.getId()) .stream() - .filter(chatRoomMember -> isPersonalChatRoomWithReceiver(chatRoomMember, receiver)) + .filter(chatRoomMember -> existsReceiverInPersonalChatRoom(receiver, chatRoomMember.getChatRoom())) .findFirst() .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND)); @@ -86,14 +100,8 @@ public PersonalChatRoomExistedResponse findActivePersonalChatRoomWithReceiver( return PersonalChatRoomExistedResponse.of(personalChatRoomId, isSenderActive); } - private Member findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - - private Boolean isPersonalChatRoomWithReceiver(final ChatRoomMember chatRoomMember, final Member receiver) { - final ChatRoom chatRoom = chatRoomMember.getChatRoom(); - - return chatRoom.isMatchedRoomType(PERSONAL) && chatRoom.isEntered(receiver); + private Boolean existsReceiverInPersonalChatRoom(final Member receiver, final ChatRoom chatRoom) { + return chatRoom.isMatchedRoomType(PERSONAL) + && chatRoomMemberRepository.existsByChatRoomIdAndMemberId(chatRoom.getId(), receiver.getId()); } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java index 7bc368d5..48ccf1ba 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java @@ -47,7 +47,7 @@ public void validateIsExistedRoomMember(final Member member, final ChatRoom chat } private Boolean isExistedRoomMember(final ChatRoom chatRoom, final Member member) { - return chatRoomMemberRepository.existsByActiveTrueAndChatRoomAndMember(chatRoom, member); + return chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoom.getId(), member.getId()); } public void validateChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { From a0d3776f2e4e1880390fd9f424262619770249ac Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 6 Feb 2024 16:18:29 +0900 Subject: [PATCH 014/117] =?UTF-8?q?refactor:=20Member=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=EC=84=9C=20Address=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=82=AD=EC=A0=9C,=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=20=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/domain/AddressDepth1.java | 2 +- .../back/address/domain/AddressDepth2.java | 2 +- ...nAddressResponse.java => MainAddress.java} | 2 +- .../address/dto/response/MainAddressId.java | 15 +++ .../back/address/implement/AddressReader.java | 103 ++++++++++++++++++ .../back/address/service/AddressService.java | 54 +-------- .../back/auth/service/OauthService.java | 10 +- .../crew/dto/request/CrewCreateRequest.java | 8 +- .../back/crew/service/CrewService.java | 12 +- .../game/dto/request/GameCreateRequest.java | 8 +- .../back/game/service/GameFacadeService.java | 12 +- .../back/game/service/GameService.java | 18 +-- .../map/repository/MapPolygonRepository.java | 8 +- .../pickple/back/map/service/MapService.java | 13 ++- .../kr/pickple/back/member/domain/Member.java | 21 +--- .../back/member/domain/MemberPositions.java | 52 --------- .../dto/request/MemberCreateRequest.java | 8 +- .../response/AuthenticatedMemberResponse.java | 11 +- .../dto/response/MemberProfileResponse.java | 8 +- .../member/dto/response/MemberResponse.java | 11 +- .../member/service/MemberCrewService.java | 4 +- .../member/service/MemberGameService.java | 9 +- .../back/member/service/MemberService.java | 25 +++-- .../address/service/AddressServiceTest.java | 8 +- .../back/fixture/dto/AddressDtoFixtures.java | 6 +- .../member/service/MemberServiceTest.java | 12 +- 26 files changed, 240 insertions(+), 202 deletions(-) rename src/main/java/kr/pickple/back/address/dto/response/{MainAddressResponse.java => MainAddress.java} (92%) create mode 100644 src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java create mode 100644 src/main/java/kr/pickple/back/address/implement/AddressReader.java delete mode 100644 src/main/java/kr/pickple/back/member/domain/MemberPositions.java diff --git a/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java b/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java index e2f50da4..ef181549 100644 --- a/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java +++ b/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java @@ -13,6 +13,7 @@ import lombok.NoArgsConstructor; @Entity +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class AddressDepth1 extends BaseEntity { @@ -20,7 +21,6 @@ public class AddressDepth1 extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Getter @NotNull @Column(unique = true, length = 10) private String name; diff --git a/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java b/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java index d940c47d..f632dfc6 100644 --- a/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java +++ b/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java @@ -16,6 +16,7 @@ import lombok.NoArgsConstructor; @Entity +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class AddressDepth2 extends BaseEntity { @@ -23,7 +24,6 @@ public class AddressDepth2 extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Getter @NotNull @Column(unique = true, length = 10) private String name; diff --git a/src/main/java/kr/pickple/back/address/dto/response/MainAddressResponse.java b/src/main/java/kr/pickple/back/address/dto/response/MainAddress.java similarity index 92% rename from src/main/java/kr/pickple/back/address/dto/response/MainAddressResponse.java rename to src/main/java/kr/pickple/back/address/dto/response/MainAddress.java index 849a6413..b6e730ae 100644 --- a/src/main/java/kr/pickple/back/address/dto/response/MainAddressResponse.java +++ b/src/main/java/kr/pickple/back/address/dto/response/MainAddress.java @@ -10,7 +10,7 @@ @Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MainAddressResponse { +public class MainAddress { private AddressDepth1 addressDepth1; private AddressDepth2 addressDepth2; diff --git a/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java b/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java new file mode 100644 index 00000000..42981bcd --- /dev/null +++ b/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java @@ -0,0 +1,15 @@ +package kr.pickple.back.address.dto.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MainAddressId { + + private Long addressDepth1Id; + private Long addressDepth2Id; +} diff --git a/src/main/java/kr/pickple/back/address/implement/AddressReader.java b/src/main/java/kr/pickple/back/address/implement/AddressReader.java new file mode 100644 index 00000000..5233fac6 --- /dev/null +++ b/src/main/java/kr/pickple/back/address/implement/AddressReader.java @@ -0,0 +1,103 @@ +package kr.pickple.back.address.implement; + +import static kr.pickple.back.address.exception.AddressExceptionCode.*; + +import java.util.List; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.domain.AddressDepth1; +import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.dto.response.AllAddressResponse; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.exception.AddressException; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.util.AddressParser; +import kr.pickple.back.member.domain.Member; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AddressReader { + + private final AddressDepth1Repository addressDepth1Repository; + private final AddressDepth2Repository addressDepth2Repository; + + @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "address", key = "'all'") + public AllAddressResponse readAllAddress() { + final AddressDepth1 addressDepth1 = addressDepth1Repository.findAll() + .get(0); + + final List addressDepth2List = addressDepth2Repository.findByAddressDepth1(addressDepth1) + .stream() + .map(AddressDepth2::getName) + .toList(); + + return AllAddressResponse.builder() + .addressDepth1(addressDepth1.getName()) + .addressDepth2List(addressDepth2List) + .build(); + } + + public MainAddress readMainAddressByNames( + final String addressDepth1Name, + final String addressDepth2Name + ) { + final AddressDepth1 addressDepth1 = getAddressDepth1ByName(addressDepth1Name); + final AddressDepth2 addressDepth2 = getAddressDepth2ByNamesAndAddressDepth1( + addressDepth1Name, + addressDepth2Name, + addressDepth1 + ); + + return MainAddress.builder() + .addressDepth1(addressDepth1) + .addressDepth2(addressDepth2) + .build(); + } + + //기존 메서드 네이밍 및 시그니처 유지를 위해 임시적으로 아래와 구현했습니다. + //todo 현호:서로 다른 입력을 받아 MainAddressResponse를 반환하는 두 메서드를 어떻게 통합하면 좋을 지 논의해보면 좋겠습니다. + public MainAddress readMainAddressByAddressStrings(final String mainAddress) { + final List depthedAddress = AddressParser.splitToAddressDepth1And2(mainAddress); + + return readMainAddressByNames(depthedAddress.get(0), depthedAddress.get(1)); + } + + public MainAddress readMainAddress(final Member member) { + final AddressDepth1 addressDepth1 = getAddressDepth1ById(member.getAddressDepth1Id()); + final AddressDepth2 addressDepth2 = getAddressDepth2ById(member.getAddressDepth2Id()); + + return MainAddress.builder() + .addressDepth1(addressDepth1) + .addressDepth2(addressDepth2) + .build(); + } + + private AddressDepth2 getAddressDepth2ByNamesAndAddressDepth1(final String addressDepth1Name, + final String addressDepth2Name, + final AddressDepth1 addressDepth1 + ) { + return addressDepth2Repository.findByNameAndAddressDepth1(addressDepth2Name, addressDepth1) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); + } + + private AddressDepth1 getAddressDepth1ByName(final String addressDepth1Name) { + return addressDepth1Repository.findByName(addressDepth1Name) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); + } + + private AddressDepth1 getAddressDepth1ById(final Long addressDepth1Id) { + return addressDepth1Repository.findById(addressDepth1Id) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Id)); + } + + private AddressDepth2 getAddressDepth2ById(final Long addressDepth2Id) { + return addressDepth2Repository.findById(addressDepth2Id) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth2Id)); + } +} diff --git a/src/main/java/kr/pickple/back/address/service/AddressService.java b/src/main/java/kr/pickple/back/address/service/AddressService.java index f23bb004..2e5c529e 100644 --- a/src/main/java/kr/pickple/back/address/service/AddressService.java +++ b/src/main/java/kr/pickple/back/address/service/AddressService.java @@ -1,66 +1,18 @@ package kr.pickple.back.address.service; -import static kr.pickple.back.address.exception.AddressExceptionCode.*; - -import java.util.List; - -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddressResponse; -import kr.pickple.back.address.exception.AddressException; -import kr.pickple.back.address.repository.AddressDepth1Repository; -import kr.pickple.back.address.repository.AddressDepth2Repository; -import kr.pickple.back.address.util.AddressParser; +import kr.pickple.back.address.implement.AddressReader; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor -@Transactional(readOnly = true) public class AddressService { - private final AddressDepth1Repository addressDepth1Repository; - private final AddressDepth2Repository addressDepth2Repository; + private final AddressReader addressReader; - @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "address", key = "'all'") public AllAddressResponse findAllAddress() { - final AddressDepth1 addressDepth1 = addressDepth1Repository.findAll() - .get(0); - - final List addressDepth2List = addressDepth2Repository.findByAddressDepth1(addressDepth1) - .stream() - .map(AddressDepth2::getName) - .toList(); - - return AllAddressResponse.builder() - .addressDepth1(addressDepth1.getName()) - .addressDepth2List(addressDepth2List) - .build(); - } - - public MainAddressResponse findMainAddressByNames(final String addressDepth1Name, final String addressDepth2Name) { - final AddressDepth1 addressDepth1 = addressDepth1Repository.findByName(addressDepth1Name) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); - - final AddressDepth2 addressDepth2 = addressDepth2Repository.findByNameAndAddressDepth1(addressDepth2Name, - addressDepth1) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); - - return MainAddressResponse.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); - } - - //기존 메서드 네이밍 및 시그니처 유지를 위해 임시적으로 아래와 구현했습니다. - //todo 현호:서로 다른 입력을 받아 MainAddressResponse를 반환하는 두 메서드를 어떻게 통합하면 좋을 지 논의해보면 좋겠습니다. - public MainAddressResponse findMainAddressByAddressStrings(final String mainAddress) { - final List depthedAddress = AddressParser.splitToAddressDepth1And2(mainAddress); - - return findMainAddressByNames(depthedAddress.get(0), depthedAddress.get(1)); + return addressReader.readAllAddress(); } } diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index fa9fd675..e290525f 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -8,6 +8,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.TokenExtractor; import kr.pickple.back.auth.domain.oauth.OauthMember; @@ -39,6 +41,7 @@ public class OauthService { private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; private final RedisRepository redisRepository; + private final AddressReader addressReader; public String getAuthCodeRequestUrl(final OauthProvider oauthProvider) { return authCodeRequestUrlProviderComposite.provide(oauthProvider); @@ -70,7 +73,9 @@ public AuthenticatedMemberResponse processLoginOrRegistration( jwtProperties.getRefreshTokenExpirationTime() ); - return AuthenticatedMemberResponse.of(loginMember, loginTokens); + final MainAddress mainAddress = addressReader.readMainAddress(loginMember); + + return AuthenticatedMemberResponse.of(loginMember, loginTokens, mainAddress); } // 사용자가 회원 가입 시, 추가 정보(주 활동지역, 포지션)를 입력하는 경우 @@ -84,8 +89,7 @@ public AccessTokenResponse regenerateAccessToken(final String refreshToken, fina final String accessToken = tokenExtractor.extractAccessToken(authorizationHeader); if (jwtProvider.isValidRefreshAndInvalidAccess(refreshToken, accessToken)) { - final RefreshToken validRefreshToken = redisRepository.findHash(REFRESH_TOKEN_KEY, - refreshToken); + final RefreshToken validRefreshToken = redisRepository.findHash(REFRESH_TOKEN_KEY, refreshToken); if (validRefreshToken == null) { throw new AuthException(AUTH_INVALID_REFRESH_TOKEN); diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index c5893fe8..161d46cb 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; @@ -40,7 +40,7 @@ public class CrewCreateRequest { public Crew toEntity( final Member leader, - final MainAddressResponse mainAddressResponse, + final MainAddressId mainAddressId, final String profile, final String background ) { @@ -52,8 +52,8 @@ public Crew toEntity( .leader(leader) .profileImageUrl(profile) .backgroundImageUrl(background) - .addressDepth1(mainAddressResponse.getAddressDepth1()) - .addressDepth2(mainAddressResponse.getAddressDepth2()) + .addressDepth1(mainAddressId.getAddressDepth1()) + .addressDepth2(mainAddressId.getAddressDepth2()) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 4521a822..9e66aad9 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatRoomService; @@ -62,7 +62,7 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina validateMemberCreatedCrewsCount(leader); - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + final MainAddressId mainAddressId = addressService.findMainAddressByNames( crewCreateRequest.getAddressDepth1(), crewCreateRequest.getAddressDepth2() ); @@ -74,7 +74,7 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina final Crew crew = crewCreateRequest.toEntity( leader, - mainAddressResponse, + mainAddressId, MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) ); @@ -126,12 +126,12 @@ public List findCrewsByAddress( final String addressDepth2, final Pageable pageable ) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, + final MainAddressId mainAddressId = addressService.findMainAddressByNames(addressDepth1, addressDepth2); final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), + mainAddressId.getAddressDepth1(), + mainAddressId.getAddressDepth2(), pageable ); diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index 6739a450..677ab702 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -15,7 +15,7 @@ import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.member.domain.Member; @@ -69,7 +69,7 @@ public class GameCreateRequest { public Game toEntity( final Member host, - final MainAddressResponse mainAddressResponse, + final MainAddressId mainAddressId, final Point point ) { return Game.builder() @@ -84,8 +84,8 @@ public Game toEntity( .maxMemberCount(maxMemberCount) .host(host) .point(point) - .addressDepth1(mainAddressResponse.getAddressDepth1()) - .addressDepth2(mainAddressResponse.getAddressDepth2()) + .addressDepth1(mainAddressId.getAddressDepth1()) + .addressDepth2(mainAddressId.getAddressDepth2()) .build(); } diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index abb27630..13163ba7 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Component; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; @@ -24,11 +24,13 @@ public GamesAndLocationResponse findGamesWithInAddress( final String addressDepth1, final String addressDepth2 ) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1, - addressDepth2); + final MainAddressId mainAddressId = addressService.findMainAddressByNames( + addressDepth1, + addressDepth2 + ); - final List gameResponses = gameService.findGamesWithInAddress(mainAddressResponse); - final MapPolygon mapPolygon = mapService.findMapPolygonByMainAddress(mainAddressResponse); + final List gameResponses = gameService.findGamesWithInAddress(mainAddressId); + final MapPolygon mapPolygon = mapService.findMapPolygonByMainAddress(mainAddressId); return GamesAndLocationResponse.of(gameResponses, mapPolygon); } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 9b3e5f6a..ef84ae4a 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -19,7 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; @@ -77,10 +77,10 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina final Member host = memberRepository.getMemberById(loggedInMemberId); final Point point = kakaoAddressSearchClient.fetchAddress( gameCreateRequest.getMainAddress()); - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings( + final MainAddressId mainAddressId = addressService.findMainAddressByAddressStrings( gameCreateRequest.getMainAddress()); - final Game game = gameCreateRequest.toEntity(host, mainAddressResponse, point); + final Game game = gameCreateRequest.toEntity(host, mainAddressId, point); final GameMember gameHost = GameMember.builder() .member(host) @@ -179,7 +179,7 @@ public List findGamesByCategory( * 주소별 게스트 모집글 조회 */ private List findGamesByAddress(final String address, final Pageable pageable) { - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByAddressStrings(address); + final MainAddressId mainAddressId = addressService.findMainAddressByAddressStrings(address); final PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), @@ -192,8 +192,8 @@ private List findGamesByAddress(final String address, final Pageab ); final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2(), + mainAddressId.getAddressDepth1(), + mainAddressId.getAddressDepth2(), GameStatus.ENDED, pageRequest ); @@ -207,10 +207,10 @@ private List findGamesByAddress(final String address, final Pageab /** * 특정 지역의 게스트 모집글 조회 */ - public List findGamesWithInAddress(final MainAddressResponse mainAddressResponse) { + public List findGamesWithInAddress(final MainAddressId mainAddressId) { final List games = gameRepository.findGamesWithInAddress( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2() + mainAddressId.getAddressDepth1(), + mainAddressId.getAddressDepth2() ); return games.stream() diff --git a/src/main/java/kr/pickple/back/map/repository/MapPolygonRepository.java b/src/main/java/kr/pickple/back/map/repository/MapPolygonRepository.java index bdbfe6d8..2320ada1 100644 --- a/src/main/java/kr/pickple/back/map/repository/MapPolygonRepository.java +++ b/src/main/java/kr/pickple/back/map/repository/MapPolygonRepository.java @@ -2,12 +2,12 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.map.domain.MapPolygon; public interface MapPolygonRepository extends JpaRepository { - MapPolygon findByAddressDepth1AndAddressDepth2(final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2); + MapPolygon findByAddressDepth1IdAndAddressDepth2Id( + final Long addressDepth1Id, + final Long addressDepth2Id + ); } diff --git a/src/main/java/kr/pickple/back/map/service/MapService.java b/src/main/java/kr/pickple/back/map/service/MapService.java index 73d483c4..4db7fdcb 100644 --- a/src/main/java/kr/pickple/back/map/service/MapService.java +++ b/src/main/java/kr/pickple/back/map/service/MapService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; import kr.pickple.back.map.domain.MapPolygon; import kr.pickple.back.map.repository.MapPolygonRepository; import lombok.RequiredArgsConstructor; @@ -16,11 +16,12 @@ public class MapService { private final MapPolygonRepository mapPolygonRepository; @Transactional(readOnly = true) - @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddressResponse.addressDepth2.name") - public MapPolygon findMapPolygonByMainAddress(final MainAddressResponse mainAddressResponse) { - return mapPolygonRepository.findByAddressDepth1AndAddressDepth2( - mainAddressResponse.getAddressDepth1(), - mainAddressResponse.getAddressDepth2() + @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddressId.addressDepth2.name") + public MapPolygon findMapPolygonByMainAddress(final MainAddressId mainAddressId) { + + return mapPolygonRepository.findByAddressDepth1IdAndAddressDepth2Id( + mainAddressId.getAddressDepth1Id(), + mainAddressId.getAddressDepth2Id() ); } } diff --git a/src/main/java/kr/pickple/back/member/domain/Member.java b/src/main/java/kr/pickple/back/member/domain/Member.java index 89061335..e5478b28 100644 --- a/src/main/java/kr/pickple/back/member/domain/Member.java +++ b/src/main/java/kr/pickple/back/member/domain/Member.java @@ -10,15 +10,10 @@ import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.member.exception.MemberException; @@ -76,14 +71,10 @@ public class Member extends BaseEntity { private OauthProvider oauthProvider; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth1_id") - private AddressDepth1 addressDepth1; + private Long addressDepth1Id; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth2_id") - private AddressDepth2 addressDepth2; + private Long addressDepth2Id; @Builder private Member( @@ -93,8 +84,8 @@ private Member( final MemberStatus status, final Long oauthId, final OauthProvider oauthProvider, - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final Long addressDepth1Id, + final Long addressDepth2Id ) { this.email = email; this.nickname = nickname; @@ -102,8 +93,8 @@ private Member( this.status = status; this.oauthId = oauthId; this.oauthProvider = oauthProvider; - this.addressDepth1 = addressDepth1; - this.addressDepth2 = addressDepth2; + this.addressDepth1Id = addressDepth1Id; + this.addressDepth2Id = addressDepth2Id; setDefaultIntroduction(nickname); } diff --git a/src/main/java/kr/pickple/back/member/domain/MemberPositions.java b/src/main/java/kr/pickple/back/member/domain/MemberPositions.java deleted file mode 100644 index eeac9935..00000000 --- a/src/main/java/kr/pickple/back/member/domain/MemberPositions.java +++ /dev/null @@ -1,52 +0,0 @@ -package kr.pickple.back.member.domain; - -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -import org.hibernate.annotations.BatchSize; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.position.domain.Position; - -@Embeddable -public class MemberPositions { - - @BatchSize(size = 1000) - @OneToMany(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List memberPositions = new ArrayList<>(); - - public List getPositions() { - return memberPositions.stream() - .map(MemberPosition::getPosition) - .toList(); - } - - public void updateMemberPositions(final Member member, final List positions) { - validateIsDuplicatedPositions(positions); - - positions.stream() - .map(position -> buildMemberPosition(member, position)) - .forEach(memberPositions::add); - } - - private void validateIsDuplicatedPositions(final List positions) { - long distinctPositionsSize = new HashSet<>(positions).size(); - - if (distinctPositionsSize < positions.size()) { - throw new MemberException(MEMBER_POSITIONS_IS_DUPLICATED, positions); - } - } - - private MemberPosition buildMemberPosition(final Member member, final Position position) { - return MemberPosition.builder() - .position(position) - .member(member) - .build(); - } -} diff --git a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java index dc2087c2..cee5ec6a 100644 --- a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java +++ b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; @@ -48,7 +48,7 @@ public class MemberCreateRequest { @NotBlank(message = "주소2는 null이거나 빈 문자열이거나 공백일 수 없음") private String addressDepth2; - public Member toEntity(final MainAddressResponse mainAddressResponse) { + public Member toEntity(final MainAddress mainAddress) { return Member.builder() .email(email) .nickname(nickname) @@ -56,8 +56,8 @@ public Member toEntity(final MainAddressResponse mainAddressResponse) { .status(MemberStatus.ACTIVE) .oauthId(oauthId) .oauthProvider(oauthProvider) - .addressDepth1(mainAddressResponse.getAddressDepth1()) - .addressDepth2(mainAddressResponse.getAddressDepth2()) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) .build(); } diff --git a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java index 9e86ba5e..51073322 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java @@ -1,5 +1,6 @@ package kr.pickple.back.member.dto.response; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.auth.domain.oauth.OauthMember; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.auth.domain.token.AuthTokens; @@ -46,7 +47,11 @@ private AuthenticatedMemberResponse( this.addressDepth2 = addressDepth2; } - public static AuthenticatedMemberResponse of(final Member member, final AuthTokens authTokens) { + public static AuthenticatedMemberResponse of( + final Member member, + final AuthTokens authTokens, + final MainAddress mainAddress + ) { return AuthenticatedMemberResponse.builder() .accessToken(authTokens.getAccessToken()) .refreshToken(authTokens.getRefreshToken()) @@ -56,8 +61,8 @@ public static AuthenticatedMemberResponse of(final Member member, final AuthToke .email(member.getEmail()) .oauthId(member.getOauthId()) .oauthProvider(member.getOauthProvider()) - .addressDepth1(member.getAddressDepth1().getName()) - .addressDepth2(member.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .build(); } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java index 78bc387e..d0d329d3 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java @@ -2,6 +2,7 @@ import java.util.List; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; @@ -30,7 +31,8 @@ public class MemberProfileResponse { public static MemberProfileResponse of( final Member member, final List crewResponses, - final List positions + final List positions, + final MainAddress mainAddress ) { return MemberProfileResponse.builder() .id(member.getId()) @@ -40,8 +42,8 @@ public static MemberProfileResponse of( .profileImageUrl(member.getProfileImageUrl()) .mannerScore(member.getMannerScore()) .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1(member.getAddressDepth1().getName()) - .addressDepth2(member.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .positions(positions) .crews(crewResponses) .build(); diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index 49cbafce..b4d74527 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -2,6 +2,7 @@ import java.util.List; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -25,7 +26,11 @@ public class MemberResponse { private String addressDepth2; private List positions; - public static MemberResponse of(final Member member, final List positions) { + public static MemberResponse of( + final Member member, + final List positions, + final MainAddress mainAddress + ) { return MemberResponse.builder() .id(member.getId()) .email(member.getEmail()) @@ -34,8 +39,8 @@ public static MemberResponse of(final Member member, final List positi .profileImageUrl(member.getProfileImageUrl()) .mannerScore(member.getMannerScore()) .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1(member.getAddressDepth1().getName()) - .addressDepth2(member.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .positions(positions) .build(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index c9947d83..20785ec5 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; @@ -33,6 +34,7 @@ public class MemberCrewService { private final CrewMemberRepository crewMemberRepository; private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; + private final AddressReader addressReader; /** * 사용자가 가입한 크루 목록 조회 @@ -94,7 +96,7 @@ private List getMemberResponsesByCrew(final Crew crew, final Reg return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member))) + .map(member -> MemberResponse.of(member, getPositions(member), addressReader.readMainAddress(member))) .toList(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index 6dfeb6a2..5a4910c3 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; @@ -33,6 +34,7 @@ public class MemberGameService { private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; private final MemberPositionRepository memberPositionRepository; + private final AddressReader addressReader; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 @@ -107,7 +109,12 @@ private List getMemberResponsesByGame(final Game game, final Reg return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) .stream() .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositionsByMember(member), + addressReader.readMainAddress(member) + ) + ) .toList(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 12714f50..debf97fc 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -9,8 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressResponse; -import kr.pickple.back.address.service.AddressService; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.auth.domain.token.JwtProvider; @@ -20,8 +20,6 @@ import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.request.MemberCreateRequest; @@ -45,11 +43,9 @@ public class MemberService { private final CrewMemberRepository crewMemberRepository; private final MemberPositionRepository memberPositionRepository; private final RedisRepository redisRepository; - private final AddressService addressService; private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; - private final GamePositionRepository gamePositionRepository; - private final GameMemberRepository gameMemberRepository; + private final AddressReader addressReader; /** * 사용자 회원가입 (카카오) @@ -58,12 +54,12 @@ public class MemberService { public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { validateIsDuplicatedMemberInfo(memberCreateRequest); - final MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames( + final MainAddress mainAddressId = addressReader.readMainAddressByNames( memberCreateRequest.getAddressDepth1(), memberCreateRequest.getAddressDepth2() ); - final Member member = memberCreateRequest.toEntity(mainAddressResponse); + final Member member = memberCreateRequest.toEntity(mainAddressId); final Member savedMember = memberRepository.save(member); final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); @@ -85,7 +81,9 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member jwtProperties.getRefreshTokenExpirationTime() ); - return AuthenticatedMemberResponse.of(savedMember, loginTokens); + final MainAddress mainAddress = addressReader.readMainAddress(savedMember); + + return AuthenticatedMemberResponse.of(savedMember, loginTokens, mainAddress); } private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { @@ -114,13 +112,16 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) .toList(); - return MemberProfileResponse.of(member, crewResponses, positions); + final MainAddress mainAddress = addressReader.readMainAddress(member); + + return MemberProfileResponse.of(member, crewResponses, positions, mainAddress); } private MemberResponse getLeaderResponse(final Crew crew) { final Member member = crew.getLeader(); + final MainAddress mainAddress = addressReader.readMainAddress(member); - return MemberResponse.of(member, getPositionsByMember(member)); + return MemberResponse.of(member, getPositionsByMember(member), mainAddress); } private List getPositionsByMember(final Member member) { diff --git a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java index 52663b0b..501ea5a6 100644 --- a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java +++ b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java @@ -8,7 +8,7 @@ import org.springframework.boot.test.context.SpringBootTest; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; @SpringBootTest class AddressServiceTest { @@ -35,11 +35,11 @@ void findMainAddressByNames_ValidAddressNames_ReturnMainAddressInstance() { String addressDepth2Name = "강남구"; //when - MainAddressResponse mainAddressResponse = addressService.findMainAddressByNames(addressDepth1Name, + MainAddressId mainAddressId = addressService.findMainAddressByNames(addressDepth1Name, addressDepth2Name); //then - assertThat(mainAddressResponse.getAddressDepth1().getName()).isEqualTo(addressDepth1Name); - assertThat(mainAddressResponse.getAddressDepth2().getName()).isEqualTo(addressDepth2Name); + assertThat(mainAddressId.getAddressDepth1().getName()).isEqualTo(addressDepth1Name); + assertThat(mainAddressId.getAddressDepth2().getName()).isEqualTo(addressDepth2Name); } } diff --git a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java index 3cf6af97..acc1e67e 100644 --- a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java @@ -5,7 +5,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddressResponse; +import kr.pickple.back.address.dto.response.MainAddressId; public class AddressDtoFixtures { @@ -19,11 +19,11 @@ public static AllAddressResponse allAddressResponseBuild( .build(); } - public static MainAddressResponse mainAddressResponseBuild( + public static MainAddressId mainAddressResponseBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 ) { - return MainAddressResponse.builder() + return MainAddressId.builder() .addressDepth1(addressDepth1) .addressDepth2(addressDepth2) .build(); diff --git a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java index fccdb6c5..c5d7720c 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java +++ b/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java @@ -15,8 +15,8 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.address.dto.response.MainAddressResponse; -import kr.pickple.back.address.service.AddressService; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.auth.domain.token.JwtProvider; @@ -43,7 +43,7 @@ class MemberServiceTest { private JwtProvider jwtProvider; @Mock - private AddressService addressService; + private AddressReader addressReader; @Mock private JwtProperties jwtProperties; @@ -64,7 +64,7 @@ void createMember_ReturnAuthenticatedMemberResponse() { .name("영등포구") .addressDepth1(addressDepth1) .build(); - final MainAddressResponse mainAddressResponse = MainAddressResponse.builder() + final MainAddress mainAddress = MainAddress.builder() .addressDepth1(addressDepth1) .addressDepth2(addressDepth2) .build(); @@ -73,9 +73,9 @@ void createMember_ReturnAuthenticatedMemberResponse() { .refreshToken("refreshToken") .build(); - final Member member = memberCreateRequest.toEntity(mainAddressResponse); + final Member member = memberCreateRequest.toEntity(mainAddress); - given(addressService.findMainAddressByNames(anyString(), anyString())).willReturn(mainAddressResponse); + given(addressReader.readMainAddressByNames(anyString(), anyString())).willReturn(mainAddress); given(memberRepository.save(any(Member.class))).willReturn(member); given(jwtProvider.createLoginToken(anyString())).willReturn(authTokens); given(jwtProperties.getRefreshTokenExpirationTime()).willReturn(1000L); From 45bb117a9a910f5b7003a2fa9b6d6f32889f0e78 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 6 Feb 2024 16:28:01 +0900 Subject: [PATCH 015/117] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/dto/response/MainAddressId.java | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java diff --git a/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java b/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java deleted file mode 100644 index 42981bcd..00000000 --- a/src/main/java/kr/pickple/back/address/dto/response/MainAddressId.java +++ /dev/null @@ -1,15 +0,0 @@ -package kr.pickple.back.address.dto.response; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MainAddressId { - - private Long addressDepth1Id; - private Long addressDepth2Id; -} From 9f5ba6881b4869ebc665c37cb9c0032be39710d3 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 6 Feb 2024 16:31:51 +0900 Subject: [PATCH 016/117] =?UTF-8?q?refactor:=20MapService=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/map/service/MapService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/kr/pickple/back/map/service/MapService.java b/src/main/java/kr/pickple/back/map/service/MapService.java index 4db7fdcb..a9f93db0 100644 --- a/src/main/java/kr/pickple/back/map/service/MapService.java +++ b/src/main/java/kr/pickple/back/map/service/MapService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.map.domain.MapPolygon; import kr.pickple.back.map.repository.MapPolygonRepository; import lombok.RequiredArgsConstructor; @@ -16,12 +16,12 @@ public class MapService { private final MapPolygonRepository mapPolygonRepository; @Transactional(readOnly = true) - @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddressId.addressDepth2.name") - public MapPolygon findMapPolygonByMainAddress(final MainAddressId mainAddressId) { + @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddress.addressDepth2.name") + public MapPolygon findMapPolygonByMainAddress(final MainAddress mainAddress) { return mapPolygonRepository.findByAddressDepth1IdAndAddressDepth2Id( - mainAddressId.getAddressDepth1Id(), - mainAddressId.getAddressDepth2Id() + mainAddress.getAddressDepth1().getId(), + mainAddress.getAddressDepth2().getId() ); } } From 2e2370392c843625d9c7c1e26248b26ae13c13d5 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 7 Feb 2024 16:38:28 +0900 Subject: [PATCH 017/117] =?UTF-8?q?fix:=20MainAddressId=20->=20MainAddress?= =?UTF-8?q?=EB=A1=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EC=BB=B4=ED=8C=8C=EC=9D=BC=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../crew/dto/request/CrewCreateRequest.java | 8 ++--- .../back/crew/service/CrewMemberService.java | 10 +++++- .../back/crew/service/CrewService.java | 28 +++++++++------- .../game/dto/request/GameCreateRequest.java | 10 +++--- .../back/game/service/GameFacadeService.java | 24 +++++--------- .../back/game/service/GameMemberService.java | 10 +++++- .../back/game/service/GameService.java | 33 +++++++++++-------- 7 files changed, 72 insertions(+), 51 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index 161d46cb..cd22d0d0 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; @@ -40,7 +40,7 @@ public class CrewCreateRequest { public Crew toEntity( final Member leader, - final MainAddressId mainAddressId, + final MainAddress mainAddress, final String profile, final String background ) { @@ -52,8 +52,8 @@ public Crew toEntity( .leader(leader) .profileImageUrl(profile) .backgroundImageUrl(background) - .addressDepth1(mainAddressId.getAddressDepth1()) - .addressDepth2(mainAddressId.getAddressDepth2()) + .addressDepth1(mainAddress.getAddressDepth1()) + .addressDepth2(mainAddress.getAddressDepth2()) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 8634bfa7..2bb55286 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; @@ -34,6 +35,8 @@ @Transactional(readOnly = true) public class CrewMemberService { + private final AddressReader addressReader; + private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; @@ -85,7 +88,12 @@ public CrewProfileResponse findAllCrewMembers( final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) .stream() .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositionsByMember(member), + addressReader.readMainAddress(member) + ) + ) .toList(); return CrewProfileResponse.of(crew, memberResponses); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 9e66aad9..34b03e85 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -12,8 +12,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressId; -import kr.pickple.back.address.service.AddressService; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.config.property.S3Properties; @@ -43,11 +43,12 @@ public class CrewService { private static final Integer CREW_IMAGE_END_NUMBER = 20; private static final Integer CREW_CREATE_MAX_SIZE = 3; + private final AddressReader addressReader; + private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; private final MemberPositionRepository memberPositionRepository; - private final AddressService addressService; private final ChatRoomService chatRoomService; private final S3Properties s3Properties; @@ -62,7 +63,7 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina validateMemberCreatedCrewsCount(leader); - final MainAddressId mainAddressId = addressService.findMainAddressByNames( + final MainAddress mainAddress = addressReader.readMainAddressByNames( crewCreateRequest.getAddressDepth1(), crewCreateRequest.getAddressDepth2() ); @@ -74,7 +75,7 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina final Crew crew = crewCreateRequest.toEntity( leader, - mainAddressId, + mainAddress, MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) ); @@ -126,12 +127,11 @@ public List findCrewsByAddress( final String addressDepth2, final Pageable pageable ) { - final MainAddressId mainAddressId = addressService.findMainAddressByNames(addressDepth1, - addressDepth2); + final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( - mainAddressId.getAddressDepth1(), - mainAddressId.getAddressDepth2(), + mainAddress.getAddressDepth1(), + mainAddress.getAddressDepth2(), pageable ); @@ -144,13 +144,17 @@ private List getConfirmedMemberResponses(final Long crewId) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) .stream() .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositionsByMember(member), + addressReader.readMainAddress(member) + ) + ) .toList(); } private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); + final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); return Position.fromMemberPositions(memberPositions); } diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index 677ab702..b8091f87 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -15,7 +15,7 @@ import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.member.domain.Member; @@ -69,7 +69,7 @@ public class GameCreateRequest { public Game toEntity( final Member host, - final MainAddressId mainAddressId, + final MainAddress mainAddress, final Point point ) { return Game.builder() @@ -78,14 +78,14 @@ public Game toEntity( .playStartTime(playStartTime) .playEndTime(playStartTime.plusMinutes(playTimeMinutes)) .playTimeMinutes(playTimeMinutes) - .mainAddress(mainAddress) + .mainAddress(this.mainAddress) .detailAddress(detailAddress) .cost(cost) .maxMemberCount(maxMemberCount) .host(host) .point(point) - .addressDepth1(mainAddressId.getAddressDepth1()) - .addressDepth2(mainAddressId.getAddressDepth2()) + .addressDepth1(mainAddress.getAddressDepth1()) + .addressDepth2(mainAddress.getAddressDepth2()) .build(); } diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index 13163ba7..430a7386 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -4,8 +4,8 @@ import org.springframework.stereotype.Component; -import kr.pickple.back.address.dto.response.MainAddressId; -import kr.pickple.back.address.service.AddressService; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; import kr.pickple.back.map.domain.MapPolygon; @@ -16,21 +16,15 @@ @RequiredArgsConstructor public class GameFacadeService { + private final AddressReader addressReader; + private final GameService gameService; private final MapService mapService; - private final AddressService addressService; - - public GamesAndLocationResponse findGamesWithInAddress( - final String addressDepth1, - final String addressDepth2 - ) { - final MainAddressId mainAddressId = addressService.findMainAddressByNames( - addressDepth1, - addressDepth2 - ); - - final List gameResponses = gameService.findGamesWithInAddress(mainAddressId); - final MapPolygon mapPolygon = mapService.findMapPolygonByMainAddress(mainAddressId); + + public GamesAndLocationResponse findGamesWithInAddress(final String addressDepth1, final String addressDepth2) { + final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); + final List gameResponses = gameService.findGamesWithInAddress(mainAddress); + final MapPolygon mapPolygon = mapService.findMapPolygonByMainAddress(mainAddress); return GamesAndLocationResponse.of(gameResponses, mapPolygon); } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index fd6ccc7d..64c198d9 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; @@ -36,6 +37,8 @@ @RequiredArgsConstructor public class GameMemberService { + private final AddressReader addressReader; + private final GameRepository gameRepository; private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; @@ -96,7 +99,12 @@ private List getMemberResponsesByStatus(final Game game, final R return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) .stream() .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositionsByMember(member), + addressReader.readMainAddress(member) + ) + ) .toList(); } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index ef84ae4a..7e6259fa 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -19,7 +19,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; @@ -51,6 +52,8 @@ @Transactional(readOnly = true) public class GameService { + private final AddressReader addressReader; + private final GameRepository gameRepository; private final MemberPositionRepository memberPositionRepository; private final MemberRepository memberRepository; @@ -75,17 +78,16 @@ private static long getSecondsBetween( @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { final Member host = memberRepository.getMemberById(loggedInMemberId); - final Point point = kakaoAddressSearchClient.fetchAddress( - gameCreateRequest.getMainAddress()); - final MainAddressId mainAddressId = addressService.findMainAddressByAddressStrings( + final Point point = kakaoAddressSearchClient.fetchAddress(gameCreateRequest.getMainAddress()); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( gameCreateRequest.getMainAddress()); - final Game game = gameCreateRequest.toEntity(host, mainAddressId, point); - + final Game game = gameCreateRequest.toEntity(host, mainAddress, point); final GameMember gameHost = GameMember.builder() .member(host) .game(game) .build(); + gameHost.confirmRegistration(); final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); @@ -179,7 +181,7 @@ public List findGamesByCategory( * 주소별 게스트 모집글 조회 */ private List findGamesByAddress(final String address, final Pageable pageable) { - final MainAddressId mainAddressId = addressService.findMainAddressByAddressStrings(address); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(address); final PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), @@ -192,8 +194,8 @@ private List findGamesByAddress(final String address, final Pageab ); final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( - mainAddressId.getAddressDepth1(), - mainAddressId.getAddressDepth2(), + mainAddress.getAddressDepth1(), + mainAddress.getAddressDepth2(), GameStatus.ENDED, pageRequest ); @@ -207,10 +209,10 @@ private List findGamesByAddress(final String address, final Pageab /** * 특정 지역의 게스트 모집글 조회 */ - public List findGamesWithInAddress(final MainAddressId mainAddressId) { + public List findGamesWithInAddress(final MainAddress mainAddress) { final List games = gameRepository.findGamesWithInAddress( - mainAddressId.getAddressDepth1(), - mainAddressId.getAddressDepth2() + mainAddress.getAddressDepth1(), + mainAddress.getAddressDepth2() ); return games.stream() @@ -241,7 +243,12 @@ private List getMemberResponsesByStatus(final Game game, final R return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) .stream() .map(GameMember::getMember) - .map(member -> MemberResponse.of(member, getPositionsByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositionsByMember(member), + addressReader.readMainAddress(member) + ) + ) .toList(); } From 2c0290712e8d5a81b5a118a8f44d3b4954a53379 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 7 Feb 2024 21:00:09 +0900 Subject: [PATCH 018/117] =?UTF-8?q?fix:=20=ED=8F=AC=EC=A7=80=EC=85=98=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=ED=99=95=EC=9D=B8=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/member/service/MemberService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index debf97fc..44feb319 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -62,6 +62,7 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member final Member member = memberCreateRequest.toEntity(mainAddressId); final Member savedMember = memberRepository.save(member); + validatedIsDuplicatedPositions(memberCreateRequest.getPositions()); final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ @@ -86,6 +87,16 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member return AuthenticatedMemberResponse.of(savedMember, loginTokens, mainAddress); } + private void validatedIsDuplicatedPositions(final List positions) { + long distinctPositionsSize = positions.stream() + .distinct() + .count(); + + if (distinctPositionsSize != positions.size()) { + throw new MemberException(MEMBER_POSITIONS_IS_DUPLICATED, positions); + } + } + private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { final String email = memberCreateRequest.getEmail(); final String nickname = memberCreateRequest.getNickname(); From 17de837508db4376ce6f86dfa2f4a4bf4cc4bba7 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 7 Feb 2024 21:03:31 +0900 Subject: [PATCH 019/117] =?UTF-8?q?style:=20=EC=BB=A8=EB=B2=A4=EC=85=98=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 --- src/main/java/kr/pickple/back/member/service/MemberService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 44feb319..d528b5cc 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -88,7 +88,7 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member } private void validatedIsDuplicatedPositions(final List positions) { - long distinctPositionsSize = positions.stream() + final Long distinctPositionsSize = positions.stream() .distinct() .count(); From cb0ece55b322f5428ed04517f4106129586a62bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 7 Feb 2024 17:53:12 +0900 Subject: [PATCH 020/117] =?UTF-8?q?refactor:=20addressReader=EC=97=90=20re?= =?UTF-8?q?adMainAddressByGame=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20readMainAddress=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20readMainAddressByMember=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/implement/AddressReader.java | 15 +++++++++++++-- .../pickple/back/auth/service/OauthService.java | 2 +- .../back/crew/service/CrewMemberService.java | 2 +- .../kr/pickple/back/crew/service/CrewService.java | 2 +- .../back/member/service/MemberService.java | 6 +++--- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/pickple/back/address/implement/AddressReader.java b/src/main/java/kr/pickple/back/address/implement/AddressReader.java index 5233fac6..ae733f0b 100644 --- a/src/main/java/kr/pickple/back/address/implement/AddressReader.java +++ b/src/main/java/kr/pickple/back/address/implement/AddressReader.java @@ -16,6 +16,7 @@ import kr.pickple.back.address.repository.AddressDepth1Repository; import kr.pickple.back.address.repository.AddressDepth2Repository; import kr.pickple.back.address.util.AddressParser; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @@ -68,7 +69,7 @@ public MainAddress readMainAddressByAddressStrings(final String mainAddress) { return readMainAddressByNames(depthedAddress.get(0), depthedAddress.get(1)); } - public MainAddress readMainAddress(final Member member) { + public MainAddress readMainAddressByMember(final Member member) { final AddressDepth1 addressDepth1 = getAddressDepth1ById(member.getAddressDepth1Id()); final AddressDepth2 addressDepth2 = getAddressDepth2ById(member.getAddressDepth2Id()); @@ -78,6 +79,16 @@ public MainAddress readMainAddress(final Member member) { .build(); } + public MainAddress readMainAddressByGame(final Game game) { + final AddressDepth1 addressDepth1 = getAddressDepth1ById(game.getAddressDepth1Id()); + final AddressDepth2 addressDepth2 = getAddressDepth2ById(game.getAddressDepth2Id()); + + return MainAddress.builder() + .addressDepth1(addressDepth1) + .addressDepth2(addressDepth2) + .build(); + } + private AddressDepth2 getAddressDepth2ByNamesAndAddressDepth1(final String addressDepth1Name, final String addressDepth2Name, final AddressDepth1 addressDepth1 @@ -96,7 +107,7 @@ private AddressDepth1 getAddressDepth1ById(final Long addressDepth1Id) { .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Id)); } - private AddressDepth2 getAddressDepth2ById(final Long addressDepth2Id) { + public AddressDepth2 getAddressDepth2ById(final Long addressDepth2Id) { return addressDepth2Repository.findById(addressDepth2Id) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth2Id)); } diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index e290525f..7e0449cc 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -73,7 +73,7 @@ public AuthenticatedMemberResponse processLoginOrRegistration( jwtProperties.getRefreshTokenExpirationTime() ); - final MainAddress mainAddress = addressReader.readMainAddress(loginMember); + final MainAddress mainAddress = addressReader.readMainAddressByMember(loginMember); return AuthenticatedMemberResponse.of(loginMember, loginTokens, mainAddress); } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 2bb55286..6edd6e2b 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -91,7 +91,7 @@ public CrewProfileResponse findAllCrewMembers( .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddress(member) + addressReader.readMainAddressByMember(member) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 34b03e85..f0870787 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -147,7 +147,7 @@ private List getConfirmedMemberResponses(final Long crewId) { .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddress(member) + addressReader.readMainAddressByMember(member) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index d528b5cc..b9db27f8 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -82,7 +82,7 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member jwtProperties.getRefreshTokenExpirationTime() ); - final MainAddress mainAddress = addressReader.readMainAddress(savedMember); + final MainAddress mainAddress = addressReader.readMainAddressByMember(savedMember); return AuthenticatedMemberResponse.of(savedMember, loginTokens, mainAddress); } @@ -123,14 +123,14 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) .toList(); - final MainAddress mainAddress = addressReader.readMainAddress(member); + final MainAddress mainAddress = addressReader.readMainAddressByMember(member); return MemberProfileResponse.of(member, crewResponses, positions, mainAddress); } private MemberResponse getLeaderResponse(final Crew crew) { final Member member = crew.getLeader(); - final MainAddress mainAddress = addressReader.readMainAddress(member); + final MainAddress mainAddress = addressReader.readMainAddressByMember(member); return MemberResponse.of(member, getPositionsByMember(member), mainAddress); } From e6ebdb11fa5fd6eb4462e89e0cb40dc8d1d5537b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 7 Feb 2024 18:04:28 +0900 Subject: [PATCH 021/117] =?UTF-8?q?refactor:=20Game=EC=9D=98=20Address?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=8B=A8=EB=B0=A9=ED=96=A5=20?= =?UTF-8?q?=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/game/domain/Game.java | 18 ++++++------------ .../game/dto/request/GameCreateRequest.java | 4 ++-- .../pickple/back/game/service/GameService.java | 14 ++++++-------- .../dto/response/MemberGameResponse.java | 7 ++++--- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index 18ff9aa7..d6efe038 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -20,8 +20,6 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.exception.GameException; @@ -91,14 +89,10 @@ public class Game extends BaseEntity { private Member host; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth1_id") - private AddressDepth1 addressDepth1; + private Long addressDepth1Id; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth2_id") - private AddressDepth2 addressDepth2; + private Long addressDepth2Id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chat_room_id") @@ -117,8 +111,8 @@ private Game( final Integer maxMemberCount, final Member host, final Point point, - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final Long addressDepth1Id, + final Long addressDepth2Id ) { this.content = content; this.playDate = playDate; @@ -131,8 +125,8 @@ private Game( this.maxMemberCount = maxMemberCount; this.host = host; this.point = point; - this.addressDepth1 = addressDepth1; - this.addressDepth2 = addressDepth2; + this.addressDepth1Id = addressDepth1Id; + this.addressDepth2Id = addressDepth2Id; } public void updateGameStatus(final GameStatus gameStatus) { diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index b8091f87..bac7b3b5 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -84,8 +84,8 @@ public Game toEntity( .maxMemberCount(maxMemberCount) .host(host) .point(point) - .addressDepth1(mainAddress.getAddressDepth1()) - .addressDepth2(mainAddress.getAddressDepth2()) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) .build(); } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 7e6259fa..fe618222 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -21,7 +21,6 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.address.service.AddressService; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.chat.domain.ChatRoom; @@ -58,7 +57,6 @@ public class GameService { private final MemberPositionRepository memberPositionRepository; private final MemberRepository memberRepository; private final KakaoAddressSearchClient kakaoAddressSearchClient; - private final AddressService addressService; private final ChatRoomService chatRoomService; private final RedisRepository redisRepository; private final GamePositionRepository gamePositionRepository; @@ -105,7 +103,7 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina private String makeGameRoomName(final Game game) { final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); - final String addressDepth2Name = game.getAddressDepth2().getName(); + final String addressDepth2Name = addressReader.getAddressDepth2ById(game.getAddressDepth2Id()).getName(); return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); } @@ -159,7 +157,7 @@ public GameResponse findGameById(final Long gameId) { final Game game = gameRepository.getGameById(gameId); game.increaseViewCount(); - return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game)); + return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game), addressReader.readMainAddressByGame(game)); } /** @@ -202,7 +200,7 @@ private List findGamesByAddress(final String address, final Pageab return games.stream() .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game))) + getPositionsByGame(game), addressReader.readMainAddressByGame(game))) .toList(); } @@ -218,7 +216,7 @@ public List findGamesWithInAddress(final MainAddress mainAddress) return games.stream() .filter(Game::isNotEndedGame) .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game))) + getPositionsByGame(game), addressReader.readMainAddressByGame(game))) .toList(); } @@ -235,7 +233,7 @@ public List findGamesWithInDistance( return games.stream() .filter(Game::isNotEndedGame) .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game))) + getPositionsByGame(game), addressReader.readMainAddressByGame(game))) .toList(); } @@ -246,7 +244,7 @@ private List getMemberResponsesByStatus(final Game game, final R .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddress(member) + addressReader.readMainAddressByMember(member) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index 4e85ac76..403e76ab 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -4,6 +4,7 @@ import java.time.LocalTime; import java.util.List; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.GameStatus; @@ -41,7 +42,7 @@ public class MemberGameResponse { private List members; public static MemberGameResponse of(final GameMember gameMember, final List memberResponses, - List positions) { + final List positions, final MainAddress mainAddress) { final Game game = gameMember.getGame(); return MemberGameResponse.builder() @@ -62,8 +63,8 @@ public static MemberGameResponse of(final GameMember gameMember, final List Date: Wed, 7 Feb 2024 18:06:56 +0900 Subject: [PATCH 022/117] =?UTF-8?q?refactor:=20game=20-=20address=20?= =?UTF-8?q?=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20toDTO,=20fromDTO=20=EC=8B=9C?= =?UTF-8?q?=EA=B7=B8=EB=8B=88=EC=B2=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/game/dto/response/GameResponse.java | 7 ++++--- .../kr/pickple/back/game/service/GameMemberService.java | 4 ++-- .../kr/pickple/back/member/service/MemberCrewService.java | 2 +- .../kr/pickple/back/member/service/MemberGameService.java | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index 7ff61aaa..7f1f0fe0 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -4,6 +4,7 @@ import java.time.LocalTime; import java.util.List; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.member.dto.response.MemberResponse; @@ -40,7 +41,7 @@ public class GameResponse { private List members; public static GameResponse of(final Game game, final List memberResponses, - List positions) { + final List positions, final MainAddress mainAddress) { return GameResponse.builder() .id(game.getId()) .content(game.getContent()) @@ -58,8 +59,8 @@ public static GameResponse of(final Game game, final List member .memberCount(game.getMemberCount()) .maxMemberCount(game.getMaxMemberCount()) .host(getHostResponse(memberResponses, game.getHost().getId())) - .addressDepth1(game.getAddressDepth1().getName()) - .addressDepth2(game.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .positions(positions) .members(memberResponses) .build(); diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 64c198d9..e7339e05 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -92,7 +92,7 @@ public GameResponse findAllGameMembers( throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game)); + return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game), addressReader.readMainAddressByGame(game)); } private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { @@ -102,7 +102,7 @@ private List getMemberResponsesByStatus(final Game game, final R .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddress(member) + addressReader.readMainAddressByMember(member) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 20785ec5..f9e559a2 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -96,7 +96,7 @@ private List getMemberResponsesByCrew(final Crew crew, final Reg return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member), addressReader.readMainAddress(member))) + .map(member -> MemberResponse.of(member, getPositions(member), addressReader.readMainAddressByMember(member))) .toList(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index 5a4910c3..ee51eb88 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -99,7 +99,8 @@ private List convertToMemberGameResponses( MemberGameResponse.of( memberGame, getMemberResponsesByGame(memberGame.getGame(), memberStatus), - getPositionsByMember(memberGame.getMember()) + getPositionsByMember(memberGame.getMember()), + addressReader.readMainAddressByGame(memberGame.getGame()) ) ) .toList(); @@ -112,7 +113,7 @@ private List getMemberResponsesByGame(final Game game, final Reg .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddress(member) + addressReader.readMainAddressByMember(member) ) ) .toList(); From 0548aa9f4d57148c30a2cc47368516e642f32e44 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 7 Feb 2024 21:32:50 +0900 Subject: [PATCH 023/117] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4,=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C,=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ChatRoomDetailResponse.java | 7 --- .../pickple/back/crew/domain/CrewMember.java | 8 --- .../back/crew/implement/CrewReader.java | 14 +++++ .../pickple/back/game/domain/GameMember.java | 8 --- .../pickple/back/game/domain/GameMembers.java | 57 ------------------- .../back/game/domain/GamePositions.java | 53 ----------------- 6 files changed, 14 insertions(+), 133 deletions(-) create mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewReader.java delete mode 100644 src/main/java/kr/pickple/back/game/domain/GameMembers.java delete mode 100644 src/main/java/kr/pickple/back/game/domain/GamePositions.java diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java index d323cd18..7d4f6428 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java @@ -85,11 +85,4 @@ public static ChatRoomDetailResponse of( .createdAt(chatRoom.getCreatedAt()) .build(); } - - // private static List getChatMemberResponses(final ChatRoom chatRoom) { - // return chatRoom.getActiveMembersInRoom() - // .stream() - // .map(ChatMemberResponse::from) - // .toList(); - // } } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index adc5844d..87a63b44 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -52,14 +52,6 @@ private CrewMember(final Member member, final Crew crew) { this.crew = crew; } - public Boolean equalsStatus(final RegistrationStatus status) { - return this.status == status; - } - - public Boolean equalsCrew(final Crew crew) { - return this.crew.equals(crew); - } - public void confirmRegistration() { this.status = CONFIRMED; } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java new file mode 100644 index 00000000..a6518f29 --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -0,0 +1,14 @@ +package kr.pickple.back.crew.implement; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CrewReader { + + +} diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 9e81d69d..075da652 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -69,14 +69,6 @@ public void updateStatus(final RegistrationStatus status) { this.status = status; } - public Boolean equalsStatus(final RegistrationStatus status) { - return this.status == status; - } - - public Boolean equalsGame(final Game game) { - return this.game.equals(game); - } - public ChatRoom getCrewChatRoom() { return game.getChatRoom(); } diff --git a/src/main/java/kr/pickple/back/game/domain/GameMembers.java b/src/main/java/kr/pickple/back/game/domain/GameMembers.java deleted file mode 100644 index 2b37743c..00000000 --- a/src/main/java/kr/pickple/back/game/domain/GameMembers.java +++ /dev/null @@ -1,57 +0,0 @@ -package kr.pickple.back.game.domain; - -import static kr.pickple.back.game.exception.GameExceptionCode.*; - -import java.util.ArrayList; -import java.util.List; - -import org.hibernate.annotations.BatchSize; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.member.domain.Member; -import lombok.Getter; - -@Embeddable -public class GameMembers { - - @Getter - @BatchSize(size = 1000) - @OneToMany(mappedBy = "game", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List gameMembers = new ArrayList<>(); - - public List getMembersByStatus(final RegistrationStatus status) { - return gameMembers.stream() - .filter(gameMember -> gameMember.equalsStatus(status)) - .map(GameMember::getMember) - .toList(); - } - - public void addGameMember(final Game game, final Member member) { - validateIsAlreadyRegisteredGameMember(member); - - final GameMember gameMember = buildGameMember(game, member); - gameMembers.add(gameMember); - } - - private void validateIsAlreadyRegisteredGameMember(final Member member) { - if (isAlreadyRegistered(member)) { - throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); - } - } - - private boolean isAlreadyRegistered(final Member member) { - return gameMembers.stream() - .anyMatch(gameMember -> member.equals(gameMember.getMember())); - } - - private GameMember buildGameMember(final Game game, final Member member) { - return GameMember.builder() - .member(member) - .game(game) - .build(); - } -} diff --git a/src/main/java/kr/pickple/back/game/domain/GamePositions.java b/src/main/java/kr/pickple/back/game/domain/GamePositions.java deleted file mode 100644 index cf56ada0..00000000 --- a/src/main/java/kr/pickple/back/game/domain/GamePositions.java +++ /dev/null @@ -1,53 +0,0 @@ -package kr.pickple.back.game.domain; - -import static kr.pickple.back.game.exception.GameExceptionCode.*; - -import java.util.ArrayList; -import java.util.List; - -import org.hibernate.annotations.BatchSize; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Embeddable; -import jakarta.persistence.OneToMany; -import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.position.domain.Position; - -@Embeddable -public class GamePositions { - - @BatchSize(size = 1000) - @OneToMany(mappedBy = "game", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) - private List gamePositions = new ArrayList<>(); - - public List getPositions() { - return gamePositions.stream() - .map(GamePosition::getPosition) - .toList(); - } - - public void updateGamePositions(final Game game, final List positions) { - validateIsDuplicatedPositions(positions); - - positions.stream() - .map(position -> buildGamePosition(game, position)) - .forEach(gamePositions::add); - } - - private void validateIsDuplicatedPositions(final List positions) { - long distinctPositionsSize = positions.stream() - .distinct() - .count(); - - if (distinctPositionsSize < positions.size()) { - throw new GameException(GAME_POSITIONS_IS_DUPLICATED, positions); - } - } - - private GamePosition buildGamePosition(final Game game, final Position position) { - return GamePosition.builder() - .position(position) - .game(game) - .build(); - } -} From 07441ac568c842eaacd6114fdb838aacba31c906 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 7 Feb 2024 23:34:52 +0900 Subject: [PATCH 024/117] =?UTF-8?q?refactor:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Address=20=EB=8B=A8=EB=B0=A9=ED=96=A5=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/implement/AddressReader.java | 53 +++++++------------ .../back/auth/service/OauthService.java | 5 +- .../kr/pickple/back/crew/domain/Crew.java | 22 +++----- .../crew/dto/request/CrewCreateRequest.java | 4 +- .../dto/response/CrewProfileResponse.java | 8 +-- .../back/crew/dto/response/CrewResponse.java | 7 +-- .../back/crew/implement/CrewReader.java | 14 ----- .../back/crew/service/CrewMemberService.java | 10 +++- .../back/crew/service/CrewService.java | 15 ++++-- .../back/game/dto/response/GameResponse.java | 8 ++- .../back/game/service/GameMemberService.java | 9 +++- .../back/game/service/GameService.java | 42 ++++++++++----- .../member/service/MemberCrewService.java | 18 +++++-- .../member/service/MemberGameService.java | 10 ++-- .../back/member/service/MemberService.java | 25 +++++++-- 15 files changed, 144 insertions(+), 106 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewReader.java diff --git a/src/main/java/kr/pickple/back/address/implement/AddressReader.java b/src/main/java/kr/pickple/back/address/implement/AddressReader.java index ae733f0b..4aff9bd3 100644 --- a/src/main/java/kr/pickple/back/address/implement/AddressReader.java +++ b/src/main/java/kr/pickple/back/address/implement/AddressReader.java @@ -16,8 +16,6 @@ import kr.pickple.back.address.repository.AddressDepth1Repository; import kr.pickple.back.address.repository.AddressDepth2Repository; import kr.pickple.back.address.util.AddressParser; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -44,10 +42,7 @@ public AllAddressResponse readAllAddress() { .build(); } - public MainAddress readMainAddressByNames( - final String addressDepth1Name, - final String addressDepth2Name - ) { + public MainAddress readMainAddressByNames(final String addressDepth1Name, final String addressDepth2Name) { final AddressDepth1 addressDepth1 = getAddressDepth1ByName(addressDepth1Name); final AddressDepth2 addressDepth2 = getAddressDepth2ByNamesAndAddressDepth1( addressDepth1Name, @@ -61,6 +56,20 @@ public MainAddress readMainAddressByNames( .build(); } + private AddressDepth1 getAddressDepth1ByName(final String addressDepth1Name) { + return addressDepth1Repository.findByName(addressDepth1Name) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); + } + + private AddressDepth2 getAddressDepth2ByNamesAndAddressDepth1( + final String addressDepth1Name, + final String addressDepth2Name, + final AddressDepth1 addressDepth1 + ) { + return addressDepth2Repository.findByNameAndAddressDepth1(addressDepth2Name, addressDepth1) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); + } + //기존 메서드 네이밍 및 시그니처 유지를 위해 임시적으로 아래와 구현했습니다. //todo 현호:서로 다른 입력을 받아 MainAddressResponse를 반환하는 두 메서드를 어떻게 통합하면 좋을 지 논의해보면 좋겠습니다. public MainAddress readMainAddressByAddressStrings(final String mainAddress) { @@ -69,39 +78,13 @@ public MainAddress readMainAddressByAddressStrings(final String mainAddress) { return readMainAddressByNames(depthedAddress.get(0), depthedAddress.get(1)); } - public MainAddress readMainAddressByMember(final Member member) { - final AddressDepth1 addressDepth1 = getAddressDepth1ById(member.getAddressDepth1Id()); - final AddressDepth2 addressDepth2 = getAddressDepth2ById(member.getAddressDepth2Id()); - + public MainAddress readMainAddressById(final Long addressDepth1Id, final Long addressDepth2Id) { return MainAddress.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) + .addressDepth1(getAddressDepth1ById(addressDepth1Id)) + .addressDepth2(getAddressDepth2ById(addressDepth2Id)) .build(); } - public MainAddress readMainAddressByGame(final Game game) { - final AddressDepth1 addressDepth1 = getAddressDepth1ById(game.getAddressDepth1Id()); - final AddressDepth2 addressDepth2 = getAddressDepth2ById(game.getAddressDepth2Id()); - - return MainAddress.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); - } - - private AddressDepth2 getAddressDepth2ByNamesAndAddressDepth1(final String addressDepth1Name, - final String addressDepth2Name, - final AddressDepth1 addressDepth1 - ) { - return addressDepth2Repository.findByNameAndAddressDepth1(addressDepth2Name, addressDepth1) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); - } - - private AddressDepth1 getAddressDepth1ByName(final String addressDepth1Name) { - return addressDepth1Repository.findByName(addressDepth1Name) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); - } - private AddressDepth1 getAddressDepth1ById(final Long addressDepth1Id) { return addressDepth1Repository.findById(addressDepth1Id) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Id)); diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index 7e0449cc..0ebd04ea 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -73,7 +73,10 @@ public AuthenticatedMemberResponse processLoginOrRegistration( jwtProperties.getRefreshTokenExpirationTime() ); - final MainAddress mainAddress = addressReader.readMainAddressByMember(loginMember); + final MainAddress mainAddress = addressReader.readMainAddressById( + loginMember.getAddressDepth1Id(), + loginMember.getAddressDepth2Id() + ); return AuthenticatedMemberResponse.of(loginMember, loginTokens, mainAddress); } diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index c7a51b4f..9f69ae8e 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -14,8 +14,6 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.exception.CrewException; @@ -73,14 +71,10 @@ public class Crew extends BaseEntity { private Member leader; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth1_id") - private AddressDepth1 addressDepth1; + private Long addressDepth1Id; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth2_id") - private AddressDepth2 addressDepth2; + private Long addressDepth2Id; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chat_room_id") @@ -94,8 +88,8 @@ private Crew( final String backgroundImageUrl, final Integer maxMemberCount, final Member leader, - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final Long addressDepth1Id, + final Long addressDepth2Id ) { this.name = name; this.content = content; @@ -103,8 +97,8 @@ private Crew( this.backgroundImageUrl = backgroundImageUrl; this.maxMemberCount = maxMemberCount; this.leader = leader; - this.addressDepth1 = addressDepth1; - this.addressDepth2 = addressDepth2; + this.addressDepth1Id = addressDepth1Id; + this.addressDepth2Id = addressDepth2Id; updateStatusIfCrewMemberFull(); } @@ -148,10 +142,6 @@ private Boolean isFullCrew() { return memberCount.equals(maxMemberCount); } - public Boolean isLeader(final Member member) { - return member.equals(leader); - } - public Boolean isLeader(final Long memberId) { return memberId.equals(leader.getId()); } diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index cd22d0d0..dbf3400b 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -52,8 +52,8 @@ public Crew toEntity( .leader(leader) .profileImageUrl(profile) .backgroundImageUrl(background) - .addressDepth1(mainAddress.getAddressDepth1()) - .addressDepth2(mainAddress.getAddressDepth2()) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index 4ec539df..a3bd1fe5 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -2,6 +2,7 @@ import java.util.List; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; @@ -29,7 +30,8 @@ public class CrewProfileResponse { public static CrewProfileResponse of( final Crew crew, - final List memberResponses + final List memberResponses, + final MainAddress mainAddress ) { return CrewProfileResponse.builder() .id(crew.getId()) @@ -43,8 +45,8 @@ public static CrewProfileResponse of( .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) .leader(getLeaderResponse(memberResponses, crew.getLeader().getId())) - .addressDepth1(crew.getAddressDepth1().getName()) - .addressDepth2(crew.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .members(memberResponses) .build(); } diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java index 8700b9a9..febbc010 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java @@ -1,5 +1,6 @@ package kr.pickple.back.crew.dto.response; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; @@ -27,7 +28,7 @@ public class CrewResponse { private String addressDepth1; private String addressDepth2; - public static CrewResponse from(final Crew crew, final MemberResponse leader) { + public static CrewResponse of(final Crew crew, final MemberResponse leader, final MainAddress mainAddress) { return CrewResponse.builder() .id(crew.getId()) .name(crew.getName()) @@ -40,8 +41,8 @@ public static CrewResponse from(final Crew crew, final MemberResponse leader) { .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) .leader(leader) - .addressDepth1(crew.getAddressDepth1().getName()) - .addressDepth2(crew.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java deleted file mode 100644 index a6518f29..00000000 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ /dev/null @@ -1,14 +0,0 @@ -package kr.pickple.back.crew.implement; - -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class CrewReader { - - -} diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 6edd6e2b..6eab5eee 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; @@ -91,12 +92,17 @@ public CrewProfileResponse findAllCrewMembers( .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddressByMember(member) + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) ) ) .toList(); - return CrewProfileResponse.of(crew, memberResponses); + final MainAddress mainAddress = addressReader.readMainAddressById( + crew.getAddressDepth1Id(), + crew.getAddressDepth2Id() + ); + + return CrewProfileResponse.of(crew, memberResponses, mainAddress); } private List getPositionsByMember(final Member member) { diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index f0870787..14f35f82 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -115,8 +115,12 @@ private void validateMemberCreatedCrewsCount(final Member leader) { */ public CrewProfileResponse findCrewById(final Long crewId) { final Crew crew = crewRepository.getCrewById(crewId); + final MainAddress mainAddress = addressReader.readMainAddressById( + crew.getAddressDepth1Id(), + crew.getAddressDepth2Id() + ); - return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); + return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId), mainAddress); } /** @@ -136,7 +140,12 @@ public List findCrewsByAddress( ); return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getConfirmedMemberResponses(crew.getId()))) + .map(crew -> CrewProfileResponse.of( + crew, + getConfirmedMemberResponses(crew.getId()), + addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) + ) + ) .toList(); } @@ -147,7 +156,7 @@ private List getConfirmedMemberResponses(final Long crewId) { .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddressByMember(member) + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index 7f1f0fe0..4651154e 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -40,8 +40,12 @@ public class GameResponse { private List positions; private List members; - public static GameResponse of(final Game game, final List memberResponses, - final List positions, final MainAddress mainAddress) { + public static GameResponse of( + final Game game, + final List memberResponses, + final List positions, + final MainAddress mainAddress + ) { return GameResponse.builder() .id(game.getId()) .content(game.getContent()) diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index e7339e05..39bb10b5 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -92,7 +92,12 @@ public GameResponse findAllGameMembers( throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - return GameResponse.of(game, getMemberResponsesByStatus(game, status), getPositionsByGame(game), addressReader.readMainAddressByGame(game)); + return GameResponse.of( + game, + getMemberResponsesByStatus(game, status), + getPositionsByGame(game), + addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + ); } private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { @@ -102,7 +107,7 @@ private List getMemberResponsesByStatus(final Game game, final R .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddressByMember(member) + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index fe618222..c3e166a3 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -77,8 +77,7 @@ private static long getSecondsBetween( public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { final Member host = memberRepository.getMemberById(loggedInMemberId); final Point point = kakaoAddressSearchClient.fetchAddress(gameCreateRequest.getMainAddress()); - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( - gameCreateRequest.getMainAddress()); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(gameCreateRequest.getMainAddress()); final Game game = gameCreateRequest.toEntity(host, mainAddress, point); final GameMember gameHost = GameMember.builder() @@ -157,7 +156,12 @@ public GameResponse findGameById(final Long gameId) { final Game game = gameRepository.getGameById(gameId); game.increaseViewCount(); - return GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), getPositionsByGame(game), addressReader.readMainAddressByGame(game)); + return GameResponse.of( + game, + getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game), + addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + ); } /** @@ -199,8 +203,13 @@ private List findGamesByAddress(final String address, final Pageab ); return games.stream() - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), addressReader.readMainAddressByGame(game))) + .map(game -> GameResponse.of( + game, + getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game), + addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + ) + ) .toList(); } @@ -215,8 +224,13 @@ public List findGamesWithInAddress(final MainAddress mainAddress) return games.stream() .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), addressReader.readMainAddressByGame(game))) + .map(game -> GameResponse.of( + game, + getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game), + addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + ) + ) .toList(); } @@ -232,8 +246,13 @@ public List findGamesWithInDistance( return games.stream() .filter(Game::isNotEndedGame) - .map(game -> GameResponse.of(game, getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), addressReader.readMainAddressByGame(game))) + .map(game -> GameResponse.of( + game, + getMemberResponsesByStatus(game, CONFIRMED), + getPositionsByGame(game), + addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + ) + ) .toList(); } @@ -244,15 +263,14 @@ private List getMemberResponsesByStatus(final Game game, final R .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddressByMember(member) + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) ) ) .toList(); } private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); + final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); return Position.fromMemberPositions(memberPositions); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index f9e559a2..f6660279 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -30,11 +30,12 @@ @Transactional(readOnly = true) public class MemberCrewService { + private final AddressReader addressReader; + private final MemberRepository memberRepository; private final CrewMemberRepository crewMemberRepository; private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; - private final AddressReader addressReader; /** * 사용자가 가입한 크루 목록 조회 @@ -88,7 +89,12 @@ private List convertToCrewProfileResponses( ) { return crews.stream() - .map(crew -> CrewProfileResponse.of(crew, getMemberResponsesByCrew(crew, memberStatus))) + .map(crew -> CrewProfileResponse.of( + crew, + getMemberResponsesByCrew(crew, memberStatus), + addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) + ) + ) .toList(); } @@ -96,7 +102,13 @@ private List getMemberResponsesByCrew(final Crew crew, final Reg return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() .map(CrewMember::getMember) - .map(member -> MemberResponse.of(member, getPositions(member), addressReader.readMainAddressByMember(member))) + .map(member -> MemberResponse.of( + member, + getPositions(member), + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id() + ) + ) + ) .toList(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index ee51eb88..0da7f720 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -30,11 +30,12 @@ @Transactional(readOnly = true) public class MemberGameService { + private final AddressReader addressReader; + private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; private final MemberPositionRepository memberPositionRepository; - private final AddressReader addressReader; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 @@ -100,7 +101,10 @@ private List convertToMemberGameResponses( memberGame, getMemberResponsesByGame(memberGame.getGame(), memberStatus), getPositionsByMember(memberGame.getMember()), - addressReader.readMainAddressByGame(memberGame.getGame()) + addressReader.readMainAddressById( + memberGame.getGame().getAddressDepth1Id(), + memberGame.getGame().getAddressDepth2Id() + ) ) ) .toList(); @@ -113,7 +117,7 @@ private List getMemberResponsesByGame(final Game game, final Reg .map(member -> MemberResponse.of( member, getPositionsByMember(member), - addressReader.readMainAddressByMember(member) + addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index b9db27f8..b61cc942 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -39,13 +39,14 @@ public class MemberService { private static final String REFRESH_TOKEN_KEY = "refresh_token"; + private final AddressReader addressReader; + private final MemberRepository memberRepository; private final CrewMemberRepository crewMemberRepository; private final MemberPositionRepository memberPositionRepository; private final RedisRepository redisRepository; private final JwtProvider jwtProvider; private final JwtProperties jwtProperties; - private final AddressReader addressReader; /** * 사용자 회원가입 (카카오) @@ -82,7 +83,10 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member jwtProperties.getRefreshTokenExpirationTime() ); - final MainAddress mainAddress = addressReader.readMainAddressByMember(savedMember); + final MainAddress mainAddress = addressReader.readMainAddressById( + savedMember.getAddressDepth1Id(), + savedMember.getAddressDepth2Id() + ); return AuthenticatedMemberResponse.of(savedMember, loginTokens, mainAddress); } @@ -120,17 +124,28 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { .toList(); final List crewResponses = crews.stream() - .map(crew -> CrewResponse.from(crew, getLeaderResponse(crew))) + .map(crew -> CrewResponse.of( + crew, + getLeaderResponse(crew), + addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) + ) + ) .toList(); - final MainAddress mainAddress = addressReader.readMainAddressByMember(member); + final MainAddress mainAddress = addressReader.readMainAddressById( + member.getAddressDepth1Id(), + member.getAddressDepth2Id() + ); return MemberProfileResponse.of(member, crewResponses, positions, mainAddress); } private MemberResponse getLeaderResponse(final Crew crew) { final Member member = crew.getLeader(); - final MainAddress mainAddress = addressReader.readMainAddressByMember(member); + final MainAddress mainAddress = addressReader.readMainAddressById( + member.getAddressDepth1Id(), + member.getAddressDepth2Id() + ); return MemberResponse.of(member, getPositionsByMember(member), mainAddress); } From c676936453cd1e351b1fff988055399f5e3c623e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Thu, 8 Feb 2024 19:30:37 +0900 Subject: [PATCH 025/117] =?UTF-8?q?refactor:=20Game=20=EB=8B=A8=EB=B0=A9?= =?UTF-8?q?=ED=96=A5=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20queryDSL=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/game/repository/GameSearchRepositoryImpl.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java index dbd46f25..893b6c1c 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java @@ -30,9 +30,6 @@ public List findGamesWithInDistance( return jpaQueryFactory .selectFrom(game) - .join(game.host).fetchJoin() - .join(game.addressDepth1).fetchJoin() - .join(game.addressDepth2).fetchJoin() .where(isWithInDistance(pointWKT, distance)) .orderBy(getOrderByDistance(pointWKT)) .fetch(); From 628c246272aec1aae7c853af3d728abca9962776 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 8 Feb 2024 19:51:00 +0900 Subject: [PATCH 026/117] =?UTF-8?q?refactor:=20Member,=20Crew=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20?= =?UTF-8?q?=EB=AA=A8=EB=91=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/crew/domain/Crew.java | 12 +++------ .../pickple/back/crew/domain/CrewMember.java | 22 ++++------------ .../back/crew/service/CrewMemberService.java | 26 ++++++++++++++----- .../back/crew/service/CrewService.java | 6 ++--- .../back/member/domain/MemberPosition.java | 14 ++++------ .../dto/request/MemberCreateRequest.java | 4 +-- .../member/service/MemberCrewService.java | 4 +-- .../back/member/service/MemberService.java | 16 +++++++++--- .../address/service/AddressServiceTest.java | 13 ++++++---- .../back/fixture/dto/AddressDtoFixtures.java | 6 ++--- 10 files changed, 63 insertions(+), 60 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 9f69ae8e..d423da97 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -11,14 +11,12 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.util.CrewStatusConverter; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -66,9 +64,7 @@ public class Crew extends BaseEntity { private Integer competitionPoint = 0; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "leader_id") - private Member leader; + private Long leaderId; @NotNull private Long addressDepth1Id; @@ -87,7 +83,7 @@ private Crew( final String profileImageUrl, final String backgroundImageUrl, final Integer maxMemberCount, - final Member leader, + final Long leaderId, final Long addressDepth1Id, final Long addressDepth2Id ) { @@ -96,7 +92,7 @@ private Crew( this.profileImageUrl = profileImageUrl; this.backgroundImageUrl = backgroundImageUrl; this.maxMemberCount = maxMemberCount; - this.leader = leader; + this.leaderId = leaderId; this.addressDepth1Id = addressDepth1Id; this.addressDepth2Id = addressDepth2Id; @@ -143,7 +139,7 @@ private Boolean isFullCrew() { } public Boolean isLeader(final Long memberId) { - return memberId.equals(leader.getId()); + return memberId.equals(leaderId); } public void makeNewCrewChatRoom(final ChatRoom chatRoom) { diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index 87a63b44..a90dbbdf 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -5,18 +5,14 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -37,19 +33,15 @@ public class CrewMember extends BaseEntity { private RegistrationStatus status = WAITING; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; + private Long memberId; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "crew_id") - private Crew crew; + private Long crewId; @Builder - private CrewMember(final Member member, final Crew crew) { - this.member = member; - this.crew = crew; + private CrewMember(final Long memberId, final Long crewId) { + this.memberId = memberId; + this.crewId = crewId; } public void confirmRegistration() { @@ -57,10 +49,6 @@ public void confirmRegistration() { } public void updateStatus(final RegistrationStatus status) { - if (this.status == WAITING && status == CONFIRMED) { - crew.increaseMemberCount(); - } - this.status = status; } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 6eab5eee..99f07944 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -56,15 +56,15 @@ public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); final CrewMember newCrewMember = CrewMember.builder() - .member(member) - .crew(crew) + .memberId(member.getId()) + .crewId(crew.getId()) .build(); crewMemberRepository.save(newCrewMember); eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() .crewId(crewId) - .memberId(crew.getLeader().getId()) + .memberId(crew.getLeaderId()) .build()); } @@ -88,7 +88,7 @@ public CrewProfileResponse findAllCrewMembers( final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) .stream() - .map(CrewMember::getMember) + .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), @@ -123,13 +123,14 @@ public void updateCrewMemberRegistrationStatus( final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest ) { final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); + final Crew crew = crewRepository.getCrewById(crewId); validateIsLeader(loggedInMemberId, crew); final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); enterCrewChatRoom(updateStatus, crewMember); + increaseMemberCount(crew, crewMember, updateStatus); crewMember.updateStatus(updateStatus); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() @@ -138,6 +139,16 @@ public void updateCrewMemberRegistrationStatus( .build()); } + private static void increaseMemberCount( + final Crew crew, + final CrewMember crewMember, + final RegistrationStatus status + ) { + if (crewMember.getStatus() == WAITING && status == CONFIRMED) { + crew.increaseMemberCount(); + } + } + private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { if (!crew.isLeader(loggedInMemberId)) { throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); @@ -146,9 +157,10 @@ private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { final RegistrationStatus nowStatus = crewMember.getStatus(); + final Member member = memberRepository.getMemberById(crewMember.getMemberId()); if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), crewMember.getMember()); + chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), member); } } @@ -158,7 +170,7 @@ private void enterCrewChatRoom(final RegistrationStatus updateStatus, final Crew @Transactional public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewMember.getCrew(); + final Crew crew = crewRepository.getCrewById(crewId); if (crew.isLeader(loggedInMemberId)) { validateIsLeaderSelfDeleted(loggedInMemberId, memberId); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 14f35f82..0f9f2dc7 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -81,8 +81,8 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina ); final CrewMember crewLeader = CrewMember.builder() - .member(leader) - .crew(crew) + .memberId(leader.getId()) + .crewId(crew.getId()) .build(); crewLeader.confirmRegistration(); @@ -152,7 +152,7 @@ public List findCrewsByAddress( private List getConfirmedMemberResponses(final Long crewId) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) .stream() - .map(CrewMember::getMember) + .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), diff --git a/src/main/java/kr/pickple/back/member/domain/MemberPosition.java b/src/main/java/kr/pickple/back/member/domain/MemberPosition.java index 7a126dd8..5451e858 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberPosition.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberPosition.java @@ -3,12 +3,9 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.position.domain.Position; @@ -19,6 +16,7 @@ import lombok.NoArgsConstructor; @Entity +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class MemberPosition extends BaseEntity { @@ -26,19 +24,17 @@ public class MemberPosition extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Getter @NotNull @Convert(converter = PositionConverter.class) @Column(length = 2) private Position position; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; + @NotNull + private Long memberId; @Builder - private MemberPosition(final Position position, final Member member) { + private MemberPosition(final Position position, final Long memberId) { this.position = position; - this.member = member; + this.memberId = memberId; } } diff --git a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java index cee5ec6a..f52f5711 100644 --- a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java +++ b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java @@ -61,10 +61,10 @@ public Member toEntity(final MainAddress mainAddress) { .build(); } - public List toMemberPositionEntities(final Member member) { + public List toMemberPositionEntities(final Long memberId) { return positions.stream() .map(position -> MemberPosition.builder() - .member(member) + .memberId(memberId) .position(position) .build() ).toList(); diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index f6660279..48849c1d 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -50,7 +50,7 @@ public List findAllCrewsByMemberId( final Member member = memberRepository.getMemberById(memberId); final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) .stream() - .map(CrewMember::getCrew) + .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) .toList(); return convertToCrewProfileResponses(crews, memberStatus); @@ -101,7 +101,7 @@ private List convertToCrewProfileResponses( private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() - .map(CrewMember::getMember) + .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositions(member), diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index b61cc942..d9512a3e 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -20,6 +20,7 @@ import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.request.MemberCreateRequest; @@ -40,7 +41,8 @@ public class MemberService { private static final String REFRESH_TOKEN_KEY = "refresh_token"; private final AddressReader addressReader; - + + private final CrewRepository crewRepository; private final MemberRepository memberRepository; private final CrewMemberRepository crewMemberRepository; private final MemberPositionRepository memberPositionRepository; @@ -64,7 +66,7 @@ public AuthenticatedMemberResponse createMember(final MemberCreateRequest member final Member savedMember = memberRepository.save(member); validatedIsDuplicatedPositions(memberCreateRequest.getPositions()); - final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember); + final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember.getId()); memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ @@ -120,7 +122,7 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) .stream() - .map(CrewMember::getCrew) + .map(this::getCrewByCrewId) .toList(); final List crewResponses = crews.stream() @@ -140,8 +142,14 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { return MemberProfileResponse.of(member, crewResponses, positions, mainAddress); } + private Crew getCrewByCrewId(final CrewMember crewMember) { + return crewRepository.getCrewById(crewMember.getMemberId()); + } + private MemberResponse getLeaderResponse(final Crew crew) { - final Member member = crew.getLeader(); + final Long memberId = crew.getLeaderId(); + final Member member = memberRepository.getMemberById(memberId); + final MainAddress mainAddress = addressReader.readMainAddressById( member.getAddressDepth1Id(), member.getAddressDepth2Id() diff --git a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java index 501ea5a6..046c3300 100644 --- a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java +++ b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java @@ -8,7 +8,8 @@ import org.springframework.boot.test.context.SpringBootTest; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; @SpringBootTest class AddressServiceTest { @@ -16,6 +17,9 @@ class AddressServiceTest { @Autowired private AddressService addressService; + @Autowired + private AddressReader addressReader; + @Test @DisplayName("지역 목록 조회 시, 전체 도, 시, 구 정보를 반환한다.") void findAllAddress_ReturnAllAddressNames() { @@ -35,11 +39,10 @@ void findMainAddressByNames_ValidAddressNames_ReturnMainAddressInstance() { String addressDepth2Name = "강남구"; //when - MainAddressId mainAddressId = addressService.findMainAddressByNames(addressDepth1Name, - addressDepth2Name); + MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); //then - assertThat(mainAddressId.getAddressDepth1().getName()).isEqualTo(addressDepth1Name); - assertThat(mainAddressId.getAddressDepth2().getName()).isEqualTo(addressDepth2Name); + assertThat(mainAddress.getAddressDepth1().getName()).isEqualTo(addressDepth1Name); + assertThat(mainAddress.getAddressDepth2().getName()).isEqualTo(addressDepth2Name); } } diff --git a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java index acc1e67e..fedf677f 100644 --- a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java @@ -5,7 +5,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddressId; +import kr.pickple.back.address.dto.response.MainAddress; public class AddressDtoFixtures { @@ -19,11 +19,11 @@ public static AllAddressResponse allAddressResponseBuild( .build(); } - public static MainAddressId mainAddressResponseBuild( + public static MainAddress mainAddressBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 ) { - return MainAddressId.builder() + return MainAddress.builder() .addressDepth1(addressDepth1) .addressDepth2(addressDepth2) .build(); From 661a6591bf62bf2217ef40e8753c2049dbb1874b Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 8 Feb 2024 20:01:27 +0900 Subject: [PATCH 027/117] =?UTF-8?q?refactor:=20Member,=20Crew=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EC=B6=94=EA=B0=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/alarm/service/CrewAlarmService.java | 6 ++++-- .../kr/pickple/back/crew/dto/request/CrewCreateRequest.java | 5 ++--- .../pickple/back/crew/dto/response/CrewProfileResponse.java | 2 +- src/main/java/kr/pickple/back/crew/service/CrewService.java | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index 0a5571b6..c7798546 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -44,7 +44,7 @@ public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinR final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final Crew crew = getCrewInfo(crewId); - final Member leader = crew.getLeader(); + final Member leader = memberRepository.getMemberById(crew.getLeaderId()); final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) @@ -114,8 +114,10 @@ private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEv final Long crewId = crewAlarmEvent.getCrewId(); final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + final Member leader = memberRepository.getMemberById(crew.getLeaderId()); + if (!crew.isLeader(crewAlarmEvent.getMemberId())) { - throw new CrewException(CREW_IS_NOT_LEADER, crewId, crew.getLeader()); + throw new CrewException(CREW_IS_NOT_LEADER, crewId, leader.getId()); } } diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index dbf3400b..fa8543bb 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -7,7 +7,6 @@ import jakarta.validation.constraints.Size; import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -39,7 +38,7 @@ public class CrewCreateRequest { private String addressDepth2; public Crew toEntity( - final Member leader, + final Long leaderId, final MainAddress mainAddress, final String profile, final String background @@ -49,7 +48,7 @@ public Crew toEntity( .name(name) .content(content) .maxMemberCount(maxMemberCount) - .leader(leader) + .leaderId(leaderId) .profileImageUrl(profile) .backgroundImageUrl(background) .addressDepth1Id(mainAddress.getAddressDepth1().getId()) diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index a3bd1fe5..52d82b5c 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -44,7 +44,7 @@ public static CrewProfileResponse of( .status(crew.getStatus()) .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) - .leader(getLeaderResponse(memberResponses, crew.getLeader().getId())) + .leader(getLeaderResponse(memberResponses, crew.getLeaderId())) .addressDepth1(mainAddress.getAddressDepth1().getName()) .addressDepth2(mainAddress.getAddressDepth2().getName()) .members(memberResponses) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 0f9f2dc7..fc2ab591 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -74,7 +74,7 @@ public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, fina ); final Crew crew = crewCreateRequest.toEntity( - leader, + leader.getId(), mainAddress, MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) From 1e68c4d3d218004ff1d79bd2bd43e60a9a88d8cc Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 8 Feb 2024 20:29:01 +0900 Subject: [PATCH 028/117] =?UTF-8?q?refactor:=20Chat=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=8B=A8=EB=B0=A9=ED=96=A5=20=EC=97=B0=EA=B4=80?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/chat/domain/ChatMessage.java | 23 ++++--------- .../kr/pickple/back/chat/domain/ChatRoom.java | 6 +--- .../back/chat/domain/ChatRoomMember.java | 23 +++++-------- .../dto/response/ChatMessageResponse.java | 8 +++-- .../repository/ChatMessageRepository.java | 2 +- .../back/chat/service/ChatMessageService.java | 30 ++++++++++------ .../chat/service/ChatRoomFindService.java | 14 ++++---- .../back/chat/service/ChatRoomService.java | 10 ++++-- .../back/chat/service/ChatValidator.java | 4 +-- .../kr/pickple/back/crew/domain/Crew.java | 9 ++--- .../pickple/back/crew/domain/CrewMember.java | 5 --- .../back/crew/repository/CrewRepository.java | 11 +++--- .../back/crew/service/CrewMemberService.java | 34 ++++++++++++------- .../back/crew/service/CrewService.java | 6 ++-- .../kr/pickple/back/game/domain/Game.java | 7 ++-- .../pickple/back/game/domain/GameMember.java | 5 --- .../back/game/repository/GameRepository.java | 10 +++--- .../back/game/service/GameMemberService.java | 14 ++++++-- .../back/game/service/GameService.java | 9 ++--- 19 files changed, 109 insertions(+), 121 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java index b46e743f..4c64cc08 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java @@ -3,21 +3,18 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.util.MessageTypeAttributeConverter; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatMessage extends BaseEntity { @@ -26,33 +23,25 @@ public class ChatMessage extends BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Getter @NotNull @Convert(converter = MessageTypeAttributeConverter.class) private MessageType type; - @Getter @NotNull @Column(length = 500) private String content; - @Getter @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "sender_id") - private Member sender; + private Long senderId; - @Getter @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "chat_room_id") - private ChatRoom chatRoom; + private Long chatRoomId; @Builder - private ChatMessage(final ChatRoom chatRoom, final Member sender, final String content, final MessageType type) { + private ChatMessage(final MessageType type, final String content, final Long senderId, final Long chatRoomId) { this.type = type; this.content = content; - this.chatRoom = chatRoom; - this.sender = sender; + this.senderId = senderId; + this.chatRoomId = chatRoomId; } } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java index 2b6450c3..df420a11 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java @@ -17,30 +17,26 @@ import lombok.Getter; import lombok.NoArgsConstructor; +@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatRoom extends BaseEntity { @Id - @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Getter @NotNull @Column(length = 20) private String name; - @Getter @NotNull @Convert(converter = RoomTypeAttributeConverter.class) private RoomType type; - @Getter @NotNull private Integer memberCount = 0; - @Getter @NotNull private Integer maxMemberCount = 2; diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java index 3efc12b8..645a00be 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java @@ -2,18 +2,15 @@ import static java.lang.Boolean.*; +import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import jakarta.persistence.UniqueConstraint; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -23,7 +20,7 @@ @Entity @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"member_id", "chat_room_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) -@EqualsAndHashCode(of = {"member", "chatRoom"}, callSuper = false) +@EqualsAndHashCode(of = {"memberId", "chatRoomId"}, callSuper = false) public class ChatRoomMember extends BaseEntity { @Id @@ -35,20 +32,18 @@ public class ChatRoomMember extends BaseEntity { @Getter @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; + @Column(name = "member_id") + private Long memberId; @Getter @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "chat_room_id") - private ChatRoom chatRoom; + @Column(name = "chat_room_id") + private Long chatRoomId; @Builder - private ChatRoomMember(final Member member, final ChatRoom chatRoom) { - this.member = member; - this.chatRoom = chatRoom; + private ChatRoomMember(final Long memberId, final Long chatRoomId) { + this.memberId = memberId; + this.chatRoomId = chatRoomId; } public void activate() { diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java index 5f515797..a13c06d8 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java @@ -3,7 +3,9 @@ import java.time.LocalDateTime; import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.MessageType; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,12 +22,12 @@ public class ChatMessageResponse { private Long roomId; private LocalDateTime createdAt; - public static ChatMessageResponse from(final ChatMessage chatMessage) { + public static ChatMessageResponse of(final ChatMessage chatMessage, final Member sender, final ChatRoom chatRoom) { return ChatMessageResponse.builder() .type(chatMessage.getType()) .content(chatMessage.getContent()) - .sender(ChatMemberResponse.from(chatMessage.getSender())) - .roomId(chatMessage.getChatRoom().getId()) + .sender(ChatMemberResponse.from(sender)) + .roomId(chatRoom.getId()) .createdAt(chatMessage.getCreatedAt()) .build(); } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 482cf3bd..4446cd11 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -17,7 +17,7 @@ public interface ChatMessageRepository extends JpaRepository @Query(""" select cm from ChatMessage cm - where cm.sender.id = :senderId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER + where cm.senderId= :senderId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER order by cm.createdAt desc limit 1 """) diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 82b27ac5..18ff2ca9 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -43,7 +43,7 @@ public ChatMessageResponse enterChatRoom( final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); final ChatMessage enteringMessage = enterRoomAndSaveEnteringMessages(chatRoom, member); - return ChatMessageResponse.from(enteringMessage); + return ChatMessageResponse.of(enteringMessage, member, chatRoom); } @Transactional @@ -66,8 +66,8 @@ public ChatMessage enterRoomAndSaveEnteringMessages(final ChatRoom chatRoom, fin private ChatRoomMember buildChatRoomMember(final ChatRoom chatRoom, final Member member) { return ChatRoomMember.builder() - .chatRoom(chatRoom) - .member(member) + .chatRoomId(chatRoom.getId()) + .memberId(member.getId()) .build(); } @@ -88,7 +88,7 @@ public ChatMessageResponse sendMessage( final ChatMessage chatMessage = buildChatMessage(TALK, content, chatRoom, sender); final ChatMessage sendingMessage = chatMessageRepository.save(chatMessage); - return ChatMessageResponse.from(sendingMessage); + return ChatMessageResponse.of(sendingMessage, sender, chatRoom); } /** @@ -119,7 +119,7 @@ public ChatMessageResponse leaveChatRoom( final ChatMessage chatMessage = buildChatMessage(LEAVE, content, chatRoom, member); final ChatMessage leavingMessage = chatMessageRepository.save(chatMessage); - return ChatMessageResponse.from(leavingMessage); + return ChatMessageResponse.of(leavingMessage, member, chatRoom); } private ChatMessage buildChatMessage( @@ -131,8 +131,8 @@ private ChatMessage buildChatMessage( return ChatMessage.builder() .type(type) .content(content) - .chatRoom(chatRoom) - .sender(member) + .chatRoomId(chatRoom.getId()) + .senderId(member.getId()) .build(); } @@ -148,10 +148,18 @@ public List findAllMessagesInRoom(final Long loggedInMember final ChatMessage lastEnteringMessage = chatMessageRepository.getLastEnteringChatMessageBySenderId( loggedInMember.getId()); - return chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual(chatRoom.getId(), - lastEnteringMessage.getCreatedAt()) - .stream() - .map(ChatMessageResponse::from) + final List chatMessages = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( + chatRoom.getId(), + lastEnteringMessage.getCreatedAt() + ); + + return chatMessages.stream() + .map(chatMessage -> ChatMessageResponse.of( + chatMessage, + memberRepository.getMemberById(chatMessage.getSenderId()), + chatRoom + ) + ) .toList(); } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index 250e5be0..0f71c15a 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -9,7 +9,6 @@ import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; @@ -46,7 +45,7 @@ public List findAllActiveChatRoomsByType(final Long loggedInMe return chatRoomMemberRepository.findAllByActiveTrueAndMemberId(loggedInMember.getId()) .stream() - .map(ChatRoomMember::getChatRoom) + .map(chatRoomMember -> chatRoomRepository.getChatRoomById(chatRoomMember.getChatRoomId())) .filter(chatRoom -> chatRoom.isMatchedRoomType(type)) .map(chatRoom -> getChatRoomResponse(loggedInMemberId, chatRoom)) .toList(); @@ -78,21 +77,22 @@ private ChatRoomDetailResponse getChatRoomDetailResponse(final Long loggedInMemb private ChatRoomDetailResponse getPersonalChatRoomDetailResponse(final Long memberId, final ChatRoom chatRoom) { final Member sender = memberRepository.getMemberById(memberId); - final Member receiver = chatRoomMemberRepository.getPersonalChatRoomReceiver(chatRoom.getId(), sender.getId()) - .getMember(); + final Long receiverId = chatRoomMemberRepository.getPersonalChatRoomReceiver(chatRoom.getId(), sender.getId()) + .getMemberId(); + final Member receiver = memberRepository.getMemberById(receiverId); return ChatRoomDetailResponse.of(chatRoom, receiver, getChatMemberResponses(chatRoom)); } private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { - final Crew crew = crewRepository.findByChatRoom(chatRoom) + final Crew crew = crewRepository.findByChatRoomId(chatRoom.getId()) .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoom.getId())); return ChatRoomDetailResponse.of(chatRoom, crew, getChatMemberResponses(chatRoom)); } private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chatRoom) { - final Game game = gameRepository.findByChatRoom(chatRoom) + final Game game = gameRepository.findByChatRoomId(chatRoom.getId()) .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getId())); return ChatRoomDetailResponse.of(chatRoom, game, getChatMemberResponses(chatRoom)); @@ -101,7 +101,7 @@ private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chat private List getChatMemberResponses(final ChatRoom chatRoom) { return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) .stream() - .map(ChatRoomMember::getMember) + .map(chatRoomMember -> memberRepository.getMemberById(chatRoomMember.getMemberId())) .map(ChatMemberResponse::from) .toList(); } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index 907fcaf7..e4c551b7 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -58,7 +58,7 @@ public ChatRoomDetailResponse createPersonalRoom( private List getChatMemberResponses(final ChatRoom chatRoom) { return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) .stream() - .map(ChatRoomMember::getMember) + .map(chatRoomMember -> memberRepository.getMemberById(chatRoomMember.getMemberId())) .map(ChatMemberResponse::from) .toList(); } @@ -90,11 +90,15 @@ public PersonalChatRoomExistedResponse findActivePersonalChatRoomWithReceiver( final ChatRoomMember foundChatRoomMember = chatRoomMemberRepository.findAllByMemberId(sender.getId()) .stream() - .filter(chatRoomMember -> existsReceiverInPersonalChatRoom(receiver, chatRoomMember.getChatRoom())) + .filter(chatRoomMember -> existsReceiverInPersonalChatRoom( + receiver, + chatRoomRepository.getChatRoomById(chatRoomMember.getChatRoomId()) + ) + ) .findFirst() .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND)); - final Long personalChatRoomId = foundChatRoomMember.getChatRoom().getId(); + final Long personalChatRoomId = foundChatRoomMember.getChatRoomId(); final Boolean isSenderActive = foundChatRoomMember.isActive(); return PersonalChatRoomExistedResponse.of(personalChatRoomId, isSenderActive); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java index 48ccf1ba..a7306b26 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java @@ -58,7 +58,7 @@ public void validateChatRoomLeavingConditions(final Member member, final ChatRoo } private void validateCrewChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - final Optional optionalCrew = crewRepository.findByChatRoom(chatRoom); + final Optional optionalCrew = crewRepository.findByChatRoomId(chatRoom.getId()); if (optionalCrew.isEmpty()) { return; @@ -75,7 +75,7 @@ private void validateIsMemberConfirmedCrewMember(final Long crewId, final Long m } private void validateGameChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - final Optional optionalGame = gameRepository.findByChatRoom(chatRoom); + final Optional optionalGame = gameRepository.findByChatRoomId(chatRoom.getId()); if (optionalGame.isEmpty()) { return; diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index d423da97..507ee797 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -6,12 +6,9 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.OneToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; @@ -72,9 +69,7 @@ public class Crew extends BaseEntity { @NotNull private Long addressDepth2Id; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "chat_room_id") - private ChatRoom chatRoom; + private Long chatRoomId; @Builder private Crew( @@ -144,6 +139,6 @@ public Boolean isLeader(final Long memberId) { public void makeNewCrewChatRoom(final ChatRoom chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); - this.chatRoom = chatRoom; + this.chatRoomId = chatRoom.getId(); } } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index a90dbbdf..a8de3eaa 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -9,7 +9,6 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; @@ -51,8 +50,4 @@ public void confirmRegistration() { public void updateStatus(final RegistrationStatus status) { this.status = status; } - - public ChatRoom getCrewChatRoom() { - return crew.getChatRoom(); - } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 2e364a7a..72a592e9 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -9,9 +9,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; @@ -19,13 +16,13 @@ public interface CrewRepository extends JpaRepository { Boolean existsByName(final String name); - Page findByAddressDepth1AndAddressDepth2( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, + Page findByAddressDepth1IdAndAddressDepth2Id( + final Long addressDepth1Id, + final Long addressDepth2Id, final Pageable pageable ); - Optional findByChatRoom(final ChatRoom chatRoom); + Optional findByChatRoomId(final Long chatRoomId); List findAllByLeaderId(final Long leaderId); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 99f07944..d801f499 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -14,6 +14,8 @@ import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; @@ -42,9 +44,20 @@ public class CrewMemberService { private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; private final CrewMemberRepository crewMemberRepository; + private final ChatRoomRepository chatRoomRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; + private static void increaseMemberCount( + final Crew crew, + final CrewMember crewMember, + final RegistrationStatus status + ) { + if (crewMember.getStatus() == WAITING && status == CONFIRMED) { + crew.increaseMemberCount(); + } + } + /** * 크루 가입 신청 */ @@ -128,7 +141,8 @@ public void updateCrewMemberRegistrationStatus( validateIsLeader(loggedInMemberId, crew); final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); - enterCrewChatRoom(updateStatus, crewMember); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crew.getChatRoomId()); + enterCrewChatRoom(updateStatus, crewMember, chatRoom); increaseMemberCount(crew, crewMember, updateStatus); crewMember.updateStatus(updateStatus); @@ -139,28 +153,22 @@ public void updateCrewMemberRegistrationStatus( .build()); } - private static void increaseMemberCount( - final Crew crew, - final CrewMember crewMember, - final RegistrationStatus status - ) { - if (crewMember.getStatus() == WAITING && status == CONFIRMED) { - crew.increaseMemberCount(); - } - } - private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { if (!crew.isLeader(loggedInMemberId)) { throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } } - private void enterCrewChatRoom(final RegistrationStatus updateStatus, final CrewMember crewMember) { + private void enterCrewChatRoom( + final RegistrationStatus updateStatus, + final CrewMember crewMember, + final ChatRoom chatRoom + ) { final RegistrationStatus nowStatus = crewMember.getStatus(); final Member member = memberRepository.getMemberById(crewMember.getMemberId()); if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(crewMember.getCrewChatRoom(), member); + chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, member); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index fc2ab591..cbfebd07 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -133,9 +133,9 @@ public List findCrewsByAddress( ) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); - final Page crews = crewRepository.findByAddressDepth1AndAddressDepth2( - mainAddress.getAddressDepth1(), - mainAddress.getAddressDepth2(), + final Page crews = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( + mainAddress.getAddressDepth1().getId(), + mainAddress.getAddressDepth2().getId(), pageable ); diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index d6efe038..c738fb83 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -18,7 +18,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; @@ -94,9 +93,7 @@ public class Game extends BaseEntity { @NotNull private Long addressDepth2Id; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "chat_room_id") - private ChatRoom chatRoom; + private Long chatRoomId; @Builder private Game( @@ -179,6 +176,6 @@ public Boolean isHost(final Long hostId) { public void makeNewCrewChatRoom(final ChatRoom chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); - this.chatRoom = chatRoom; + this.chatRoomId = chatRoom.getId(); } } diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 075da652..13e2cf2b 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -13,7 +13,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; @@ -69,10 +68,6 @@ public void updateStatus(final RegistrationStatus status) { this.status = status; } - public ChatRoom getCrewChatRoom() { - return game.getChatRoom(); - } - public Boolean isAlreadyReviewDone() { return isReview; } diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index 09efe99f..b26fa68b 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -8,8 +8,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; @@ -17,14 +15,14 @@ public interface GameRepository extends JpaRepository, GameSearchRepository { - Page findByAddressDepth1AndAddressDepth2AndStatusNot( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, + Page findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + final Long addressDepth1Id, + final Long addressDepth2Id, final GameStatus status, final Pageable pageable ); - Optional findByChatRoom(final ChatRoom chatRoom); + Optional findByChatRoomId(final Long chatRoomId); default Game getGameById(final Long gameId) { return findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 39bb10b5..71511b8c 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -13,6 +13,8 @@ import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; @@ -42,6 +44,7 @@ public class GameMemberService { private final GameRepository gameRepository; private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; + private final ChatRoomRepository chatRoomRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; private final GameMemberRepository gameMemberRepository; @@ -144,7 +147,8 @@ public void updateGameMemberRegistrationStatus( validateIsHost(loggedInMemberId, game); final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); - enterGameChatRoom(updateStatus, gameMember); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(game.getChatRoomId()); + enterGameChatRoom(updateStatus, gameMember, chatRoom); gameMember.updateStatus(updateStatus); @@ -162,11 +166,15 @@ private void validateIsHost(final Long loggedInMemberId, final Game game) { } } - private void enterGameChatRoom(final RegistrationStatus updateStatus, final GameMember gameMember) { + private void enterGameChatRoom( + final RegistrationStatus updateStatus, + final GameMember gameMember, + final ChatRoom chatRoom + ) { final RegistrationStatus nowStatus = gameMember.getStatus(); if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(gameMember.getCrewChatRoom(), gameMember.getMember()); + chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, gameMember.getMember()); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index c3e166a3..4c49cafc 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -77,7 +77,8 @@ private static long getSecondsBetween( public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { final Member host = memberRepository.getMemberById(loggedInMemberId); final Point point = kakaoAddressSearchClient.fetchAddress(gameCreateRequest.getMainAddress()); - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(gameCreateRequest.getMainAddress()); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( + gameCreateRequest.getMainAddress()); final Game game = gameCreateRequest.toEntity(host, mainAddress, point); final GameMember gameHost = GameMember.builder() @@ -195,9 +196,9 @@ private List findGamesByAddress(final String address, final Pageab ) ); - final Page games = gameRepository.findByAddressDepth1AndAddressDepth2AndStatusNot( - mainAddress.getAddressDepth1(), - mainAddress.getAddressDepth2(), + final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + mainAddress.getAddressDepth1().getId(), + mainAddress.getAddressDepth2().getId(), GameStatus.ENDED, pageRequest ); From 05d20a65fa539f3d36e57eebfd7ddb37b11f1bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Fri, 9 Feb 2024 16:37:26 +0900 Subject: [PATCH 029/117] =?UTF-8?q?refactor:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/game/domain/Game.java | 18 ++++-------------- .../game/dto/request/GameCreateRequest.java | 5 ++--- .../service/GameReviewMannerScoresService.java | 10 +++++++--- .../pickple/back/game/service/GameService.java | 8 ++++---- 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index c738fb83..24fbc8dd 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -12,18 +12,14 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.util.GameStatusConverter; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -83,9 +79,7 @@ public class Game extends BaseEntity { private Integer maxMemberCount = 2; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "host_id") - private Member host; + private Long hostId; @NotNull private Long addressDepth1Id; @@ -106,7 +100,7 @@ private Game( final String detailAddress, final Integer cost, final Integer maxMemberCount, - final Member host, + final Long hostId, final Point point, final Long addressDepth1Id, final Long addressDepth2Id @@ -120,7 +114,7 @@ private Game( this.detailAddress = detailAddress; this.cost = cost; this.maxMemberCount = maxMemberCount; - this.host = host; + this.hostId = hostId; this.point = point; this.addressDepth1Id = addressDepth1Id; this.addressDepth2Id = addressDepth2Id; @@ -166,12 +160,8 @@ public void increaseViewCount() { viewCount++; } - public Boolean isHost(final Member member) { - return member.equals(host); - } - public Boolean isHost(final Long hostId) { - return hostId.equals(host.getId()); + return hostId.equals(this.hostId); } public void makeNewCrewChatRoom(final ChatRoom chatRoom) { diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index bac7b3b5..f952c6d3 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -18,7 +18,6 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GamePosition; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -68,7 +67,7 @@ public class GameCreateRequest { private List positions; public Game toEntity( - final Member host, + final Long hostId, final MainAddress mainAddress, final Point point ) { @@ -82,7 +81,7 @@ public Game toEntity( .detailAddress(detailAddress) .cost(cost) .maxMemberCount(maxMemberCount) - .host(host) + .hostId(hostId) .point(point) .addressDepth1Id(mainAddress.getAddressDepth1().getId()) .addressDepth2Id(mainAddress.getAddressDepth2().getId()) diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 5faf479e..9875939a 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -15,7 +15,9 @@ import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -26,6 +28,8 @@ public class GameReviewMannerScoresService { private static final int REVIEW_POSSIBLE_DAYS = 7; private final GameMemberRepository gameMemberRepository; + private final GameRepository gameRepository; + private final MemberRepository memberRepository; @Transactional public void reviewMannerScores( @@ -44,8 +48,8 @@ public void reviewMannerScores( throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); + final Game game = gameRepository.getGameById(gameMember.getGameId()); + final Member loggedInMember = memberRepository.getMemberById(gameMember.getMemberId()); if (isNotReviewPeriod(game)) { throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), @@ -92,7 +96,7 @@ private Member getReviewedMember(final Game game, final Long reviewedMemberId) { private List getConfirmedMembers(Game game) { return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), CONFIRMED) .stream() - .map(GameMember::getMember) + .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .toList(); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 4c49cafc..c8dbb675 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -80,10 +80,10 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( gameCreateRequest.getMainAddress()); - final Game game = gameCreateRequest.toEntity(host, mainAddress, point); + final Game game = gameCreateRequest.toEntity(host.getId(), mainAddress, point); final GameMember gameHost = GameMember.builder() - .member(host) - .game(game) + .memberId(host.getId()) + .gameId(game.getId()) .build(); gameHost.confirmRegistration(); @@ -260,7 +260,7 @@ public List findGamesWithInDistance( private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) .stream() - .map(GameMember::getMember) + .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), From 626c2b460a49bb9c88ea6ac4ed9564d52fc18a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Fri, 9 Feb 2024 16:38:37 +0900 Subject: [PATCH 030/117] =?UTF-8?q?refactor:=20GameMember=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/game/domain/GameMember.java | 38 +++++------------ .../back/game/service/GameMemberService.java | 41 +++++++++++++------ .../dto/response/MemberGameResponse.java | 6 +-- .../member/service/MemberGameService.java | 28 +++++++------ 4 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 13e2cf2b..f59d5680 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -6,17 +6,13 @@ import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -40,20 +36,16 @@ public class GameMember extends BaseEntity { private Boolean isReview = FALSE; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id") - private Member member; + private Long memberId; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_id") - private Game game; + private Long gameId; @Builder - private GameMember(final Member member, final Game game) { - this.status = getRegistrationStatus(member, game); - this.member = member; - this.game = game; + private GameMember(final Long memberId, final Long gameId, final RegistrationStatus status) { + this.status = status; + this.memberId = memberId; + this.gameId = gameId; } public void confirmRegistration() { @@ -61,13 +53,13 @@ public void confirmRegistration() { } public void updateStatus(final RegistrationStatus status) { - if (this.status == WAITING && status == CONFIRMED) { - game.increaseMemberCount(); - } - this.status = status; } + public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { + return this.status == WAITING && updateStatus == CONFIRMED; + } + public Boolean isAlreadyReviewDone() { return isReview; } @@ -75,14 +67,4 @@ public Boolean isAlreadyReviewDone() { public void updateReviewDone() { this.isReview = TRUE; } - - private RegistrationStatus getRegistrationStatus(final Member member, final Game game) { - final Member host = game.getHost(); - - if (member.equals(host)) { - return CONFIRMED; - } - - return status; - } } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 71511b8c..da25b0f6 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -61,7 +61,7 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() .gameId(gameId) - .memberId(game.getHost().getId()) + .memberId(game.getHostId()) .build()); } @@ -76,22 +76,34 @@ private boolean isAlreadyRegistered(final Game game, final Member member) { } private GameMember buildGameMember(final Game game, final Member member) { + return GameMember.builder() - .member(member) - .game(game) + .status(getRegistrationStatus(member, game)) + .memberId(member.getId()) + .gameId(game.getId()) .build(); } + private RegistrationStatus getRegistrationStatus(final Member member, final Game game) { + final Member host = memberRepository.getMemberById(game.getHostId()); + + if (member.equals(host)) { + return CONFIRMED; + } + + return WAITING; + } + public GameResponse findAllGameMembers( final Long loggedInMemberId, final Long gameId, final RegistrationStatus status ) { final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); - final Game game = gameMember.getGame(); - final Member loggedInMember = gameMember.getMember(); + final Game game = gameRepository.getGameById(gameMember.getGameId()); + final Member loggedInMember = memberRepository.getMemberById(gameMember.getMemberId()); - if (!game.isHost(loggedInMember) && status == WAITING) { + if (!game.isHost(loggedInMember.getId()) && status == WAITING) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } @@ -106,7 +118,7 @@ public GameResponse findAllGameMembers( private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) .stream() - .map(GameMember::getMember) + .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), @@ -142,7 +154,7 @@ public void updateGameMemberRegistrationStatus( final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest ) { final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); + final Game game = gameRepository.getGameById(gameMember.getGameId()); validateIsHost(loggedInMemberId, game); @@ -151,6 +163,9 @@ public void updateGameMemberRegistrationStatus( enterGameChatRoom(updateStatus, gameMember, chatRoom); gameMember.updateStatus(updateStatus); + if (gameMember.isStatusChangedFromWaitingToConfirmed(updateStatus)) { + game.increaseMemberCount(); + } eventPublisher.publishEvent(GameMemberJoinedEvent.builder() .gameId(gameId) @@ -161,7 +176,7 @@ public void updateGameMemberRegistrationStatus( private void validateIsHost(final Long loggedInMemberId, final Game game) { final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - if (!game.isHost(loggedInMember)) { + if (!game.isHost(loggedInMember.getId())) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } } @@ -174,18 +189,18 @@ private void enterGameChatRoom( final RegistrationStatus nowStatus = gameMember.getStatus(); if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, gameMember.getMember()); + chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, memberRepository.getMemberById(gameMember.getMemberId())); } } @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameMember.getGame(); - final Member member = gameMember.getMember(); + final Game game = gameRepository.getGameById(gameMember.getGameId()); + final Member member = memberRepository.getMemberById(gameMember.getMemberId()); final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - if (game.isHost(loggedInMember)) { + if (game.isHost(loggedInMember.getId())) { validateIsHostSelfDeleted(loggedInMember, member); eventPublisher.publishEvent(GameMemberRejectedEvent.builder() diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index 403e76ab..835a2482 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -41,10 +41,8 @@ public class MemberGameResponse { private List positions; private List members; - public static MemberGameResponse of(final GameMember gameMember, final List memberResponses, + public static MemberGameResponse of(final GameMember gameMember, final Game game, final List memberResponses, final List positions, final MainAddress mainAddress) { - final Game game = gameMember.getGame(); - return MemberGameResponse.builder() .id(game.getId()) .content(game.getContent()) @@ -62,7 +60,7 @@ public static MemberGameResponse of(final GameMember gameMember, final List convertToMemberGameResponses( final RegistrationStatus memberStatus ) { return memberGames.stream() - .map(memberGame -> - MemberGameResponse.of( - memberGame, - getMemberResponsesByGame(memberGame.getGame(), memberStatus), - getPositionsByMember(memberGame.getMember()), - addressReader.readMainAddressById( - memberGame.getGame().getAddressDepth1Id(), - memberGame.getGame().getAddressDepth2Id() - ) - ) - ) + .map(memberGame -> { + Game game = gameRepository.getGameById(memberGame.getGameId()); + Member member = memberRepository.getMemberById(memberGame.getMemberId()); + + return MemberGameResponse.of( + memberGame, + game, + getMemberResponsesByGame(game, memberStatus), + getPositionsByMember(member), + addressReader.readMainAddressById( + game.getAddressDepth1Id(), + game.getAddressDepth2Id() + ) + ); + }) .toList(); } private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) .stream() - .map(GameMember::getMember) + .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), From b968e096b57ed1b75046519cb01b3e19a67fba26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Fri, 9 Feb 2024 16:39:09 +0900 Subject: [PATCH 031/117] =?UTF-8?q?refactor:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=88=84=EB=9D=BD=EB=90=9C=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/alarm/service/GameAlarmService.java | 4 ++-- .../java/kr/pickple/back/game/dto/response/GameResponse.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 3f8ab231..e39e8821 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -44,7 +44,7 @@ public void createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinR final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final Game game = getGameInfo(gameId); - final Member host = game.getHost(); + final Member host = getMemberInfo(game.getHostId()); final GameAlarm gameAlarm = GameAlarm.builder() .game(game) @@ -102,7 +102,7 @@ private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinReque final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); if (!game.isHost(gameJoinRequestNotificationEvent.getMemberId())) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, gameId, game.getHost()); + throw new GameException(GAME_MEMBER_IS_NOT_HOST, gameId, game.getHostId()); } } diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index 4651154e..d9dc0386 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -62,7 +62,7 @@ public static GameResponse of( .cost(game.getCost()) .memberCount(game.getMemberCount()) .maxMemberCount(game.getMaxMemberCount()) - .host(getHostResponse(memberResponses, game.getHost().getId())) + .host(getHostResponse(memberResponses, game.getHostId())) .addressDepth1(mainAddress.getAddressDepth1().getName()) .addressDepth2(mainAddress.getAddressDepth2().getName()) .positions(positions) From fb7c2d2a7219f7fd891fb291a2cdfa0800282498 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 21 Feb 2024 20:52:30 +0900 Subject: [PATCH 032/117] =?UTF-8?q?refactor:=20Member=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20=EA=B3=84=EC=B8=B5=20=EB=8F=84=EC=9E=85=20=EB=B0=8F=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=99=80=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/auth/implement/TokenManager.java | 42 ++++++ .../back/auth/service/OauthService.java | 6 +- .../member/controller/MemberController.java | 16 ++- .../back/member/domain/MemberProfile.java | 32 +++++ .../pickple/back/member/domain/NewMember.java | 36 +++++ .../dto/mapper/MemberRequestMapper.java | 20 +++ .../dto/mapper/MemberResponseMapper.java | 40 ++++++ .../dto/request/MemberCreateRequest.java | 26 ---- .../back/member/implement/MemberReader.java | 62 +++++++++ .../back/member/implement/MemberWriter.java | 77 +++++++++++ .../back/member/mapper/MemberMapper.java | 57 ++++++++ .../member/repository/MemberRepository.java | 7 - .../member/service/MemberCrewService.java | 16 +-- .../member/service/MemberGameService.java | 15 +- .../back/member/service/MemberService.java | 130 ++++-------------- 15 files changed, 421 insertions(+), 161 deletions(-) create mode 100644 src/main/java/kr/pickple/back/auth/implement/TokenManager.java create mode 100644 src/main/java/kr/pickple/back/member/domain/MemberProfile.java create mode 100644 src/main/java/kr/pickple/back/member/domain/NewMember.java create mode 100644 src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java create mode 100644 src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java create mode 100644 src/main/java/kr/pickple/back/member/implement/MemberReader.java create mode 100644 src/main/java/kr/pickple/back/member/implement/MemberWriter.java create mode 100644 src/main/java/kr/pickple/back/member/mapper/MemberMapper.java diff --git a/src/main/java/kr/pickple/back/auth/implement/TokenManager.java b/src/main/java/kr/pickple/back/auth/implement/TokenManager.java new file mode 100644 index 00000000..b0b5bdcc --- /dev/null +++ b/src/main/java/kr/pickple/back/auth/implement/TokenManager.java @@ -0,0 +1,42 @@ +package kr.pickple.back.auth.implement; + +import java.time.LocalDateTime; + +import org.springframework.stereotype.Component; + +import kr.pickple.back.auth.config.property.JwtProperties; +import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.auth.domain.token.JwtProvider; +import kr.pickple.back.auth.domain.token.RefreshToken; +import kr.pickple.back.auth.repository.RedisRepository; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class TokenManager { + + private static final String REFRESH_TOKEN_KEY = "refresh_token"; + + private final JwtProvider jwtProvider; + private final JwtProperties jwtProperties; + private final RedisRepository redisRepository; + + public AuthTokens create(final Long memberId) { + final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(memberId)); + + final RefreshToken refreshToken = RefreshToken.builder() + .token(loginTokens.getRefreshToken()) + .memberId(memberId) + .createdAt(LocalDateTime.now()) + .build(); + + redisRepository.saveHash( + REFRESH_TOKEN_KEY, + refreshToken.getToken(), + refreshToken, + jwtProperties.getRefreshTokenExpirationTime() + ); + + return loginTokens; + } +} diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index 0ebd04ea..c37f6f2b 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -24,7 +24,7 @@ import kr.pickple.back.auth.service.memberclient.OauthMemberClientComposite; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @Service @@ -34,7 +34,7 @@ public class OauthService { private static final String REFRESH_TOKEN_KEY = "refresh_token"; - private final MemberRepository memberRepository; + private final MemberReader memberReader; private final AuthCodeRequestUrlProviderComposite authCodeRequestUrlProviderComposite; private final OauthMemberClientComposite oauthMemberClientComposite; private final TokenExtractor tokenExtractor; @@ -53,7 +53,7 @@ public AuthenticatedMemberResponse processLoginOrRegistration( final String authCode ) { final OauthMember oauthMember = oauthMemberClientComposite.fetch(oauthProvider, authCode); - final Optional member = memberRepository.findByOauthId(oauthMember.getOauthId()); + final Optional member = memberReader.readByOauthId(oauthMember.getOauthId()); // 사용자가 로그인 하는 경우 if (member.isPresent()) { diff --git a/src/main/java/kr/pickple/back/member/controller/MemberController.java b/src/main/java/kr/pickple/back/member/controller/MemberController.java index 76c22e4e..f9f6cb8d 100644 --- a/src/main/java/kr/pickple/back/member/controller/MemberController.java +++ b/src/main/java/kr/pickple/back/member/controller/MemberController.java @@ -23,6 +23,10 @@ import kr.pickple.back.auth.config.resolver.SignUp; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.member.domain.MemberProfile; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.dto.mapper.MemberRequestMapper; +import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; @@ -58,7 +62,11 @@ public ResponseEntity createMember( throw new MemberException(MEMBER_SIGNUP_OAUTH_SUBJECT_INVALID, requestOauthSubject); } - final AuthenticatedMemberResponse authenticatedMemberResponse = memberService.createMember(memberCreateRequest); + final NewMember newMember = MemberRequestMapper.mapToNewMemberDomain(memberCreateRequest); + final NewMember savedNewMember = memberService.createMember(newMember); + final AuthenticatedMemberResponse authenticatedMemberResponse = MemberResponseMapper + .mapToAuthenticatedMemberResponseDto(savedNewMember); + final String refreshToken = authenticatedMemberResponse.getRefreshToken(); if (refreshToken != null) { @@ -79,8 +87,12 @@ public ResponseEntity createMember( @GetMapping("/{memberId}") public ResponseEntity findMemberProfileById(@PathVariable final Long memberId) { + final MemberProfile memberProfile = memberService.findMemberProfileById(memberId); + final MemberProfileResponse memberProfileResponse = MemberResponseMapper + .mapToMemberProfileResponseDto(memberProfile); + return ResponseEntity.status(OK) - .body(memberService.findMemberProfileById(memberId)); + .body(memberProfileResponse); } @GetMapping("/{memberId}/crews") diff --git a/src/main/java/kr/pickple/back/member/domain/MemberProfile.java b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java new file mode 100644 index 00000000..50b66928 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java @@ -0,0 +1,32 @@ +package kr.pickple.back.member.domain; + +import java.util.List; + +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MemberProfile { + + private Long memberId; + private String email; + private String nickname; + private String introduction; + private String profileImageUrl; + private Integer mannerScore; + private Integer mannerScoreCount; + private String addressDepth1Name; + private String addressDepth2Name; + private List positions; + private List joinedCrews; + + public void updateJoinedCrews(final List joinedCrews) { + this.joinedCrews = joinedCrews; + } +} diff --git a/src/main/java/kr/pickple/back/member/domain/NewMember.java b/src/main/java/kr/pickple/back/member/domain/NewMember.java new file mode 100644 index 00000000..35a81b69 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/domain/NewMember.java @@ -0,0 +1,36 @@ +package kr.pickple.back.member.domain; + +import java.util.List; + +import kr.pickple.back.auth.domain.oauth.OauthProvider; +import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class NewMember { + + private Long memberId; + private AuthTokens authTokens; + private String nickname; + private String profileImageUrl; + private String email; + private List positions; + private Long oauthId; + private OauthProvider oauthProvider; + private String addressDepth1Name; + private String addressDepth2Name; + + public void updateMemberId(final Long memberId) { + this.memberId = memberId; + } + + public void updateAuthTokens(final AuthTokens authTokens) { + this.authTokens = authTokens; + } +} diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java new file mode 100644 index 00000000..9344bf5c --- /dev/null +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java @@ -0,0 +1,20 @@ +package kr.pickple.back.member.dto.mapper; + +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.dto.request.MemberCreateRequest; + +public final class MemberRequestMapper { + + public static NewMember mapToNewMemberDomain(final MemberCreateRequest memberCreateRequest) { + return NewMember.builder() + .email(memberCreateRequest.getEmail()) + .nickname(memberCreateRequest.getNickname()) + .profileImageUrl(memberCreateRequest.getProfileImageUrl()) + .positions(memberCreateRequest.getPositions()) + .oauthId(memberCreateRequest.getOauthId()) + .oauthProvider(memberCreateRequest.getOauthProvider()) + .addressDepth1Name(memberCreateRequest.getAddressDepth1()) + .addressDepth2Name(memberCreateRequest.getAddressDepth2()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java new file mode 100644 index 00000000..6a8863db --- /dev/null +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -0,0 +1,40 @@ +package kr.pickple.back.member.dto.mapper; + +import kr.pickple.back.member.domain.MemberProfile; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; +import kr.pickple.back.member.dto.response.MemberProfileResponse; + +public final class MemberResponseMapper { + + public static AuthenticatedMemberResponse mapToAuthenticatedMemberResponseDto(final NewMember newMember) { + return AuthenticatedMemberResponse.builder() + .accessToken(newMember.getAuthTokens().getAccessToken()) + .refreshToken(newMember.getAuthTokens().getRefreshToken()) + .id(newMember.getMemberId()) + .nickname(newMember.getNickname()) + .profileImageUrl(newMember.getProfileImageUrl()) + .email(newMember.getEmail()) + .oauthId(newMember.getOauthId()) + .oauthProvider(newMember.getOauthProvider()) + .addressDepth1(newMember.getAddressDepth1Name()) + .addressDepth2(newMember.getAddressDepth2Name()) + .build(); + } + + public static MemberProfileResponse mapToMemberProfileResponseDto(final MemberProfile memberProfile) { + return MemberProfileResponse.builder() + .id(memberProfile.getMemberId()) + .email(memberProfile.getEmail()) + .nickname(memberProfile.getNickname()) + .introduction(memberProfile.getIntroduction()) + .profileImageUrl(memberProfile.getProfileImageUrl()) + .mannerScore(memberProfile.getMannerScore()) + .mannerScoreCount(memberProfile.getMannerScoreCount()) + .addressDepth1(memberProfile.getAddressDepth1Name()) + .addressDepth2(memberProfile.getAddressDepth2Name()) + .positions(memberProfile.getPositions()) + .crews(memberProfile.getJoinedCrews()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java index f52f5711..3f21b4d1 100644 --- a/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java +++ b/src/main/java/kr/pickple/back/member/dto/request/MemberCreateRequest.java @@ -5,11 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; -import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -47,26 +43,4 @@ public class MemberCreateRequest { @NotBlank(message = "주소2는 null이거나 빈 문자열이거나 공백일 수 없음") private String addressDepth2; - - public Member toEntity(final MainAddress mainAddress) { - return Member.builder() - .email(email) - .nickname(nickname) - .profileImageUrl(profileImageUrl) - .status(MemberStatus.ACTIVE) - .oauthId(oauthId) - .oauthProvider(oauthProvider) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) - .build(); - } - - public List toMemberPositionEntities(final Long memberId) { - return positions.stream() - .map(position -> MemberPosition.builder() - .memberId(memberId) - .position(position) - .build() - ).toList(); - } } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java new file mode 100644 index 00000000..71d9881a --- /dev/null +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -0,0 +1,62 @@ +package kr.pickple.back.member.implement; + +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.domain.MemberProfile; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.mapper.MemberMapper; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberReader { + + private final AddressReader addressReader; + private final MemberRepository memberRepository; + private final CrewRepository crewRepository; + private final MemberPositionRepository memberPositionRepository; + + public MemberProfile readProfileByMemberId(final Long memberId) { + final Member member = readByMemberId(memberId); + + final MainAddress mainAddress = addressReader.readMainAddressById( + member.getAddressDepth1Id(), + member.getAddressDepth2Id() + ); + + final List positions = readAllMemberPosition(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); + + return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions); + } + + public Member readByMemberId(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + public List readAllMemberPosition(final Long memberId) { + return memberPositionRepository.findAllByMemberId(memberId); + } + + public Optional readByOauthId(final Long oauthId) { + return memberRepository.findByOauthId(oauthId); + } +} diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java new file mode 100644 index 00000000..32e2fa43 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -0,0 +1,77 @@ +package kr.pickple.back.member.implement; + +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.auth.implement.TokenManager; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.mapper.MemberMapper; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Component +@Transactional +@RequiredArgsConstructor +public class MemberWriter { + + private final TokenManager tokenManager; + private final AddressReader addressReader; + private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; + + public NewMember create(final NewMember newMember) { + validateIsDuplicatedMemberInfo(newMember); + + final MainAddress mainAddress = addressReader.readMainAddressByNames( + newMember.getAddressDepth1Name(), + newMember.getAddressDepth2Name() + ); + + final Member memberEntity = MemberMapper.mapToMemberEntity(newMember, mainAddress); + final Member savedMemberEntity = memberRepository.save(memberEntity); + + newMember.updateMemberId(savedMemberEntity.getId()); + setPositionsToMember(newMember.getPositions(), newMember.getMemberId()); + + return newMember; + } + + private void setPositionsToMember(final List positions, final Long memberId) { + validateIsDuplicatedPositions(positions); + + final List memberPositions = MemberMapper.mapToMemberPositionEntities(positions, memberId); + + memberPositionRepository.saveAll(memberPositions); + } + + private void validateIsDuplicatedMemberInfo(final NewMember newMember) { + final String email = newMember.getEmail(); + final String nickname = newMember.getNickname(); + final Long oauthId = newMember.getOauthId(); + + if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { + throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); + } + } + + private void validateIsDuplicatedPositions(final List positions) { + final Long distinctPositionsSize = positions.stream() + .distinct() + .count(); + + if (distinctPositionsSize != positions.size()) { + throw new MemberException(MEMBER_POSITIONS_IS_DUPLICATED, positions); + } + } +} diff --git a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java new file mode 100644 index 00000000..e691028f --- /dev/null +++ b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java @@ -0,0 +1,57 @@ +package kr.pickple.back.member.mapper; + +import java.util.List; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.domain.MemberProfile; +import kr.pickple.back.member.domain.MemberStatus; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.position.domain.Position; + +public final class MemberMapper { + + public static Member mapToMemberEntity(final NewMember newMember, final MainAddress mainAddress) { + return Member.builder() + .email(newMember.getEmail()) + .nickname(newMember.getNickname()) + .profileImageUrl(newMember.getProfileImageUrl()) + .status(MemberStatus.ACTIVE) + .oauthId(newMember.getOauthId()) + .oauthProvider(newMember.getOauthProvider()) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .build(); + } + + public static List mapToMemberPositionEntities( + final List positions, + final Long memberId + ) { + return positions.stream() + .map(position -> MemberPosition.builder() + .memberId(memberId) + .position(position) + .build() + ).toList(); + } + + public static MemberProfile mapToMemberProfileDomain( + final Member member, + final MainAddress mainAddress, + final List positions + ) { + return MemberProfile.builder() + .memberId(member.getId()) + .email(member.getEmail()) + .nickname(member.getNickname()) + .profileImageUrl(member.getProfileImageUrl()) + .mannerScore(member.getMannerScore()) + .mannerScoreCount(member.getMannerScoreCount()) + .addressDepth1Name(mainAddress.getAddressDepth1().getName()) + .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .positions(positions) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index f03915ac..b8658dea 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -1,21 +1,14 @@ package kr.pickple.back.member.repository; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; public interface MemberRepository extends JpaRepository { Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); Optional findByOauthId(final Long oauthId); - - default Member getMemberById(final Long memberId) { - return findById(memberId).orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 48849c1d..5c86f6ed 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -20,8 +20,7 @@ import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -31,11 +30,9 @@ public class MemberCrewService { private final AddressReader addressReader; - - private final MemberRepository memberRepository; + private final MemberReader memberReader; private final CrewMemberRepository crewMemberRepository; private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; /** * 사용자가 가입한 크루 목록 조회 @@ -47,7 +44,7 @@ public List findAllCrewsByMemberId( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) .stream() .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) @@ -62,7 +59,7 @@ public List findAllCrewsByMemberId( public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final List crews = crewRepository.findAllByLeaderId(member.getId()); return convertToCrewProfileResponses(crews, CONFIRMED); @@ -101,7 +98,7 @@ private List convertToCrewProfileResponses( private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() - .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) + .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositions(member), @@ -113,8 +110,7 @@ private List getMemberResponsesByCrew(final Crew crew, final Reg } private List getPositions(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); + final List memberPositions = memberPositionReader.readAll(member.getId()); return Position.fromMemberPositions(memberPositions); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index c94e6711..97bb23c7 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -20,8 +20,7 @@ import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -31,11 +30,9 @@ public class MemberGameService { private final AddressReader addressReader; - - private final MemberRepository memberRepository; + private final MemberReader memberReader; private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; - private final MemberPositionRepository memberPositionRepository; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 @@ -47,7 +44,7 @@ public List findAllMemberGames( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus); @@ -60,7 +57,7 @@ public List findAllMemberGames( public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); return convertToMemberGameResponses(memberGames, CONFIRMED); @@ -76,7 +73,7 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final Game game = gameRepository.getGameById(gameId); final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) @@ -128,7 +125,7 @@ private List getMemberResponsesByGame(final Game game, final Reg } private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); + final List memberPositions = memberPositionReader.readAll(member.getId()); return Position.fromMemberPositions(memberPositions); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index d9512a3e..c8f00dce 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -1,36 +1,22 @@ package kr.pickple.back.member.service; import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; -import java.time.LocalDateTime; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.auth.domain.token.JwtProvider; -import kr.pickple.back.auth.domain.token.RefreshToken; -import kr.pickple.back.auth.repository.RedisRepository; +import kr.pickple.back.auth.implement.TokenManager; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.request.MemberCreateRequest; -import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.MemberProfileResponse; -import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; +import kr.pickple.back.member.domain.MemberProfile; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.implement.MemberReader; +import kr.pickple.back.member.implement.MemberWriter; import lombok.RequiredArgsConstructor; @Service @@ -38,94 +24,39 @@ @Transactional(readOnly = true) public class MemberService { - private static final String REFRESH_TOKEN_KEY = "refresh_token"; - private final AddressReader addressReader; - + private final TokenManager tokenManager; + private final MemberWriter memberWriter; + private final MemberReader memberReader; private final CrewRepository crewRepository; - private final MemberRepository memberRepository; private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; - private final RedisRepository redisRepository; - private final JwtProvider jwtProvider; - private final JwtProperties jwtProperties; /** * 사용자 회원가입 (카카오) */ @Transactional - public AuthenticatedMemberResponse createMember(final MemberCreateRequest memberCreateRequest) { - validateIsDuplicatedMemberInfo(memberCreateRequest); - - final MainAddress mainAddressId = addressReader.readMainAddressByNames( - memberCreateRequest.getAddressDepth1(), - memberCreateRequest.getAddressDepth2() - ); - - final Member member = memberCreateRequest.toEntity(mainAddressId); - final Member savedMember = memberRepository.save(member); - - validatedIsDuplicatedPositions(memberCreateRequest.getPositions()); - final List memberPositions = memberCreateRequest.toMemberPositionEntities(savedMember.getId()); - - memberPositionRepository.saveAll(memberPositions); /* TODO: 벌크 연산으로 고치기 */ - - final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(savedMember.getId())); - - final RefreshToken refreshToken = RefreshToken.builder() - .token(loginTokens.getRefreshToken()) - .memberId(savedMember.getId()) - .createdAt(LocalDateTime.now()) - .build(); - - redisRepository.saveHash( - REFRESH_TOKEN_KEY, - refreshToken.getToken(), - refreshToken, - jwtProperties.getRefreshTokenExpirationTime() - ); - - final MainAddress mainAddress = addressReader.readMainAddressById( - savedMember.getAddressDepth1Id(), - savedMember.getAddressDepth2Id() - ); - - return AuthenticatedMemberResponse.of(savedMember, loginTokens, mainAddress); - } - - private void validatedIsDuplicatedPositions(final List positions) { - final Long distinctPositionsSize = positions.stream() - .distinct() - .count(); + public NewMember createMember(final NewMember newMember) { + final NewMember savedNewMember = memberWriter.create(newMember); + final AuthTokens authTokens = tokenManager.create(savedNewMember.getMemberId()); + savedNewMember.updateAuthTokens(authTokens); - if (distinctPositionsSize != positions.size()) { - throw new MemberException(MEMBER_POSITIONS_IS_DUPLICATED, positions); - } - } - - private void validateIsDuplicatedMemberInfo(final MemberCreateRequest memberCreateRequest) { - final String email = memberCreateRequest.getEmail(); - final String nickname = memberCreateRequest.getNickname(); - final Long oauthId = memberCreateRequest.getOauthId(); - - if (memberRepository.existsByEmailOrNicknameOrOauthId(email, nickname, oauthId)) { - throw new MemberException(MEMBER_IS_EXISTED, email, nickname, oauthId); - } + return savedNewMember; } /** * 사용자 프로필 조회 */ - public MemberProfileResponse findMemberProfileById(final Long memberId) { - final Member member = memberRepository.getMemberById(memberId); - final List positions = getPositionsByMember(member); + public MemberProfile findMemberProfileById(final Long memberId) { + final MemberProfile memberProfile = memberReader.readProfileByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), CONFIRMED) + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), CONFIRMED) .stream() - .map(this::getCrewByCrewId) + .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) .toList(); - final List crewResponses = crews.stream() + memberProfile.updateJoinedCrews(crews); + +/* final List crewResponses = crews.stream() .map(crew -> CrewResponse.of( crew, getLeaderResponse(crew), @@ -133,22 +64,14 @@ public MemberProfileResponse findMemberProfileById(final Long memberId) { ) ) .toList(); + */ - final MainAddress mainAddress = addressReader.readMainAddressById( - member.getAddressDepth1Id(), - member.getAddressDepth2Id() - ); - - return MemberProfileResponse.of(member, crewResponses, positions, mainAddress); + return memberProfile; } - private Crew getCrewByCrewId(final CrewMember crewMember) { - return crewRepository.getCrewById(crewMember.getMemberId()); - } - - private MemberResponse getLeaderResponse(final Crew crew) { + /*private MemberResponse getLeaderResponse(final Crew crew) { final Long memberId = crew.getLeaderId(); - final Member member = memberRepository.getMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( member.getAddressDepth1Id(), @@ -159,9 +82,8 @@ private MemberResponse getLeaderResponse(final Crew crew) { } private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); + final List memberPositions = memberPositionReader.readAll(member.getId()); return Position.fromMemberPositions(memberPositions); - } + }*/ } From 1364a4e99e21a7e27274888b0f64e46c2e7a87dd Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 14 Feb 2024 10:36:21 +0900 Subject: [PATCH 033/117] =?UTF-8?q?refactor:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/implement/CrewMemberReader.java | 13 +++++++++++++ .../pickple/back/crew/implement/CrewReader.java | 17 +++++++++++++++++ .../pickple/back/crew/implement/CrewWriter.java | 11 +++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java create mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewReader.java create mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewWriter.java diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java new file mode 100644 index 00000000..0f16dc58 --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java @@ -0,0 +1,13 @@ +package kr.pickple.back.crew.implement; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CrewMemberReader { + +} diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java new file mode 100644 index 00000000..dcccea3e --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -0,0 +1,17 @@ +package kr.pickple.back.crew.implement; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class CrewReader { + + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; +} diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java new file mode 100644 index 00000000..0a2a09db --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -0,0 +1,11 @@ +package kr.pickple.back.crew.implement; + +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class CrewWriter { + +} From aa691889055f469fe145b6b6d001ae02964e9de9 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 15 Feb 2024 02:23:49 +0900 Subject: [PATCH 034/117] =?UTF-8?q?refactor:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=BD=EA=B8=B0,=20=EC=93=B0=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EA=B3=84=EC=B8=B5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/common/util/RandomUtil.java | 2 +- .../back/crew/controller/CrewController.java | 5 +- .../kr/pickple/back/crew/domain/Crew.java | 4 +- .../pickple/back/crew/domain/CrewMember.java | 11 +--- .../crew/dto/request/CrewCreateRequest.java | 20 ++---- .../back/crew/implement/CrewReader.java | 1 + .../back/crew/implement/CrewWriter.java | 40 ++++++++++++ .../back/crew/service/CrewService.java | 61 ++++++------------- 8 files changed, 76 insertions(+), 68 deletions(-) diff --git a/src/main/java/kr/pickple/back/common/util/RandomUtil.java b/src/main/java/kr/pickple/back/common/util/RandomUtil.java index ec55e52a..fad74bdf 100644 --- a/src/main/java/kr/pickple/back/common/util/RandomUtil.java +++ b/src/main/java/kr/pickple/back/common/util/RandomUtil.java @@ -4,7 +4,7 @@ public final class RandomUtil { - public static int getRandomNumber(final int start, final int end) { + public static Integer getRandomNumber(final int start, final int end) { final Random random = new Random(); return random.nextInt(end) + start; diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 137acd28..fd9177d5 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -19,6 +19,7 @@ import jakarta.validation.Valid; import kr.pickple.back.auth.config.resolver.Login; import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.dto.request.CrewCreateRequest; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.dto.response.CrewIdResponse; @@ -40,8 +41,10 @@ public ResponseEntity createCrew( @Login final Long loggedInMemberId, @Valid @RequestBody final CrewCreateRequest crewCreateRequest ) { + final CrewDomain newCrew = crewCreateRequest.toDomain(); + return ResponseEntity.status(CREATED) - .body(crewService.createCrew(crewCreateRequest, loggedInMemberId)); + .body(crewService.createCrew(loggedInMemberId, newCrew)); } @GetMapping("/{crewId}") diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 507ee797..d882b0c4 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -80,7 +80,8 @@ private Crew( final Integer maxMemberCount, final Long leaderId, final Long addressDepth1Id, - final Long addressDepth2Id + final Long addressDepth2Id, + final Long chatRoomId ) { this.name = name; this.content = content; @@ -90,6 +91,7 @@ private Crew( this.leaderId = leaderId; this.addressDepth1Id = addressDepth1Id; this.addressDepth2Id = addressDepth2Id; + this.chatRoomId = chatRoomId; updateStatusIfCrewMemberFull(); } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index a8de3eaa..61f6ef71 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -38,16 +38,9 @@ public class CrewMember extends BaseEntity { private Long crewId; @Builder - private CrewMember(final Long memberId, final Long crewId) { + private CrewMember(final RegistrationStatus status, final Long memberId, final Long crewId) { + this.status = status; this.memberId = memberId; this.crewId = crewId; } - - public void confirmRegistration() { - this.status = CONFIRMED; - } - - public void updateStatus(final RegistrationStatus status) { - this.status = status; - } } diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index fa8543bb..e536172c 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -5,8 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -37,22 +36,13 @@ public class CrewCreateRequest { @NotBlank(message = "해당 크루의 활동 장소(구) 정보는 필수입니다.") private String addressDepth2; - public Crew toEntity( - final Long leaderId, - final MainAddress mainAddress, - final String profile, - final String background - ) { - - return Crew.builder() + public CrewDomain toDomain() { + return CrewDomain.builder() .name(name) .content(content) .maxMemberCount(maxMemberCount) - .leaderId(leaderId) - .profileImageUrl(profile) - .backgroundImageUrl(background) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .addressDepth1Name(addressDepth1) + .addressDepth2Name(addressDepth2) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index dcccea3e..9e0be9b8 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -14,4 +14,5 @@ public class CrewReader { private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; + } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 0a2a09db..70ebd0ee 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -1,11 +1,51 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewMemberDomain; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component +@Transactional @RequiredArgsConstructor public class CrewWriter { + private final CrewMapper crewMapper; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; + + public void create(final CrewDomain crew) { + if (crewRepository.existsByName(crew.getName())) { + throw new CrewException(CREW_IS_EXISTED, crew.getName()); + } + + final Crew crewEntity = crewMapper.mapCrewDomainToEntity(crew); + final Crew savedCrewEntity = crewRepository.save(crewEntity); + + crew.updateCrewId(savedCrewEntity.getId()); + } + + public void register(final Member member, final CrewDomain crew) { + final CrewMemberDomain crewMember = CrewMemberDomain.builder() + .memberId(member.getId()) + .crewId(crew.getCrewId()) + .build(); + + crewMember.confirmRegistration(); + + final CrewMember crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); + final CrewMember savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); + + crewMember.updateCrewMemberId(savedCrewMemberEntity.getId()); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index cbfebd07..43b82570 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -19,11 +19,11 @@ import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.dto.request.CrewCreateRequest; +import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.implement.CrewWriter; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; @@ -44,6 +44,7 @@ public class CrewService { private static final Integer CREW_CREATE_MAX_SIZE = 3; private final AddressReader addressReader; + private final CrewWriter crewWriter; private final MemberRepository memberRepository; private final CrewRepository crewRepository; @@ -56,53 +57,24 @@ public class CrewService { * 크루 생성 */ @Transactional - public CrewIdResponse createCrew(final CrewCreateRequest crewCreateRequest, final Long loggedInMemberId) { - validateIsDuplicatedCrewInfo(crewCreateRequest.getName()); - + public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewDomain crew) { final Member leader = memberRepository.getMemberById(loggedInMemberId); - - validateMemberCreatedCrewsCount(leader); - - final MainAddress mainAddress = addressReader.readMainAddressByNames( - crewCreateRequest.getAddressDepth1(), - crewCreateRequest.getAddressDepth2() - ); - - final Integer crewImageRandomNumber = RandomUtil.getRandomNumber( - CREW_IMAGE_START_NUMBER, - CREW_IMAGE_END_NUMBER - ); - - final Crew crew = crewCreateRequest.toEntity( - leader.getId(), - mainAddress, - MessageFormat.format(s3Properties.getCrewProfile(), crewImageRandomNumber), - MessageFormat.format(s3Properties.getCrewBackground(), crewImageRandomNumber) - ); - - final CrewMember crewLeader = CrewMember.builder() - .memberId(leader.getId()) - .crewId(crew.getId()) - .build(); - - crewLeader.confirmRegistration(); + validateCreateCrewMoreThanMaxCount(leader); final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); - crew.makeNewCrewChatRoom(chatRoom); + chatRoom.updateMaxMemberCount(crew.getMaxMemberCount()); - final Long crewId = crewRepository.save(crew).getId(); - crewMemberRepository.save(crewLeader); + crew.updateLeader(leader); + crew.updateChatRoom(chatRoom); + initializeNewCrewImages(crew); - return CrewIdResponse.from(crewId); - } + crewWriter.create(crew); + crewWriter.register(leader, crew); - private void validateIsDuplicatedCrewInfo(final String name) { - if (crewRepository.existsByName(name)) { - throw new CrewException(CREW_IS_EXISTED, name); - } + return CrewIdResponse.from(crew.getCrewId()); } - private void validateMemberCreatedCrewsCount(final Member leader) { + private void validateCreateCrewMoreThanMaxCount(final Member leader) { final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { @@ -110,6 +82,13 @@ private void validateMemberCreatedCrewsCount(final Member leader) { } } + private void initializeNewCrewImages(final CrewDomain crew) { + final Integer randomImageNumber = RandomUtil.getRandomNumber(CREW_IMAGE_START_NUMBER, CREW_IMAGE_END_NUMBER); + + crew.updateProfileImageUrl(MessageFormat.format(s3Properties.getCrewProfile(), randomImageNumber)); + crew.updateBackgroundImageUrl(MessageFormat.format(s3Properties.getCrewBackground(), randomImageNumber)); + } + /** * 크루 상세 조회 */ From d6ccda115a17e67f8c68418df5b7a0483cfac5ce Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 15 Feb 2024 02:24:06 +0900 Subject: [PATCH 035/117] =?UTF-8?q?refactor:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/crew/domain/CrewDomain.java | 60 +++++++++++++++++++ .../back/crew/domain/CrewMemberDomain.java | 33 ++++++++++ .../back/crew/implement/CrewMapper.java | 45 ++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewDomain.java create mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java create mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewMapper.java diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java new file mode 100644 index 00000000..151978fc --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java @@ -0,0 +1,60 @@ +package kr.pickple.back.crew.domain; + +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.member.domain.Member; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +//TODO: CrewDomain -> Crew, CrewMemberDomain -> CrewMember 변경 예정 (2024.02.15 김영주) +public class CrewDomain { + + private Long crewId; + private String name; + private String content; + private Integer maxMemberCount; + private Member leader; + private String addressDepth1Name; + private String addressDepth2Name; + private String profileImageUrl; + private String backgroundImageUrl; + private ChatRoom chatRoom; + + @Builder + private CrewDomain( + final String name, + final String content, + final Integer maxMemberCount, + final String addressDepth1Name, + final String addressDepth2Name + ) { + this.name = name; + this.content = content; + this.maxMemberCount = maxMemberCount; + this.addressDepth1Name = addressDepth1Name; + this.addressDepth2Name = addressDepth2Name; + } + + public void updateCrewId(final Long crewId) { + this.crewId = crewId; + } + + public void updateLeader(final Member leader) { + this.leader = leader; + } + + public void updateProfileImageUrl(final String profileImageUrl) { + this.profileImageUrl = profileImageUrl; + } + + public void updateBackgroundImageUrl(final String backgroundImageUrl) { + this.backgroundImageUrl = backgroundImageUrl; + } + + public void updateChatRoom(final ChatRoom chatRoom) { + this.chatRoom = chatRoom; + } +} diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java new file mode 100644 index 00000000..8998494f --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java @@ -0,0 +1,33 @@ +package kr.pickple.back.crew.domain; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import kr.pickple.back.common.domain.RegistrationStatus; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CrewMemberDomain { + + private Long crewMemberId; + private RegistrationStatus status = WAITING; + private Long memberId; + private Long crewId; + + @Builder + private CrewMemberDomain(final Long memberId, final Long crewId) { + this.memberId = memberId; + this.crewId = crewId; + } + + public void updateCrewMemberId(final Long crewMemberId) { + this.crewMemberId = crewMemberId; + } + + public void confirmRegistration() { + this.status = CONFIRMED; + } +} diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java new file mode 100644 index 00000000..163ac61a --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -0,0 +1,45 @@ +package kr.pickple.back.crew.implement; + +import org.springframework.stereotype.Component; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewMemberDomain; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class CrewMapper { + + private final AddressReader addressReader; + + public Crew mapCrewDomainToEntity(final CrewDomain crew) { + final MainAddress mainAddress = addressReader.readMainAddressByNames( + crew.getAddressDepth1Name(), + crew.getAddressDepth2Name() + ); + + return Crew.builder() + .name(crew.getName()) + .content(crew.getContent()) + .maxMemberCount(crew.getMaxMemberCount()) + .leaderId(crew.getLeader().getId()) + .profileImageUrl(crew.getProfileImageUrl()) + .backgroundImageUrl(crew.getBackgroundImageUrl()) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .chatRoomId(crew.getChatRoom().getId()) + .build(); + } + + public CrewMember mapCrewMemberDomainToEntity(final CrewMemberDomain crewMember) { + return CrewMember.builder() + .status(crewMember.getStatus()) + .memberId(crewMember.getMemberId()) + .crewId(crewMember.getCrewId()) + .build(); + } +} From 3eb7651fca3b211fb412cf8434ab6cdfeb6fe0cc Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 15 Feb 2024 20:41:19 +0900 Subject: [PATCH 036/117] =?UTF-8?q?refactor:=20CrewReader=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=98=EC=97=AC=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 3 +- .../kr/pickple/back/crew/domain/Crew.java | 43 ------------------ .../pickple/back/crew/domain/CrewDomain.java | 44 ++++++++++++------- .../dto/response/CrewProfileResponse.java | 17 +++---- .../back/crew/implement/CrewMapper.java | 27 ++++++++++++ .../back/crew/implement/CrewReader.java | 17 +++++++ .../back/crew/implement/CrewWriter.java | 2 + .../back/crew/service/CrewService.java | 18 ++++---- 8 files changed, 90 insertions(+), 81 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index fd9177d5..6616c041 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -42,9 +42,10 @@ public ResponseEntity createCrew( @Valid @RequestBody final CrewCreateRequest crewCreateRequest ) { final CrewDomain newCrew = crewCreateRequest.toDomain(); + final Long crewId = crewService.createCrew(loggedInMemberId, newCrew); return ResponseEntity.status(CREATED) - .body(crewService.createCrew(loggedInMemberId, newCrew)); + .body(CrewIdResponse.from(crewId)); } @GetMapping("/{crewId}") diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index d882b0c4..232956e6 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -1,7 +1,6 @@ package kr.pickple.back.crew.domain; import static kr.pickple.back.crew.domain.CrewStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -12,7 +11,6 @@ import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.util.CrewStatusConverter; import lombok.AccessLevel; import lombok.Builder; @@ -92,47 +90,6 @@ private Crew( this.addressDepth1Id = addressDepth1Id; this.addressDepth2Id = addressDepth2Id; this.chatRoomId = chatRoomId; - - updateStatusIfCrewMemberFull(); - } - - public void increaseMemberCount() { - validateCrewIsClosedOrFull(); - - this.memberCount++; - - updateStatusIfCrewMemberFull(); - } - - private void updateStatusIfCrewMemberFull() { - if (isFullCrew()) { - this.status = CLOSED; - } - } - - private void validateCrewIsClosedOrFull() { - validateCrewClosed(); - validateCrewFull(); - } - - private void validateCrewClosed() { - if (isClosedCrew()) { - throw new CrewException(CREW_STATUS_IS_CLOSED, status); - } - } - - private Boolean isClosedCrew() { - return status == CLOSED; - } - - private void validateCrewFull() { - if (isFullCrew()) { - throw new CrewException(CREW_CAPACITY_LIMIT_REACHED, memberCount); - } - } - - private Boolean isFullCrew() { - return memberCount.equals(maxMemberCount); } public Boolean isLeader(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java index 151978fc..8dd53cb4 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java @@ -1,43 +1,39 @@ package kr.pickple.back.crew.domain; +import static kr.pickple.back.crew.domain.CrewStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@Builder @NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) //TODO: CrewDomain -> Crew, CrewMemberDomain -> CrewMember 변경 예정 (2024.02.15 김영주) public class CrewDomain { private Long crewId; private String name; private String content; - private Integer maxMemberCount; + private Integer memberCount = 0; + private Integer maxMemberCount = 1; + private CrewStatus status = OPEN; private Member leader; private String addressDepth1Name; private String addressDepth2Name; private String profileImageUrl; private String backgroundImageUrl; + private Integer likeCount = 0; + private Integer competitionPoint = 0; private ChatRoom chatRoom; - @Builder - private CrewDomain( - final String name, - final String content, - final Integer maxMemberCount, - final String addressDepth1Name, - final String addressDepth2Name - ) { - this.name = name; - this.content = content; - this.maxMemberCount = maxMemberCount; - this.addressDepth1Name = addressDepth1Name; - this.addressDepth2Name = addressDepth2Name; - } - public void updateCrewId(final Long crewId) { this.crewId = crewId; } @@ -57,4 +53,20 @@ public void updateBackgroundImageUrl(final String backgroundImageUrl) { public void updateChatRoom(final ChatRoom chatRoom) { this.chatRoom = chatRoom; } + + public void increaseMemberCount() { + if (status == CLOSED) { + throw new CrewException(CREW_STATUS_IS_CLOSED, status); + } + + if (memberCount.equals(maxMemberCount)) { + throw new CrewException(CREW_CAPACITY_LIMIT_REACHED, memberCount); + } + + memberCount += 1; + + if (memberCount.equals(maxMemberCount)) { + this.status = CLOSED; + } + } } diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index 52d82b5c..aed31ba7 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -2,8 +2,7 @@ import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.Builder; @@ -28,13 +27,9 @@ public class CrewProfileResponse { private String addressDepth2; private List members; - public static CrewProfileResponse of( - final Crew crew, - final List memberResponses, - final MainAddress mainAddress - ) { + public static CrewProfileResponse of(final CrewDomain crew, final List memberResponses) { return CrewProfileResponse.builder() - .id(crew.getId()) + .id(crew.getCrewId()) .name(crew.getName()) .content(crew.getContent()) .memberCount(crew.getMemberCount()) @@ -44,9 +39,9 @@ public static CrewProfileResponse of( .status(crew.getStatus()) .likeCount(crew.getLikeCount()) .competitionPoint(crew.getCompetitionPoint()) - .leader(getLeaderResponse(memberResponses, crew.getLeaderId())) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) + .leader(getLeaderResponse(memberResponses, crew.getLeader().getId())) + .addressDepth1(crew.getAddressDepth1Name()) + .addressDepth2(crew.getAddressDepth2Name()) .members(memberResponses) .build(); } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 163ac61a..00f43403 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -4,10 +4,12 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewMemberDomain; +import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Component @@ -15,6 +17,8 @@ public class CrewMapper { private final AddressReader addressReader; + private final MemberRepository memberRepository; + private final ChatRoomRepository chatRoomRepository; public Crew mapCrewDomainToEntity(final CrewDomain crew) { final MainAddress mainAddress = addressReader.readMainAddressByNames( @@ -35,6 +39,29 @@ public Crew mapCrewDomainToEntity(final CrewDomain crew) { .build(); } + public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { + final MainAddress mainAddress = addressReader.readMainAddressById( + crewEntity.getAddressDepth1Id(), + crewEntity.getAddressDepth2Id() + ); + + return CrewDomain.builder() + .crewId(crewEntity.getId()) + .name(crewEntity.getName()) + .content(crewEntity.getContent()) + .memberCount(crewEntity.getMemberCount()) + .maxMemberCount(crewEntity.getMaxMemberCount()) + .leader(memberRepository.getMemberById(crewEntity.getLeaderId())) + .addressDepth1Name(mainAddress.getAddressDepth1().getName()) + .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .profileImageUrl(crewEntity.getProfileImageUrl()) + .backgroundImageUrl(crewEntity.getBackgroundImageUrl()) + .likeCount(crewEntity.getLikeCount()) + .competitionPoint(crewEntity.getCompetitionPoint()) + .chatRoom(chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId())) + .build(); + } + public CrewMember mapCrewMemberDomainToEntity(final CrewMemberDomain crewMember) { return CrewMember.builder() .status(crewMember.getStatus()) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 9e0be9b8..44b03e84 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -1,10 +1,16 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -12,7 +18,18 @@ @Transactional(readOnly = true) public class CrewReader { + private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; + public Integer countByLeader(final Member leader) { + return crewRepository.countByLeaderId(leader.getId()); + } + + public CrewDomain read(final Long crewId) { + final Crew crewEntity = crewRepository.findById(crewId) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + + return crewMapper.mapCrewEntityToDomain(crewEntity); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 70ebd0ee..c5bab874 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -42,6 +42,8 @@ public void register(final Member member, final CrewDomain crew) { .build(); crewMember.confirmRegistration(); + crew.increaseMemberCount(); + //TODO : crew 인원 + 1 쿼리 추가 예정 final CrewMember crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); final CrewMember savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 43b82570..3bf09d51 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -20,9 +20,9 @@ import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; -import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; @@ -44,6 +44,7 @@ public class CrewService { private static final Integer CREW_CREATE_MAX_SIZE = 3; private final AddressReader addressReader; + private final CrewReader crewReader; private final CrewWriter crewWriter; private final MemberRepository memberRepository; @@ -57,7 +58,7 @@ public class CrewService { * 크루 생성 */ @Transactional - public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewDomain crew) { + public Long createCrew(final Long loggedInMemberId, final CrewDomain crew) { final Member leader = memberRepository.getMemberById(loggedInMemberId); validateCreateCrewMoreThanMaxCount(leader); @@ -71,11 +72,11 @@ public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewDomain c crewWriter.create(crew); crewWriter.register(leader, crew); - return CrewIdResponse.from(crew.getCrewId()); + return crew.getCrewId(); } private void validateCreateCrewMoreThanMaxCount(final Member leader) { - final Integer createdCrewsCount = crewRepository.countByLeaderId(leader.getId()); + final Integer createdCrewsCount = crewReader.countByLeader(leader); if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); @@ -93,13 +94,10 @@ private void initializeNewCrewImages(final CrewDomain crew) { * 크루 상세 조회 */ public CrewProfileResponse findCrewById(final Long crewId) { - final Crew crew = crewRepository.getCrewById(crewId); - final MainAddress mainAddress = addressReader.readMainAddressById( - crew.getAddressDepth1Id(), - crew.getAddressDepth2Id() - ); + final CrewDomain crew = crewReader.read(crewId); - return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId), mainAddress); + // TODO: CrewProfileResponse 변환작업 컨트롤러로 이관 + return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); } /** From 90f2f54ca1875f0bc0640989da269d57893bcefa Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 23 Feb 2024 19:01:41 +0900 Subject: [PATCH 037/117] =?UTF-8?q?fix:=20=ED=81=AC=EB=A3=A8=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EB=93=B1=EB=A1=9D=20=EC=8B=9C,=20=ED=81=AC?= =?UTF-8?q?=EB=A3=A8=EC=9D=98=20=EB=A9=A4=EB=B2=84=EC=88=98=EC=99=80=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EB=A5=BC=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/crew/domain/CrewDomain.java | 1 - .../java/kr/pickple/back/crew/implement/CrewMapper.java | 6 +++--- .../java/kr/pickple/back/crew/implement/CrewWriter.java | 7 +++++-- .../kr/pickple/back/crew/repository/CrewRepository.java | 5 +++++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java index 8dd53cb4..6af5bdcf 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java @@ -16,7 +16,6 @@ @Builder @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) -//TODO: CrewDomain -> Crew, CrewMemberDomain -> CrewMember 변경 예정 (2024.02.15 김영주) public class CrewDomain { private Long crewId; diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 00f43403..3e194445 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -9,7 +9,7 @@ import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewMemberDomain; -import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @Component @@ -17,7 +17,7 @@ public class CrewMapper { private final AddressReader addressReader; - private final MemberRepository memberRepository; + private final MemberReader memberReader; private final ChatRoomRepository chatRoomRepository; public Crew mapCrewDomainToEntity(final CrewDomain crew) { @@ -51,7 +51,7 @@ public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { .content(crewEntity.getContent()) .memberCount(crewEntity.getMemberCount()) .maxMemberCount(crewEntity.getMaxMemberCount()) - .leader(memberRepository.getMemberById(crewEntity.getLeaderId())) + .leader(memberReader.readByMemberId(crewEntity.getLeaderId())) .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .profileImageUrl(crewEntity.getProfileImageUrl()) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index c5bab874..ba53b030 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewMember; @@ -20,6 +21,7 @@ @RequiredArgsConstructor public class CrewWriter { + private final AddressReader addressReader; private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -42,12 +44,13 @@ public void register(final Member member, final CrewDomain crew) { .build(); crewMember.confirmRegistration(); - crew.increaseMemberCount(); - //TODO : crew 인원 + 1 쿼리 추가 예정 final CrewMember crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); final CrewMember savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); crewMember.updateCrewMemberId(savedCrewMemberEntity.getId()); + + crew.increaseMemberCount(); + crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 72a592e9..2f6b280a 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -8,8 +8,10 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.crew.exception.CrewException; public interface CrewRepository extends JpaRepository { @@ -28,6 +30,9 @@ Page findByAddressDepth1IdAndAddressDepth2Id( Integer countByLeaderId(final Long leaderId); + @Query("update Crew c set c.memberCount = :memberCount, c.status =: status where c.id = :crewId") + void updateMemberCountAndStatus(final Long crewId, final Integer memberCount, final CrewStatus status); + default Crew getCrewById(final Long crewId) { return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); } From 9f7635860826d2007bd3bd1009532f33b16e1210 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 23 Feb 2024 23:12:15 +0900 Subject: [PATCH 038/117] =?UTF-8?q?refactor:=20NewCrew=EC=99=80=20CrewDoma?= =?UTF-8?q?in=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 4 +- .../pickple/back/crew/domain/CrewDomain.java | 42 +++++++-------- .../kr/pickple/back/crew/domain/NewCrew.java | 51 +++++++++++++++++++ .../back/crew/implement/CrewMapper.java | 34 +++++++++---- .../back/crew/implement/CrewReader.java | 15 ++++-- .../back/crew/implement/CrewWriter.java | 25 ++++----- .../back/crew/service/CrewService.java | 44 ++++++++-------- .../back/member/domain/MemberProfile.java | 6 +-- .../back/member/service/MemberService.java | 37 +++----------- 9 files changed, 148 insertions(+), 110 deletions(-) create mode 100644 src/main/java/kr/pickple/back/crew/domain/NewCrew.java diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 6616c041..30d3bb03 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -41,11 +41,11 @@ public ResponseEntity createCrew( @Login final Long loggedInMemberId, @Valid @RequestBody final CrewCreateRequest crewCreateRequest ) { - final CrewDomain newCrew = crewCreateRequest.toDomain(); + final NewCrew newCrew = CrewRequestMapper.mapToNewCrewDomain(crewCreateRequest); final Long crewId = crewService.createCrew(loggedInMemberId, newCrew); return ResponseEntity.status(CREATED) - .body(CrewIdResponse.from(crewId)); + .body(crewIdResponse); } @GetMapping("/{crewId}") diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java index 6af5bdcf..5ab1c6fc 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java @@ -3,9 +3,12 @@ import static kr.pickple.back.crew.domain.CrewStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import java.util.List; + import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -21,37 +24,18 @@ public class CrewDomain { private Long crewId; private String name; private String content; - private Integer memberCount = 0; - private Integer maxMemberCount = 1; + private Integer memberCount; + private Integer maxMemberCount; private CrewStatus status = OPEN; - private Member leader; + private MemberDomain leader; private String addressDepth1Name; private String addressDepth2Name; private String profileImageUrl; private String backgroundImageUrl; - private Integer likeCount = 0; - private Integer competitionPoint = 0; + private Integer likeCount; + private Integer competitionPoint; private ChatRoom chatRoom; - - public void updateCrewId(final Long crewId) { - this.crewId = crewId; - } - - public void updateLeader(final Member leader) { - this.leader = leader; - } - - public void updateProfileImageUrl(final String profileImageUrl) { - this.profileImageUrl = profileImageUrl; - } - - public void updateBackgroundImageUrl(final String backgroundImageUrl) { - this.backgroundImageUrl = backgroundImageUrl; - } - - public void updateChatRoom(final ChatRoom chatRoom) { - this.chatRoom = chatRoom; - } + private List members; public void increaseMemberCount() { if (status == CLOSED) { @@ -68,4 +52,12 @@ public void increaseMemberCount() { this.status = CLOSED; } } + + public void addMember(final MemberDomain member) { + if (members.contains(member)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, member.getMemberId()); + } + + members.add(member); + } } diff --git a/src/main/java/kr/pickple/back/crew/domain/NewCrew.java b/src/main/java/kr/pickple/back/crew/domain/NewCrew.java new file mode 100644 index 00000000..97435cc3 --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/domain/NewCrew.java @@ -0,0 +1,51 @@ +package kr.pickple.back.crew.domain; + +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.member.domain.MemberDomain; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class NewCrew { + + private String name; + private String content; + private Integer maxMemberCount; + private String addressDepth1Name; + private String addressDepth2Name; + private String profileImageUrl; + private String backgroundImageUrl; + private MemberDomain leader; + private ChatRoom chatRoom; + + @Builder + private NewCrew( + final String name, + final String content, + final Integer maxMemberCount, + final String addressDepth1Name, + final String addressDepth2Name + ) { + this.name = name; + this.content = content; + this.maxMemberCount = maxMemberCount; + this.addressDepth1Name = addressDepth1Name; + this.addressDepth2Name = addressDepth2Name; + } + + public void assignImageUrls(final String profileImageUrl, final String backgroundImageUrl) { + this.profileImageUrl = profileImageUrl; + this.backgroundImageUrl = backgroundImageUrl; + } + + public void assignLeader(final MemberDomain leader) { + this.leader = leader; + } + + public void assignChatRoom(final ChatRoom chatRoom) { + this.chatRoom = chatRoom; + } +} diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 3e194445..b3685e7d 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -1,5 +1,9 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import java.util.List; + import org.springframework.stereotype.Component; import kr.pickple.back.address.dto.response.MainAddress; @@ -9,6 +13,9 @@ import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewMemberDomain; +import kr.pickple.back.crew.domain.NewCrew; +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -18,24 +25,25 @@ public class CrewMapper { private final AddressReader addressReader; private final MemberReader memberReader; + private final CrewMemberRepository crewMemberRepository; private final ChatRoomRepository chatRoomRepository; - public Crew mapCrewDomainToEntity(final CrewDomain crew) { + public Crew mapNewCrewDomainToEntity(final NewCrew newCrew) { final MainAddress mainAddress = addressReader.readMainAddressByNames( - crew.getAddressDepth1Name(), - crew.getAddressDepth2Name() + newCrew.getAddressDepth1Name(), + newCrew.getAddressDepth2Name() ); return Crew.builder() - .name(crew.getName()) - .content(crew.getContent()) - .maxMemberCount(crew.getMaxMemberCount()) - .leaderId(crew.getLeader().getId()) - .profileImageUrl(crew.getProfileImageUrl()) - .backgroundImageUrl(crew.getBackgroundImageUrl()) + .name(newCrew.getName()) + .content(newCrew.getContent()) + .maxMemberCount(newCrew.getMaxMemberCount()) + .leaderId(newCrew.getLeader().getMemberId()) + .profileImageUrl(newCrew.getProfileImageUrl()) + .backgroundImageUrl(newCrew.getBackgroundImageUrl()) .addressDepth1Id(mainAddress.getAddressDepth1().getId()) .addressDepth2Id(mainAddress.getAddressDepth2().getId()) - .chatRoomId(crew.getChatRoom().getId()) + .chatRoomId(newCrew.getChatRoom().getId()) .build(); } @@ -45,6 +53,11 @@ public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { crewEntity.getAddressDepth2Id() ); + final List members = crewMemberRepository.findAllByCrewIdAndStatus(crewEntity.getId(), CONFIRMED) + .stream() + .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) + .toList(); + return CrewDomain.builder() .crewId(crewEntity.getId()) .name(crewEntity.getName()) @@ -59,6 +72,7 @@ public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { .likeCount(crewEntity.getLikeCount()) .competitionPoint(crewEntity.getCompetitionPoint()) .chatRoom(chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId())) + .members(members) .build(); } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 44b03e84..8e7d3011 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -1,7 +1,10 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import java.util.List; + import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -10,7 +13,6 @@ import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -22,8 +24,8 @@ public class CrewReader { private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; - public Integer countByLeader(final Member leader) { - return crewRepository.countByLeaderId(leader.getId()); + public Integer countByLeaderId(final Long leaderId) { + return crewRepository.countByLeaderId(leaderId); } public CrewDomain read(final Long crewId) { @@ -32,4 +34,11 @@ public CrewDomain read(final Long crewId) { return crewMapper.mapCrewEntityToDomain(crewEntity); } + + public List readAllConfirmedByMemberId(final Long memberId) { + return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) + .stream() + .map(crewMember -> read(crewMember.getCrewId())) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index ba53b030..c6964672 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -8,12 +8,13 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; -import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewMemberDomain; +import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @Component @@ -26,30 +27,26 @@ public class CrewWriter { private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; - public void create(final CrewDomain crew) { - if (crewRepository.existsByName(crew.getName())) { - throw new CrewException(CREW_IS_EXISTED, crew.getName()); + public CrewDomain create(final NewCrew newCrew) { + if (crewRepository.existsByName(newCrew.getName())) { + throw new CrewException(CREW_IS_EXISTED, newCrew.getName()); } - final Crew crewEntity = crewMapper.mapCrewDomainToEntity(crew); - final Crew savedCrewEntity = crewRepository.save(crewEntity); + final Crew crewEntity = crewRepository.save(crewMapper.mapNewCrewDomainToEntity(newCrew)); - crew.updateCrewId(savedCrewEntity.getId()); + return crewMapper.mapCrewEntityToDomain(crewEntity); } - public void register(final Member member, final CrewDomain crew) { + public void register(final MemberDomain member, final CrewDomain crew) { final CrewMemberDomain crewMember = CrewMemberDomain.builder() - .memberId(member.getId()) + .memberId(member.getMemberId()) .crewId(crew.getCrewId()) .build(); crewMember.confirmRegistration(); + crewMemberRepository.save(crewMapper.mapCrewMemberDomainToEntity(crewMember)); - final CrewMember crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); - final CrewMember savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); - - crewMember.updateCrewMemberId(savedCrewMemberEntity.getId()); - + crew.addMember(member); crew.increaseMemberCount(); crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 3bf09d51..c028b311 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -20,6 +20,7 @@ import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; @@ -27,10 +28,11 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -44,10 +46,10 @@ public class CrewService { private static final Integer CREW_CREATE_MAX_SIZE = 3; private final AddressReader addressReader; + private final MemberReader memberReader; private final CrewReader crewReader; private final CrewWriter crewWriter; - private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; private final MemberPositionRepository memberPositionRepository; @@ -58,46 +60,44 @@ public class CrewService { * 크루 생성 */ @Transactional - public Long createCrew(final Long loggedInMemberId, final CrewDomain crew) { - final Member leader = memberRepository.getMemberById(loggedInMemberId); - validateCreateCrewMoreThanMaxCount(leader); + public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { + final MemberDomain leader = memberReader.readByMemberId(loggedInMemberId); + validateCreateCrewMoreThanMaxCount(loggedInMemberId); - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, crew.getName(), CREW); - chatRoom.updateMaxMemberCount(crew.getMaxMemberCount()); + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, newCrew.getName(), CREW); + chatRoom.updateMaxMemberCount(newCrew.getMaxMemberCount()); - crew.updateLeader(leader); - crew.updateChatRoom(chatRoom); - initializeNewCrewImages(crew); + newCrew.assignLeader(leader); + newCrew.assignChatRoom(chatRoom); + assignImageUrls(newCrew); - crewWriter.create(crew); + final CrewDomain crew = crewWriter.create(newCrew); crewWriter.register(leader, crew); return crew.getCrewId(); } - private void validateCreateCrewMoreThanMaxCount(final Member leader) { - final Integer createdCrewsCount = crewReader.countByLeader(leader); + private void validateCreateCrewMoreThanMaxCount(final Long leaderId) { + final Integer createdCrewsCount = crewReader.countByLeaderId(leaderId); if (createdCrewsCount >= CREW_CREATE_MAX_SIZE) { throw new CrewException(CREW_CREATE_MAX_COUNT_EXCEEDED, createdCrewsCount); } } - private void initializeNewCrewImages(final CrewDomain crew) { + private void assignImageUrls(final NewCrew newCrew) { final Integer randomImageNumber = RandomUtil.getRandomNumber(CREW_IMAGE_START_NUMBER, CREW_IMAGE_END_NUMBER); + final String profileImageUrl = MessageFormat.format(s3Properties.getCrewProfile(), randomImageNumber); + final String backgroundImageUrl = MessageFormat.format(s3Properties.getCrewBackground(), randomImageNumber); - crew.updateProfileImageUrl(MessageFormat.format(s3Properties.getCrewProfile(), randomImageNumber)); - crew.updateBackgroundImageUrl(MessageFormat.format(s3Properties.getCrewBackground(), randomImageNumber)); + newCrew.assignImageUrls(profileImageUrl, backgroundImageUrl); } /** * 크루 상세 조회 */ - public CrewProfileResponse findCrewById(final Long crewId) { - final CrewDomain crew = crewReader.read(crewId); - - // TODO: CrewProfileResponse 변환작업 컨트롤러로 이관 - return CrewProfileResponse.of(crew, getConfirmedMemberResponses(crewId)); + public CrewDomain findCrewById(final Long crewId) { + return crewReader.read(crewId); } /** @@ -129,7 +129,7 @@ public List findCrewsByAddress( private List getConfirmedMemberResponses(final Long crewId) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) .stream() - .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) + .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositionsByMember(member), diff --git a/src/main/java/kr/pickple/back/member/domain/MemberProfile.java b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java index 50b66928..9747363b 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberProfile.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -24,9 +24,9 @@ public class MemberProfile { private String addressDepth1Name; private String addressDepth2Name; private List positions; - private List joinedCrews; + private List joinedCrews; - public void updateJoinedCrews(final List joinedCrews) { + public void updateJoinedCrews(final List joinedCrews) { this.joinedCrews = joinedCrews; } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index c8f00dce..bd63d0e9 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -10,7 +10,8 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.auth.implement.TokenManager; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.MemberProfile; @@ -28,6 +29,7 @@ public class MemberService { private final TokenManager tokenManager; private final MemberWriter memberWriter; private final MemberReader memberReader; + private final CrewReader crewReader; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -49,41 +51,14 @@ public NewMember createMember(final NewMember newMember) { public MemberProfile findMemberProfileById(final Long memberId) { final MemberProfile memberProfile = memberReader.readProfileByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), CONFIRMED) + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), + CONFIRMED) .stream() - .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) + .map(crewMember -> crewReader.read(crewMember.getCrewId())) .toList(); memberProfile.updateJoinedCrews(crews); -/* final List crewResponses = crews.stream() - .map(crew -> CrewResponse.of( - crew, - getLeaderResponse(crew), - addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) - ) - ) - .toList(); - */ - return memberProfile; } - - /*private MemberResponse getLeaderResponse(final Crew crew) { - final Long memberId = crew.getLeaderId(); - final Member member = memberReader.readByMemberId(memberId); - - final MainAddress mainAddress = addressReader.readMainAddressById( - member.getAddressDepth1Id(), - member.getAddressDepth2Id() - ); - - return MemberResponse.of(member, getPositionsByMember(member), mainAddress); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionReader.readAll(member.getId()); - - return Position.fromMemberPositions(memberPositions); - }*/ } From ae57a0b0879ee87a83797b2fb22c58c3d0d482c4 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 23 Feb 2024 23:15:20 +0900 Subject: [PATCH 039/117] =?UTF-8?q?refactor:=20Crew=20DTO=EC=99=80=20Domai?= =?UTF-8?q?n=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=81=ED=98=B8=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20Mapper=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 9 ++- .../crew/dto/mapper/CrewRequestMapper.java | 20 ++++++ .../crew/dto/mapper/CrewResponseMapper.java | 62 +++++++++++++++++++ .../dto/response/CrewProfileResponse.java | 30 +-------- .../back/crew/dto/response/CrewResponse.java | 20 ------ 5 files changed, 93 insertions(+), 48 deletions(-) create mode 100644 src/main/java/kr/pickple/back/crew/dto/mapper/CrewRequestMapper.java create mode 100644 src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 30d3bb03..dfb4fe6c 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -20,6 +20,9 @@ import kr.pickple.back.auth.config.resolver.Login; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.NewCrew; +import kr.pickple.back.crew.dto.mapper.CrewRequestMapper; +import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.request.CrewCreateRequest; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.dto.response.CrewIdResponse; @@ -43,6 +46,7 @@ public ResponseEntity createCrew( ) { final NewCrew newCrew = CrewRequestMapper.mapToNewCrewDomain(crewCreateRequest); final Long crewId = crewService.createCrew(loggedInMemberId, newCrew); + final CrewIdResponse crewIdResponse = CrewResponseMapper.mapToCrewIdResponseDto(crewId); return ResponseEntity.status(CREATED) .body(crewIdResponse); @@ -52,8 +56,11 @@ public ResponseEntity createCrew( public ResponseEntity findCrewById( @PathVariable final Long crewId ) { + final CrewDomain crew = crewService.findCrewById(crewId); + final CrewProfileResponse crewProfileResponse = CrewResponseMapper.mapToCrewProfileResponseDto(crew); + return ResponseEntity.status(OK) - .body(crewService.findCrewById(crewId)); + .body(crewProfileResponse); } @PostMapping("/{crewId}/members") diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewRequestMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewRequestMapper.java new file mode 100644 index 00000000..21569daa --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewRequestMapper.java @@ -0,0 +1,20 @@ +package kr.pickple.back.crew.dto.mapper; + +import kr.pickple.back.crew.domain.NewCrew; +import kr.pickple.back.crew.dto.request.CrewCreateRequest; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class CrewRequestMapper { + + public static NewCrew mapToNewCrewDomain(final CrewCreateRequest crewCreateRequest) { + return NewCrew.builder() + .name(crewCreateRequest.getName()) + .content(crewCreateRequest.getContent()) + .maxMemberCount(crewCreateRequest.getMaxMemberCount()) + .addressDepth1Name(crewCreateRequest.getAddressDepth1()) + .addressDepth2Name(crewCreateRequest.getAddressDepth2()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java new file mode 100644 index 00000000..b06eca82 --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -0,0 +1,62 @@ +package kr.pickple.back.crew.dto.mapper; + +import java.util.List; + +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.dto.response.CrewIdResponse; +import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.member.dto.mapper.MemberResponseMapper; +import kr.pickple.back.member.dto.response.MemberResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class CrewResponseMapper { + + public static CrewIdResponse mapToCrewIdResponseDto(final Long crewId) { + return CrewIdResponse.from(crewId); + } + + public static CrewProfileResponse mapToCrewProfileResponseDto(final CrewDomain crew) { + final List memberResponses = crew.getMembers() + .stream() + .map(MemberResponseMapper::mapToMemberResponseDto) + .toList(); + + return CrewProfileResponse.builder() + .id(crew.getCrewId()) + .name(crew.getName()) + .content(crew.getContent()) + .memberCount(crew.getMemberCount()) + .maxMemberCount(crew.getMaxMemberCount()) + .profileImageUrl(crew.getProfileImageUrl()) + .backgroundImageUrl(crew.getBackgroundImageUrl()) + .status(crew.getStatus()) + .likeCount(crew.getLikeCount()) + .competitionPoint(crew.getCompetitionPoint()) + .leader(MemberResponseMapper.mapToMemberResponseDto(crew.getLeader())) + .addressDepth1(crew.getAddressDepth1Name()) + .addressDepth2(crew.getAddressDepth2Name()) + .members(memberResponses) + .build(); + } + + public static CrewResponse mapToCrewResponseDto(final CrewDomain crew) { + return CrewResponse.builder() + .id(crew.getCrewId()) + .name(crew.getName()) + .content(crew.getContent()) + .memberCount(crew.getMemberCount()) + .maxMemberCount(crew.getMaxMemberCount()) + .profileImageUrl(crew.getProfileImageUrl()) + .backgroundImageUrl(crew.getBackgroundImageUrl()) + .status(crew.getStatus()) + .likeCount(crew.getLikeCount()) + .competitionPoint(crew.getCompetitionPoint()) + .leader(MemberResponseMapper.mapToMemberResponseDto(crew.getLeader())) + .addressDepth1(crew.getAddressDepth1Name()) + .addressDepth2(crew.getAddressDepth2Name()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java index aed31ba7..bf446688 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewProfileResponse.java @@ -2,14 +2,16 @@ import java.util.List; -import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @Getter @Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class CrewProfileResponse { private Long id; @@ -26,30 +28,4 @@ public class CrewProfileResponse { private String addressDepth1; private String addressDepth2; private List members; - - public static CrewProfileResponse of(final CrewDomain crew, final List memberResponses) { - return CrewProfileResponse.builder() - .id(crew.getCrewId()) - .name(crew.getName()) - .content(crew.getContent()) - .memberCount(crew.getMemberCount()) - .maxMemberCount(crew.getMaxMemberCount()) - .profileImageUrl(crew.getProfileImageUrl()) - .backgroundImageUrl(crew.getBackgroundImageUrl()) - .status(crew.getStatus()) - .likeCount(crew.getLikeCount()) - .competitionPoint(crew.getCompetitionPoint()) - .leader(getLeaderResponse(memberResponses, crew.getLeader().getId())) - .addressDepth1(crew.getAddressDepth1Name()) - .addressDepth2(crew.getAddressDepth2Name()) - .members(memberResponses) - .build(); - } - - private static MemberResponse getLeaderResponse(final List memberResponses, final Long leaderId) { - return memberResponses.stream() - .filter(memberResponse -> memberResponse.getId().equals(leaderId)) - .findFirst() - .orElseThrow(); - } } diff --git a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java index febbc010..c58603d9 100644 --- a/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewResponse.java @@ -1,7 +1,5 @@ package kr.pickple.back.crew.dto.response; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; @@ -27,22 +25,4 @@ public class CrewResponse { private MemberResponse leader; private String addressDepth1; private String addressDepth2; - - public static CrewResponse of(final Crew crew, final MemberResponse leader, final MainAddress mainAddress) { - return CrewResponse.builder() - .id(crew.getId()) - .name(crew.getName()) - .content(crew.getContent()) - .memberCount(crew.getMemberCount()) - .maxMemberCount(crew.getMaxMemberCount()) - .profileImageUrl(crew.getProfileImageUrl()) - .backgroundImageUrl(crew.getBackgroundImageUrl()) - .status(crew.getStatus()) - .likeCount(crew.getLikeCount()) - .competitionPoint(crew.getCompetitionPoint()) - .leader(leader) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) - .build(); - } } From d080b1629eb4e4cf6142d5ca5d5676191367eaa0 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 23 Feb 2024 23:15:52 +0900 Subject: [PATCH 040/117] =?UTF-8?q?refactor:=20Member=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EA=B3=BC=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/member/domain/MemberDomain.java | 32 +++++++++++++++++++ .../back/member/implement/MemberReader.java | 30 ++++++++++------- .../member/service/MemberCrewService.java | 6 ++-- .../member/service/MemberGameService.java | 6 ++-- 4 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 src/main/java/kr/pickple/back/member/domain/MemberDomain.java diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java new file mode 100644 index 00000000..f2ac3253 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java @@ -0,0 +1,32 @@ +package kr.pickple.back.member.domain; + +import java.util.List; + +import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@EqualsAndHashCode(of = "memberId") +public class MemberDomain { + + private Long memberId; + private String email; + private String nickname; + private String introduction; + private String profileImageUrl; + private Integer mannerScore; + private Integer mannerScoreCount; + private String addressDepth1Name; + private String addressDepth2Name; + private List positions; + private List joinedCrews; + private List joinedGames; +} diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index 71d9881a..f49097b6 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -10,8 +10,8 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.exception.MemberException; @@ -27,33 +27,39 @@ public class MemberReader { private final AddressReader addressReader; + private final MemberMapper memberMapper; private final MemberRepository memberRepository; - private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; public MemberProfile readProfileByMemberId(final Long memberId) { - final Member member = readByMemberId(memberId); - + final Member member = readEntityByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( member.getAddressDepth1Id(), member.getAddressDepth2Id() ); - - final List positions = readAllMemberPosition(memberId) - .stream() - .map(MemberPosition::getPosition) - .toList(); + final List positions = readPositionsByMemberId(memberId); return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions); } - public Member readByMemberId(final Long memberId) { + //TODO: member -> memberDomain 변경 작업 후 제거 예정 (김영주) + public Member readEntityByMemberId(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } - public List readAllMemberPosition(final Long memberId) { - return memberPositionRepository.findAllByMemberId(memberId); + public MemberDomain readByMemberId(final Long memberId) { + final Member memberEntity = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + + return memberMapper.mapToMemberDomain(memberEntity); + } + + public List readPositionsByMemberId(final Long memberId) { + return memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); } public Optional readByOauthId(final Long oauthId) { diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 5c86f6ed..e47d2612 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -44,7 +44,7 @@ public List findAllCrewsByMemberId( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readByMemberId(memberId); + final Member member = memberReader.readEntityByMemberId(memberId); final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) .stream() .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) @@ -59,7 +59,7 @@ public List findAllCrewsByMemberId( public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readByMemberId(memberId); + final Member member = memberReader.readEntityByMemberId(memberId); final List crews = crewRepository.findAllByLeaderId(member.getId()); return convertToCrewProfileResponses(crews, CONFIRMED); @@ -98,7 +98,7 @@ private List convertToCrewProfileResponses( private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() - .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) + .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) .map(member -> MemberResponse.of( member, getPositions(member), diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index 97bb23c7..a34279c5 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -44,7 +44,7 @@ public List findAllMemberGames( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readByMemberId(memberId); + final Member member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus); @@ -57,7 +57,7 @@ public List findAllMemberGames( public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readByMemberId(memberId); + final Member member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); return convertToMemberGameResponses(memberGames, CONFIRMED); @@ -73,7 +73,7 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readByMemberId(memberId); + final Member member = memberReader.readEntityByMemberId(memberId); final Game game = gameRepository.getGameById(gameId); final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) From 41b4a161e7d68f3296679050230e83faccc6e7b0 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 23 Feb 2024 23:16:09 +0900 Subject: [PATCH 041/117] =?UTF-8?q?refactor:=20Member=20DTO=EC=99=80=20Dom?= =?UTF-8?q?ain=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=81=ED=98=B8=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20Mapper=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/mapper/MemberRequestMapper.java | 3 + .../dto/mapper/MemberResponseMapper.java | 20 ++++++- .../dto/response/MemberProfileResponse.java | 23 -------- .../member/dto/response/MemberResponse.java | 17 ++++++ .../back/member/mapper/MemberMapper.java | 55 ++++++++++++++++++- 5 files changed, 93 insertions(+), 25 deletions(-) diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java index 9344bf5c..c6d74669 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberRequestMapper.java @@ -2,7 +2,10 @@ import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.request.MemberCreateRequest; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MemberRequestMapper { public static NewMember mapToNewMemberDomain(final MemberCreateRequest memberCreateRequest) { diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index 6a8863db..4cf5d20a 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -1,10 +1,19 @@ package kr.pickple.back.member.dto.mapper; +import java.util.List; + +import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; +import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; +import kr.pickple.back.member.dto.response.MemberResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MemberResponseMapper { public static AuthenticatedMemberResponse mapToAuthenticatedMemberResponseDto(final NewMember newMember) { @@ -23,6 +32,11 @@ public static AuthenticatedMemberResponse mapToAuthenticatedMemberResponseDto(fi } public static MemberProfileResponse mapToMemberProfileResponseDto(final MemberProfile memberProfile) { + final List joinedCrewResponses = memberProfile.getJoinedCrews() + .stream() + .map(CrewResponseMapper::mapToCrewResponseDto) + .toList(); + return MemberProfileResponse.builder() .id(memberProfile.getMemberId()) .email(memberProfile.getEmail()) @@ -34,7 +48,11 @@ public static MemberProfileResponse mapToMemberProfileResponseDto(final MemberPr .addressDepth1(memberProfile.getAddressDepth1Name()) .addressDepth2(memberProfile.getAddressDepth2Name()) .positions(memberProfile.getPositions()) - .crews(memberProfile.getJoinedCrews()) + .crews(joinedCrewResponses) .build(); } + + public static MemberResponse mapToMemberResponseDto(final MemberDomain member) { + return MemberResponse.of(member); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java index d0d329d3..e859dc2a 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberProfileResponse.java @@ -2,9 +2,7 @@ import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -27,25 +25,4 @@ public class MemberProfileResponse { private String addressDepth2; private List positions; private List crews; - - public static MemberProfileResponse of( - final Member member, - final List crewResponses, - final List positions, - final MainAddress mainAddress - ) { - return MemberProfileResponse.builder() - .id(member.getId()) - .email(member.getEmail()) - .nickname(member.getNickname()) - .introduction(member.getIntroduction()) - .profileImageUrl(member.getProfileImageUrl()) - .mannerScore(member.getMannerScore()) - .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) - .positions(positions) - .crews(crewResponses) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index b4d74527..875a4051 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -4,6 +4,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -26,6 +27,7 @@ public class MemberResponse { private String addressDepth2; private List positions; + //TODO: member -> memberDomain 으로 변환 완료되면 삭제 예정 (김영주) public static MemberResponse of( final Member member, final List positions, @@ -44,4 +46,19 @@ public static MemberResponse of( .positions(positions) .build(); } + + public static MemberResponse of(final MemberDomain member) { + return MemberResponse.builder() + .id(member.getMemberId()) + .email(member.getEmail()) + .nickname(member.getNickname()) + .introduction(member.getIntroduction()) + .profileImageUrl(member.getProfileImageUrl()) + .mannerScore(member.getMannerScore()) + .mannerScoreCount(member.getMannerScoreCount()) + .addressDepth1(member.getAddressDepth1Name()) + .addressDepth2(member.getAddressDepth2Name()) + .positions(member.getPositions()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java index e691028f..1e2ab2a4 100644 --- a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java @@ -1,16 +1,36 @@ package kr.pickple.back.member.mapper; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + import java.util.List; +import org.springframework.stereotype.Component; + import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.crew.implement.CrewReader; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class MemberMapper { -public final class MemberMapper { + private final AddressReader addressReader; + private final CrewReader crewReader; + private final MemberPositionRepository memberPositionRepository; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; public static Member mapToMemberEntity(final NewMember newMember, final MainAddress mainAddress) { return Member.builder() @@ -54,4 +74,37 @@ public static MemberProfile mapToMemberProfileDomain( .positions(positions) .build(); } + + public MemberDomain mapToMemberDomain(final Member memberEntity) { + final Long memberId = memberEntity.getId(); + final MainAddress mainAddress = addressReader.readMainAddressById( + memberEntity.getAddressDepth1Id(), + memberEntity.getAddressDepth2Id() + ); + + final List positions = memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); + + final List joinedGames = gameMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) + .stream() + .map(gameMember -> gameRepository.getGameById(gameMember.getGameId())) + .toList(); + + return MemberDomain.builder() + .memberId(memberId) + .email(memberEntity.getEmail()) + .nickname(memberEntity.getNickname()) + .introduction(memberEntity.getIntroduction()) + .profileImageUrl(memberEntity.getProfileImageUrl()) + .mannerScore(memberEntity.getMannerScore()) + .mannerScoreCount(memberEntity.getMannerScoreCount()) + .addressDepth1Name(mainAddress.getAddressDepth1().getName()) + .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .positions(positions) + .joinedCrews(crewReader.readAllConfirmedByMemberId(memberId)) + .joinedGames(joinedGames) + .build(); + } } From 353aaadbef7c991ed8617eb229524627681560ac Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 24 Feb 2024 00:03:01 +0900 Subject: [PATCH 042/117] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EA=B7=BC=EC=B2=98=20=ED=81=AC=EB=A3=A8=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=B4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 9 ++- .../back/crew/implement/CrewReader.java | 24 +++++++- .../back/crew/service/CrewService.java | 59 ++----------------- .../back/member/mapper/MemberMapper.java | 2 +- 4 files changed, 35 insertions(+), 59 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index dfb4fe6c..47323b8c 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -115,12 +115,17 @@ public ResponseEntity deleteCrewMember( } @GetMapping - public ResponseEntity> findCrewsByAddress( + public ResponseEntity> findNearCrewsByAddress( @RequestParam final String addressDepth1, @RequestParam final String addressDepth2, final Pageable pageable ) { + final List nearCrews = crewService.findNearCrewsByAddress(addressDepth1, addressDepth2, pageable); + final List crewProfileResponses = nearCrews.stream() + .map(CrewResponseMapper::mapToCrewProfileResponseDto) + .toList(); + return ResponseEntity.status(OK) - .body(crewService.findCrewsByAddress(addressDepth1, addressDepth2, pageable)); + .body(crewProfileResponses); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 8e7d3011..d1d1896b 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -5,9 +5,13 @@ import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.exception.CrewException; @@ -20,6 +24,7 @@ @Transactional(readOnly = true) public class CrewReader { + private final AddressReader addressReader; private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -35,10 +40,27 @@ public CrewDomain read(final Long crewId) { return crewMapper.mapCrewEntityToDomain(crewEntity); } - public List readAllConfirmedByMemberId(final Long memberId) { + public List readJoinedCrewsByMemberId(final Long memberId) { return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) .stream() .map(crewMember -> read(crewMember.getCrewId())) .toList(); } + + public List readNearCrewsByAddress( + final String addressDepth1Name, + final String addressDepth2Name, + final Pageable pageable + ) { + final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); + final Page crewEntities = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( + mainAddress.getAddressDepth1().getId(), + mainAddress.getAddressDepth2().getId(), + pageable + ); + + return crewEntities.stream() + .map(crewMapper::mapCrewEntityToDomain) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index c028b311..0768e8b1 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -1,39 +1,26 @@ package kr.pickple.back.crew.service; import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import java.text.MessageFormat; import java.util.List; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; -import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.domain.NewCrew; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -45,14 +32,10 @@ public class CrewService { private static final Integer CREW_IMAGE_END_NUMBER = 20; private static final Integer CREW_CREATE_MAX_SIZE = 3; - private final AddressReader addressReader; private final MemberReader memberReader; private final CrewReader crewReader; private final CrewWriter crewWriter; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; - private final MemberPositionRepository memberPositionRepository; private final ChatRoomService chatRoomService; private final S3Properties s3Properties; @@ -103,45 +86,11 @@ public CrewDomain findCrewById(final Long crewId) { /** * 사용자 근처 크루 목록 조회 */ - public List findCrewsByAddress( - final String addressDepth1, - final String addressDepth2, + public List findNearCrewsByAddress( + final String addressDepth1Name, + final String addressDepth2Name, final Pageable pageable ) { - final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); - - final Page crews = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( - mainAddress.getAddressDepth1().getId(), - mainAddress.getAddressDepth2().getId(), - pageable - ); - - return crews.stream() - .map(crew -> CrewProfileResponse.of( - crew, - getConfirmedMemberResponses(crew.getId()), - addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) - ) - ) - .toList(); - } - - private List getConfirmedMemberResponses(final Long crewId) { - return crewMemberRepository.findAllByCrewIdAndStatus(crewId, CONFIRMED) - .stream() - .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositionsByMember(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) - ) - ) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); - - return Position.fromMemberPositions(memberPositions); + return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable); } } diff --git a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java index 1e2ab2a4..55ada98d 100644 --- a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java @@ -103,7 +103,7 @@ public MemberDomain mapToMemberDomain(final Member memberEntity) { .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .positions(positions) - .joinedCrews(crewReader.readAllConfirmedByMemberId(memberId)) + .joinedCrews(crewReader.readJoinedCrewsByMemberId(memberId)) .joinedGames(joinedGames) .build(); } From 1ff8754e8245ed9fd3e187f987137ee286cff753 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 24 Feb 2024 00:11:04 +0900 Subject: [PATCH 043/117] =?UTF-8?q?refactor:=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20repository=EB=82=B4?= =?UTF-8?q?=EC=9D=98=20entity=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alarm/domain/CrewAlarm.java | 6 +- .../alarm/dto/response/CrewAlarmResponse.java | 4 +- .../back/alarm/service/CrewAlarmService.java | 14 +-- .../dto/response/ChatRoomDetailResponse.java | 4 +- .../chat/service/ChatRoomFindService.java | 4 +- .../back/chat/service/ChatValidator.java | 6 +- .../back/crew/controller/CrewController.java | 6 +- .../kr/pickple/back/crew/domain/Crew.java | 115 ++++++------------ .../pickple/back/crew/domain/CrewDomain.java | 63 ---------- .../pickple/back/crew/domain/CrewMember.java | 37 ++---- .../back/crew/domain/CrewMemberDomain.java | 33 ----- .../crew/dto/mapper/CrewResponseMapper.java | 6 +- .../crew/dto/request/CrewCreateRequest.java | 6 +- .../back/crew/implement/CrewMapper.java | 16 +-- .../back/crew/implement/CrewMemberReader.java | 13 -- .../back/crew/implement/CrewReader.java | 12 +- .../back/crew/implement/CrewWriter.java | 13 +- .../crew/repository/CrewMemberRepository.java | 12 +- .../back/crew/repository/CrewRepository.java | 14 +-- .../crew/repository/entity/CrewEntity.java | 106 ++++++++++++++++ .../repository/entity/CrewMemberEntity.java | 48 ++++++++ .../back/crew/service/CrewMemberService.java | 32 ++--- .../back/crew/service/CrewService.java | 8 +- .../back/member/domain/MemberDomain.java | 4 +- .../back/member/domain/MemberProfile.java | 6 +- .../member/service/MemberCrewService.java | 14 +-- .../back/member/service/MemberService.java | 4 +- ...ava => CrewEntityAlarmControllerTest.java} | 6 +- ....java => CrewEntityAlarmDocumentTest.java} | 6 +- ...est.java => CrewEntityControllerTest.java} | 16 +-- ...tTest.java => CrewEntityDocumentTest.java} | 17 ++- .../fixture/domain/CrewAlarmFixtures.java | 4 +- .../back/fixture/domain/CrewFixtures.java | 18 +-- .../pickple/back/fixture/setup/CrewSetup.java | 20 +-- .../controller/MemberControllerTest.java | 8 +- ....java => MemberCrewServiceTestEntity.java} | 2 +- 36 files changed, 346 insertions(+), 357 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewDomain.java delete mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java delete mode 100644 src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java create mode 100644 src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java create mode 100644 src/main/java/kr/pickple/back/crew/repository/entity/CrewMemberEntity.java rename src/test/java/kr/pickple/back/alarm/controller/{CrewAlarmControllerTest.java => CrewEntityAlarmControllerTest.java} (91%) rename src/test/java/kr/pickple/back/alarm/docs/{CrewAlarmDocumentTest.java => CrewEntityAlarmDocumentTest.java} (95%) rename src/test/java/kr/pickple/back/crew/controller/{CrewControllerTest.java => CrewEntityControllerTest.java} (96%) rename src/test/java/kr/pickple/back/crew/docs/{CrewDocumentTest.java => CrewEntityDocumentTest.java} (98%) rename src/test/java/kr/pickple/back/member/service/{MemberCrewServiceTest.java => MemberCrewServiceTestEntity.java} (98%) diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index a8a6f71e..08b7d032 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -12,7 +12,7 @@ import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.CrewAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; @@ -38,7 +38,7 @@ public class CrewAlarm extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "crew_id") - private Crew crew; + private CrewEntity crew; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") @@ -47,7 +47,7 @@ public class CrewAlarm extends BaseEntity { @Builder private CrewAlarm( final CrewAlarmType crewAlarmType, - final Crew crew, + final CrewEntity crew, final Member member ) { this.crewAlarmType = crewAlarmType; diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java index f62a1398..41b4e745 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/CrewAlarmResponse.java @@ -6,7 +6,7 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.domain.CrewAlarmType; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -26,7 +26,7 @@ public class CrewAlarmResponse implements AlarmResponse { private final CrewAlarmType crewAlarmMessage; public static CrewAlarmResponse from(final CrewAlarm crewAlarm) { - final Crew crew = crewAlarm.getCrew(); + final CrewEntity crew = crewAlarm.getCrew(); return CrewAlarmResponse.builder() .crewAlarmId(crewAlarm.getId()) diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index c7798546..b102fa1f 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -20,7 +20,7 @@ import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.Member; @@ -43,7 +43,7 @@ public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinR validateIsLeader(crewJoinRequestNotificationEvent); final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); - final Crew crew = getCrewInfo(crewId); + final CrewEntity crew = getCrewInfo(crewId); final Member leader = memberRepository.getMemberById(crew.getLeaderId()); final CrewAlarm crewAlarm = CrewAlarm.builder() @@ -61,7 +61,7 @@ public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinR @Transactional public void createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { final Long crewId = crewMemberJoinedEvent.getCrewId(); - final Crew crew = getCrewInfo(crewId); + final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); @@ -80,7 +80,7 @@ public void createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJ @Transactional public void createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { final Long crewId = crewMemberRejectedEvent.getCrewId(); - final Crew crew = getCrewInfo(crewId); + final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); @@ -96,8 +96,8 @@ public void createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMember sseEmitterService.sendAlarm(member.getId(), response); } - private Crew getCrewInfo(final Long crewId) { - final Crew crew = crewRepository.findById(crewId) + private CrewEntity getCrewInfo(final Long crewId) { + final CrewEntity crew = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); return crew; @@ -112,7 +112,7 @@ private Member getMemberInfo(final Long memberId) { private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEvent) { final Long crewId = crewAlarmEvent.getCrewId(); - final Crew crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + final CrewEntity crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); final Member leader = memberRepository.getMemberById(crew.getLeaderId()); diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java index 7d4f6428..1e537f00 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java @@ -6,7 +6,7 @@ import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.RoomType; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; @@ -70,7 +70,7 @@ public static ChatRoomDetailResponse of( public static ChatRoomDetailResponse of( final ChatRoom chatRoom, - final Crew crew, + final CrewEntity crew, final List chatMemberResponses ) { return ChatRoomDetailResponse.builder() diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index 0f71c15a..dca2efde 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -17,7 +17,7 @@ import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; @@ -85,7 +85,7 @@ private ChatRoomDetailResponse getPersonalChatRoomDetailResponse(final Long memb } private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { - final Crew crew = crewRepository.findByChatRoomId(chatRoom.getId()) + final CrewEntity crew = crewRepository.findByChatRoomId(chatRoom.getId()) .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoom.getId())); return ChatRoomDetailResponse.of(chatRoom, crew, getChatMemberResponses(chatRoom)); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java index a7306b26..0ff6d336 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java @@ -11,7 +11,7 @@ import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.game.domain.Game; @@ -58,13 +58,13 @@ public void validateChatRoomLeavingConditions(final Member member, final ChatRoo } private void validateCrewChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - final Optional optionalCrew = crewRepository.findByChatRoomId(chatRoom.getId()); + final Optional optionalCrew = crewRepository.findByChatRoomId(chatRoom.getId()); if (optionalCrew.isEmpty()) { return; } - final Crew crew = optionalCrew.get(); + final CrewEntity crew = optionalCrew.get(); validateIsMemberConfirmedCrewMember(crew.getId(), member.getId(), chatRoom.getId()); } diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 47323b8c..a036ec8d 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -19,7 +19,7 @@ import jakarta.validation.Valid; import kr.pickple.back.auth.config.resolver.Login; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.dto.mapper.CrewRequestMapper; import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; @@ -56,7 +56,7 @@ public ResponseEntity createCrew( public ResponseEntity findCrewById( @PathVariable final Long crewId ) { - final CrewDomain crew = crewService.findCrewById(crewId); + final Crew crew = crewService.findCrewById(crewId); final CrewProfileResponse crewProfileResponse = CrewResponseMapper.mapToCrewProfileResponseDto(crew); return ResponseEntity.status(OK) @@ -120,7 +120,7 @@ public ResponseEntity> findNearCrewsByAddress( @RequestParam final String addressDepth2, final Pageable pageable ) { - final List nearCrews = crewService.findNearCrewsByAddress(addressDepth1, addressDepth2, pageable); + final List nearCrews = crewService.findNearCrewsByAddress(addressDepth1, addressDepth2, pageable); final List crewProfileResponses = nearCrews.stream() .map(CrewResponseMapper::mapToCrewProfileResponseDto) .toList(); diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 232956e6..5ecdf426 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -1,103 +1,62 @@ package kr.pickple.back.crew.domain; import static kr.pickple.back.crew.domain.CrewStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; + +import java.util.List; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.crew.util.CrewStatusConverter; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Crew extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Crew { - @NotNull - @Column(unique = true, length = 20) + private Long crewId; private String name; - - @Column(length = 1000) private String content; - - @NotNull - private Integer memberCount = 1; - - @NotNull - @Column(length = 300) + private Integer memberCount; + private Integer maxMemberCount; + private CrewStatus status = OPEN; + private MemberDomain leader; + private String addressDepth1Name; + private String addressDepth2Name; private String profileImageUrl; - - @NotNull - @Column(length = 300) private String backgroundImageUrl; + private Integer likeCount; + private Integer competitionPoint; + private ChatRoom chatRoom; + private List members; - @NotNull - @Column(length = 10) - @Convert(converter = CrewStatusConverter.class) - private CrewStatus status = OPEN; - - @NotNull - private Integer likeCount = 0; - - @NotNull - private Integer maxMemberCount = 1; - - @NotNull - private Integer competitionPoint = 0; + public void increaseMemberCount() { + if (status == CLOSED) { + throw new CrewException(CREW_STATUS_IS_CLOSED, status); + } - @NotNull - private Long leaderId; + if (memberCount.equals(maxMemberCount)) { + throw new CrewException(CREW_CAPACITY_LIMIT_REACHED, memberCount); + } - @NotNull - private Long addressDepth1Id; + memberCount += 1; - @NotNull - private Long addressDepth2Id; - - private Long chatRoomId; - - @Builder - private Crew( - final String name, - final String content, - final String profileImageUrl, - final String backgroundImageUrl, - final Integer maxMemberCount, - final Long leaderId, - final Long addressDepth1Id, - final Long addressDepth2Id, - final Long chatRoomId - ) { - this.name = name; - this.content = content; - this.profileImageUrl = profileImageUrl; - this.backgroundImageUrl = backgroundImageUrl; - this.maxMemberCount = maxMemberCount; - this.leaderId = leaderId; - this.addressDepth1Id = addressDepth1Id; - this.addressDepth2Id = addressDepth2Id; - this.chatRoomId = chatRoomId; + if (memberCount.equals(maxMemberCount)) { + this.status = CLOSED; + } } - public Boolean isLeader(final Long memberId) { - return memberId.equals(leaderId); - } + public void addMember(final MemberDomain member) { + if (members.contains(member)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, member.getMemberId()); + } - public void makeNewCrewChatRoom(final ChatRoom chatRoom) { - chatRoom.updateMaxMemberCount(maxMemberCount); - this.chatRoomId = chatRoom.getId(); + members.add(member); } } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java deleted file mode 100644 index 5ab1c6fc..00000000 --- a/src/main/java/kr/pickple/back/crew/domain/CrewDomain.java +++ /dev/null @@ -1,63 +0,0 @@ -package kr.pickple.back.crew.domain; - -import static kr.pickple.back.crew.domain.CrewStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; - -import java.util.List; - -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberDomain; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class CrewDomain { - - private Long crewId; - private String name; - private String content; - private Integer memberCount; - private Integer maxMemberCount; - private CrewStatus status = OPEN; - private MemberDomain leader; - private String addressDepth1Name; - private String addressDepth2Name; - private String profileImageUrl; - private String backgroundImageUrl; - private Integer likeCount; - private Integer competitionPoint; - private ChatRoom chatRoom; - private List members; - - public void increaseMemberCount() { - if (status == CLOSED) { - throw new CrewException(CREW_STATUS_IS_CLOSED, status); - } - - if (memberCount.equals(maxMemberCount)) { - throw new CrewException(CREW_CAPACITY_LIMIT_REACHED, memberCount); - } - - memberCount += 1; - - if (memberCount.equals(maxMemberCount)) { - this.status = CLOSED; - } - } - - public void addMember(final MemberDomain member) { - if (members.contains(member)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, member.getMemberId()); - } - - members.add(member); - } -} diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index 61f6ef71..fbd9e992 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -2,45 +2,32 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CrewMember extends BaseEntity { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CrewMember { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Convert(converter = RegistrationStatusAttributeConverter.class) - @Column(length = 10) + private Long crewMemberId; private RegistrationStatus status = WAITING; - - @NotNull private Long memberId; - - @NotNull private Long crewId; @Builder - private CrewMember(final RegistrationStatus status, final Long memberId, final Long crewId) { - this.status = status; + private CrewMember(final Long memberId, final Long crewId) { this.memberId = memberId; this.crewId = crewId; } + + public void updateCrewMemberId(final Long crewMemberId) { + this.crewMemberId = crewMemberId; + } + + public void confirmRegistration() { + this.status = CONFIRMED; + } } diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java b/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java deleted file mode 100644 index 8998494f..00000000 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMemberDomain.java +++ /dev/null @@ -1,33 +0,0 @@ -package kr.pickple.back.crew.domain; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import kr.pickple.back.common.domain.RegistrationStatus; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class CrewMemberDomain { - - private Long crewMemberId; - private RegistrationStatus status = WAITING; - private Long memberId; - private Long crewId; - - @Builder - private CrewMemberDomain(final Long memberId, final Long crewId) { - this.memberId = memberId; - this.crewId = crewId; - } - - public void updateCrewMemberId(final Long crewMemberId) { - this.crewMemberId = crewMemberId; - } - - public void confirmRegistration() { - this.status = CONFIRMED; - } -} diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java index b06eca82..a3967e48 100644 --- a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; @@ -18,7 +18,7 @@ public static CrewIdResponse mapToCrewIdResponseDto(final Long crewId) { return CrewIdResponse.from(crewId); } - public static CrewProfileResponse mapToCrewProfileResponseDto(final CrewDomain crew) { + public static CrewProfileResponse mapToCrewProfileResponseDto(final Crew crew) { final List memberResponses = crew.getMembers() .stream() .map(MemberResponseMapper::mapToMemberResponseDto) @@ -42,7 +42,7 @@ public static CrewProfileResponse mapToCrewProfileResponseDto(final CrewDomain c .build(); } - public static CrewResponse mapToCrewResponseDto(final CrewDomain crew) { + public static CrewResponse mapToCrewResponseDto(final Crew crew) { return CrewResponse.builder() .id(crew.getCrewId()) .name(crew.getName()) diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index e536172c..11edbd6a 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -36,8 +36,8 @@ public class CrewCreateRequest { @NotBlank(message = "해당 크루의 활동 장소(구) 정보는 필수입니다.") private String addressDepth2; - public CrewDomain toDomain() { - return CrewDomain.builder() + public Crew toDomain() { + return Crew.builder() .name(name) .content(content) .maxMemberCount(maxMemberCount) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index b3685e7d..da9a2a62 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -9,10 +9,10 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.domain.CrewMemberDomain; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.member.domain.MemberDomain; @@ -28,13 +28,13 @@ public class CrewMapper { private final CrewMemberRepository crewMemberRepository; private final ChatRoomRepository chatRoomRepository; - public Crew mapNewCrewDomainToEntity(final NewCrew newCrew) { + public CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew) { final MainAddress mainAddress = addressReader.readMainAddressByNames( newCrew.getAddressDepth1Name(), newCrew.getAddressDepth2Name() ); - return Crew.builder() + return CrewEntity.builder() .name(newCrew.getName()) .content(newCrew.getContent()) .maxMemberCount(newCrew.getMaxMemberCount()) @@ -47,7 +47,7 @@ public Crew mapNewCrewDomainToEntity(final NewCrew newCrew) { .build(); } - public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { + public Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { final MainAddress mainAddress = addressReader.readMainAddressById( crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() @@ -58,7 +58,7 @@ public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) .toList(); - return CrewDomain.builder() + return Crew.builder() .crewId(crewEntity.getId()) .name(crewEntity.getName()) .content(crewEntity.getContent()) @@ -76,8 +76,8 @@ public CrewDomain mapCrewEntityToDomain(final Crew crewEntity) { .build(); } - public CrewMember mapCrewMemberDomainToEntity(final CrewMemberDomain crewMember) { - return CrewMember.builder() + public CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crewMember) { + return CrewMemberEntity.builder() .status(crewMember.getStatus()) .memberId(crewMember.getMemberId()) .crewId(crewMember.getCrewId()) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java deleted file mode 100644 index 0f16dc58..00000000 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMemberReader.java +++ /dev/null @@ -1,13 +0,0 @@ -package kr.pickple.back.crew.implement; - -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class CrewMemberReader { - -} diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index d1d1896b..31a6d589 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -13,10 +13,10 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewDomain; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; import lombok.RequiredArgsConstructor; @Component @@ -33,27 +33,27 @@ public Integer countByLeaderId(final Long leaderId) { return crewRepository.countByLeaderId(leaderId); } - public CrewDomain read(final Long crewId) { - final Crew crewEntity = crewRepository.findById(crewId) + public Crew read(final Long crewId) { + final CrewEntity crewEntity = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); return crewMapper.mapCrewEntityToDomain(crewEntity); } - public List readJoinedCrewsByMemberId(final Long memberId) { + public List readJoinedCrewsByMemberId(final Long memberId) { return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) .stream() .map(crewMember -> read(crewMember.getCrewId())) .toList(); } - public List readNearCrewsByAddress( + public List readNearCrewsByAddress( final String addressDepth1Name, final String addressDepth2Name, final Pageable pageable ) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); - final Page crewEntities = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( + final Page crewEntities = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( mainAddress.getAddressDepth1().getId(), mainAddress.getAddressDepth2().getId(), pageable diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index c6964672..81fb5228 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -6,14 +6,13 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewDomain; -import kr.pickple.back.crew.domain.CrewMemberDomain; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @@ -27,18 +26,18 @@ public class CrewWriter { private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; - public CrewDomain create(final NewCrew newCrew) { + public Crew create(final NewCrew newCrew) { if (crewRepository.existsByName(newCrew.getName())) { throw new CrewException(CREW_IS_EXISTED, newCrew.getName()); } - final Crew crewEntity = crewRepository.save(crewMapper.mapNewCrewDomainToEntity(newCrew)); + final CrewEntity crewEntity = crewRepository.save(crewMapper.mapNewCrewDomainToEntity(newCrew)); return crewMapper.mapCrewEntityToDomain(crewEntity); } - public void register(final MemberDomain member, final CrewDomain crew) { - final CrewMemberDomain crewMember = CrewMemberDomain.builder() + public void register(final MemberDomain member, final Crew crew) { + final CrewMember crewMember = CrewMember.builder() .memberId(member.getMemberId()) .crewId(crew.getCrewId()) .build(); diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 0c8ad0d4..552229bc 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -8,22 +8,22 @@ import org.springframework.data.jpa.repository.JpaRepository; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.exception.CrewException; -public interface CrewMemberRepository extends JpaRepository { +public interface CrewMemberRepository extends JpaRepository { - Optional findByMemberIdAndCrewId(final Long memberId, final Long crewId); + Optional findByMemberIdAndCrewId(final Long memberId, final Long crewId); - List findAllByCrewIdAndStatus(final Long crewId, final RegistrationStatus status); + List findAllByCrewIdAndStatus(final Long crewId, final RegistrationStatus status); - List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus status); + List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus status); Boolean existsByCrewIdAndMemberId(final Long crewId, final Long memberId); Boolean existsByCrewIdAndMemberIdAndStatus(final Long crewId, final Long memberId, final RegistrationStatus status); - default CrewMember getCrewMemberByCrewIdAndMemberId(final Long memberId, final Long crewId) { + default CrewMemberEntity getCrewMemberByCrewIdAndMemberId(final Long memberId, final Long crewId) { return findByMemberIdAndCrewId(memberId, crewId).orElseThrow( () -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 2f6b280a..d241b5e3 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -10,30 +10,30 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.crew.exception.CrewException; -public interface CrewRepository extends JpaRepository { +public interface CrewRepository extends JpaRepository { Boolean existsByName(final String name); - Page findByAddressDepth1IdAndAddressDepth2Id( + Page findByAddressDepth1IdAndAddressDepth2Id( final Long addressDepth1Id, final Long addressDepth2Id, final Pageable pageable ); - Optional findByChatRoomId(final Long chatRoomId); + Optional findByChatRoomId(final Long chatRoomId); - List findAllByLeaderId(final Long leaderId); + List findAllByLeaderId(final Long leaderId); Integer countByLeaderId(final Long leaderId); - @Query("update Crew c set c.memberCount = :memberCount, c.status =: status where c.id = :crewId") + @Query("update CrewEntity c set c.memberCount = :memberCount, c.status =: status where c.id = :crewId") void updateMemberCountAndStatus(final Long crewId, final Integer memberCount, final CrewStatus status); - default Crew getCrewById(final Long crewId) { + default CrewEntity getCrewById(final Long crewId) { return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); } } diff --git a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java new file mode 100644 index 00000000..e7d0c0b6 --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java @@ -0,0 +1,106 @@ +package kr.pickple.back.crew.repository.entity; + +import static kr.pickple.back.crew.domain.CrewStatus.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.crew.domain.CrewStatus; +import kr.pickple.back.crew.util.CrewStatusConverter; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "crew") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CrewEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(unique = true, length = 20) + private String name; + + @Column(length = 1000) + private String content; + + @NotNull + private Integer memberCount = 1; + + @NotNull + @Column(length = 300) + private String profileImageUrl; + + @NotNull + @Column(length = 300) + private String backgroundImageUrl; + + @NotNull + @Column(length = 10) + @Convert(converter = CrewStatusConverter.class) + private CrewStatus status = OPEN; + + @NotNull + private Integer likeCount = 0; + + @NotNull + private Integer maxMemberCount = 1; + + @NotNull + private Integer competitionPoint = 0; + + @NotNull + private Long leaderId; + + @NotNull + private Long addressDepth1Id; + + @NotNull + private Long addressDepth2Id; + + private Long chatRoomId; + + @Builder + private CrewEntity( + final String name, + final String content, + final String profileImageUrl, + final String backgroundImageUrl, + final Integer maxMemberCount, + final Long leaderId, + final Long addressDepth1Id, + final Long addressDepth2Id, + final Long chatRoomId + ) { + this.name = name; + this.content = content; + this.profileImageUrl = profileImageUrl; + this.backgroundImageUrl = backgroundImageUrl; + this.maxMemberCount = maxMemberCount; + this.leaderId = leaderId; + this.addressDepth1Id = addressDepth1Id; + this.addressDepth2Id = addressDepth2Id; + this.chatRoomId = chatRoomId; + } + + public Boolean isLeader(final Long memberId) { + return memberId.equals(leaderId); + } + + public void makeNewCrewChatRoom(final ChatRoom chatRoom) { + chatRoom.updateMaxMemberCount(maxMemberCount); + this.chatRoomId = chatRoom.getId(); + } +} diff --git a/src/main/java/kr/pickple/back/crew/repository/entity/CrewMemberEntity.java b/src/main/java/kr/pickple/back/crew/repository/entity/CrewMemberEntity.java new file mode 100644 index 00000000..92b7ea1c --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/repository/entity/CrewMemberEntity.java @@ -0,0 +1,48 @@ +package kr.pickple.back.crew.repository.entity; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "crew_member") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CrewMemberEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Convert(converter = RegistrationStatusAttributeConverter.class) + @Column(length = 10) + private RegistrationStatus status = WAITING; + + @NotNull + private Long memberId; + + @NotNull + private Long crewId; + + @Builder + private CrewMemberEntity(final RegistrationStatus status, final Long memberId, final Long crewId) { + this.status = status; + this.memberId = memberId; + this.crewId = crewId; + } +} diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index d801f499..db201662 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -18,8 +18,8 @@ import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; @@ -39,18 +39,18 @@ public class CrewMemberService { private final AddressReader addressReader; - private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; private final CrewMemberRepository crewMemberRepository; private final ChatRoomRepository chatRoomRepository; + private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; private static void increaseMemberCount( - final Crew crew, - final CrewMember crewMember, + final CrewEntity crew, + final CrewMemberEntity crewMember, final RegistrationStatus status ) { if (crewMember.getStatus() == WAITING && status == CONFIRMED) { @@ -63,12 +63,12 @@ private static void increaseMemberCount( */ @Transactional public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final Crew crew = crewRepository.getCrewById(crewId); + final CrewEntity crew = crewRepository.getCrewById(crewId); final Member member = memberRepository.getMemberById(loggedInMemberId); validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); - final CrewMember newCrewMember = CrewMember.builder() + final CrewMemberEntity newCrewMember = CrewMemberEntity.builder() .memberId(member.getId()) .crewId(crew.getId()) .build(); @@ -95,7 +95,7 @@ public CrewProfileResponse findAllCrewMembers( final Long crewId, final RegistrationStatus status ) { - final Crew crew = crewRepository.getCrewById(crewId); + final CrewEntity crew = crewRepository.getCrewById(crewId); validateIsLeader(loggedInMemberId, crew); @@ -135,8 +135,8 @@ public void updateCrewMemberRegistrationStatus( final Long memberId, final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest ) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewRepository.getCrewById(crewId); + final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final CrewEntity crew = crewRepository.getCrewById(crewId); validateIsLeader(loggedInMemberId, crew); @@ -153,7 +153,7 @@ public void updateCrewMemberRegistrationStatus( .build()); } - private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { + private void validateIsLeader(final Long loggedInMemberId, final CrewEntity crew) { if (!crew.isLeader(loggedInMemberId)) { throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } @@ -161,7 +161,7 @@ private void validateIsLeader(final Long loggedInMemberId, final Crew crew) { private void enterCrewChatRoom( final RegistrationStatus updateStatus, - final CrewMember crewMember, + final CrewMemberEntity crewMember, final ChatRoom chatRoom ) { final RegistrationStatus nowStatus = crewMember.getStatus(); @@ -177,8 +177,8 @@ private void enterCrewChatRoom( */ @Transactional public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final Crew crew = crewRepository.getCrewById(crewId); + final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); + final CrewEntity crew = crewRepository.getCrewById(crewId); if (crew.isLeader(loggedInMemberId)) { validateIsLeaderSelfDeleted(loggedInMemberId, memberId); @@ -207,7 +207,7 @@ private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { } } - private void cancelCrewMember(final CrewMember crewMember) { + private void cancelCrewMember(final CrewMemberEntity crewMember) { if (crewMember.getStatus() != WAITING) { throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); } @@ -215,7 +215,7 @@ private void cancelCrewMember(final CrewMember crewMember) { deleteCrewMember(crewMember); } - private void deleteCrewMember(final CrewMember crewMember) { + private void deleteCrewMember(final CrewMemberEntity crewMember) { crewMemberRepository.delete(crewMember); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 0768e8b1..e6b0bf20 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -14,7 +14,7 @@ import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; @@ -54,7 +54,7 @@ public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { newCrew.assignChatRoom(chatRoom); assignImageUrls(newCrew); - final CrewDomain crew = crewWriter.create(newCrew); + final Crew crew = crewWriter.create(newCrew); crewWriter.register(leader, crew); return crew.getCrewId(); @@ -79,14 +79,14 @@ private void assignImageUrls(final NewCrew newCrew) { /** * 크루 상세 조회 */ - public CrewDomain findCrewById(final Long crewId) { + public Crew findCrewById(final Long crewId) { return crewReader.read(crewId); } /** * 사용자 근처 크루 목록 조회 */ - public List findNearCrewsByAddress( + public List findNearCrewsByAddress( final String addressDepth1Name, final String addressDepth2Name, final Pageable pageable diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java index f2ac3253..cb32774d 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.game.domain.Game; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -27,6 +27,6 @@ public class MemberDomain { private String addressDepth1Name; private String addressDepth2Name; private List positions; - private List joinedCrews; + private List joinedCrews; private List joinedGames; } diff --git a/src/main/java/kr/pickple/back/member/domain/MemberProfile.java b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java index 9747363b..50b66928 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberProfile.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberProfile.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -24,9 +24,9 @@ public class MemberProfile { private String addressDepth1Name; private String addressDepth2Name; private List positions; - private List joinedCrews; + private List joinedCrews; - public void updateJoinedCrews(final List joinedCrews) { + public void updateJoinedCrews(final List joinedCrews) { this.joinedCrews = joinedCrews; } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index e47d2612..f140ecc8 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -10,8 +10,8 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; @@ -45,7 +45,7 @@ public List findAllCrewsByMemberId( validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberReader.readEntityByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) .stream() .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) .toList(); @@ -60,7 +60,7 @@ public List findCreatedCrewsByMemberId(final Long loggedInM validateSelfMemberAccess(loggedInMemberId, memberId); final Member member = memberReader.readEntityByMemberId(memberId); - final List crews = crewRepository.findAllByLeaderId(member.getId()); + final List crews = crewRepository.findAllByLeaderId(member.getId()); return convertToCrewProfileResponses(crews, CONFIRMED); } @@ -75,13 +75,13 @@ public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( ) { validateSelfMemberAccess(loggedInMemberId, memberId); - final CrewMember crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); + final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); } private List convertToCrewProfileResponses( - final List crews, + final List crews, final RegistrationStatus memberStatus ) { @@ -95,7 +95,7 @@ private List convertToCrewProfileResponses( .toList(); } - private List getMemberResponsesByCrew(final Crew crew, final RegistrationStatus memberStatus) { + private List getMemberResponsesByCrew(final CrewEntity crew, final RegistrationStatus memberStatus) { return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index bd63d0e9..2f4a3643 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -10,7 +10,7 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.auth.implement.TokenManager; -import kr.pickple.back.crew.domain.CrewDomain; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; @@ -51,7 +51,7 @@ public NewMember createMember(final NewMember newMember) { public MemberProfile findMemberProfileById(final Long memberId) { final MemberProfile memberProfile = memberReader.readProfileByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), + final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), CONFIRMED) .stream() .map(crewMember -> crewReader.read(crewMember.getCrewId())) diff --git a/src/test/java/kr/pickple/back/alarm/controller/CrewAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java similarity index 91% rename from src/test/java/kr/pickple/back/alarm/controller/CrewAlarmControllerTest.java rename to src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java index bd6d5f40..693c09e3 100644 --- a/src/test/java/kr/pickple/back/alarm/controller/CrewAlarmControllerTest.java +++ b/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java @@ -4,7 +4,7 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.domain.CrewAlarmFixtures; import kr.pickple.back.fixture.setup.CrewSetup; import kr.pickple.back.member.domain.Member; @@ -21,7 +21,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Transactional -public class CrewAlarmControllerTest extends IntegrationAlarmTest { +public class CrewEntityAlarmControllerTest extends IntegrationAlarmTest { private static final String BASE_URL = "/crew-alarms"; @@ -37,7 +37,7 @@ void updateCrewAlarmStatus_Success() throws Exception { //given final Member member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final Crew crew = crewSetup.saveWithConfirmedMembers(1); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); final CrewAlarmUpdateStatusRequest request = CrewAlarmUpdateStatusRequest.from(true); diff --git a/src/test/java/kr/pickple/back/alarm/docs/CrewAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java similarity index 95% rename from src/test/java/kr/pickple/back/alarm/docs/CrewAlarmDocumentTest.java rename to src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java index 0dde6cb6..f0cac0bb 100644 --- a/src/test/java/kr/pickple/back/alarm/docs/CrewAlarmDocumentTest.java +++ b/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java @@ -5,7 +5,7 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.domain.CrewAlarmFixtures; import kr.pickple.back.fixture.setup.CrewSetup; import kr.pickple.back.member.domain.Member; @@ -28,7 +28,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Transactional -public class CrewAlarmDocumentTest extends IntegrationAlarmTest { +public class CrewEntityAlarmDocumentTest extends IntegrationAlarmTest { private static final String BASE_URL = "/crew-alarms"; @@ -44,7 +44,7 @@ void updateCrewAlarmStatus_ReturnVoid() throws Exception { //given final Member member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final Crew crew = crewSetup.saveWithConfirmedMembers(1); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); final CrewAlarmUpdateStatusRequest request = CrewAlarmUpdateStatusRequest.from(true); diff --git a/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java similarity index 96% rename from src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java rename to src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java index 2591f3ef..a2c38279 100644 --- a/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java +++ b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java @@ -3,7 +3,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.IntegrationCrewTest; import kr.pickple.back.crew.repository.CrewMemberRepository; @@ -26,7 +26,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @Transactional -public class CrewControllerTest extends IntegrationCrewTest { +public class CrewEntityControllerTest extends IntegrationCrewTest { private static final String BASE_URL = "/crews"; @@ -40,7 +40,7 @@ public class CrewControllerTest extends IntegrationCrewTest { @DisplayName("사용자는 해당 크루의 상세 정보를 조회할 수 있다.") void findCrewDetailsById_ReturnCrewResponse() throws Exception { //given - final Crew crew = crewSetup.saveWithConfirmedMembers(2); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) @@ -85,7 +85,7 @@ void applyForCrewMemberShip_Success() throws Exception { final List members = memberSetup.save(2); final Member crewLeader = members.get(0); final Member crewApplyMember = members.get(1); - final Crew crew = crewSetup.save(crewLeader); + final CrewEntity crew = crewSetup.save(crewLeader); final String subject = String.valueOf(crewApplyMember.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -104,7 +104,7 @@ void applyForCrewMemberShip_Success() throws Exception { @DisplayName("크루장은 크루 모집글에 참여 신청한 사용자 정보 목록을 조회할 수 있다.") void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(2); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) @@ -152,7 +152,7 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { @DisplayName("크루장은 다른 사용자의 크루 모집글 참여 신청을 수락할 수 있다.") void updateCrewMemberRegistrationStatus_Success() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(2); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) @@ -181,7 +181,7 @@ void updateCrewMemberRegistrationStatus_Success() throws Exception { @DisplayName("크루장은 다른 사용자의 크루 모집글 참여 신청을 거절할 수 있다.") void deleteCrewMember_CrewLeader_Success() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(2); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) @@ -204,7 +204,7 @@ void deleteCrewMember_CrewLeader_Success() throws Exception { @DisplayName("사용자는 자신 위치 근처의 크루를 조회할 수 있다.") void findCrewsByAddress_Success() throws Exception { //given - final Crew crew = crewSetup.saveWithConfirmedMembers(2); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final Member crewLeader = crew.getLeader(); diff --git a/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java similarity index 98% rename from src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java rename to src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java index 87f2bbd9..9b61f3bc 100644 --- a/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java +++ b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java @@ -27,8 +27,7 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.crew.IntegrationCrewTest; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.fixture.dto.CrewDtoFixtures; @@ -36,7 +35,7 @@ import kr.pickple.back.member.domain.Member; @Transactional -public class CrewDocumentTest extends IntegrationCrewTest { +public class CrewEntityDocumentTest extends IntegrationCrewTest { private static final String BASE_URL = "/crews"; @@ -50,7 +49,7 @@ public class CrewDocumentTest extends IntegrationCrewTest { @DisplayName("크루원 모집글 상세 정보 조회") void findCrewById_ReturnCrewResponse() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(3); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(3); //when final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{crewId}", crew.getId())) @@ -147,7 +146,7 @@ void applyForCrewMemberShip_ReturnVoid() throws Exception { final List members = memberSetup.save(2); final Member crewLeader = members.get(0); final Member crewApplyMember = members.get(1); - final Crew crew = crewSetup.save(crewLeader); + final CrewEntity crew = crewSetup.save(crewLeader); final String subject = String.valueOf(crewApplyMember.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -185,7 +184,7 @@ void applyForCrewMemberShip_ReturnVoid() throws Exception { @DisplayName("크루원 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회") void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception { //given - final Crew crew = crewSetup.saveWithConfirmedMembers(2); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); final Member crewLeader = crew.getLeader(); final String subject = String.valueOf(crewLeader.getId()); @@ -287,7 +286,7 @@ void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception @DisplayName("크루원 모집 참여 신청 수락") void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(2); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) @@ -341,7 +340,7 @@ void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { @DisplayName("크루원 모집 참여 신청 거절/취소") void deleteCrewMember_ReturnVoid() throws Exception { //given - final Crew crew = crewSetup.saveWithWaitingMembers(2); + final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); final Member crewLeader = crew.getLeader(); final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) @@ -384,7 +383,7 @@ void deleteCrewMember_ReturnVoid() throws Exception { @DisplayName("사용자 위치 근처 크루 조회") void findCrewsByAddress_ReturnCrews() throws Exception { //given - final Crew crew = crewSetup.saveWithConfirmedMembers(2); + final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java index 9dcd90a0..852c78a4 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java @@ -1,14 +1,14 @@ package kr.pickple.back.fixture.domain; import kr.pickple.back.alarm.domain.CrewAlarm; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.member.domain.Member; import static kr.pickple.back.alarm.domain.CrewAlarmType.CREW_LEADER_WAITING; public class CrewAlarmFixtures { - public static CrewAlarm crewAlarmBuild(final Member member,final Crew crew) { + public static CrewAlarm crewAlarmBuild(final Member member,final CrewEntity crew) { return CrewAlarm.builder() .crew(crew) .member(member) diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java index 22e6ec46..f8461625 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java @@ -9,18 +9,18 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; public class CrewFixtures { - public static Crew crewBuild( + public static CrewEntity crewBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, final Member leader ) { - return Crew.builder() + return CrewEntity.builder() .name("백둥크루1") .content("안녕하세요 백둥크루1 입니다.") .profileImageUrl("https://amazon.profileimage/1") @@ -32,8 +32,8 @@ public static Crew crewBuild( .build(); } - public static CrewMember crewMemberBuild(final Member member, final Crew crew) { - return CrewMember.builder() + public static CrewMemberEntity crewMemberBuild(final Member member, final CrewEntity crew) { + return CrewMemberEntity.builder() .member(member) .crew(crew) .build(); @@ -46,17 +46,17 @@ public static ChatRoom crewChatRoomBuild() { .build(); } - public static List crewsBuild( + public static List crewsBuild( final Integer count, final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, final Member leader ) { - final List crews = new ArrayList<>(); + final List crews = new ArrayList<>(); IntStream.range(0, count).forEach(i -> { crews.add( - Crew.builder() + CrewEntity.builder() .name(String.format("백둥크루%d", i)) .content(String.format("안녕하세요 백둥크루%d 입니다.", i)) .profileImageUrl(String.format("https://amazon.profileimage/%d", i)) diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index b22bc6a7..0c67035d 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -11,8 +11,8 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.fixture.domain.CrewFixtures; @@ -36,29 +36,29 @@ public class CrewSetup { @Autowired private AddressSetup addressSetup; - public Crew save(final Member leader) { + public CrewEntity save(final Member leader) { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final Crew crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); + final CrewEntity crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); final ChatRoom savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); - final CrewMember crewLeader = CrewFixtures.crewMemberBuild(leader, crew); + final CrewMemberEntity crewLeader = CrewFixtures.crewMemberBuild(leader, crew); crewLeader.confirmRegistration(); leader.addMemberCrew(crewLeader); savedChatRoom.updateMaxMemberCount(crew.getMaxMemberCount()); crew.makeNewCrewChatRoom(savedChatRoom); - final Crew savedCrew = crewRepository.save(crew); + final CrewEntity savedCrew = crewRepository.save(crew); crewMemberRepository.save(crewLeader); return savedCrew; } - public Crew saveWithWaitingMembers(final Integer memberCount) { + public CrewEntity saveWithWaitingMembers(final Integer memberCount) { final List members = memberSetup.save(memberCount); - final Crew crew = save(members.get(0)); + final CrewEntity crew = save(members.get(0)); members.subList(1, members.size()) .stream() @@ -68,8 +68,8 @@ public Crew saveWithWaitingMembers(final Integer memberCount) { return crew; } - public Crew saveWithConfirmedMembers(final Integer memberCount) { - final Crew crew = saveWithWaitingMembers(memberCount); + public CrewEntity saveWithConfirmedMembers(final Integer memberCount) { + final CrewEntity crew = saveWithWaitingMembers(memberCount); crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .forEach(waitingCrewMember -> waitingCrewMember.updateStatus(CONFIRMED)); diff --git a/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java b/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java index c9a91595..d0afe507 100644 --- a/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java +++ b/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java @@ -11,7 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.IntegrationMemberTest; import kr.pickple.back.member.domain.Member; @@ -62,7 +62,7 @@ void createMemberById_ReturnAuthenticatedMemberResponse() throws Exception { void findMemberById_ReturnMemberProfileResponse() throws Exception { // given final Member savedMember = memberSetup.save(); - final Crew savedCrew = crewSetup.save(savedMember); + final CrewEntity savedCrew = crewSetup.save(savedMember); // when final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{members}", savedMember.getId())); @@ -113,7 +113,7 @@ void findMemberById_ReturnMemberProfileResponse() throws Exception { void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final Member member = memberSetup.save(); - final Crew crew = crewSetup.save(member); + final CrewEntity crew = crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -165,7 +165,7 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final Member member = memberSetup.save(); - final Crew crew = crewSetup.save(member); + final CrewEntity crew = crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); diff --git a/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java similarity index 98% rename from src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java rename to src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java index 70fb273f..1ddee1b1 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTest.java +++ b/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java @@ -22,7 +22,7 @@ import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; -public class MemberCrewServiceTest { +public class MemberCrewServiceTestEntity { @InjectMocks private MemberCrewService memberCrewService; From 4247b89c1a3fd83301e01d260eddcd6d9a324ee8 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 26 Feb 2024 16:23:28 +0900 Subject: [PATCH 044/117] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=8B=A0=EC=B2=AD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/implement/CrewWriter.java | 17 ++++++---- .../back/crew/service/CrewMemberService.java | 33 ++++++++----------- .../back/member/implement/MemberReader.java | 26 +++++++-------- 3 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 81fb5228..d1eb5656 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -5,14 +5,13 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @@ -21,7 +20,6 @@ @RequiredArgsConstructor public class CrewWriter { - private final AddressReader addressReader; private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -37,9 +35,16 @@ public Crew create(final NewCrew newCrew) { } public void register(final MemberDomain member, final Crew crew) { + final Long memberId = member.getMemberId(); + final Long crewId = crew.getCrewId(); + + if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { + throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); + } + final CrewMember crewMember = CrewMember.builder() - .memberId(member.getMemberId()) - .crewId(crew.getCrewId()) + .memberId(memberId) + .crewId(crewId) .build(); crewMember.confirmRegistration(); @@ -47,6 +52,6 @@ public void register(final MemberDomain member, final Crew crew) { crew.addMember(member); crew.increaseMemberCount(); - crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); + crewRepository.updateMemberCountAndStatus(crewId, crew.getMemberCount(), crew.getStatus()); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index db201662..b1bfccd9 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -18,16 +18,21 @@ import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.implement.CrewReader; +import kr.pickple.back.crew.implement.CrewWriter; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; @@ -39,6 +44,9 @@ public class CrewMemberService { private final AddressReader addressReader; + private final MemberReader memberReader; + private final CrewReader crewReader; + private final CrewWriter crewWriter; private final MemberRepository memberRepository; private final CrewRepository crewRepository; private final MemberPositionRepository memberPositionRepository; @@ -63,30 +71,17 @@ private static void increaseMemberCount( */ @Transactional public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final CrewEntity crew = crewRepository.getCrewById(crewId); - final Member member = memberRepository.getMemberById(loggedInMemberId); + final Crew crew = crewReader.read(crewId); + final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); - validateIsAlreadyRegisteredCrewMember(crewId, loggedInMemberId); - - final CrewMemberEntity newCrewMember = CrewMemberEntity.builder() - .memberId(member.getId()) - .crewId(crew.getId()) - .build(); - - crewMemberRepository.save(newCrewMember); + crewWriter.register(member, crew); eventPublisher.publishEvent(CrewJoinRequestNotificationEvent.builder() .crewId(crewId) - .memberId(crew.getLeaderId()) + .memberId(crew.getLeader().getMemberId()) .build()); } - private void validateIsAlreadyRegisteredCrewMember(final Long crewId, final Long memberId) { - if (crewMemberRepository.existsByCrewIdAndMemberId(crewId, memberId)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, memberId); - } - } - /** * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 */ diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index f49097b6..647c9d18 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -31,6 +31,13 @@ public class MemberReader { private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; + public MemberDomain readByMemberId(final Long memberId) { + final Member memberEntity = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + + return memberMapper.mapToMemberDomain(memberEntity); + } + public MemberProfile readProfileByMemberId(final Long memberId) { final Member member = readEntityByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( @@ -42,19 +49,6 @@ public MemberProfile readProfileByMemberId(final Long memberId) { return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions); } - //TODO: member -> memberDomain 변경 작업 후 제거 예정 (김영주) - public Member readEntityByMemberId(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - - public MemberDomain readByMemberId(final Long memberId) { - final Member memberEntity = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - - return memberMapper.mapToMemberDomain(memberEntity); - } - public List readPositionsByMemberId(final Long memberId) { return memberPositionRepository.findAllByMemberId(memberId) .stream() @@ -65,4 +59,10 @@ public List readPositionsByMemberId(final Long memberId) { public Optional readByOauthId(final Long oauthId) { return memberRepository.findByOauthId(oauthId); } + + //TODO: member -> memberDomain 변경 작업 후 제거 예정 (김영주) + public Member readEntityByMemberId(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } } From 2dafb66ee81ff7faf1c986bee3d2f924670533e0 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 26 Feb 2024 17:28:09 +0900 Subject: [PATCH 045/117] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=EC=97=90?= =?UTF-8?q?=20=EA=B0=80=EC=9E=85=20=EC=8B=A0=EC=B2=AD=EB=90=9C=20=ED=98=B9?= =?UTF-8?q?=EC=9D=80=20=ED=99=95=EC=A0=95=EB=90=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 5 ++- .../kr/pickple/back/crew/domain/Crew.java | 4 ++ .../back/crew/implement/CrewMapper.java | 5 ++- .../back/crew/implement/CrewReader.java | 9 ++-- .../back/crew/implement/CrewWriter.java | 4 +- .../back/crew/service/CrewMemberService.java | 42 ++++--------------- .../back/crew/service/CrewService.java | 3 +- .../back/member/domain/MemberDomain.java | 4 ++ .../back/member/service/MemberService.java | 2 +- 9 files changed, 33 insertions(+), 45 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index a036ec8d..ff8c6ee9 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -80,8 +80,11 @@ public ResponseEntity findAllCrewMembers( @PathVariable final Long crewId, @RequestParam final RegistrationStatus status ) { + final Crew crew = crewMemberService.findCrewMembersByStatus(loggedInMemberId, crewId, status); + final CrewProfileResponse crewProfileResponse = CrewResponseMapper.mapToCrewProfileResponseDto(crew); + return ResponseEntity.status(OK) - .body(crewMemberService.findAllCrewMembers(loggedInMemberId, crewId, status)); + .body(crewProfileResponse); } @PatchMapping("/{crewId}/members/{memberId}") diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 5ecdf426..58cefca2 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -59,4 +59,8 @@ public void addMember(final MemberDomain member) { members.add(member); } + + public Boolean isLeader(final Long memberId) { + return leader.isIdMatched(memberId); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index da9a2a62..0910dada 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -9,6 +9,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; @@ -47,13 +48,13 @@ public CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew) { .build(); } - public Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { + public Crew mapCrewEntityToDomain(final CrewEntity crewEntity, final RegistrationStatus status) { final MainAddress mainAddress = addressReader.readMainAddressById( crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() ); - final List members = crewMemberRepository.findAllByCrewIdAndStatus(crewEntity.getId(), CONFIRMED) + final List members = crewMemberRepository.findAllByCrewIdAndStatus(crewEntity.getId(), status) .stream() .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) .toList(); diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 31a6d589..8f45695c 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -12,6 +12,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; @@ -33,17 +34,17 @@ public Integer countByLeaderId(final Long leaderId) { return crewRepository.countByLeaderId(leaderId); } - public Crew read(final Long crewId) { + public Crew read(final Long crewId, final RegistrationStatus status) { final CrewEntity crewEntity = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - return crewMapper.mapCrewEntityToDomain(crewEntity); + return crewMapper.mapCrewEntityToDomain(crewEntity, status); } public List readJoinedCrewsByMemberId(final Long memberId) { return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) .stream() - .map(crewMember -> read(crewMember.getCrewId())) + .map(crewMember -> read(crewMember.getCrewId(), CONFIRMED)) .toList(); } @@ -60,7 +61,7 @@ public List readNearCrewsByAddress( ); return crewEntities.stream() - .map(crewMapper::mapCrewEntityToDomain) + .map(crewEntity -> crewMapper.mapCrewEntityToDomain(crewEntity, CONFIRMED)) .toList(); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index d1eb5656..43fc9766 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -1,10 +1,12 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; @@ -31,7 +33,7 @@ public Crew create(final NewCrew newCrew) { final CrewEntity crewEntity = crewRepository.save(crewMapper.mapNewCrewDomainToEntity(newCrew)); - return crewMapper.mapCrewEntityToDomain(crewEntity); + return crewMapper.mapCrewEntityToDomain(crewEntity, CONFIRMED); } public void register(final MemberDomain member, final Crew crew) { diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index b1bfccd9..5b0a432a 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -3,13 +3,10 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import java.util.List; - import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; @@ -20,7 +17,6 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; @@ -30,12 +26,9 @@ import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -71,7 +64,7 @@ private static void increaseMemberCount( */ @Transactional public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final Crew crew = crewReader.read(crewId); + final Crew crew = crewReader.read(crewId, CONFIRMED); final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); crewWriter.register(member, crew); @@ -85,39 +78,18 @@ public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { /** * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 */ - public CrewProfileResponse findAllCrewMembers( + public Crew findCrewMembersByStatus( final Long loggedInMemberId, final Long crewId, final RegistrationStatus status ) { - final CrewEntity crew = crewRepository.getCrewById(crewId); + final Crew crew = crewReader.read(crewId, status); - validateIsLeader(loggedInMemberId, crew); - - final List memberResponses = crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) - .stream() - .map(crewMember -> memberRepository.getMemberById(crewMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositionsByMember(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) - ) - ) - .toList(); - - final MainAddress mainAddress = addressReader.readMainAddressById( - crew.getAddressDepth1Id(), - crew.getAddressDepth2Id() - ); - - return CrewProfileResponse.of(crew, memberResponses, mainAddress); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); + if (!crew.isLeader(loggedInMemberId)) { + throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); + } - return Position.fromMemberPositions(memberPositions); + return crew; } /** diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index e6b0bf20..1bbb953c 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -1,6 +1,7 @@ package kr.pickple.back.crew.service; import static kr.pickple.back.chat.domain.RoomType.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import java.text.MessageFormat; @@ -80,7 +81,7 @@ private void assignImageUrls(final NewCrew newCrew) { * 크루 상세 조회 */ public Crew findCrewById(final Long crewId) { - return crewReader.read(crewId); + return crewReader.read(crewId, CONFIRMED); } /** diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java index cb32774d..3c180002 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java @@ -29,4 +29,8 @@ public class MemberDomain { private List positions; private List joinedCrews; private List joinedGames; + + public Boolean isIdMatched(final Long memberId) { + return this.memberId.equals(memberId); + } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 2f4a3643..bea74112 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -54,7 +54,7 @@ public MemberProfile findMemberProfileById(final Long memberId) { final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), CONFIRMED) .stream() - .map(crewMember -> crewReader.read(crewMember.getCrewId())) + .map(crewMember -> crewReader.read(crewMember.getCrewId(), CONFIRMED)) .toList(); memberProfile.updateJoinedCrews(crews); From d43e4400bdfc8ec158b61e11fa4de9ce1367b028 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 26 Feb 2024 20:03:07 +0900 Subject: [PATCH 046/117] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=8B=A0=EC=B2=AD=20=EC=88=98=EB=9D=BD=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/domain/RegistrationStatus.java | 1 - .../back/crew/controller/CrewController.java | 2 +- .../pickple/back/crew/domain/CrewMember.java | 27 +++++----- .../crew/exception/CrewExceptionCode.java | 1 + .../back/crew/implement/CrewMapper.java | 24 +++++++-- .../back/crew/implement/CrewReader.java | 9 ++++ .../back/crew/implement/CrewWriter.java | 31 +++++++---- .../crew/repository/CrewMemberRepository.java | 4 ++ .../back/crew/repository/CrewRepository.java | 2 +- .../back/crew/service/CrewMemberService.java | 51 ++++--------------- .../back/crew/service/CrewService.java | 4 +- 11 files changed, 85 insertions(+), 71 deletions(-) diff --git a/src/main/java/kr/pickple/back/common/domain/RegistrationStatus.java b/src/main/java/kr/pickple/back/common/domain/RegistrationStatus.java index 14a5616e..a5e0c513 100644 --- a/src/main/java/kr/pickple/back/common/domain/RegistrationStatus.java +++ b/src/main/java/kr/pickple/back/common/domain/RegistrationStatus.java @@ -19,7 +19,6 @@ @RequiredArgsConstructor public enum RegistrationStatus { - NONE("없음"), WAITING("대기"), CONFIRMED("확정"), ; diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index ff8c6ee9..2343607f 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -98,7 +98,7 @@ public ResponseEntity updateCrewMemberRegistrationStatus( loggedInMemberId, crewId, memberId, - crewMemberStatusUpdateRequest + crewMemberStatusUpdateRequest.getStatus() ); return ResponseEntity.status(NO_CONTENT) diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index fbd9e992..9752d707 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -1,33 +1,36 @@ package kr.pickple.back.crew.domain; -import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter +@Builder @NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class CrewMember { private Long crewMemberId; - private RegistrationStatus status = WAITING; - private Long memberId; - private Long crewId; - - @Builder - private CrewMember(final Long memberId, final Long crewId) { - this.memberId = memberId; - this.crewId = crewId; - } + private RegistrationStatus status; + private MemberDomain member; + private Crew crew; public void updateCrewMemberId(final Long crewMemberId) { this.crewMemberId = crewMemberId; } - public void confirmRegistration() { - this.status = CONFIRMED; + public void updateRegistrationStatus(final RegistrationStatus status) { + if (this.status == status) { + throw new CrewException(CREW_MEMBER_ALREADY_IN_THAT_REGISTRATION_STATUS, status); + } + + this.status = status; } } diff --git a/src/main/java/kr/pickple/back/crew/exception/CrewExceptionCode.java b/src/main/java/kr/pickple/back/crew/exception/CrewExceptionCode.java index 8166425d..0607f835 100644 --- a/src/main/java/kr/pickple/back/crew/exception/CrewExceptionCode.java +++ b/src/main/java/kr/pickple/back/crew/exception/CrewExceptionCode.java @@ -22,6 +22,7 @@ public enum CrewExceptionCode implements ExceptionCode { CREW_MEMBER_STATUS_IS_NOT_WAITING(HttpStatus.BAD_REQUEST, "CRE-010", "해당 크루에 가입 신청 대기 상태가 아니라면, 가입 신청을 취소할 수 없음"), CREW_LEADER_CANNOT_BE_DELETED(HttpStatus.BAD_REQUEST, "CRE-011", "크루장은 자신의 크루에서 삭제될 수 없음"), CREW_CREATE_MAX_COUNT_EXCEEDED(HttpStatus.BAD_REQUEST, "CRE-012", "사용자는 크루를 특정 MAX 값을 초과하여 생성할 수 없음"), + CREW_MEMBER_ALREADY_IN_THAT_REGISTRATION_STATUS(HttpStatus.BAD_REQUEST, "CRE-013", "크루원은 이미 해당 등록 상태를 가지고 있음"), ; private final HttpStatus status; diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 0910dada..1830548a 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -1,6 +1,7 @@ package kr.pickple.back.crew.implement; import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import java.util.List; @@ -10,12 +11,14 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; +import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -26,6 +29,7 @@ public class CrewMapper { private final AddressReader addressReader; private final MemberReader memberReader; + private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; private final ChatRoomRepository chatRoomRepository; @@ -80,8 +84,20 @@ public Crew mapCrewEntityToDomain(final CrewEntity crewEntity, final Registratio public CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crewMember) { return CrewMemberEntity.builder() .status(crewMember.getStatus()) - .memberId(crewMember.getMemberId()) - .crewId(crewMember.getCrewId()) + .memberId(crewMember.getMember().getMemberId()) + .crewId(crewMember.getCrew().getCrewId()) + .build(); + } + + public CrewMember mapCrewMemberEntityToDomain(final CrewMemberEntity crewMemberEntity) { + final CrewEntity crewEntity = crewRepository.findById(crewMemberEntity.getCrewId()) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewMemberEntity.getCrewId())); + + return CrewMember.builder() + .crewMemberId(crewMemberEntity.getId()) + .status(crewMemberEntity.getStatus()) + .member(memberReader.readByMemberId(crewMemberEntity.getMemberId())) + .crew(mapCrewEntityToDomain(crewEntity, CONFIRMED)) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 8f45695c..f8af2e87 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -14,10 +14,12 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import lombok.RequiredArgsConstructor; @Component @@ -64,4 +66,11 @@ public List readNearCrewsByAddress( .map(crewEntity -> crewMapper.mapCrewEntityToDomain(crewEntity, CONFIRMED)) .toList(); } + + public CrewMember readCrewMember(final Long memberId, final Long crewId) { + final CrewMemberEntity crewMemberEntity = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) + .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); + + return crewMapper.mapCrewMemberEntityToDomain(crewMemberEntity); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 43fc9766..9e96b51a 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -14,6 +14,7 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @@ -22,6 +23,7 @@ @RequiredArgsConstructor public class CrewWriter { + private final CrewReader crewReader; private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -31,12 +33,13 @@ public Crew create(final NewCrew newCrew) { throw new CrewException(CREW_IS_EXISTED, newCrew.getName()); } - final CrewEntity crewEntity = crewRepository.save(crewMapper.mapNewCrewDomainToEntity(newCrew)); + final CrewEntity crewEntity = crewMapper.mapNewCrewDomainToEntity(newCrew); + final CrewEntity savedCrewEntity = crewRepository.save(crewEntity); - return crewMapper.mapCrewEntityToDomain(crewEntity, CONFIRMED); + return crewMapper.mapCrewEntityToDomain(savedCrewEntity, CONFIRMED); } - public void register(final MemberDomain member, final Crew crew) { + public CrewMember register(final MemberDomain member, final Crew crew) { final Long memberId = member.getMemberId(); final Long crewId = crew.getCrewId(); @@ -45,15 +48,25 @@ public void register(final MemberDomain member, final Crew crew) { } final CrewMember crewMember = CrewMember.builder() - .memberId(memberId) - .crewId(crewId) + .status(WAITING) + .member(member) + .crew(crew) .build(); - crewMember.confirmRegistration(); - crewMemberRepository.save(crewMapper.mapCrewMemberDomainToEntity(crewMember)); + final CrewMemberEntity crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); + final CrewMemberEntity savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); + crewMember.updateCrewMemberId(savedCrewMemberEntity.getId()); - crew.addMember(member); + return crewMember; + } + + public void updateRegistrationStatus(final CrewMember crewMember, final RegistrationStatus status) { + crewMember.updateRegistrationStatus(status); + crewMemberRepository.updateRegistrationStatus(crewMember.getCrewMemberId(), status); + + final Crew crew = crewMember.getCrew(); + crew.addMember(crewMember.getMember()); crew.increaseMemberCount(); - crewRepository.updateMemberCountAndStatus(crewId, crew.getMemberCount(), crew.getStatus()); + crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 552229bc..440d0003 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -6,6 +6,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; @@ -23,6 +24,9 @@ public interface CrewMemberRepository extends JpaRepository new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index d241b5e3..6559e4c8 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -30,7 +30,7 @@ Page findByAddressDepth1IdAndAddressDepth2Id( Integer countByLeaderId(final Long leaderId); - @Query("update CrewEntity c set c.memberCount = :memberCount, c.status =: status where c.id = :crewId") + @Query("update CrewEntity c set c.memberCount = :memberCount, c.status = :status where c.id = :crewId") void updateMemberCountAndStatus(final Long crewId, final Integer memberCount, final CrewStatus status); default CrewEntity getCrewById(final Long crewId) { diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 5b0a432a..9962de84 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -11,12 +11,11 @@ import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; @@ -24,7 +23,6 @@ import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; @@ -49,16 +47,6 @@ public class CrewMemberService { private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; - private static void increaseMemberCount( - final CrewEntity crew, - final CrewMemberEntity crewMember, - final RegistrationStatus status - ) { - if (crewMember.getStatus() == WAITING && status == CONFIRMED) { - crew.increaseMemberCount(); - } - } - /** * 크루 가입 신청 */ @@ -100,19 +88,17 @@ public void updateCrewMemberRegistrationStatus( final Long loggedInMemberId, final Long crewId, final Long memberId, - final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest + final RegistrationStatus newRegistrationStatus ) { - final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final CrewEntity crew = crewRepository.getCrewById(crewId); - - validateIsLeader(loggedInMemberId, crew); + final CrewMember crewMember = crewReader.readCrewMember(memberId, crewId); + final Crew crew = crewMember.getCrew(); - final RegistrationStatus updateStatus = crewMemberUpdateStatusRequest.getStatus(); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crew.getChatRoomId()); - enterCrewChatRoom(updateStatus, crewMember, chatRoom); + if (!crew.isLeader(loggedInMemberId)) { + throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); + } - increaseMemberCount(crew, crewMember, updateStatus); - crewMember.updateStatus(updateStatus); + crewWriter.updateRegistrationStatus(crewMember, newRegistrationStatus); + chatMessageService.enterRoomAndSaveEnteringMessages(crew.getChatRoom(), crewMember.getMember()); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() .crewId(crewId) @@ -120,25 +106,6 @@ public void updateCrewMemberRegistrationStatus( .build()); } - private void validateIsLeader(final Long loggedInMemberId, final CrewEntity crew) { - if (!crew.isLeader(loggedInMemberId)) { - throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); - } - } - - private void enterCrewChatRoom( - final RegistrationStatus updateStatus, - final CrewMemberEntity crewMember, - final ChatRoom chatRoom - ) { - final RegistrationStatus nowStatus = crewMember.getStatus(); - final Member member = memberRepository.getMemberById(crewMember.getMemberId()); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, member); - } - } - /** * 크루원 가입 신청 거절/취소 */ diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 1bbb953c..bc98e5e1 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -16,6 +16,7 @@ import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; @@ -56,7 +57,8 @@ public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { assignImageUrls(newCrew); final Crew crew = crewWriter.create(newCrew); - crewWriter.register(leader, crew); + final CrewMember crewLeader = crewWriter.register(leader, crew); + crewWriter.confirm(crewLeader); return crew.getCrewId(); } From b2ba01f1272953286273e7db4237d0954b7afb83 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 26 Feb 2024 20:24:12 +0900 Subject: [PATCH 047/117] =?UTF-8?q?refactor:=20=ED=81=AC=EB=A3=A8=EC=9B=90?= =?UTF-8?q?=20=EA=B0=80=EC=9E=85=20=EC=8B=A0=EC=B2=AD=20=EA=B1=B0=EC=A0=88?= =?UTF-8?q?/=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/crew/domain/Crew.java | 8 ---- .../back/crew/implement/CrewWriter.java | 16 +++++-- .../back/crew/service/CrewMemberService.java | 46 ++++--------------- .../back/crew/service/CrewService.java | 2 +- 4 files changed, 24 insertions(+), 48 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 58cefca2..095409d2 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -52,14 +52,6 @@ public void increaseMemberCount() { } } - public void addMember(final MemberDomain member) { - if (members.contains(member)) { - throw new CrewException(CREW_MEMBER_ALREADY_EXISTED, crewId, member.getMemberId()); - } - - members.add(member); - } - public Boolean isLeader(final Long memberId) { return leader.isIdMatched(memberId); } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 9e96b51a..3fa57c1a 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -23,7 +23,6 @@ @RequiredArgsConstructor public class CrewWriter { - private final CrewReader crewReader; private final CrewMapper crewMapper; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -60,13 +59,24 @@ public CrewMember register(final MemberDomain member, final Crew crew) { return crewMember; } - public void updateRegistrationStatus(final CrewMember crewMember, final RegistrationStatus status) { + public void updateMemberRegistrationStatus(final CrewMember crewMember, final RegistrationStatus status) { crewMember.updateRegistrationStatus(status); crewMemberRepository.updateRegistrationStatus(crewMember.getCrewMemberId(), status); final Crew crew = crewMember.getCrew(); - crew.addMember(crewMember.getMember()); crew.increaseMemberCount(); crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); } + + public void cancel(final CrewMember crewMember) { + if (crewMember.getStatus() != WAITING) { + throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING, crewMember.getCrewMemberId()); + } + + delete(crewMember); + } + + public void delete(final CrewMember crewMember) { + crewMemberRepository.deleteById(crewMember.getCrewMemberId()); + } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 9962de84..0e55394d 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -7,11 +7,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; @@ -19,14 +17,8 @@ import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -34,15 +26,9 @@ @Transactional(readOnly = true) public class CrewMemberService { - private final AddressReader addressReader; private final MemberReader memberReader; private final CrewReader crewReader; private final CrewWriter crewWriter; - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; - private final MemberPositionRepository memberPositionRepository; - private final CrewMemberRepository crewMemberRepository; - private final ChatRoomRepository chatRoomRepository; private final ChatMessageService chatMessageService; private final ApplicationEventPublisher eventPublisher; @@ -97,7 +83,7 @@ public void updateCrewMemberRegistrationStatus( throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } - crewWriter.updateRegistrationStatus(crewMember, newRegistrationStatus); + crewWriter.updateMemberRegistrationStatus(crewMember, newRegistrationStatus); chatMessageService.enterRoomAndSaveEnteringMessages(crew.getChatRoom(), crewMember.getMember()); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() @@ -111,45 +97,33 @@ public void updateCrewMemberRegistrationStatus( */ @Transactional public void deleteCrewMember(final Long loggedInMemberId, final Long crewId, final Long memberId) { - final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(memberId, crewId); - final CrewEntity crew = crewRepository.getCrewById(crewId); + final CrewMember crewMember = crewReader.readCrewMember(memberId, crewId); + final Crew crew = crewMember.getCrew(); if (crew.isLeader(loggedInMemberId)) { - validateIsLeaderSelfDeleted(loggedInMemberId, memberId); + validateLeaderDeleteSelf(loggedInMemberId, memberId); + crewWriter.delete(crewMember); eventPublisher.publishEvent(CrewMemberRejectedEvent.builder() .crewId(crewId) .memberId(memberId) .build()); - deleteCrewMember(crewMember); - return; } if (loggedInMemberId.equals(memberId)) { - cancelCrewMember(crewMember); + crewWriter.cancel(crewMember); + return; } throw new CrewException(CREW_MEMBER_NOT_ALLOWED, loggedInMemberId); } - private void validateIsLeaderSelfDeleted(Long loggedInMemberId, Long memberId) { - if (loggedInMemberId.equals(memberId)) { - throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, loggedInMemberId); + private void validateLeaderDeleteSelf(final Long leaderId, final Long deletingMemberId) { + if (leaderId.equals(deletingMemberId)) { + throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, deletingMemberId); } } - - private void cancelCrewMember(final CrewMemberEntity crewMember) { - if (crewMember.getStatus() != WAITING) { - throw new CrewException(CREW_MEMBER_STATUS_IS_NOT_WAITING); - } - - deleteCrewMember(crewMember); - } - - private void deleteCrewMember(final CrewMemberEntity crewMember) { - crewMemberRepository.delete(crewMember); - } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index bc98e5e1..67135fe9 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -58,7 +58,7 @@ public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { final Crew crew = crewWriter.create(newCrew); final CrewMember crewLeader = crewWriter.register(leader, crew); - crewWriter.confirm(crewLeader); + crewWriter.updateMemberRegistrationStatus(crewLeader, CONFIRMED); return crew.getCrewId(); } From 7124847b03085e2223b99e6d854286628af2e097 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 28 Feb 2024 18:07:00 +0900 Subject: [PATCH 048/117] =?UTF-8?q?refactor:=20Crew=20DTO=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=EC=9D=84=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EA=B3=84?= =?UTF-8?q?=EC=B8=B5=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 27 +++---------------- .../back/crew/service/CrewMemberService.java | 6 +++-- .../back/crew/service/CrewService.java | 24 ++++++++++++----- 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 2343607f..0a130d2f 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -19,10 +19,6 @@ import jakarta.validation.Valid; import kr.pickple.back.auth.config.resolver.Login; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.domain.NewCrew; -import kr.pickple.back.crew.dto.mapper.CrewRequestMapper; -import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.request.CrewCreateRequest; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; import kr.pickple.back.crew.dto.response.CrewIdResponse; @@ -44,23 +40,16 @@ public ResponseEntity createCrew( @Login final Long loggedInMemberId, @Valid @RequestBody final CrewCreateRequest crewCreateRequest ) { - final NewCrew newCrew = CrewRequestMapper.mapToNewCrewDomain(crewCreateRequest); - final Long crewId = crewService.createCrew(loggedInMemberId, newCrew); - final CrewIdResponse crewIdResponse = CrewResponseMapper.mapToCrewIdResponseDto(crewId); - return ResponseEntity.status(CREATED) - .body(crewIdResponse); + .body(crewService.createCrew(loggedInMemberId, crewCreateRequest)); } @GetMapping("/{crewId}") public ResponseEntity findCrewById( @PathVariable final Long crewId ) { - final Crew crew = crewService.findCrewById(crewId); - final CrewProfileResponse crewProfileResponse = CrewResponseMapper.mapToCrewProfileResponseDto(crew); - return ResponseEntity.status(OK) - .body(crewProfileResponse); + .body(crewService.findCrewById(crewId)); } @PostMapping("/{crewId}/members") @@ -80,11 +69,8 @@ public ResponseEntity findAllCrewMembers( @PathVariable final Long crewId, @RequestParam final RegistrationStatus status ) { - final Crew crew = crewMemberService.findCrewMembersByStatus(loggedInMemberId, crewId, status); - final CrewProfileResponse crewProfileResponse = CrewResponseMapper.mapToCrewProfileResponseDto(crew); - return ResponseEntity.status(OK) - .body(crewProfileResponse); + .body(crewMemberService.findCrewMembersByStatus(loggedInMemberId, crewId, status)); } @PatchMapping("/{crewId}/members/{memberId}") @@ -123,12 +109,7 @@ public ResponseEntity> findNearCrewsByAddress( @RequestParam final String addressDepth2, final Pageable pageable ) { - final List nearCrews = crewService.findNearCrewsByAddress(addressDepth1, addressDepth2, pageable); - final List crewProfileResponses = nearCrews.stream() - .map(CrewResponseMapper::mapToCrewProfileResponseDto) - .toList(); - return ResponseEntity.status(OK) - .body(crewProfileResponses); + .body(crewService.findNearCrewsByAddress(addressDepth1, addressDepth2, pageable)); } } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 0e55394d..bb83e6a3 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -14,6 +14,8 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; +import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; @@ -52,7 +54,7 @@ public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { /** * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 */ - public Crew findCrewMembersByStatus( + public CrewProfileResponse findCrewMembersByStatus( final Long loggedInMemberId, final Long crewId, final RegistrationStatus status @@ -63,7 +65,7 @@ public Crew findCrewMembersByStatus( throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } - return crew; + return CrewResponseMapper.mapToCrewProfileResponseDto(crew); } /** diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 67135fe9..f174a7af 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -18,6 +18,11 @@ import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; +import kr.pickple.back.crew.dto.mapper.CrewRequestMapper; +import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; +import kr.pickple.back.crew.dto.request.CrewCreateRequest; +import kr.pickple.back.crew.dto.response.CrewIdResponse; +import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; @@ -45,7 +50,9 @@ public class CrewService { * 크루 생성 */ @Transactional - public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { + public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewCreateRequest crewCreateRequest) { + final NewCrew newCrew = CrewRequestMapper.mapToNewCrewDomain(crewCreateRequest); + final MemberDomain leader = memberReader.readByMemberId(loggedInMemberId); validateCreateCrewMoreThanMaxCount(loggedInMemberId); @@ -60,7 +67,7 @@ public Long createCrew(final Long loggedInMemberId, final NewCrew newCrew) { final CrewMember crewLeader = crewWriter.register(leader, crew); crewWriter.updateMemberRegistrationStatus(crewLeader, CONFIRMED); - return crew.getCrewId(); + return CrewResponseMapper.mapToCrewIdResponseDto(crew.getCrewId()); } private void validateCreateCrewMoreThanMaxCount(final Long leaderId) { @@ -82,18 +89,23 @@ private void assignImageUrls(final NewCrew newCrew) { /** * 크루 상세 조회 */ - public Crew findCrewById(final Long crewId) { - return crewReader.read(crewId, CONFIRMED); + public CrewProfileResponse findCrewById(final Long crewId) { + final Crew crew = crewReader.read(crewId, CONFIRMED); + + return CrewResponseMapper.mapToCrewProfileResponseDto(crew); } /** * 사용자 근처 크루 목록 조회 */ - public List findNearCrewsByAddress( + public List findNearCrewsByAddress( final String addressDepth1Name, final String addressDepth2Name, final Pageable pageable ) { - return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable); + return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable) + .stream() + .map(CrewResponseMapper::mapToCrewProfileResponseDto) + .toList(); } } From ef497f4bdfe3ca32a8c8a02baac56d190641b542 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 28 Feb 2024 19:30:21 +0900 Subject: [PATCH 049/117] =?UTF-8?q?refactor:=20CrewMapper,=20MemberMapper?= =?UTF-8?q?=EC=97=90=EC=84=9C=20DB=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EB=AA=A8=EB=91=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/crew/domain/Crew.java | 3 - .../crew/dto/mapper/CrewResponseMapper.java | 6 +- .../back/crew/implement/CrewMapper.java | 73 ++++++------------- .../back/crew/implement/CrewReader.java | 68 ++++++++++++++--- .../back/crew/implement/CrewWriter.java | 20 ++++- .../back/crew/service/CrewMemberService.java | 11 ++- .../back/crew/service/CrewService.java | 11 ++- .../back/member/domain/MemberDomain.java | 4 - .../dto/mapper/MemberResponseMapper.java | 13 +++- .../member/dto/response/MemberResponse.java | 16 ---- .../{mapper => implement}/MemberMapper.java | 52 +++---------- .../back/member/implement/MemberReader.java | 13 +++- .../back/member/implement/MemberWriter.java | 1 - .../back/member/service/MemberService.java | 2 +- 14 files changed, 147 insertions(+), 146 deletions(-) rename src/main/java/kr/pickple/back/member/{mapper => implement}/MemberMapper.java (61%) diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 095409d2..1a0658e1 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -3,8 +3,6 @@ import static kr.pickple.back.crew.domain.CrewStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import java.util.List; - import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.member.domain.MemberDomain; @@ -34,7 +32,6 @@ public class Crew { private Integer likeCount; private Integer competitionPoint; private ChatRoom chatRoom; - private List members; public void increaseMemberCount() { if (status == CLOSED) { diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java index a3967e48..370ba875 100644 --- a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -6,6 +6,7 @@ import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; @@ -18,9 +19,8 @@ public static CrewIdResponse mapToCrewIdResponseDto(final Long crewId) { return CrewIdResponse.from(crewId); } - public static CrewProfileResponse mapToCrewProfileResponseDto(final Crew crew) { - final List memberResponses = crew.getMembers() - .stream() + public static CrewProfileResponse mapToCrewProfileResponseDto(final Crew crew, final List members) { + final List memberResponses = members.stream() .map(MemberResponseMapper::mapToMemberResponseDto) .toList(); diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 1830548a..676f571a 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -1,44 +1,20 @@ package kr.pickple.back.crew.implement; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; - -import java.util.List; - -import org.springframework.stereotype.Component; - import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.NewCrew; -import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.implement.MemberReader; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class CrewMapper { +import lombok.AccessLevel; +import lombok.NoArgsConstructor; - private final AddressReader addressReader; - private final MemberReader memberReader; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; - private final ChatRoomRepository chatRoomRepository; - - public CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew) { - final MainAddress mainAddress = addressReader.readMainAddressByNames( - newCrew.getAddressDepth1Name(), - newCrew.getAddressDepth2Name() - ); +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class CrewMapper { + public static CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew, final MainAddress mainAddress) { return CrewEntity.builder() .name(newCrew.getName()) .content(newCrew.getContent()) @@ -52,36 +28,30 @@ public CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew) { .build(); } - public Crew mapCrewEntityToDomain(final CrewEntity crewEntity, final RegistrationStatus status) { - final MainAddress mainAddress = addressReader.readMainAddressById( - crewEntity.getAddressDepth1Id(), - crewEntity.getAddressDepth2Id() - ); - - final List members = crewMemberRepository.findAllByCrewIdAndStatus(crewEntity.getId(), status) - .stream() - .map(crewMember -> memberReader.readByMemberId(crewMember.getMemberId())) - .toList(); - + public static Crew mapCrewEntityToDomain( + final CrewEntity crewEntity, + final MainAddress mainAddress, + final MemberDomain leader, + final ChatRoom chatRoom + ) { return Crew.builder() .crewId(crewEntity.getId()) .name(crewEntity.getName()) .content(crewEntity.getContent()) .memberCount(crewEntity.getMemberCount()) .maxMemberCount(crewEntity.getMaxMemberCount()) - .leader(memberReader.readByMemberId(crewEntity.getLeaderId())) + .leader(leader) .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .profileImageUrl(crewEntity.getProfileImageUrl()) .backgroundImageUrl(crewEntity.getBackgroundImageUrl()) .likeCount(crewEntity.getLikeCount()) .competitionPoint(crewEntity.getCompetitionPoint()) - .chatRoom(chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId())) - .members(members) + .chatRoom(chatRoom) .build(); } - public CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crewMember) { + public static CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crewMember) { return CrewMemberEntity.builder() .status(crewMember.getStatus()) .memberId(crewMember.getMember().getMemberId()) @@ -89,15 +59,16 @@ public CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crewMember) .build(); } - public CrewMember mapCrewMemberEntityToDomain(final CrewMemberEntity crewMemberEntity) { - final CrewEntity crewEntity = crewRepository.findById(crewMemberEntity.getCrewId()) - .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewMemberEntity.getCrewId())); - + public static CrewMember mapCrewMemberEntityToDomain( + final CrewMemberEntity crewMemberEntity, + final MemberDomain member, + final Crew crew + ) { return CrewMember.builder() .crewMemberId(crewMemberEntity.getId()) .status(crewMemberEntity.getStatus()) - .member(memberReader.readByMemberId(crewMemberEntity.getMemberId())) - .crew(mapCrewEntityToDomain(crewEntity, CONFIRMED)) + .member(member) + .crew(crew) .build(); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index f8af2e87..c5f7ae26 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -1,7 +1,7 @@ package kr.pickple.back.crew.implement; -import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -12,6 +12,8 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; @@ -20,6 +22,14 @@ import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.implement.MemberMapper; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Component @@ -28,26 +38,29 @@ public class CrewReader { private final AddressReader addressReader; - private final CrewMapper crewMapper; + private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; + private final ChatRoomRepository chatRoomRepository; public Integer countByLeaderId(final Long leaderId) { return crewRepository.countByLeaderId(leaderId); } - public Crew read(final Long crewId, final RegistrationStatus status) { + public Crew read(final Long crewId) { final CrewEntity crewEntity = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - return crewMapper.mapCrewEntityToDomain(crewEntity, status); - } + final MainAddress mainAddress = addressReader.readMainAddressById( + crewEntity.getAddressDepth1Id(), + crewEntity.getAddressDepth2Id() + ); - public List readJoinedCrewsByMemberId(final Long memberId) { - return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) - .stream() - .map(crewMember -> read(crewMember.getCrewId(), CONFIRMED)) - .toList(); + final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); + + return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); } public List readNearCrewsByAddress( @@ -63,14 +76,45 @@ public List readNearCrewsByAddress( ); return crewEntities.stream() - .map(crewEntity -> crewMapper.mapCrewEntityToDomain(crewEntity, CONFIRMED)) + .map(crewEntity -> { + final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); + + return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); + }) .toList(); } public CrewMember readCrewMember(final Long memberId, final Long crewId) { final CrewMemberEntity crewMemberEntity = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); + final MemberDomain member = readMemberById(memberId); + final Crew crew = read(crewId); + + return CrewMapper.mapCrewMemberEntityToDomain(crewMemberEntity, member, crew); + } + + public List readAllMembersInStatus(final Long crewId, final RegistrationStatus status) { + return crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) + .stream() + .map(crewMemberEntity -> readMemberById(crewMemberEntity.getMemberId())) + .toList(); + } + + private MemberDomain readMemberById(final Long memberId) { + final Member memberEntity = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + + final MainAddress mainAddress = addressReader.readMainAddressById( + memberEntity.getAddressDepth1Id(), + memberEntity.getAddressDepth2Id() + ); + + final List positions = memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); - return crewMapper.mapCrewMemberEntityToDomain(crewMemberEntity); + return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 3fa57c1a..d9ed4dd5 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -6,6 +6,8 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; @@ -23,7 +25,7 @@ @RequiredArgsConstructor public class CrewWriter { - private final CrewMapper crewMapper; + private final AddressReader addressReader; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -32,10 +34,20 @@ public Crew create(final NewCrew newCrew) { throw new CrewException(CREW_IS_EXISTED, newCrew.getName()); } - final CrewEntity crewEntity = crewMapper.mapNewCrewDomainToEntity(newCrew); + final MainAddress mainAddress = addressReader.readMainAddressByNames( + newCrew.getAddressDepth1Name(), + newCrew.getAddressDepth2Name() + ); + + final CrewEntity crewEntity = CrewMapper.mapNewCrewDomainToEntity(newCrew, mainAddress); final CrewEntity savedCrewEntity = crewRepository.save(crewEntity); - return crewMapper.mapCrewEntityToDomain(savedCrewEntity, CONFIRMED); + return CrewMapper.mapCrewEntityToDomain( + savedCrewEntity, + mainAddress, + newCrew.getLeader(), + newCrew.getChatRoom() + ); } public CrewMember register(final MemberDomain member, final Crew crew) { @@ -52,7 +64,7 @@ public CrewMember register(final MemberDomain member, final Crew crew) { .crew(crew) .build(); - final CrewMemberEntity crewMemberEntity = crewMapper.mapCrewMemberDomainToEntity(crewMember); + final CrewMemberEntity crewMemberEntity = CrewMapper.mapCrewMemberDomainToEntity(crewMember); final CrewMemberEntity savedCrewMemberEntity = crewMemberRepository.save(crewMemberEntity); crewMember.updateCrewMemberId(savedCrewMemberEntity.getId()); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index bb83e6a3..1909950f 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,8 +1,9 @@ package kr.pickple.back.crew.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import java.util.List; + import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,7 +41,7 @@ public class CrewMemberService { */ @Transactional public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { - final Crew crew = crewReader.read(crewId, CONFIRMED); + final Crew crew = crewReader.read(crewId); final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); crewWriter.register(member, crew); @@ -59,13 +60,15 @@ public CrewProfileResponse findCrewMembersByStatus( final Long crewId, final RegistrationStatus status ) { - final Crew crew = crewReader.read(crewId, status); + final Crew crew = crewReader.read(crewId); if (!crew.isLeader(loggedInMemberId)) { throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } - return CrewResponseMapper.mapToCrewProfileResponseDto(crew); + final List members = crewReader.readAllMembersInStatus(crewId, status); + + return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); } /** diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index f174a7af..970ec8ab 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -90,9 +90,10 @@ private void assignImageUrls(final NewCrew newCrew) { * 크루 상세 조회 */ public CrewProfileResponse findCrewById(final Long crewId) { - final Crew crew = crewReader.read(crewId, CONFIRMED); + final Crew crew = crewReader.read(crewId); + final List members = crewReader.readAllMembersInStatus(crewId, CONFIRMED); - return CrewResponseMapper.mapToCrewProfileResponseDto(crew); + return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); } /** @@ -105,7 +106,11 @@ public List findNearCrewsByAddress( ) { return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable) .stream() - .map(CrewResponseMapper::mapToCrewProfileResponseDto) + .map(crew -> { + final List members = crewReader.readAllMembersInStatus(crew.getCrewId(), CONFIRMED); + + return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); + }) .toList(); } } diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java index 3c180002..4924c6fe 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java @@ -2,8 +2,6 @@ import java.util.List; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -27,8 +25,6 @@ public class MemberDomain { private String addressDepth1Name; private String addressDepth2Name; private List positions; - private List joinedCrews; - private List joinedGames; public Boolean isIdMatched(final Long memberId) { return this.memberId.equals(memberId); diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index 4cf5d20a..b6f9f3c5 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -53,6 +53,17 @@ public static MemberProfileResponse mapToMemberProfileResponseDto(final MemberPr } public static MemberResponse mapToMemberResponseDto(final MemberDomain member) { - return MemberResponse.of(member); + return MemberResponse.builder() + .id(member.getMemberId()) + .email(member.getEmail()) + .nickname(member.getNickname()) + .introduction(member.getIntroduction()) + .profileImageUrl(member.getProfileImageUrl()) + .mannerScore(member.getMannerScore()) + .mannerScoreCount(member.getMannerScoreCount()) + .addressDepth1(member.getAddressDepth1Name()) + .addressDepth2(member.getAddressDepth2Name()) + .positions(member.getPositions()) + .build(); } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index 875a4051..bdf2f5c5 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -4,7 +4,6 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -46,19 +45,4 @@ public static MemberResponse of( .positions(positions) .build(); } - - public static MemberResponse of(final MemberDomain member) { - return MemberResponse.builder() - .id(member.getMemberId()) - .email(member.getEmail()) - .nickname(member.getNickname()) - .introduction(member.getIntroduction()) - .profileImageUrl(member.getProfileImageUrl()) - .mannerScore(member.getMannerScore()) - .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1(member.getAddressDepth1Name()) - .addressDepth2(member.getAddressDepth2Name()) - .positions(member.getPositions()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java similarity index 61% rename from src/main/java/kr/pickple/back/member/mapper/MemberMapper.java rename to src/main/java/kr/pickple/back/member/implement/MemberMapper.java index 55ada98d..682c40db 100644 --- a/src/main/java/kr/pickple/back/member/mapper/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java @@ -1,36 +1,20 @@ -package kr.pickple.back.member.mapper; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; +package kr.pickple.back.member.implement; import java.util.List; -import org.springframework.stereotype.Component; - import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.domain.NewMember; -import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.position.domain.Position; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class MemberMapper { +import lombok.AccessLevel; +import lombok.NoArgsConstructor; - private final AddressReader addressReader; - private final CrewReader crewReader; - private final MemberPositionRepository memberPositionRepository; - private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class MemberMapper { public static Member mapToMemberEntity(final NewMember newMember, final MainAddress mainAddress) { return Member.builder() @@ -75,25 +59,13 @@ public static MemberProfile mapToMemberProfileDomain( .build(); } - public MemberDomain mapToMemberDomain(final Member memberEntity) { - final Long memberId = memberEntity.getId(); - final MainAddress mainAddress = addressReader.readMainAddressById( - memberEntity.getAddressDepth1Id(), - memberEntity.getAddressDepth2Id() - ); - - final List positions = memberPositionRepository.findAllByMemberId(memberId) - .stream() - .map(MemberPosition::getPosition) - .toList(); - - final List joinedGames = gameMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) - .stream() - .map(gameMember -> gameRepository.getGameById(gameMember.getGameId())) - .toList(); - + public static MemberDomain mapToMemberDomain( + final Member memberEntity, + final MainAddress mainAddress, + final List positions + ) { return MemberDomain.builder() - .memberId(memberId) + .memberId(memberEntity.getId()) .email(memberEntity.getEmail()) .nickname(memberEntity.getNickname()) .introduction(memberEntity.getIntroduction()) @@ -103,8 +75,6 @@ public MemberDomain mapToMemberDomain(final Member memberEntity) { .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .positions(positions) - .joinedCrews(crewReader.readJoinedCrewsByMemberId(memberId)) - .joinedGames(joinedGames) .build(); } } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index 647c9d18..6acc8983 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -15,7 +15,6 @@ import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.mapper.MemberMapper; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; @@ -35,7 +34,17 @@ public MemberDomain readByMemberId(final Long memberId) { final Member memberEntity = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - return memberMapper.mapToMemberDomain(memberEntity); + final MainAddress mainAddress = addressReader.readMainAddressById( + memberEntity.getAddressDepth1Id(), + memberEntity.getAddressDepth2Id() + ); + + final List positions = memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); + + return memberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); } public MemberProfile readProfileByMemberId(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java index 32e2fa43..ba69b420 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -14,7 +14,6 @@ import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.mapper.MemberMapper; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index bea74112..2f4a3643 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -54,7 +54,7 @@ public MemberProfile findMemberProfileById(final Long memberId) { final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), CONFIRMED) .stream() - .map(crewMember -> crewReader.read(crewMember.getCrewId(), CONFIRMED)) + .map(crewMember -> crewReader.read(crewMember.getCrewId())) .toList(); memberProfile.updateJoinedCrews(crews); From 697026c7c8a41a42746053aa38d49eba09b2895a Mon Sep 17 00:00:00 2001 From: changhyeon Date: Thu, 29 Feb 2024 16:48:44 +0900 Subject: [PATCH 050/117] =?UTF-8?q?feat:=20AOP=EB=A1=9C=20=EB=B3=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=B8=EC=A6=9D=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/Identification.java | 13 +++++++++ .../controller/IdentificationAspect.java | 24 ++++++++++++++++ .../member/controller/MemberController.java | 28 +++++++++---------- .../member/service/MemberCrewService.java | 17 ++++------- .../member/service/MemberGameService.java | 18 ++---------- 5 files changed, 58 insertions(+), 42 deletions(-) create mode 100644 src/main/java/kr/pickple/back/member/controller/Identification.java create mode 100644 src/main/java/kr/pickple/back/member/controller/IdentificationAspect.java diff --git a/src/main/java/kr/pickple/back/member/controller/Identification.java b/src/main/java/kr/pickple/back/member/controller/Identification.java new file mode 100644 index 00000000..f01af6c6 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/controller/Identification.java @@ -0,0 +1,13 @@ +package kr.pickple.back.member.controller; + +import static java.lang.annotation.RetentionPolicy.*; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target({ElementType.METHOD}) +public @interface Identification { + +} diff --git a/src/main/java/kr/pickple/back/member/controller/IdentificationAspect.java b/src/main/java/kr/pickple/back/member/controller/IdentificationAspect.java new file mode 100644 index 00000000..8a14a486 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/controller/IdentificationAspect.java @@ -0,0 +1,24 @@ +package kr.pickple.back.member.controller; + +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import kr.pickple.back.member.exception.MemberException; + +@Aspect +@Component +public class IdentificationAspect { + + @Before(value = "@annotation(Identification) && args(loggedInMemberId, memberId, ..)", argNames = "loggedInMemberId, memberId") + public void checkIdentification( + final Long loggedInMemberId, + final Long memberId + ) { + if (!loggedInMemberId.equals(memberId)) { + throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); + } + } +} diff --git a/src/main/java/kr/pickple/back/member/controller/MemberController.java b/src/main/java/kr/pickple/back/member/controller/MemberController.java index f9f6cb8d..e7eed92d 100644 --- a/src/main/java/kr/pickple/back/member/controller/MemberController.java +++ b/src/main/java/kr/pickple/back/member/controller/MemberController.java @@ -23,10 +23,8 @@ import kr.pickple.back.auth.config.resolver.SignUp; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.dto.response.CrewProfileResponse; -import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.mapper.MemberRequestMapper; -import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; @@ -63,9 +61,7 @@ public ResponseEntity createMember( } final NewMember newMember = MemberRequestMapper.mapToNewMemberDomain(memberCreateRequest); - final NewMember savedNewMember = memberService.createMember(newMember); - final AuthenticatedMemberResponse authenticatedMemberResponse = MemberResponseMapper - .mapToAuthenticatedMemberResponseDto(savedNewMember); + final AuthenticatedMemberResponse authenticatedMemberResponse = memberService.createMember(newMember); final String refreshToken = authenticatedMemberResponse.getRefreshToken(); @@ -87,14 +83,13 @@ public ResponseEntity createMember( @GetMapping("/{memberId}") public ResponseEntity findMemberProfileById(@PathVariable final Long memberId) { - final MemberProfile memberProfile = memberService.findMemberProfileById(memberId); - final MemberProfileResponse memberProfileResponse = MemberResponseMapper - .mapToMemberProfileResponseDto(memberProfile); + final MemberProfileResponse memberProfileResponse = memberService.findMemberProfileById(memberId); return ResponseEntity.status(OK) .body(memberProfileResponse); } + @Identification @GetMapping("/{memberId}/crews") public ResponseEntity> findAllCrewsByMemberId( @Login final Long loggedInMemberId, @@ -102,18 +97,20 @@ public ResponseEntity> findAllCrewsByMemberId( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberCrewService.findAllCrewsByMemberId(loggedInMemberId, memberId, status)); + .body(memberCrewService.findAllCrewsByMemberId(memberId, status)); } + @Identification @GetMapping("/{memberId}/created-crews") public ResponseEntity> findCreatedCrewsByMemberId( @Login final Long loggedInMemberId, @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberCrewService.findCreatedCrewsByMemberId(loggedInMemberId, memberId)); + .body(memberCrewService.findCreatedCrewsByMemberId(memberId)); } + @Identification @GetMapping("/{memberId}/games") public ResponseEntity> findAllMemberGames( @Login final Long loggedInMemberId, @@ -121,18 +118,20 @@ public ResponseEntity> findAllMemberGames( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberGameService.findAllMemberGames(loggedInMemberId, memberId, status)); + .body(memberGameService.findAllMemberGames(memberId, status)); } + @Identification @GetMapping("/{memberId}/created-games") public ResponseEntity> findAllCreatedGames( @Login final Long loggedInMemberId, @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberGameService.findAllCreatedGames(loggedInMemberId, memberId)); + .body(memberGameService.findAllCreatedGames(memberId)); } + @Identification @GetMapping("/{memberId}/games/{gameId}/registration-status") public ResponseEntity findMemberRegistrationStatusForGame( @Login final Long loggedInMemberId, @@ -140,9 +139,10 @@ public ResponseEntity findMemberRegistrati @PathVariable final Long gameId ) { return ResponseEntity.status(OK) - .body(memberGameService.findMemberRegistrationStatusForGame(loggedInMemberId, memberId, gameId)); + .body(memberGameService.findMemberRegistrationStatusForGame(memberId, gameId)); } + @Identification @GetMapping("/{memberId}/crews/{crewId}/registration-status") public ResponseEntity findMemberRegistrationStatusForCrew( @Login final Long loggedInMemberId, @@ -150,6 +150,6 @@ public ResponseEntity findMemberRegistrati @PathVariable final Long crewId ) { return ResponseEntity.status(OK) - .body(memberCrewService.findMemberRegistrationStatusForCrew(loggedInMemberId, memberId, crewId)); + .body(memberCrewService.findMemberRegistrationStatusForCrew(memberId, crewId)); } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index f140ecc8..e8c8cb90 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -10,11 +10,11 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; @@ -38,12 +38,9 @@ public class MemberCrewService { * 사용자가 가입한 크루 목록 조회 */ public List findAllCrewsByMemberId( - final Long loggedInMemberId, final Long memberId, final RegistrationStatus memberStatus ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readEntityByMemberId(memberId); final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) .stream() @@ -56,9 +53,7 @@ public List findAllCrewsByMemberId( /** * 사용자가 만든 크루 목록 조회 */ - public List findCreatedCrewsByMemberId(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - + public List findCreatedCrewsByMemberId(final Long memberId) { final Member member = memberReader.readEntityByMemberId(memberId); final List crews = crewRepository.findAllByLeaderId(member.getId()); @@ -69,12 +64,9 @@ public List findCreatedCrewsByMemberId(final Long loggedInM * 회원의 크루 가입 신청 여부 조회 */ public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( - final Long loggedInMemberId, final Long memberId, final Long crewId ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); @@ -95,7 +87,8 @@ private List convertToCrewProfileResponses( .toList(); } - private List getMemberResponsesByCrew(final CrewEntity crew, final RegistrationStatus memberStatus) { + private List getMemberResponsesByCrew(final CrewEntity crew, + final RegistrationStatus memberStatus) { return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) .stream() .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index a34279c5..f5062ccb 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -38,12 +38,9 @@ public class MemberGameService { * 사용자의 참여 확정 게스트 모집글 목록 조회 */ public List findAllMemberGames( - final Long loggedInMemberId, final Long memberId, final RegistrationStatus memberStatus ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus); @@ -54,9 +51,7 @@ public List findAllMemberGames( /** * 사용자가 만든 게스트 모집글 목록 조회 */ - public List findAllCreatedGames(final Long loggedInMemberId, final Long memberId) { - validateSelfMemberAccess(loggedInMemberId, memberId); - + public List findAllCreatedGames(final Long memberId) { final Member member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); @@ -67,12 +62,9 @@ public List findAllCreatedGames(final Long loggedInMemberId, * 회원의 게스트 모집 신청 여부 조회 */ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( - final Long loggedInMemberId, final Long memberId, final Long gameId ) { - validateSelfMemberAccess(loggedInMemberId, memberId); - final Member member = memberReader.readEntityByMemberId(memberId); final Game game = gameRepository.getGameById(gameId); @@ -81,13 +73,7 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); } - - private void validateSelfMemberAccess(Long loggedInMemberId, Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } - } - + private List convertToMemberGameResponses( final List memberGames, final RegistrationStatus memberStatus From c2fbbb50ddd097de8def1f4c5ba3bc22dabf9e7f Mon Sep 17 00:00:00 2001 From: changhyeon Date: Fri, 1 Mar 2024 14:58:41 +0900 Subject: [PATCH 051/117] =?UTF-8?q?feat:=20AOP=EB=A1=9C=20=EB=B3=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=B8=EC=A6=9D=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/member/controller/MemberController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/member/controller/MemberController.java b/src/main/java/kr/pickple/back/member/controller/MemberController.java index e7eed92d..e2022d29 100644 --- a/src/main/java/kr/pickple/back/member/controller/MemberController.java +++ b/src/main/java/kr/pickple/back/member/controller/MemberController.java @@ -83,10 +83,8 @@ public ResponseEntity createMember( @GetMapping("/{memberId}") public ResponseEntity findMemberProfileById(@PathVariable final Long memberId) { - final MemberProfileResponse memberProfileResponse = memberService.findMemberProfileById(memberId); - return ResponseEntity.status(OK) - .body(memberProfileResponse); + .body(memberService.findMemberProfileById(memberId)); } @Identification From 855ffbbf0431233a08d7c481e9dc18129ea25a81 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Fri, 1 Mar 2024 15:13:14 +0900 Subject: [PATCH 052/117] =?UTF-8?q?feat:=20Member=EC=99=80=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=EB=90=9C=20Crew=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/crew/domain/CrewProfile.java | 30 +++++++ .../crew/dto/mapper/CrewResponseMapper.java | 35 ++++++++ .../back/crew/implement/CrewMapper.java | 27 ++++++ .../back/crew/implement/CrewReader.java | 38 ++++++++ .../dto/mapper/MemberResponseMapper.java | 6 ++ .../back/member/implement/MemberMapper.java | 6 +- .../back/member/implement/MemberReader.java | 69 +++++++++++++-- .../back/member/implement/MemberWriter.java | 2 +- .../member/service/MemberCrewService.java | 86 ++++--------------- .../back/member/service/MemberService.java | 32 ++----- 10 files changed, 226 insertions(+), 105 deletions(-) create mode 100644 src/main/java/kr/pickple/back/crew/domain/CrewProfile.java diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java b/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java new file mode 100644 index 00000000..d6c1cb5f --- /dev/null +++ b/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java @@ -0,0 +1,30 @@ +package kr.pickple.back.crew.domain; + +import java.util.List; + +import kr.pickple.back.member.domain.MemberDomain; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class CrewProfile { + + private Long crewId; + private String name; + private String content; + private Integer memberCount; + private Integer maxMemberCount; + private String profileImageUrl; + private String backgroundImageUrl; + private CrewStatus status; + private Integer likeCount; + private Integer competitionPoint; + private MemberDomain leader; + private String addressDepth1; + private String addressDepth2; + private List members; +} diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java index 370ba875..ed03ff3d 100644 --- a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -2,12 +2,15 @@ import java.util.List; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.domain.CrewProfile; import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; +import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -59,4 +62,36 @@ public static CrewResponse mapToCrewResponseDto(final Crew crew) { .addressDepth2(crew.getAddressDepth2Name()) .build(); } + + public static List mapToCrewProfilesResponseDto( + final List crewProfiles + ) { + + return crewProfiles.stream() + .map(crewProfile -> CrewProfileResponse.builder() + .id(crewProfile.getCrewId()) + .name(crewProfile.getName()) + .content(crewProfile.getContent()) + .memberCount(crewProfile.getMemberCount()) + .maxMemberCount(crewProfile.getMaxMemberCount()) + .profileImageUrl(crewProfile.getProfileImageUrl()) + .backgroundImageUrl(crewProfile.getBackgroundImageUrl()) + .status(crewProfile.getStatus()) + .likeCount(crewProfile.getLikeCount()) + .competitionPoint(crewProfile.getCompetitionPoint()) + .leader(MemberResponseMapper.mapToMemberResponseDto(crewProfile.getLeader())) + .addressDepth1(crewProfile.getAddressDepth1()) + .addressDepth2(crewProfile.getAddressDepth2()) + .members(MemberResponseMapper.mapToMemberResponseDtos(crewProfile.getMembers())) + .build() + ) + .toList(); + + } + + public static CrewMemberRegistrationStatusResponse mapToCrewMemberRegistrationStatusResponse( + final RegistrationStatus status + ) { + return CrewMemberRegistrationStatusResponse.from(status); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 676f571a..4a1f1348 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -1,9 +1,12 @@ package kr.pickple.back.crew.implement; +import java.util.List; + import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewProfile; import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; @@ -71,4 +74,28 @@ public static CrewMember mapCrewMemberEntityToDomain( .crew(crew) .build(); } + + public static CrewProfile mapCrewEntityToCrewProfile( + final CrewEntity crewEntity, + final MainAddress mainAddress, + final MemberDomain leader, + final List members + ) { + return CrewProfile.builder() + .crewId(crewEntity.getId()) + .name(crewEntity.getName()) + .content(crewEntity.getContent()) + .memberCount(crewEntity.getMemberCount()) + .maxMemberCount(crewEntity.getMaxMemberCount()) + .profileImageUrl(crewEntity.getProfileImageUrl()) + .backgroundImageUrl(crewEntity.getBackgroundImageUrl()) + .status(crewEntity.getStatus()) + .likeCount(crewEntity.getLikeCount()) + .competitionPoint(crewEntity.getCompetitionPoint()) + .leader(leader) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) + .members(members) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index c5f7ae26..fe945d11 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -1,5 +1,6 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; @@ -17,6 +18,7 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewProfile; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; @@ -117,4 +119,40 @@ private MemberDomain readMemberById(final Long memberId) { return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); } + + public List readAllCrewProfilesByMemberIdAndStatus( + final Long memberId, + final RegistrationStatus memberStatus + ) { + final List crewEntities = crewMemberRepository.findAllByMemberIdAndStatus(memberId, memberStatus) + .stream() + .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) + .toList(); + + return mapCrewEntitiesToCrewProfiles(crewEntities, memberStatus); + } + + public List readAllCrewProfilesByLeaderId(final Long memberId) { + final List crewEntities = crewRepository.findAllByLeaderId(memberId); + + return mapCrewEntitiesToCrewProfiles(crewEntities, CONFIRMED); + } + + private List mapCrewEntitiesToCrewProfiles( + final List crewEntities, + final RegistrationStatus registrationStatus + ) { + return crewEntities.stream() + .map(crew -> { + final List members = readAllMembersInStatus(crew.getId(), registrationStatus); + final MainAddress mainAddress = addressReader.readMainAddressById( + crew.getAddressDepth1Id(), + crew.getAddressDepth2Id() + ); + final MemberDomain leader = readMemberById(crew.getLeaderId()); + + return CrewMapper.mapCrewEntityToCrewProfile(crew, mainAddress, leader, members); + }) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index b6f9f3c5..e0a55740 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -66,4 +66,10 @@ public static MemberResponse mapToMemberResponseDto(final MemberDomain member) { .positions(member.getPositions()) .build(); } + + public static List mapToMemberResponseDtos(final List members) { + return members.stream() + .map(MemberResponseMapper::mapToMemberResponseDto) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java index 682c40db..fe0a6cdc 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java @@ -3,6 +3,7 @@ import java.util.List; import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; @@ -44,8 +45,10 @@ public static List mapToMemberPositionEntities( public static MemberProfile mapToMemberProfileDomain( final Member member, final MainAddress mainAddress, - final List positions + final List positions, + final List crews ) { + return MemberProfile.builder() .memberId(member.getId()) .email(member.getEmail()) @@ -56,6 +59,7 @@ public static MemberProfile mapToMemberProfileDomain( .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .positions(positions) + .joinedCrews(crews) .build(); } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index 6acc8983..aef10426 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -1,5 +1,7 @@ package kr.pickple.back.member.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -10,6 +12,15 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.implement.CrewMapper; +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; @@ -26,13 +37,14 @@ public class MemberReader { private final AddressReader addressReader; - private final MemberMapper memberMapper; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; + private final ChatRoomRepository chatRoomRepository; public MemberDomain readByMemberId(final Long memberId) { - final Member memberEntity = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + final Member memberEntity = readEntityByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( memberEntity.getAddressDepth1Id(), @@ -44,7 +56,7 @@ public MemberDomain readByMemberId(final Long memberId) { .map(MemberPosition::getPosition) .toList(); - return memberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); + return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); } public MemberProfile readProfileByMemberId(final Long memberId) { @@ -55,10 +67,50 @@ public MemberProfile readProfileByMemberId(final Long memberId) { ); final List positions = readPositionsByMemberId(memberId); - return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions); + final List crews = readCrewsByMemberId(member.getId()); + + return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions, crews); + } + + private List readCrewsByMemberId(final Long memberId) { + return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) + .stream() + .map(this::readCrewEntityByCrewId) + .map(crewEntity -> { + final MainAddress mainAddress = addressReader.readMainAddressById( + crewEntity.getAddressDepth1Id(), + crewEntity.getAddressDepth2Id() + ); + final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); + + return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); + }) + .toList(); } - public List readPositionsByMemberId(final Long memberId) { + private MemberDomain readMemberById(final Long memberId) { + final Member memberEntity = readEntityByMemberId(memberId); + + final MainAddress mainAddress = addressReader.readMainAddressById( + memberEntity.getAddressDepth1Id(), + memberEntity.getAddressDepth2Id() + ); + + final List positions = memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); + + return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); + } + + private CrewEntity readCrewEntityByCrewId(final CrewMemberEntity crewMember) { + return crewRepository.findById(crewMember.getCrewId()) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewMember.getCrewId())); + } + + private List readPositionsByMemberId(final Long memberId) { return memberPositionRepository.findAllByMemberId(memberId) .stream() .map(MemberPosition::getPosition) @@ -68,9 +120,8 @@ public List readPositionsByMemberId(final Long memberId) { public Optional readByOauthId(final Long oauthId) { return memberRepository.findByOauthId(oauthId); } - - //TODO: member -> memberDomain 변경 작업 후 제거 예정 (김영주) - public Member readEntityByMemberId(final Long memberId) { + + private Member readEntityByMemberId(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java index ba69b420..6ef38dc4 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -48,7 +48,7 @@ public NewMember create(final NewMember newMember) { private void setPositionsToMember(final List positions, final Long memberId) { validateIsDuplicatedPositions(positions); - + final List memberPositions = MemberMapper.mapToMemberPositionEntities(positions, memberId); memberPositionRepository.saveAll(memberPositions); diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index e8c8cb90..613f2544 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -1,27 +1,19 @@ package kr.pickple.back.member.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewProfile; +import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.response.CrewProfileResponse; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.crew.implement.CrewReader; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.MemberResponse; -import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -29,10 +21,8 @@ @Transactional(readOnly = true) public class MemberCrewService { - private final AddressReader addressReader; private final MemberReader memberReader; - private final CrewMemberRepository crewMemberRepository; - private final CrewRepository crewRepository; + private final CrewReader crewReader; /** * 사용자가 가입한 크루 목록 조회 @@ -41,23 +31,23 @@ public List findAllCrewsByMemberId( final Long memberId, final RegistrationStatus memberStatus ) { - final Member member = memberReader.readEntityByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus) - .stream() - .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) - .toList(); + final MemberDomain memberDomain = memberReader.readByMemberId(memberId); + final List crewProfiles = crewReader.readAllCrewProfilesByMemberIdAndStatus( + memberDomain.getMemberId(), + memberStatus + ); - return convertToCrewProfileResponses(crews, memberStatus); + return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); } /** * 사용자가 만든 크루 목록 조회 */ public List findCreatedCrewsByMemberId(final Long memberId) { - final Member member = memberReader.readEntityByMemberId(memberId); - final List crews = crewRepository.findAllByLeaderId(member.getId()); + final MemberDomain memberDomain = memberReader.readByMemberId(memberId); + final List crewProfiles = crewReader.readAllCrewProfilesByLeaderId(memberDomain.getMemberId()); - return convertToCrewProfileResponses(crews, CONFIRMED); + return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); } /** @@ -67,50 +57,8 @@ public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( final Long memberId, final Long crewId ) { - final CrewMemberEntity crewMember = crewMemberRepository.getCrewMemberByCrewIdAndMemberId(crewId, memberId); - - return CrewMemberRegistrationStatusResponse.from(crewMember.getStatus()); - } - - private List convertToCrewProfileResponses( - final List crews, - final RegistrationStatus memberStatus - ) { - - return crews.stream() - .map(crew -> CrewProfileResponse.of( - crew, - getMemberResponsesByCrew(crew, memberStatus), - addressReader.readMainAddressById(crew.getAddressDepth1Id(), crew.getAddressDepth2Id()) - ) - ) - .toList(); - } - - private List getMemberResponsesByCrew(final CrewEntity crew, - final RegistrationStatus memberStatus) { - return crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), memberStatus) - .stream() - .map(crewMember -> memberReader.readEntityByMemberId(crewMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositions(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id() - ) - ) - ) - .toList(); - } - - private List getPositions(final Member member) { - final List memberPositions = memberPositionReader.readAll(member.getId()); - - return Position.fromMemberPositions(memberPositions); - } + final CrewMember crewMember = crewReader.readCrewMember(crewId, memberId); - private void validateSelfMemberAccess(final Long loggedInMemberId, final Long memberId) { - if (!loggedInMemberId.equals(memberId)) { - throw new MemberException(MEMBER_MISMATCH, loggedInMemberId, memberId); - } + return CrewResponseMapper.mapToCrewMemberRegistrationStatusResponse(crewMember.getStatus()); } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberService.java b/src/main/java/kr/pickple/back/member/service/MemberService.java index 2f4a3643..416ee48f 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberService.java @@ -1,21 +1,15 @@ package kr.pickple.back.member.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import java.util.List; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.auth.implement.TokenManager; -import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.dto.mapper.MemberResponseMapper; +import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; +import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.implement.MemberWriter; import lombok.RequiredArgsConstructor; @@ -25,40 +19,28 @@ @Transactional(readOnly = true) public class MemberService { - private final AddressReader addressReader; private final TokenManager tokenManager; private final MemberWriter memberWriter; private final MemberReader memberReader; - private final CrewReader crewReader; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; /** * 사용자 회원가입 (카카오) */ @Transactional - public NewMember createMember(final NewMember newMember) { + public AuthenticatedMemberResponse createMember(final NewMember newMember) { final NewMember savedNewMember = memberWriter.create(newMember); final AuthTokens authTokens = tokenManager.create(savedNewMember.getMemberId()); savedNewMember.updateAuthTokens(authTokens); - return savedNewMember; + return MemberResponseMapper.mapToAuthenticatedMemberResponseDto(savedNewMember); } /** * 사용자 프로필 조회 */ - public MemberProfile findMemberProfileById(final Long memberId) { + public MemberProfileResponse findMemberProfileById(final Long memberId) { final MemberProfile memberProfile = memberReader.readProfileByMemberId(memberId); - final List crews = crewMemberRepository.findAllByMemberIdAndStatus(memberProfile.getMemberId(), - CONFIRMED) - .stream() - .map(crewMember -> crewReader.read(crewMember.getCrewId())) - .toList(); - - memberProfile.updateJoinedCrews(crews); - - return memberProfile; + return MemberResponseMapper.mapToMemberProfileResponseDto(memberProfile); } } From 928ae2488ef13993fe197caa0b6d4747b84a391f Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 28 Feb 2024 19:36:44 +0900 Subject: [PATCH 053/117] =?UTF-8?q?refactor:=20Chat=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8F=B4=EB=8D=94=20=EB=B0=8F=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/chat/implement/ChatMapper.java | 9 +++++++++ .../kr/pickple/back/chat/implement/ChatReader.java | 11 +++++++++++ .../kr/pickple/back/chat/implement/ChatWriter.java | 11 +++++++++++ 3 files changed, 31 insertions(+) create mode 100644 src/main/java/kr/pickple/back/chat/implement/ChatMapper.java create mode 100644 src/main/java/kr/pickple/back/chat/implement/ChatReader.java create mode 100644 src/main/java/kr/pickple/back/chat/implement/ChatWriter.java diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java new file mode 100644 index 00000000..258d3fd3 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -0,0 +1,9 @@ +package kr.pickple.back.chat.implement; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ChatMapper { + +} diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java new file mode 100644 index 00000000..ad466fa8 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -0,0 +1,11 @@ +package kr.pickple.back.chat.implement; + +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class ChatReader { + +} diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java new file mode 100644 index 00000000..16e31396 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -0,0 +1,11 @@ +package kr.pickple.back.chat.implement; + +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class ChatWriter { + +} From dea5f900f47f14e7acab95934db1e0ab61f40bf9 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 2 Mar 2024 18:42:58 +0900 Subject: [PATCH 054/117] =?UTF-8?q?refactor:=20=EC=83=88=EB=A1=9C=EC=9A=B4?= =?UTF-8?q?=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/domain/ChatRoomDomain.java | 34 +++++++++ .../back/chat/implement/ChatMapper.java | 20 ++++++ .../back/chat/implement/ChatWriter.java | 71 +++++++++++++++++++ .../repository/ChatRoomMemberRepository.java | 11 +++ .../chat/repository/ChatRoomRepository.java | 4 ++ .../back/chat/service/ChatRoomService.java | 57 +++++---------- .../back/member/implement/MemberReader.java | 2 +- 7 files changed, 160 insertions(+), 39 deletions(-) create mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java new file mode 100644 index 00000000..7a88a03e --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java @@ -0,0 +1,34 @@ +package kr.pickple.back.chat.domain; + +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + +import java.time.LocalDateTime; + +import kr.pickple.back.chat.exception.ChatException; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ChatRoomDomain { + + private Long chatRoomId; + private String name; + private RoomType type; + private Integer memberCount; + private Integer maxMemberCount; + private LocalDateTime createdAt; + + public void increaseMemberCount() { + if (memberCount.equals(maxMemberCount)) { + throw new ChatException(CHAT_ROOM_IS_FULL, memberCount); + } + + memberCount += 1; + } +} diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java index 258d3fd3..6cdc7baa 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -1,9 +1,29 @@ package kr.pickple.back.chat.implement; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.RoomType; import lombok.AccessLevel; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ChatMapper { + public static ChatRoom mapToChatRoomEntity(final RoomType type, final String name) { + return ChatRoom.builder() + .type(type) + .name(name) + .build(); + } + + public static ChatRoomDomain mapChatRoomEntityToDomain(final ChatRoom chatRoomEntity) { + return ChatRoomDomain.builder() + .chatRoomId(chatRoomEntity.getId()) + .type(chatRoomEntity.getType()) + .name(chatRoomEntity.getName()) + .memberCount(chatRoomEntity.getMemberCount()) + .maxMemberCount(chatRoomEntity.getMaxMemberCount()) + .createdAt(chatRoomEntity.getCreatedAt()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 16e31396..41b411f2 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -1,11 +1,82 @@ package kr.pickple.back.chat.implement; +import static java.lang.Boolean.*; +import static kr.pickple.back.chat.domain.MessageType.*; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatRoomMember; +import kr.pickple.back.chat.domain.MessageType; +import kr.pickple.back.chat.domain.RoomType; +import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.ChatMessageRepository; +import kr.pickple.back.chat.repository.ChatRoomMemberRepository; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @Component +@Transactional @RequiredArgsConstructor public class ChatWriter { + private final ChatRoomRepository chatRoomRepository; + private final ChatRoomMemberRepository chatRoomMemberRepository; + private final ChatMessageRepository chatMessageRepository; + + public ChatRoomDomain createNewRoom(final RoomType type, final String name) { + final ChatRoom chatRoomEntity = ChatMapper.mapToChatRoomEntity(type, name); + final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + + return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); + } + + public void enterRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { + final Long memberId = member.getMemberId(); + final Long chatRoomId = chatRoom.getChatRoomId(); + + if (chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoomId, memberId)) { + throw new ChatException(CHAT_MEMBER_IS_ALREADY_IN_ROOM, chatRoomId, memberId); + } + + activateRoom(chatRoomId, memberId); + chatRoom.increaseMemberCount(); + chatRoomRepository.updateMemberCount(chatRoomId, chatRoom.getMemberCount()); + + sendMessage(ENTER, MessageType.makeEnterMessage(member.getNickname()), member, chatRoom); + } + + private void activateRoom(final Long chatRoomId, final Long memberId) { + if (chatRoomMemberRepository.existsByChatRoomIdAndMemberId(chatRoomId, memberId)) { + chatRoomMemberRepository.updateChatRoomMemberActiveStatus(chatRoomId, memberId, TRUE); + + return; + } + + chatRoomMemberRepository.save(ChatRoomMember.builder() + .memberId(memberId) + .chatRoomId(chatRoomId) + .build()); + } + + private void sendMessage( + final MessageType type, + final String content, + final MemberDomain sender, + final ChatRoomDomain chatRoom + ) { + final ChatMessage chatMessageEntity = ChatMessage.builder() + .type(type) + .content(content) + .senderId(sender.getMemberId()) + .chatRoomId(chatRoom.getChatRoomId()) + .build(); + + chatMessageRepository.save(chatMessageEntity); + } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java index 39fe349d..892e3183 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java @@ -6,6 +6,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.exception.ChatException; @@ -27,6 +28,16 @@ public interface ChatRoomMemberRepository extends JpaRepository findByChatRoomIdAndMemberIdNot(final Long chatRoomId, final Long memberId); + @Query(""" + update ChatRoomMember crm + set crm.active = :activeStatus + where crm.chatRoomId = :chatRoomId and crm.memberId = :memberId""") + void updateChatRoomMemberActiveStatus( + final Long chatRoomId, + final Long memberId, + final Boolean activeStatus + ); + default ChatRoomMember getByMemberIdAndChatRoomId(final Long memberId, final Long chatRoomId) { return findByMemberIdAndChatRoomId(memberId, chatRoomId) .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, memberId, chatRoomId)); diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java index d9d21c93..d1d07b0e 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java @@ -3,12 +3,16 @@ import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.exception.ChatException; public interface ChatRoomRepository extends JpaRepository { + @Query("update ChatRoom cr set cr.memberCount = :memberCount where cr.id = :chatRoomId") + void updateMemberCount(final Long chatRoomId, final Integer memberCount); + default ChatRoom getChatRoomById(final Long chatRoomId) { return findById(chatRoomId).orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, chatRoomId)); } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index e4c551b7..834fd7cc 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -1,25 +1,26 @@ package kr.pickple.back.chat.service; -import static java.text.MessageFormat.*; import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import java.util.List; +import java.text.MessageFormat; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.ChatRoomMember; -import kr.pickple.back.chat.domain.RoomType; -import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; -import kr.pickple.back.chat.dto.response.ChatMemberResponse; +import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -28,52 +29,32 @@ @Transactional(readOnly = true) public class ChatRoomService { + private final MemberReader memberReader; + private final ChatWriter chatWriter; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; private final MemberRepository memberRepository; - private final ChatMessageService chatMessageService; private final ChatValidator chatValidator; /** * 새 1:1 채팅방 생성 */ @Transactional - public ChatRoomDetailResponse createPersonalRoom( - final Long senderId, - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest - ) { - final Long receiverId = personalChatRoomCreateRequest.getReceiverId(); - final Member receiver = memberRepository.getMemberById(receiverId); - final Member sender = memberRepository.getMemberById(senderId); - - chatValidator.validateIsSelfChat(receiver, sender); + public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long receiverId) { + if (senderId.equals(receiverId)) { + throw new ChatException(CHAT_MEMBER_CANNOT_CHAT_SELF, senderId); + } - final String personalRoomName = format("{0},{1}", sender.getNickname(), receiver.getNickname()); - final ChatRoom savedChatRoom = saveNewChatRoom(sender, personalRoomName, PERSONAL); - chatMessageService.enterRoomAndSaveEnteringMessages(savedChatRoom, receiver); + final MemberDomain sender = memberReader.readByMemberId(senderId); + final MemberDomain receiver = memberReader.readByMemberId(receiverId); - return ChatRoomDetailResponse.of(savedChatRoom, receiver, getChatMemberResponses(savedChatRoom)); - } - - private List getChatMemberResponses(final ChatRoom chatRoom) { - return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) - .stream() - .map(chatRoomMember -> memberRepository.getMemberById(chatRoomMember.getMemberId())) - .map(ChatMemberResponse::from) - .toList(); - } - - @Transactional - public ChatRoom saveNewChatRoom(final Member member, final String roomName, final RoomType type) { - final ChatRoom newChatRoom = ChatRoom.builder() - .type(type) - .name(roomName) - .build(); + final String roomName = MessageFormat.format("{0},{1}", sender.getNickname(), receiver.getNickname()); + final ChatRoomDomain chatRoom = chatWriter.createNewRoom(PERSONAL, roomName); - final ChatRoom savedChatRoom = chatRoomRepository.save(newChatRoom); - chatMessageService.enterRoomAndSaveEnteringMessages(savedChatRoom, member); + chatWriter.enterRoom(sender, chatRoom); + chatWriter.enterRoom(receiver, chatRoom); - return savedChatRoom; + return ChatResponseMapper.mapToPersonalChatRoomDetailResponseDto(sender, receiver, chatRoom); } /** diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index aef10426..2fb6f285 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -120,7 +120,7 @@ private List readPositionsByMemberId(final Long memberId) { public Optional readByOauthId(final Long oauthId) { return memberRepository.findByOauthId(oauthId); } - + private Member readEntityByMemberId(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); From 793b98f46723b2beb8dcb6511347c49bb71daae0 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 2 Mar 2024 18:43:59 +0900 Subject: [PATCH 055/117] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20DTO=20=EB=A7=A4=ED=8D=BC=20=EB=B3=84?= =?UTF-8?q?=EB=8F=84=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 2 +- .../chat/dto/mapper/ChatResponseMapper.java | 40 +++++++++++++++++++ .../chat/dto/response/ChatMemberResponse.java | 9 ----- 3 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java diff --git a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java index f1c9169b..22387ca3 100644 --- a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java +++ b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java @@ -37,7 +37,7 @@ public ResponseEntity createPersonalRoom( @RequestBody final PersonalChatRoomCreateRequest personalChatRoomCreateRequest ) { return ResponseEntity.status(CREATED) - .body(chatRoomService.createPersonalRoom(senderId, personalChatRoomCreateRequest)); + .body(chatRoomService.createPersonalRoom(senderId, personalChatRoomCreateRequest.getReceiverId())); } @GetMapping("/personal") diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java new file mode 100644 index 00000000..1a8befa9 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -0,0 +1,40 @@ +package kr.pickple.back.chat.dto.mapper; + +import java.util.List; + +import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.dto.response.ChatMemberResponse; +import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; +import kr.pickple.back.member.domain.MemberDomain; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class ChatResponseMapper { + + public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( + final MemberDomain sender, + final MemberDomain receiver, + final ChatRoomDomain chatRoom + ) { + return ChatRoomDetailResponse.builder() + .id(chatRoom.getChatRoomId()) + .roomName(receiver.getNickname()) + .roomIconImageUrl(receiver.getProfileImageUrl()) + .type(chatRoom.getType()) + .domainId(receiver.getMemberId()) + .memberCount(chatRoom.getMemberCount()) + .maxMemberCount(chatRoom.getMaxMemberCount()) + .members(List.of(mapToChatMemberResponseDto(sender), mapToChatMemberResponseDto(receiver))) + .createdAt(chatRoom.getCreatedAt()) + .build(); + } + + public static ChatMemberResponse mapToChatMemberResponseDto(final MemberDomain member) { + return ChatMemberResponse.builder() + .id(member.getMemberId()) + .nickname(member.getNickname()) + .profileImageUrl(member.getProfileImageUrl()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatMemberResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatMemberResponse.java index b778d70d..6a4d0b80 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatMemberResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatMemberResponse.java @@ -1,6 +1,5 @@ package kr.pickple.back.chat.dto.response; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -14,12 +13,4 @@ public class ChatMemberResponse { private Long id; private String nickname; private String profileImageUrl; - - public static ChatMemberResponse from(final Member member) { - return ChatMemberResponse.builder() - .id(member.getId()) - .nickname(member.getNickname()) - .profileImageUrl(member.getProfileImageUrl()) - .build(); - } } From 25dd5c6d873fe064df78804d4adf01bb8217f82b Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 2 Mar 2024 18:50:05 +0900 Subject: [PATCH 056/117] =?UTF-8?q?test:=20=EC=83=88=20=EA=B0=9C=EC=9D=B8?= =?UTF-8?q?=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD=EC=9C=BC=EB=A1=9C,=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=EB=8F=84=20?= =?UTF-8?q?=EA=B0=99=EC=9D=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/docs/ChatMessageDocumentTest.java | 2 +- .../pickple/back/chat/docs/ChatRoomDocumentTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java index 5be48f9f..50a3abdc 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java @@ -43,7 +43,7 @@ void findAllMessagesInRoom_ReturnChatMessageResponses() throws Exception { final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom(sender.getId(), - personalChatRoomCreateRequest); + personalChatRoomCreateRequest.getReceiverId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java index 4168f22b..1d8a4de6 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java @@ -44,7 +44,7 @@ void createPersonalRoom_ReturnChatRoomDetailResponse() throws Exception { final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest); + chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest.getReceiverId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); final String requestBody = objectMapper.writeValueAsString(personalChatRoomCreateRequest); @@ -123,7 +123,7 @@ void findActivePersonalChatRoomWithReceiver_ReturnPersonalChatRoomExistedRespons final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest); + chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest.getReceiverId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); @@ -175,11 +175,11 @@ void findAllActiveChatRoomsByType_ReturnChatRoomResponses() throws Exception { final PersonalChatRoomCreateRequest personalChatRoomCreateRequest1 = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver1.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest1); + chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest1.getReceiverId()); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest2 = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver2.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest2); + chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest2.getReceiverId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); @@ -248,7 +248,7 @@ void findChatRoomById_ReturnChatRoomDetailResponse() throws Exception { final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom(sender.getId(), - personalChatRoomCreateRequest); + personalChatRoomCreateRequest.getReceiverId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); From e70f83313e753abade3acedf41e9d7a992071c9c Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 14:17:26 +0900 Subject: [PATCH 057/117] =?UTF-8?q?refactor:=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EC=99=80=EC=9D=98=201:1=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=A1=B4=EC=9E=AC=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 6 +- .../back/chat/domain/ChatRoomDomain.java | 4 + .../back/chat/domain/ChatRoomMember.java | 7 +- .../chat/domain/PersonalChatRoomStatus.java | 15 ++++ .../chat/dto/mapper/ChatResponseMapper.java | 11 +++ ...va => PersonalChatRoomStatusResponse.java} | 7 +- .../back/chat/implement/ChatMapper.java | 8 -- .../back/chat/implement/ChatReader.java | 80 +++++++++++++++++++ .../back/chat/implement/ChatWriter.java | 5 +- .../back/chat/service/ChatRoomService.java | 48 +++-------- 10 files changed, 136 insertions(+), 55 deletions(-) create mode 100644 src/main/java/kr/pickple/back/chat/domain/PersonalChatRoomStatus.java rename src/main/java/kr/pickple/back/chat/dto/response/{PersonalChatRoomExistedResponse.java => PersonalChatRoomStatusResponse.java} (52%) diff --git a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java index 22387ca3..f166aad3 100644 --- a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java +++ b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java @@ -18,7 +18,7 @@ import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; -import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; +import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; import kr.pickple.back.chat.service.ChatRoomFindService; import kr.pickple.back.chat.service.ChatRoomService; import lombok.RequiredArgsConstructor; @@ -41,12 +41,12 @@ public ResponseEntity createPersonalRoom( } @GetMapping("/personal") - public ResponseEntity findActivePersonalChatRoomWithReceiver( + public ResponseEntity findPersonalChatRoomStatus( @Login final Long senderId, @RequestParam("receiver") final Long receiverId ) { return ResponseEntity.status(OK) - .body(chatRoomService.findActivePersonalChatRoomWithReceiver(senderId, receiverId)); + .body(chatRoomService.findPersonalChatRoomStatus(senderId, receiverId)); } @GetMapping diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java index 7a88a03e..86b45f3d 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java @@ -31,4 +31,8 @@ public void increaseMemberCount() { memberCount += 1; } + + public Boolean isMatchedRoomType(final RoomType type) { + return this.type == type; + } } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java index 645a00be..966057c0 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java @@ -18,6 +18,7 @@ import lombok.NoArgsConstructor; @Entity +@Getter @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"member_id", "chat_room_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(of = {"memberId", "chatRoomId"}, callSuper = false) @@ -30,12 +31,10 @@ public class ChatRoomMember extends BaseEntity { @NotNull private Boolean active = TRUE; - @Getter @NotNull @Column(name = "member_id") private Long memberId; - @Getter @NotNull @Column(name = "chat_room_id") private Long chatRoomId; @@ -53,8 +52,4 @@ public void activate() { public void deactivate() { active = FALSE; } - - public Boolean isActive() { - return active; - } } diff --git a/src/main/java/kr/pickple/back/chat/domain/PersonalChatRoomStatus.java b/src/main/java/kr/pickple/back/chat/domain/PersonalChatRoomStatus.java new file mode 100644 index 00000000..ae74a745 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/domain/PersonalChatRoomStatus.java @@ -0,0 +1,15 @@ +package kr.pickple.back.chat.domain; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PersonalChatRoomStatus { + + private Long roomId; + private Boolean isSenderActive; +} diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java index 1a8befa9..569156ad 100644 --- a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -3,8 +3,10 @@ import java.util.List; import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; +import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -37,4 +39,13 @@ public static ChatMemberResponse mapToChatMemberResponseDto(final MemberDomain m .profileImageUrl(member.getProfileImageUrl()) .build(); } + + public static PersonalChatRoomStatusResponse mapToPersonalChatRoomStatusResponseDto( + final PersonalChatRoomStatus personalChatRoomStatus + ) { + return PersonalChatRoomStatusResponse.builder() + .roomId(personalChatRoomStatus.getRoomId()) + .isSenderActive(personalChatRoomStatus.getIsSenderActive()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomStatusResponse.java similarity index 52% rename from src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java rename to src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomStatusResponse.java index 6c701354..80ebfc5a 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomExistedResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/PersonalChatRoomStatusResponse.java @@ -1,11 +1,14 @@ package kr.pickple.back.chat.dto.response; +import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "of") -public class PersonalChatRoomExistedResponse { +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PersonalChatRoomStatusResponse { private Long roomId; private Boolean isSenderActive; diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java index 6cdc7baa..728223f0 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -2,20 +2,12 @@ import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; -import kr.pickple.back.chat.domain.RoomType; import lombok.AccessLevel; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ChatMapper { - public static ChatRoom mapToChatRoomEntity(final RoomType type, final String name) { - return ChatRoom.builder() - .type(type) - .name(name) - .build(); - } - public static ChatRoomDomain mapChatRoomEntityToDomain(final ChatRoom chatRoomEntity) { return ChatRoomDomain.builder() .chatRoomId(chatRoomEntity.getId()) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index ad466fa8..320234d8 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -1,11 +1,91 @@ package kr.pickple.back.chat.implement; +import static kr.pickple.back.chat.domain.RoomType.*; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.util.List; + import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatRoomMember; +import kr.pickple.back.chat.domain.PersonalChatRoomStatus; +import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.ChatRoomMemberRepository; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.implement.MemberMapper; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor +@Transactional(readOnly = true) public class ChatReader { + private final AddressReader addressReader; + private final MemberRepository memberRepository; + private final MemberPositionRepository memberPositionRepository; + private final ChatRoomRepository chatRoomRepository; + private final ChatRoomMemberRepository chatRoomMemberRepository; + + public ChatRoomDomain readRoom(final Long chatRoomId) { + final ChatRoom chatRoomEntity = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, chatRoomId)); + + return ChatMapper.mapChatRoomEntityToDomain(chatRoomEntity); + } + + public PersonalChatRoomStatus readPersonalRoomStatus(final Long senderId, final Long receiverId) { + final ChatRoomMember receiverEntity = chatRoomMemberRepository.findAllByMemberId(senderId) + .stream() + .filter(chatRoomMemberEntity -> { + final ChatRoomDomain chatRoom = readRoom(chatRoomMemberEntity.getChatRoomId()); + final Long chatRoomId = chatRoom.getChatRoomId(); + + return chatRoom.isMatchedRoomType(PERSONAL) + && chatRoomMemberRepository.existsByChatRoomIdAndMemberId(chatRoomId, receiverId); + }) + .findFirst() + .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND)); + + return PersonalChatRoomStatus.builder() + .roomId(receiverEntity.getChatRoomId()) + .isSenderActive(receiverEntity.getActive()) + .build(); + } + + public List readRoomMembers(final ChatRoom chatRoom) { + return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) + .stream() + .map(chatRoomMember -> readMemberById(chatRoomMember.getMemberId())) + .toList(); + } + + private MemberDomain readMemberById(final Long memberId) { + final Member memberEntity = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + + final MainAddress mainAddress = addressReader.readMainAddressById( + memberEntity.getAddressDepth1Id(), + memberEntity.getAddressDepth2Id() + ); + + final List positions = memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPosition::getPosition) + .toList(); + + return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); + } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 41b411f2..59c34545 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -30,7 +30,10 @@ public class ChatWriter { private final ChatMessageRepository chatMessageRepository; public ChatRoomDomain createNewRoom(final RoomType type, final String name) { - final ChatRoom chatRoomEntity = ChatMapper.mapToChatRoomEntity(type, name); + final ChatRoom chatRoomEntity = ChatRoom.builder() + .type(type) + .name(name) + .build(); final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index 834fd7cc..aa40d2b6 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -8,20 +8,16 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; -import kr.pickple.back.chat.domain.ChatRoomMember; +import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; -import kr.pickple.back.chat.dto.response.PersonalChatRoomExistedResponse; +import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.chat.implement.ChatWriter; -import kr.pickple.back.chat.repository.ChatRoomMemberRepository; -import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -30,20 +26,15 @@ public class ChatRoomService { private final MemberReader memberReader; + private final ChatReader chatReader; private final ChatWriter chatWriter; - private final ChatRoomRepository chatRoomRepository; - private final ChatRoomMemberRepository chatRoomMemberRepository; - private final MemberRepository memberRepository; - private final ChatValidator chatValidator; /** * 새 1:1 채팅방 생성 */ @Transactional public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long receiverId) { - if (senderId.equals(receiverId)) { - throw new ChatException(CHAT_MEMBER_CANNOT_CHAT_SELF, senderId); - } + validateSelfChat(senderId, receiverId); final MemberDomain sender = memberReader.readByMemberId(senderId); final MemberDomain receiver = memberReader.readByMemberId(receiverId); @@ -60,33 +51,20 @@ public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long /** * 특정 사용자와의 1:1 채팅방 존재 여부 조회 */ - public PersonalChatRoomExistedResponse findActivePersonalChatRoomWithReceiver( + public PersonalChatRoomStatusResponse findPersonalChatRoomStatus( final Long senderId, final Long receiverId ) { - final Member sender = memberRepository.getMemberById(senderId); - final Member receiver = memberRepository.getMemberById(receiverId); - - chatValidator.validateIsSelfChat(receiver, sender); + validateSelfChat(senderId, receiverId); - final ChatRoomMember foundChatRoomMember = chatRoomMemberRepository.findAllByMemberId(sender.getId()) - .stream() - .filter(chatRoomMember -> existsReceiverInPersonalChatRoom( - receiver, - chatRoomRepository.getChatRoomById(chatRoomMember.getChatRoomId()) - ) - ) - .findFirst() - .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND)); + final PersonalChatRoomStatus personalChatRoomStatus = chatReader.readPersonalRoomStatus(senderId, receiverId); - final Long personalChatRoomId = foundChatRoomMember.getChatRoomId(); - final Boolean isSenderActive = foundChatRoomMember.isActive(); - - return PersonalChatRoomExistedResponse.of(personalChatRoomId, isSenderActive); + return ChatResponseMapper.mapToPersonalChatRoomStatusResponseDto(personalChatRoomStatus); } - private Boolean existsReceiverInPersonalChatRoom(final Member receiver, final ChatRoom chatRoom) { - return chatRoom.isMatchedRoomType(PERSONAL) - && chatRoomMemberRepository.existsByChatRoomIdAndMemberId(chatRoom.getId(), receiver.getId()); + private void validateSelfChat(final Long senderId, final Long receiverId) { + if (senderId.equals(receiverId)) { + throw new ChatException(CHAT_MEMBER_CANNOT_CHAT_SELF, senderId); + } } } From 59c5c34270eedb41cd4fed1781ede94f210a31de Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 19:09:58 +0900 Subject: [PATCH 058/117] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=A4=91=EC=9D=B8=20=EB=AA=A8=EB=93=A0=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 4 +- .../back/chat/domain/ChatMessageDomain.java | 24 +++++ .../kr/pickple/back/chat/domain/ChatRoom.java | 7 +- .../chat/dto/mapper/ChatResponseMapper.java | 75 +++++++++++++++- .../dto/response/ChatRoomDetailResponse.java | 59 ------------ .../chat/dto/response/ChatRoomResponse.java | 20 ----- .../back/chat/implement/ChatMapper.java | 18 ++++ .../back/chat/implement/ChatReader.java | 53 +++++------ .../back/chat/implement/ChatWriter.java | 16 +++- .../repository/ChatMessageRepository.java | 6 +- .../repository/ChatRoomMemberRepository.java | 5 -- .../chat/service/ChatRoomFindService.java | 89 ++++++++----------- .../back/chat/service/ChatRoomService.java | 3 +- .../kr/pickple/back/crew/domain/Crew.java | 1 - .../back/crew/implement/CrewMapper.java | 4 +- .../back/crew/implement/CrewReader.java | 32 ++++--- .../back/crew/implement/CrewWriter.java | 3 +- .../back/member/implement/MemberReader.java | 4 + 18 files changed, 231 insertions(+), 192 deletions(-) create mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java diff --git a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java index f166aad3..6320085b 100644 --- a/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java +++ b/src/main/java/kr/pickple/back/chat/controller/ChatRoomController.java @@ -50,12 +50,12 @@ public ResponseEntity findPersonalChatRoomStatus } @GetMapping - public ResponseEntity> findAllActiveChatRoomsByType( + public ResponseEntity> findAllEnteringChatRoomsByType( @Login final Long loggedInMemberId, @RequestParam final RoomType type ) { return ResponseEntity.status(OK) - .body(chatRoomFindService.findAllActiveChatRoomsByType(loggedInMemberId, type)); + .body(chatRoomFindService.findAllEnteringChatRoomsByType(loggedInMemberId, type)); } @GetMapping("/{roomId}") diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java new file mode 100644 index 00000000..8c29a6ef --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java @@ -0,0 +1,24 @@ +package kr.pickple.back.chat.domain; + +import java.time.LocalDateTime; + +import kr.pickple.back.member.domain.MemberDomain; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ChatMessageDomain { + + private Long chatMessageId; + private MessageType type; + private String content; + private MemberDomain sender; + private ChatRoomDomain chatRoom; + private LocalDateTime createdAt; +} diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java index df420a11..78e77f42 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java @@ -41,9 +41,10 @@ public class ChatRoom extends BaseEntity { private Integer maxMemberCount = 2; @Builder - private ChatRoom(final String name, final RoomType type) { + private ChatRoom(final String name, final RoomType type, final Integer maxMemberCount) { this.name = name; this.type = type; + this.maxMemberCount = maxMemberCount; } public void increaseMemberCount() { @@ -70,10 +71,6 @@ public Boolean isEmpty() { return memberCount == 0; } - public Boolean isMatchedRoomType(final RoomType type) { - return this.type == type; - } - public void updateMaxMemberCount(final Integer maxMemberCount) { if (maxMemberCount < memberCount) { throw new ChatException(CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT, maxMemberCount); diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java index 569156ad..b32b1f28 100644 --- a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -2,11 +2,15 @@ import java.util.List; +import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; +import kr.pickple.back.chat.dto.response.ChatRoomResponse; import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -14,11 +18,35 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ChatResponseMapper { + public static ChatRoomResponse mapToChatRoomResponseDto( + final ChatMessageDomain lastChatMessage, + final ChatRoomDetailResponse chatRoomDetailResponse + ) { + return ChatRoomResponse.builder() + .id(chatRoomDetailResponse.getId()) + .roomName(chatRoomDetailResponse.getRoomName()) + .roomIconImageUrl(chatRoomDetailResponse.getRoomIconImageUrl()) + .type(chatRoomDetailResponse.getType()) + .memberCount(chatRoomDetailResponse.getMemberCount()) + .maxMemberCount(chatRoomDetailResponse.getMaxMemberCount()) + .playStartTime(chatRoomDetailResponse.getPlayStartTime()) + .playTimeMinutes(chatRoomDetailResponse.getPlayTimeMinutes()) + .lastMessageContent(lastChatMessage.getContent()) + .lastMessageCreatedAt(lastChatMessage.getCreatedAt()) + .createdAt(chatRoomDetailResponse.getCreatedAt()) + .build(); + } + public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( final MemberDomain sender, final MemberDomain receiver, final ChatRoomDomain chatRoom ) { + final List chatMemberResponses = List.of( + mapToChatMemberResponseDto(sender), + mapToChatMemberResponseDto(receiver) + ); + return ChatRoomDetailResponse.builder() .id(chatRoom.getChatRoomId()) .roomName(receiver.getNickname()) @@ -27,7 +55,52 @@ public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( .domainId(receiver.getMemberId()) .memberCount(chatRoom.getMemberCount()) .maxMemberCount(chatRoom.getMaxMemberCount()) - .members(List.of(mapToChatMemberResponseDto(sender), mapToChatMemberResponseDto(receiver))) + .members(chatMemberResponses) + .createdAt(chatRoom.getCreatedAt()) + .build(); + } + + public static ChatRoomDetailResponse mapToCrewChatRoomDetailResponseDto( + final Crew crew, + final ChatRoomDomain chatRoom, + final List members + ) { + final List chatMemberResponses = members.stream() + .map(ChatResponseMapper::mapToChatMemberResponseDto) + .toList(); + + return ChatRoomDetailResponse.builder() + .id(chatRoom.getChatRoomId()) + .roomName(chatRoom.getName()) + .roomIconImageUrl(crew.getProfileImageUrl()) + .type(chatRoom.getType()) + .domainId(crew.getCrewId()) + .memberCount(chatRoom.getMemberCount()) + .maxMemberCount(chatRoom.getMaxMemberCount()) + .members(chatMemberResponses) + .createdAt(chatRoom.getCreatedAt()) + .build(); + } + + public static ChatRoomDetailResponse mapToGameChatRoomDetailResponseDto( + final Game game, + final ChatRoomDomain chatRoom, + final List members + ) { + final List chatMemberResponses = members.stream() + .map(ChatResponseMapper::mapToChatMemberResponseDto) + .toList(); + + return ChatRoomDetailResponse.builder() + .id(chatRoom.getChatRoomId()) + .roomName(chatRoom.getName()) + .type(chatRoom.getType()) + .domainId(game.getId()) + .memberCount(chatRoom.getMemberCount()) + .maxMemberCount(chatRoom.getMaxMemberCount()) + .playStartTime(game.getPlayStartTime()) + .playTimeMinutes(game.getPlayTimeMinutes()) + .members(chatMemberResponses) .createdAt(chatRoom.getCreatedAt()) .build(); } diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java index 1e537f00..6356c802 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomDetailResponse.java @@ -4,11 +4,7 @@ import java.time.LocalTime; import java.util.List; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.RoomType; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -30,59 +26,4 @@ public class ChatRoomDetailResponse { private Integer playTimeMinutes; private List members; private LocalDateTime createdAt; - - public static ChatRoomDetailResponse of( - final ChatRoom chatRoom, - final Member receiver, - final List chatMemberResponses - ) { - return ChatRoomDetailResponse.builder() - .id(chatRoom.getId()) - .roomName(receiver.getNickname()) - .roomIconImageUrl(receiver.getProfileImageUrl()) - .type(chatRoom.getType()) - .domainId(receiver.getId()) - .memberCount(chatRoom.getMemberCount()) - .maxMemberCount(chatRoom.getMaxMemberCount()) - .members(chatMemberResponses) - .createdAt(chatRoom.getCreatedAt()) - .build(); - } - - public static ChatRoomDetailResponse of( - final ChatRoom chatRoom, - final Game game, - final List chatMemberResponses - ) { - return ChatRoomDetailResponse.builder() - .id(chatRoom.getId()) - .roomName(chatRoom.getName()) - .type(chatRoom.getType()) - .domainId(game.getId()) - .memberCount(chatRoom.getMemberCount()) - .maxMemberCount(chatRoom.getMaxMemberCount()) - .playStartTime(game.getPlayStartTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .members(chatMemberResponses) - .createdAt(chatRoom.getCreatedAt()) - .build(); - } - - public static ChatRoomDetailResponse of( - final ChatRoom chatRoom, - final CrewEntity crew, - final List chatMemberResponses - ) { - return ChatRoomDetailResponse.builder() - .id(chatRoom.getId()) - .roomName(chatRoom.getName()) - .roomIconImageUrl(crew.getProfileImageUrl()) - .type(chatRoom.getType()) - .domainId(crew.getId()) - .memberCount(chatRoom.getMemberCount()) - .maxMemberCount(chatRoom.getMaxMemberCount()) - .members(chatMemberResponses) - .createdAt(chatRoom.getCreatedAt()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomResponse.java index 8e65ecfd..2b5d0d80 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatRoomResponse.java @@ -25,24 +25,4 @@ public class ChatRoomResponse { private String lastMessageContent; private LocalDateTime lastMessageCreatedAt; private LocalDateTime createdAt; - - public static ChatRoomResponse of( - final ChatRoomDetailResponse chatRoomDetail, - final String lastMessageContent, - final LocalDateTime lastMessageCreatedAt - ) { - return ChatRoomResponse.builder() - .id(chatRoomDetail.getId()) - .roomName(chatRoomDetail.getRoomName()) - .roomIconImageUrl(chatRoomDetail.getRoomIconImageUrl()) - .type(chatRoomDetail.getType()) - .memberCount(chatRoomDetail.getMemberCount()) - .maxMemberCount(chatRoomDetail.getMaxMemberCount()) - .playStartTime(chatRoomDetail.getPlayStartTime()) - .playTimeMinutes(chatRoomDetail.getPlayTimeMinutes()) - .lastMessageContent(lastMessageContent) - .lastMessageCreatedAt(lastMessageCreatedAt) - .createdAt(chatRoomDetail.getCreatedAt()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java index 728223f0..bfcac715 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -1,7 +1,10 @@ package kr.pickple.back.chat.implement; +import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -18,4 +21,19 @@ public static ChatRoomDomain mapChatRoomEntityToDomain(final ChatRoom chatRoomEn .createdAt(chatRoomEntity.getCreatedAt()) .build(); } + + public static ChatMessageDomain mapChatMessageEntityToDomain( + final ChatMessage chatMessageEntity, + final MemberDomain sender, + final ChatRoomDomain chatRoom + ) { + return ChatMessageDomain.builder() + .chatMessageId(chatMessageEntity.getId()) + .type(chatMessageEntity.getType()) + .content(chatMessageEntity.getContent()) + .sender(sender) + .chatRoom(chatRoom) + .createdAt(chatMessageEntity.getCreatedAt()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index 320234d8..0db93308 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -2,30 +2,25 @@ import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; +import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.implement.MemberMapper; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; +import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @Component @@ -33,11 +28,10 @@ @Transactional(readOnly = true) public class ChatReader { - private final AddressReader addressReader; - private final MemberRepository memberRepository; - private final MemberPositionRepository memberPositionRepository; + private final MemberReader memberReader; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; + private final ChatMessageRepository chatMessageRepository; public ChatRoomDomain readRoom(final Long chatRoomId) { final ChatRoom chatRoomEntity = chatRoomRepository.findById(chatRoomId) @@ -65,27 +59,34 @@ public PersonalChatRoomStatus readPersonalRoomStatus(final Long senderId, final .build(); } - public List readRoomMembers(final ChatRoom chatRoom) { - return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) + public List readEnteringRoomsByType(final Long memberId, final RoomType type) { + return chatRoomMemberRepository.findAllByActiveTrueAndMemberId(memberId) .stream() - .map(chatRoomMember -> readMemberById(chatRoomMember.getMemberId())) + .map(chatRoomMemberEntity -> readRoom(chatRoomMemberEntity.getChatRoomId())) + .filter(chatRoom -> chatRoom.isMatchedRoomType(type)) .toList(); } - private MemberDomain readMemberById(final Long memberId) { - final Member memberEntity = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + public MemberDomain readReceiver(final Long senderId, final Long chatRoomId) { + final ChatRoomMember receiverEntity = chatRoomMemberRepository.findByChatRoomIdAndMemberIdNot( + chatRoomId, senderId) + .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); - final MainAddress mainAddress = addressReader.readMainAddressById( - memberEntity.getAddressDepth1Id(), - memberEntity.getAddressDepth2Id() - ); + return memberReader.readByMemberId(receiverEntity.getMemberId()); + } - final List positions = memberPositionRepository.findAllByMemberId(memberId) + public List readRoomMembers(final Long chatRoomId) { + return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoomId) .stream() - .map(MemberPosition::getPosition) + .map(chatRoomMember -> memberReader.readByMemberId(chatRoomMember.getMemberId())) .toList(); + } + + public ChatMessageDomain readLastMessage(final ChatRoomDomain chatRoom) { + final ChatMessage lastMessageEntity = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc( + chatRoom.getChatRoomId()); + final MemberDomain sender = memberReader.readByMemberId(lastMessageEntity.getSenderId()); - return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); + return ChatMapper.mapChatMessageEntityToDomain(lastMessageEntity, sender, chatRoom); } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 59c34545..9ce51d6b 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -2,6 +2,7 @@ import static java.lang.Boolean.*; import static kr.pickple.back.chat.domain.MessageType.*; +import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import org.springframework.stereotype.Component; @@ -29,10 +30,21 @@ public class ChatWriter { private final ChatRoomMemberRepository chatRoomMemberRepository; private final ChatMessageRepository chatMessageRepository; - public ChatRoomDomain createNewRoom(final RoomType type, final String name) { + public ChatRoomDomain createNewPersonalRoom(final String name) { + final ChatRoom chatRoomEntity = ChatRoom.builder() + .name(name) + .type(PERSONAL) + .build(); + final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + + return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); + } + + public ChatRoomDomain createNewGroupRoom(final String name, final RoomType type, final Integer maxMemberCount) { final ChatRoom chatRoomEntity = ChatRoom.builder() - .type(type) .name(name) + .type(type) + .maxMemberCount(maxMemberCount) .build(); final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 4446cd11..071eb7d2 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -23,8 +23,10 @@ public interface ChatMessageRepository extends JpaRepository """) Optional findLastEnteringChatMessageBySenderId(final Long senderId); - List findAllByChatRoomIdAndCreatedAtGreaterThanEqual(final Long chatRoomId, - final LocalDateTime createdAt); + List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( + final Long chatRoomId, + final LocalDateTime createdAt + ); ChatMessage findTopByChatRoomIdOrderByCreatedAtDesc(final Long chatRoomId); diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java index 892e3183..a2f3e3d1 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java @@ -42,9 +42,4 @@ default ChatRoomMember getByMemberIdAndChatRoomId(final Long memberId, final Lon return findByMemberIdAndChatRoomId(memberId, chatRoomId) .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, memberId, chatRoomId)); } - - default ChatRoomMember getPersonalChatRoomReceiver(final Long chatRoomId, final Long senderId) { - return findByChatRoomIdAndMemberIdNot(chatRoomId, senderId) - .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); - } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index dca2efde..7008954d 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -1,28 +1,29 @@ package kr.pickple.back.chat.service; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.RoomType; -import kr.pickple.back.chat.dto.response.ChatMemberResponse; +import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.chat.repository.ChatMessageRepository; -import kr.pickple.back.chat.repository.ChatRoomMemberRepository; +import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @Service @@ -30,32 +31,26 @@ @Transactional(readOnly = true) public class ChatRoomFindService { - private final ChatMessageRepository chatMessageRepository; + private final MemberReader memberReader; + private final CrewReader crewReader; + private final ChatReader chatReader; private final ChatRoomRepository chatRoomRepository; - private final ChatRoomMemberRepository chatRoomMemberRepository; - private final MemberRepository memberRepository; - private final CrewRepository crewRepository; private final GameRepository gameRepository; /** * 채팅방 타입에 따른 참여중인 모든 채팅방 목록 조회 */ - public List findAllActiveChatRoomsByType(final Long loggedInMemberId, final RoomType type) { - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); + public List findAllEnteringChatRoomsByType(final Long loggedInMemberId, final RoomType type) { + if (!memberReader.existsByMemberId(loggedInMemberId)) { + throw new MemberException(MEMBER_NOT_FOUND, loggedInMemberId); + } - return chatRoomMemberRepository.findAllByActiveTrueAndMemberId(loggedInMember.getId()) + return chatReader.readEnteringRoomsByType(loggedInMemberId, type) .stream() - .map(chatRoomMember -> chatRoomRepository.getChatRoomById(chatRoomMember.getChatRoomId())) - .filter(chatRoom -> chatRoom.isMatchedRoomType(type)) - .map(chatRoom -> getChatRoomResponse(loggedInMemberId, chatRoom)) - .toList(); - } - - private ChatRoomResponse getChatRoomResponse(final Long loggedInMemberId, final ChatRoom chatRoom) { - final ChatMessage lastMessage = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc(chatRoom.getId()); - final ChatRoomDetailResponse chatRoomDetail = getChatRoomDetailResponse(loggedInMemberId, chatRoom); - - return ChatRoomResponse.of(chatRoomDetail, lastMessage.getContent(), lastMessage.getCreatedAt()); + .map(chatRoom -> ChatResponseMapper.mapToChatRoomResponseDto( + chatReader.readLastMessage(chatRoom), + getChatRoomDetailResponse(loggedInMemberId, chatRoom)) + ).toList(); } /** @@ -67,42 +62,36 @@ public ChatRoomDetailResponse findChatRoomById(final Long loggedInMemberId, fina return getChatRoomDetailResponse(loggedInMemberId, chatRoom); } - private ChatRoomDetailResponse getChatRoomDetailResponse(final Long loggedInMemberId, final ChatRoom chatRoom) { + private ChatRoomDetailResponse getChatRoomDetailResponse(final Long memberId, final ChatRoomDomain chatRoom) { return switch (chatRoom.getType()) { - case PERSONAL -> getPersonalChatRoomDetailResponse(loggedInMemberId, chatRoom); + case PERSONAL -> getPersonalChatRoomDetailResponse(memberId, chatRoom); case CREW -> getCrewChatRoomDetailResponse(chatRoom); case GAME -> getGameChatRoomDetailResponse(chatRoom); }; } - private ChatRoomDetailResponse getPersonalChatRoomDetailResponse(final Long memberId, final ChatRoom chatRoom) { - final Member sender = memberRepository.getMemberById(memberId); - final Long receiverId = chatRoomMemberRepository.getPersonalChatRoomReceiver(chatRoom.getId(), sender.getId()) - .getMemberId(); - final Member receiver = memberRepository.getMemberById(receiverId); + private ChatRoomDetailResponse getPersonalChatRoomDetailResponse( + final Long senderId, + final ChatRoomDomain chatRoom + ) { + final MemberDomain sender = memberReader.readByMemberId(senderId); + final MemberDomain receiver = chatReader.readReceiver(senderId, chatRoom.getChatRoomId()); - return ChatRoomDetailResponse.of(chatRoom, receiver, getChatMemberResponses(chatRoom)); + return ChatResponseMapper.mapToPersonalChatRoomDetailResponseDto(sender, receiver, chatRoom); } - private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { - final CrewEntity crew = crewRepository.findByChatRoomId(chatRoom.getId()) - .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoom.getId())); + private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoomDomain chatRoom) { + final Crew crew = crewReader.readByChatRoomId(chatRoom.getChatRoomId()); + final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); - return ChatRoomDetailResponse.of(chatRoom, crew, getChatMemberResponses(chatRoom)); + return ChatResponseMapper.mapToCrewChatRoomDetailResponseDto(crew, chatRoom, members); } - private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chatRoom) { - final Game game = gameRepository.findByChatRoomId(chatRoom.getId()) - .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getId())); + private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoomDomain chatRoom) { + final Game game = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()) + .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getChatRoomId())); + final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); - return ChatRoomDetailResponse.of(chatRoom, game, getChatMemberResponses(chatRoom)); - } - - private List getChatMemberResponses(final ChatRoom chatRoom) { - return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoom.getId()) - .stream() - .map(chatRoomMember -> memberRepository.getMemberById(chatRoomMember.getMemberId())) - .map(ChatMemberResponse::from) - .toList(); + return ChatResponseMapper.mapToGameChatRoomDetailResponseDto(game, chatRoom, members); } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index aa40d2b6..1f7fdd13 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -1,6 +1,5 @@ package kr.pickple.back.chat.service; -import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import java.text.MessageFormat; @@ -40,7 +39,7 @@ public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long final MemberDomain receiver = memberReader.readByMemberId(receiverId); final String roomName = MessageFormat.format("{0},{1}", sender.getNickname(), receiver.getNickname()); - final ChatRoomDomain chatRoom = chatWriter.createNewRoom(PERSONAL, roomName); + final ChatRoomDomain chatRoom = chatWriter.createNewPersonalRoom(roomName); chatWriter.enterRoom(sender, chatRoom); chatWriter.enterRoom(receiver, chatRoom); diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 1a0658e1..abec2bb3 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -31,7 +31,6 @@ public class Crew { private String backgroundImageUrl; private Integer likeCount; private Integer competitionPoint; - private ChatRoom chatRoom; public void increaseMemberCount() { if (status == CLOSED) { diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 4a1f1348..15e2ac21 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -34,8 +34,7 @@ public static CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew, final M public static Crew mapCrewEntityToDomain( final CrewEntity crewEntity, final MainAddress mainAddress, - final MemberDomain leader, - final ChatRoom chatRoom + final MemberDomain leader ) { return Crew.builder() .crewId(crewEntity.getId()) @@ -50,7 +49,6 @@ public static Crew mapCrewEntityToDomain( .backgroundImageUrl(crewEntity.getBackgroundImageUrl()) .likeCount(crewEntity.getLikeCount()) .competitionPoint(crewEntity.getCompetitionPoint()) - .chatRoom(chatRoom) .build(); } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index fe945d11..7f947b7e 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -1,5 +1,6 @@ package kr.pickple.back.crew.implement; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; @@ -13,8 +14,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; @@ -44,7 +44,6 @@ public class CrewReader { private final MemberPositionRepository memberPositionRepository; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; - private final ChatRoomRepository chatRoomRepository; public Integer countByLeaderId(final Long leaderId) { return crewRepository.countByLeaderId(leaderId); @@ -54,15 +53,25 @@ public Crew read(final Long crewId) { final CrewEntity crewEntity = crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + return mapCrewEntityToDomain(crewEntity); + } + + public Crew readByChatRoomId(final Long chatRoomId) { + final CrewEntity crewEntity = crewRepository.findByChatRoomId(chatRoomId) + .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoomId)); + + return mapCrewEntityToDomain(crewEntity); + } + + private Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { final MainAddress mainAddress = addressReader.readMainAddressById( crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() ); final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); - return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); + return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader); } public List readNearCrewsByAddress( @@ -78,13 +87,12 @@ public List readNearCrewsByAddress( ); return crewEntities.stream() - .map(crewEntity -> { - final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); - - return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); - }) - .toList(); + .map(crewEntity -> CrewMapper.mapCrewEntityToDomain( + crewEntity, + mainAddress, + readMemberById(crewEntity.getLeaderId()) + ) + ).toList(); } public CrewMember readCrewMember(final Long memberId, final Long crewId) { diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index d9ed4dd5..3555c84c 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -45,8 +45,7 @@ public Crew create(final NewCrew newCrew) { return CrewMapper.mapCrewEntityToDomain( savedCrewEntity, mainAddress, - newCrew.getLeader(), - newCrew.getChatRoom() + newCrew.getLeader() ); } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index 2fb6f285..b5d14562 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -43,6 +43,10 @@ public class MemberReader { private final MemberPositionRepository memberPositionRepository; private final ChatRoomRepository chatRoomRepository; + public Boolean existsByMemberId(final Long memberId) { + return memberRepository.existsById(memberId); + } + public MemberDomain readByMemberId(final Long memberId) { final Member memberEntity = readEntityByMemberId(memberId); From 336d2f671cde52fc9caa157d47193d3fcb33ab40 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 19:12:45 +0900 Subject: [PATCH 059/117] =?UTF-8?q?refactor:=20=EB=8B=A8=EC=9D=BC=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=A0=95=EB=B3=B4=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/chat/service/ChatRoomFindService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index 7008954d..f483e318 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; @@ -56,8 +55,8 @@ public List findAllEnteringChatRoomsByType(final Long loggedIn /** * 단일 채팅방 정보 상세 조회 */ - public ChatRoomDetailResponse findChatRoomById(final Long loggedInMemberId, final Long roomId) { - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); + public ChatRoomDetailResponse findChatRoomById(final Long loggedInMemberId, final Long chatRoomId) { + final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); return getChatRoomDetailResponse(loggedInMemberId, chatRoom); } From 382f0cdee810dde16061e1d47179bddeffeef219 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 19:56:27 +0900 Subject: [PATCH 060/117] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=9E=85=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/dto/mapper/ChatResponseMapper.java | 11 +++++ .../dto/response/ChatMessageResponse.java | 13 ------ .../back/chat/implement/ChatWriter.java | 10 +++-- .../back/chat/service/ChatMessageService.java | 45 +++++++------------ .../back/chat/service/ChatValidator.java | 14 +----- 5 files changed, 33 insertions(+), 60 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java index b32b1f28..3bca5e9d 100644 --- a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -6,6 +6,7 @@ import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.response.ChatMemberResponse; +import kr.pickple.back.chat.dto.response.ChatMessageResponse; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; @@ -121,4 +122,14 @@ public static PersonalChatRoomStatusResponse mapToPersonalChatRoomStatusResponse .isSenderActive(personalChatRoomStatus.getIsSenderActive()) .build(); } + + public static ChatMessageResponse mapToChatMessageResponseDto(final ChatMessageDomain chatMessage) { + return ChatMessageResponse.builder() + .type(chatMessage.getType()) + .content(chatMessage.getContent()) + .sender(mapToChatMemberResponseDto(chatMessage.getSender())) + .roomId(chatMessage.getChatRoom().getChatRoomId()) + .createdAt(chatMessage.getCreatedAt()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java b/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java index a13c06d8..de33a808 100644 --- a/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java +++ b/src/main/java/kr/pickple/back/chat/dto/response/ChatMessageResponse.java @@ -2,10 +2,7 @@ import java.time.LocalDateTime; -import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.MessageType; -import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -21,14 +18,4 @@ public class ChatMessageResponse { private ChatMemberResponse sender; private Long roomId; private LocalDateTime createdAt; - - public static ChatMessageResponse of(final ChatMessage chatMessage, final Member sender, final ChatRoom chatRoom) { - return ChatMessageResponse.builder() - .type(chatMessage.getType()) - .content(chatMessage.getContent()) - .sender(ChatMemberResponse.from(sender)) - .roomId(chatRoom.getId()) - .createdAt(chatMessage.getCreatedAt()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 9ce51d6b..6cf8a949 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.ChatRoomMember; @@ -51,7 +52,7 @@ public ChatRoomDomain createNewGroupRoom(final String name, final RoomType type, return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); } - public void enterRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { + public ChatMessageDomain enterRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { final Long memberId = member.getMemberId(); final Long chatRoomId = chatRoom.getChatRoomId(); @@ -63,7 +64,7 @@ public void enterRoom(final MemberDomain member, final ChatRoomDomain chatRoom) chatRoom.increaseMemberCount(); chatRoomRepository.updateMemberCount(chatRoomId, chatRoom.getMemberCount()); - sendMessage(ENTER, MessageType.makeEnterMessage(member.getNickname()), member, chatRoom); + return sendMessage(ENTER, MessageType.makeEnterMessage(member.getNickname()), member, chatRoom); } private void activateRoom(final Long chatRoomId, final Long memberId) { @@ -79,7 +80,7 @@ private void activateRoom(final Long chatRoomId, final Long memberId) { .build()); } - private void sendMessage( + private ChatMessageDomain sendMessage( final MessageType type, final String content, final MemberDomain sender, @@ -91,7 +92,8 @@ private void sendMessage( .senderId(sender.getMemberId()) .chatRoomId(chatRoom.getChatRoomId()) .build(); + final ChatMessage savedChatMessageEntity = chatMessageRepository.save(chatMessageEntity); - chatMessageRepository.save(chatMessageEntity); + return ChatMapper.mapChatMessageEntityToDomain(savedChatMessageEntity, sender, chatRoom); } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 18ff2ca9..665c2f46 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -8,15 +8,22 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.domain.ChatRoomMember; import kr.pickple.back.chat.domain.MessageType; +import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.request.ChatMessageCreateRequest; import kr.pickple.back.chat.dto.response.ChatMessageResponse; +import kr.pickple.back.chat.implement.ChatReader; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -25,6 +32,9 @@ @Transactional(readOnly = true) public class ChatMessageService { + private final MemberReader memberReader; + private final ChatReader chatReader; + private final ChatWriter chatWriter; private final ChatMessageRepository chatMessageRepository; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; @@ -36,39 +46,14 @@ public class ChatMessageService { */ @Transactional public ChatMessageResponse enterChatRoom( - final Long roomId, + final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member member = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); - final ChatMessage enteringMessage = enterRoomAndSaveEnteringMessages(chatRoom, member); - - return ChatMessageResponse.of(enteringMessage, member, chatRoom); - } - - @Transactional - public ChatMessage enterRoomAndSaveEnteringMessages(final ChatRoom chatRoom, final Member member) { - chatValidator.validateIsNotExistedRoomMember(chatRoom, member); + final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final MemberDomain sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final ChatMessageDomain enteringMessage = chatWriter.enterRoom(sender, chatRoom); - final String content = MessageType.makeEnterMessage(member.getNickname()); - final ChatRoomMember chatRoomMember = chatRoomMemberRepository.findByMemberIdAndChatRoomId(member.getId(), - chatRoom.getId()) - .orElseGet(() -> buildChatRoomMember(chatRoom, member)); - - chatRoomMember.activate(); - chatRoomMemberRepository.save(chatRoomMember); - chatRoom.increaseMemberCount(); - - final ChatMessage enteringMessage = buildChatMessage(ENTER, content, chatRoom, member); - - return chatMessageRepository.save(enteringMessage); - } - - private ChatRoomMember buildChatRoomMember(final ChatRoom chatRoom, final Member member) { - return ChatRoomMember.builder() - .chatRoomId(chatRoom.getId()) - .memberId(member.getId()) - .build(); + return ChatResponseMapper.mapToChatMessageResponseDto(enteringMessage); } /** diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java index 0ff6d336..ce5ed3b2 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java @@ -11,9 +11,9 @@ import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; @@ -28,18 +28,6 @@ public class ChatValidator { private final GameRepository gameRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; - public void validateIsSelfChat(Member receiver, Member sender) { - if (sender.equals(receiver)) { - throw new ChatException(CHAT_MEMBER_CANNOT_CHAT_SELF, sender.getId()); - } - } - - public void validateIsNotExistedRoomMember(final ChatRoom chatRoom, final Member member) { - if (isExistedRoomMember(chatRoom, member)) { - throw new ChatException(CHAT_MEMBER_IS_ALREADY_IN_ROOM, member.getId(), chatRoom.getId()); - } - } - public void validateIsExistedRoomMember(final Member member, final ChatRoom chatRoom) { if (!isExistedRoomMember(chatRoom, member)) { throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, member.getId(), chatRoom.getId()); From eb11869077ac38eb20e2ff4b849157ba0961c711 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 20:12:53 +0900 Subject: [PATCH 061/117] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=A0=84=EC=86=A1=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/implement/ChatWriter.java | 13 +++++++++--- .../back/chat/service/ChatMessageService.java | 20 +++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 6cf8a949..30ab206a 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -80,17 +80,24 @@ private void activateRoom(final Long chatRoomId, final Long memberId) { .build()); } - private ChatMessageDomain sendMessage( + public ChatMessageDomain sendMessage( final MessageType type, final String content, final MemberDomain sender, final ChatRoomDomain chatRoom ) { + final Long chatRoomId = chatRoom.getChatRoomId(); + final Long senderId = sender.getMemberId(); + + if (!chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoomId, senderId)) { + throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, senderId); + } + final ChatMessage chatMessageEntity = ChatMessage.builder() .type(type) .content(content) - .senderId(sender.getMemberId()) - .chatRoomId(chatRoom.getChatRoomId()) + .senderId(senderId) + .chatRoomId(chatRoomId) .build(); final ChatMessage savedChatMessageEntity = chatMessageRepository.save(chatMessageEntity); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 665c2f46..a165ee9b 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -61,19 +61,19 @@ public ChatMessageResponse enterChatRoom( */ @Transactional public ChatMessageResponse sendMessage( - final Long roomId, + final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member sender = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); - - chatValidator.validateIsExistedRoomMember(sender, chatRoom); - - final String content = chatMessageCreateRequest.getContent(); - final ChatMessage chatMessage = buildChatMessage(TALK, content, chatRoom, sender); - final ChatMessage sendingMessage = chatMessageRepository.save(chatMessage); + final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final MemberDomain sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final ChatMessageDomain chatMessage = chatWriter.sendMessage( + TALK, + chatMessageCreateRequest.getContent(), + sender, + chatRoom + ); - return ChatMessageResponse.of(sendingMessage, sender, chatRoom); + return ChatResponseMapper.mapToChatMessageResponseDto(chatMessage); } /** From d9530f997237f67d203086b28e7c863679b3601d Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 21:07:02 +0900 Subject: [PATCH 062/117] =?UTF-8?q?refactor:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=ED=87=B4=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/chat/domain/ChatRoom.java | 24 ------ .../back/chat/domain/ChatRoomDomain.java | 12 +++ .../back/chat/domain/ChatRoomMember.java | 8 -- .../back/chat/implement/ChatWriter.java | 75 +++++++++++++++++++ .../back/chat/service/ChatMessageService.java | 48 ++---------- 5 files changed, 95 insertions(+), 72 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java index 78e77f42..5714d562 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java @@ -47,30 +47,6 @@ private ChatRoom(final String name, final RoomType type, final Integer maxMember this.maxMemberCount = maxMemberCount; } - public void increaseMemberCount() { - if (isFullRoom()) { - throw new ChatException(CHAT_ROOM_IS_FULL, memberCount); - } - - memberCount += 1; - } - - private Boolean isFullRoom() { - return memberCount.equals(maxMemberCount); - } - - public void decreaseMemberCount() { - if (isEmpty()) { - throw new ChatException(CHAT_ROOM_IS_EMPTY, memberCount); - } - - memberCount -= 1; - } - - public Boolean isEmpty() { - return memberCount == 0; - } - public void updateMaxMemberCount(final Integer maxMemberCount) { if (maxMemberCount < memberCount) { throw new ChatException(CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT, maxMemberCount); diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java index 86b45f3d..fa6f945e 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java @@ -32,6 +32,18 @@ public void increaseMemberCount() { memberCount += 1; } + public void decreaseMemberCount() { + if (isEmpty()) { + throw new ChatException(CHAT_ROOM_IS_EMPTY, memberCount); + } + + memberCount -= 1; + } + + public Boolean isEmpty() { + return memberCount == 0; + } + public Boolean isMatchedRoomType(final RoomType type) { return this.type == type; } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java index 966057c0..837a8dd8 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java @@ -44,12 +44,4 @@ private ChatRoomMember(final Long memberId, final Long chatRoomId) { this.memberId = memberId; this.chatRoomId = chatRoomId; } - - public void activate() { - active = TRUE; - } - - public void deactivate() { - active = FALSE; - } } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 30ab206a..9f340d22 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -4,6 +4,10 @@ import static kr.pickple.back.chat.domain.MessageType.*; import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import java.time.LocalDateTime; +import java.util.Optional; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +23,12 @@ import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.common.util.DateTimeUtil; +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.MemberDomain; import lombok.RequiredArgsConstructor; @@ -27,6 +37,9 @@ @RequiredArgsConstructor public class ChatWriter { + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; + private final GameRepository gameRepository; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; private final ChatMessageRepository chatMessageRepository; @@ -103,4 +116,66 @@ public ChatMessageDomain sendMessage( return ChatMapper.mapChatMessageEntityToDomain(savedChatMessageEntity, sender, chatRoom); } + + public ChatMessageDomain leaveRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { + final Long memberId = member.getMemberId(); + final Long chatRoomId = chatRoom.getChatRoomId(); + + if (!chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoomId, memberId)) { + throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, memberId); + } + + validateCanLeaveChatRoom(memberId, chatRoom); + + final ChatMessageDomain leaveMessage = sendMessage( + LEAVE, + MessageType.makeLeaveMessage(member.getNickname()), + member, + chatRoom + ); + + chatRoomMemberRepository.updateChatRoomMemberActiveStatus(chatRoomId, memberId, FALSE); + chatRoom.decreaseMemberCount(); + chatRoomRepository.updateMemberCount(chatRoomId, chatRoom.getMemberCount()); + + if (chatRoom.isEmpty()) { + chatRoomRepository.deleteById(chatRoomId); + } + + return leaveMessage; + } + + private void validateCanLeaveChatRoom(final Long memberId, final ChatRoomDomain chatRoom) { + if (chatRoom.getType() == CREW) { + validateCanLeaveCrewChatRoom(memberId, chatRoom); + } + + if (chatRoom.getType() == GAME) { + validateCanLeaveGameChatRoom(chatRoom); + } + } + + private void validateCanLeaveCrewChatRoom(final Long memberId, final ChatRoomDomain chatRoom) { + final Optional crewEntity = crewRepository.findByChatRoomId(chatRoom.getChatRoomId()); + + if (crewEntity.isPresent() && existsMemberInCrew(crewEntity.get().getId(), memberId)) { + throw new ChatException(CHAT_CREW_CHATROOM_NOT_ALLOWED_TO_LEAVE); + } + } + + private Boolean existsMemberInCrew(final Long crewId, final Long memberId) { + return crewMemberRepository.existsByCrewIdAndMemberIdAndStatus(crewId, memberId, CONFIRMED); + } + + private void validateCanLeaveGameChatRoom(final ChatRoomDomain chatRoom) { + final Optional gameEntity = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()); + + if (gameEntity.isPresent() && isGameNotEnded(gameEntity.get().getPlayEndDatetime())) { + throw new ChatException(CHAT_GAME_CHATROOM_NOT_ALLOWED_TO_LEAVE); + } + } + + private Boolean isGameNotEnded(final LocalDateTime gameEndDatetime) { + return DateTimeUtil.isAfterThanNow(gameEndDatetime); + } } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index a165ee9b..357706f7 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -11,8 +11,6 @@ import kr.pickple.back.chat.domain.ChatMessageDomain; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; -import kr.pickple.back.chat.domain.ChatRoomMember; -import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.request.ChatMessageCreateRequest; import kr.pickple.back.chat.dto.response.ChatMessageResponse; @@ -50,10 +48,10 @@ public ChatMessageResponse enterChatRoom( final ChatMessageCreateRequest chatMessageCreateRequest ) { final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); - final MemberDomain sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); - final ChatMessageDomain enteringMessage = chatWriter.enterRoom(sender, chatRoom); + final MemberDomain newMember = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final ChatMessageDomain enterMessage = chatWriter.enterRoom(newMember, chatRoom); - return ChatResponseMapper.mapToChatMessageResponseDto(enteringMessage); + return ChatResponseMapper.mapToChatMessageResponseDto(enterMessage); } /** @@ -81,44 +79,14 @@ public ChatMessageResponse sendMessage( */ @Transactional public ChatMessageResponse leaveChatRoom( - final Long roomId, + final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final Member member = memberRepository.getMemberById(chatMessageCreateRequest.getSenderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); - - chatValidator.validateIsExistedRoomMember(member, chatRoom); - chatValidator.validateChatRoomLeavingConditions(member, chatRoom); - - final String content = MessageType.makeLeaveMessage(member.getNickname()); - final ChatRoomMember chatRoomMember = chatRoomMemberRepository.getByMemberIdAndChatRoomId(member.getId(), - chatRoom.getId()); - - chatRoomMember.deactivate(); - chatRoom.decreaseMemberCount(); - - if (chatRoom.isEmpty()) { - chatRoomRepository.delete(chatRoom); - } - - final ChatMessage chatMessage = buildChatMessage(LEAVE, content, chatRoom, member); - final ChatMessage leavingMessage = chatMessageRepository.save(chatMessage); - - return ChatMessageResponse.of(leavingMessage, member, chatRoom); - } + final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final MemberDomain member = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final ChatMessageDomain leaveMessage = chatWriter.leaveRoom(member, chatRoom); - private ChatMessage buildChatMessage( - final MessageType type, - final String content, - final ChatRoom chatRoom, - final Member member - ) { - return ChatMessage.builder() - .type(type) - .content(content) - .chatRoomId(chatRoom.getId()) - .senderId(member.getId()) - .build(); + return ChatResponseMapper.mapToChatMessageResponseDto(leaveMessage); } /** From b22460f314cbcddd2ac91c60ed0426b17f0d1a63 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 21:25:35 +0900 Subject: [PATCH 063/117] =?UTF-8?q?refactor:=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=EC=9D=98=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/implement/ChatReader.java | 21 ++++++++++++ .../repository/ChatMessageRepository.java | 25 +++++---------- .../back/chat/service/ChatMessageService.java | 32 ++++--------------- 3 files changed, 35 insertions(+), 43 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index 0db93308..0f3a6c2c 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -3,6 +3,7 @@ import static kr.pickple.back.chat.domain.RoomType.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import java.time.LocalDateTime; import java.util.List; import org.springframework.stereotype.Component; @@ -89,4 +90,24 @@ public ChatMessageDomain readLastMessage(final ChatRoomDomain chatRoom) { return ChatMapper.mapChatMessageEntityToDomain(lastMessageEntity, sender, chatRoom); } + + public List readMessagesAfterEntrance(final Long memberId, final Long chatRoomId) { + final ChatRoomDomain chatRoom = readRoom(chatRoomId); + + if (!chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoomId, memberId)) { + throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, memberId); + } + + final LocalDateTime entranceDatetime = chatMessageRepository.findLastEntranceDatetimeByMemberId(memberId); + final List chatMessageEntities = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( + chatRoomId, entranceDatetime); + + return chatMessageEntities.stream() + .map(chatMessageEntity -> ChatMapper.mapChatMessageEntityToDomain( + chatMessageEntity, + memberReader.readByMemberId(chatMessageEntity.getSenderId()), + chatRoom + )) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 071eb7d2..3baa4629 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -1,28 +1,15 @@ package kr.pickple.back.chat.repository; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - import java.time.LocalDateTime; import java.util.List; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.exception.ChatException; public interface ChatMessageRepository extends JpaRepository { - @Query(""" - select cm - from ChatMessage cm - where cm.senderId= :senderId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER - order by cm.createdAt desc - limit 1 - """) - Optional findLastEnteringChatMessageBySenderId(final Long senderId); - List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( final Long chatRoomId, final LocalDateTime createdAt @@ -30,8 +17,12 @@ List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( ChatMessage findTopByChatRoomIdOrderByCreatedAtDesc(final Long chatRoomId); - default ChatMessage getLastEnteringChatMessageBySenderId(final Long senderId) { - return findLastEnteringChatMessageBySenderId(senderId) - .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, senderId)); - } + @Query(""" + select cm.createdAt + from ChatMessage cm + where cm.senderId= :memberId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER + order by cm.createdAt desc + limit 1 + """) + LocalDateTime findLastEntranceDatetimeByMemberId(final Long memberId); } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 357706f7..18491a87 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -7,9 +7,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.domain.ChatMessageDomain; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.request.ChatMessageCreateRequest; @@ -19,7 +17,6 @@ import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberRepository; @@ -49,9 +46,9 @@ public ChatMessageResponse enterChatRoom( ) { final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); final MemberDomain newMember = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); - final ChatMessageDomain enterMessage = chatWriter.enterRoom(newMember, chatRoom); + final ChatMessageDomain entranceMessage = chatWriter.enterRoom(newMember, chatRoom); - return ChatResponseMapper.mapToChatMessageResponseDto(enterMessage); + return ChatResponseMapper.mapToChatMessageResponseDto(entranceMessage); } /** @@ -92,27 +89,10 @@ public ChatMessageResponse leaveChatRoom( /** * 특정 채팅방의 모든 메시지 목록 조회 */ - public List findAllMessagesInRoom(final Long loggedInMemberId, final Long roomId) { - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(roomId); - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - - chatValidator.validateIsExistedRoomMember(loggedInMember, chatRoom); - - final ChatMessage lastEnteringMessage = chatMessageRepository.getLastEnteringChatMessageBySenderId( - loggedInMember.getId()); - - final List chatMessages = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( - chatRoom.getId(), - lastEnteringMessage.getCreatedAt() - ); - - return chatMessages.stream() - .map(chatMessage -> ChatMessageResponse.of( - chatMessage, - memberRepository.getMemberById(chatMessage.getSenderId()), - chatRoom - ) - ) + public List findAllMessagesInRoom(final Long loggedInMemberId, final Long chatRoomId) { + return chatReader.readMessagesAfterEntrance(loggedInMemberId, chatRoomId) + .stream() + .map(ChatResponseMapper::mapToChatMessageResponseDto) .toList(); } } From 495ddb4347554216535d66620af1e2b290fb7347 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 3 Mar 2024 21:34:41 +0900 Subject: [PATCH 064/117] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EA=B4=80=EB=A0=A8=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EB=AA=A8=EB=91=90=20?= =?UTF-8?q?repository=20=ED=8F=B4=EB=8D=94=EC=9D=98=20entity=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/chat/domain/ChatMessage.java | 47 +++-------- .../back/chat/domain/ChatMessageDomain.java | 24 ------ .../kr/pickple/back/chat/domain/ChatRoom.java | 63 +++++++------- .../back/chat/domain/ChatRoomDomain.java | 50 ----------- .../chat/dto/mapper/ChatResponseMapper.java | 14 ++-- .../back/chat/implement/ChatMapper.java | 16 ++-- .../back/chat/implement/ChatReader.java | 28 +++---- .../back/chat/implement/ChatWriter.java | 40 ++++----- .../repository/ChatMessageRepository.java | 10 +-- .../repository/ChatRoomMemberRepository.java | 24 ++---- .../chat/repository/ChatRoomRepository.java | 13 +-- .../repository/entity/ChatMessageEntity.java | 49 +++++++++++ .../repository/entity/ChatRoomEntity.java | 59 +++++++++++++ .../entity/ChatRoomMemberEntity.java} | 6 +- .../back/chat/service/ChatMessageService.java | 25 ++---- .../chat/service/ChatRoomFindService.java | 14 ++-- .../back/chat/service/ChatRoomService.java | 4 +- .../back/chat/service/ChatValidator.java | 82 ------------------- .../kr/pickple/back/crew/domain/Crew.java | 1 - .../back/crew/implement/CrewMapper.java | 1 - .../crew/repository/entity/CrewEntity.java | 4 +- .../back/crew/service/CrewService.java | 4 +- .../kr/pickple/back/game/domain/Game.java | 4 +- .../back/game/repository/GameRepository.java | 1 - .../back/game/service/GameMemberService.java | 6 +- .../back/game/service/GameService.java | 4 +- ...ava => ChatMessageEntityDocumentTest.java} | 2 +- ...t.java => ChatRoomEntityDocumentTest.java} | 2 +- .../back/fixture/domain/CrewFixtures.java | 6 +- .../back/fixture/domain/GameFixtures.java | 7 +- .../pickple/back/fixture/setup/CrewSetup.java | 4 +- .../pickple/back/fixture/setup/GameSetup.java | 4 +- 32 files changed, 254 insertions(+), 364 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java delete mode 100644 src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java create mode 100644 src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java create mode 100644 src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java rename src/main/java/kr/pickple/back/chat/{domain/ChatRoomMember.java => repository/entity/ChatRoomMemberEntity.java} (86%) delete mode 100644 src/main/java/kr/pickple/back/chat/service/ChatValidator.java rename src/test/java/kr/pickple/back/chat/docs/{ChatMessageDocumentTest.java => ChatMessageEntityDocumentTest.java} (98%) rename src/test/java/kr/pickple/back/chat/docs/{ChatRoomDocumentTest.java => ChatRoomEntityDocumentTest.java} (99%) diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java index 4c64cc08..77ec4e0a 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java @@ -1,47 +1,24 @@ package kr.pickple.back.chat.domain; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.util.MessageTypeAttributeConverter; -import kr.pickple.back.common.domain.BaseEntity; +import java.time.LocalDateTime; + +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ChatMessage extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ChatMessage { - @NotNull - @Convert(converter = MessageTypeAttributeConverter.class) + private Long chatMessageId; private MessageType type; - - @NotNull - @Column(length = 500) private String content; - - @NotNull - private Long senderId; - - @NotNull - private Long chatRoomId; - - @Builder - private ChatMessage(final MessageType type, final String content, final Long senderId, final Long chatRoomId) { - this.type = type; - this.content = content; - this.senderId = senderId; - this.chatRoomId = chatRoomId; - } + private MemberDomain sender; + private ChatRoom chatRoom; + private LocalDateTime createdAt; } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java deleted file mode 100644 index 8c29a6ef..00000000 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessageDomain.java +++ /dev/null @@ -1,24 +0,0 @@ -package kr.pickple.back.chat.domain; - -import java.time.LocalDateTime; - -import kr.pickple.back.member.domain.MemberDomain; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class ChatMessageDomain { - - private Long chatMessageId; - private MessageType type; - private String content; - private MemberDomain sender; - private ChatRoomDomain chatRoom; - private LocalDateTime createdAt; -} diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java index 5714d562..8bf49679 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatRoom.java @@ -2,56 +2,49 @@ import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.chat.util.RoomTypeAttributeConverter; -import kr.pickple.back.common.domain.BaseEntity; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ChatRoom extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ChatRoom { - @NotNull - @Column(length = 20) + private Long chatRoomId; private String name; - - @NotNull - @Convert(converter = RoomTypeAttributeConverter.class) private RoomType type; + private Integer memberCount; + private Integer maxMemberCount; + private LocalDateTime createdAt; - @NotNull - private Integer memberCount = 0; - - @NotNull - private Integer maxMemberCount = 2; + public void increaseMemberCount() { + if (memberCount.equals(maxMemberCount)) { + throw new ChatException(CHAT_ROOM_IS_FULL, memberCount); + } - @Builder - private ChatRoom(final String name, final RoomType type, final Integer maxMemberCount) { - this.name = name; - this.type = type; - this.maxMemberCount = maxMemberCount; + memberCount += 1; } - public void updateMaxMemberCount(final Integer maxMemberCount) { - if (maxMemberCount < memberCount) { - throw new ChatException(CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT, maxMemberCount); + public void decreaseMemberCount() { + if (isEmpty()) { + throw new ChatException(CHAT_ROOM_IS_EMPTY, memberCount); } - this.maxMemberCount = maxMemberCount; + memberCount -= 1; + } + + public Boolean isEmpty() { + return memberCount == 0; + } + + public Boolean isMatchedRoomType(final RoomType type) { + return this.type == type; } } diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java b/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java deleted file mode 100644 index fa6f945e..00000000 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomDomain.java +++ /dev/null @@ -1,50 +0,0 @@ -package kr.pickple.back.chat.domain; - -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - -import java.time.LocalDateTime; - -import kr.pickple.back.chat.exception.ChatException; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class ChatRoomDomain { - - private Long chatRoomId; - private String name; - private RoomType type; - private Integer memberCount; - private Integer maxMemberCount; - private LocalDateTime createdAt; - - public void increaseMemberCount() { - if (memberCount.equals(maxMemberCount)) { - throw new ChatException(CHAT_ROOM_IS_FULL, memberCount); - } - - memberCount += 1; - } - - public void decreaseMemberCount() { - if (isEmpty()) { - throw new ChatException(CHAT_ROOM_IS_EMPTY, memberCount); - } - - memberCount -= 1; - } - - public Boolean isEmpty() { - return memberCount == 0; - } - - public Boolean isMatchedRoomType(final RoomType type) { - return this.type == type; - } -} diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java index 3bca5e9d..b2067115 100644 --- a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -2,8 +2,8 @@ import java.util.List; -import kr.pickple.back.chat.domain.ChatMessageDomain; -import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.response.ChatMemberResponse; import kr.pickple.back.chat.dto.response.ChatMessageResponse; @@ -20,7 +20,7 @@ public final class ChatResponseMapper { public static ChatRoomResponse mapToChatRoomResponseDto( - final ChatMessageDomain lastChatMessage, + final ChatMessage lastChatMessage, final ChatRoomDetailResponse chatRoomDetailResponse ) { return ChatRoomResponse.builder() @@ -41,7 +41,7 @@ public static ChatRoomResponse mapToChatRoomResponseDto( public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( final MemberDomain sender, final MemberDomain receiver, - final ChatRoomDomain chatRoom + final ChatRoom chatRoom ) { final List chatMemberResponses = List.of( mapToChatMemberResponseDto(sender), @@ -63,7 +63,7 @@ public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( public static ChatRoomDetailResponse mapToCrewChatRoomDetailResponseDto( final Crew crew, - final ChatRoomDomain chatRoom, + final ChatRoom chatRoom, final List members ) { final List chatMemberResponses = members.stream() @@ -85,7 +85,7 @@ public static ChatRoomDetailResponse mapToCrewChatRoomDetailResponseDto( public static ChatRoomDetailResponse mapToGameChatRoomDetailResponseDto( final Game game, - final ChatRoomDomain chatRoom, + final ChatRoom chatRoom, final List members ) { final List chatMemberResponses = members.stream() @@ -123,7 +123,7 @@ public static PersonalChatRoomStatusResponse mapToPersonalChatRoomStatusResponse .build(); } - public static ChatMessageResponse mapToChatMessageResponseDto(final ChatMessageDomain chatMessage) { + public static ChatMessageResponse mapToChatMessageResponseDto(final ChatMessage chatMessage) { return ChatMessageResponse.builder() .type(chatMessage.getType()) .content(chatMessage.getContent()) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java index bfcac715..541b3410 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -1,9 +1,9 @@ package kr.pickple.back.chat.implement; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.domain.ChatMessageDomain; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.domain.ChatRoomDomain; import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -11,8 +11,8 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ChatMapper { - public static ChatRoomDomain mapChatRoomEntityToDomain(final ChatRoom chatRoomEntity) { - return ChatRoomDomain.builder() + public static ChatRoom mapChatRoomEntityToDomain(final ChatRoomEntity chatRoomEntity) { + return ChatRoom.builder() .chatRoomId(chatRoomEntity.getId()) .type(chatRoomEntity.getType()) .name(chatRoomEntity.getName()) @@ -22,12 +22,12 @@ public static ChatRoomDomain mapChatRoomEntityToDomain(final ChatRoom chatRoomEn .build(); } - public static ChatMessageDomain mapChatMessageEntityToDomain( - final ChatMessage chatMessageEntity, + public static ChatMessage mapChatMessageEntityToDomain( + final ChatMessageEntity chatMessageEntity, final MemberDomain sender, - final ChatRoomDomain chatRoom + final ChatRoom chatRoom ) { - return ChatMessageDomain.builder() + return ChatMessage.builder() .chatMessageId(chatMessageEntity.getId()) .type(chatMessageEntity.getType()) .content(chatMessageEntity.getContent()) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index 0f3a6c2c..d7e0509d 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -9,11 +9,11 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.domain.ChatMessageDomain; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.domain.ChatRoomDomain; -import kr.pickple.back.chat.domain.ChatRoomMember; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.exception.ChatException; @@ -34,18 +34,18 @@ public class ChatReader { private final ChatRoomMemberRepository chatRoomMemberRepository; private final ChatMessageRepository chatMessageRepository; - public ChatRoomDomain readRoom(final Long chatRoomId) { - final ChatRoom chatRoomEntity = chatRoomRepository.findById(chatRoomId) + public ChatRoom readRoom(final Long chatRoomId) { + final ChatRoomEntity chatRoomEntity = chatRoomRepository.findById(chatRoomId) .orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, chatRoomId)); return ChatMapper.mapChatRoomEntityToDomain(chatRoomEntity); } public PersonalChatRoomStatus readPersonalRoomStatus(final Long senderId, final Long receiverId) { - final ChatRoomMember receiverEntity = chatRoomMemberRepository.findAllByMemberId(senderId) + final ChatRoomMemberEntity receiverEntity = chatRoomMemberRepository.findAllByMemberId(senderId) .stream() .filter(chatRoomMemberEntity -> { - final ChatRoomDomain chatRoom = readRoom(chatRoomMemberEntity.getChatRoomId()); + final ChatRoom chatRoom = readRoom(chatRoomMemberEntity.getChatRoomId()); final Long chatRoomId = chatRoom.getChatRoomId(); return chatRoom.isMatchedRoomType(PERSONAL) @@ -60,7 +60,7 @@ public PersonalChatRoomStatus readPersonalRoomStatus(final Long senderId, final .build(); } - public List readEnteringRoomsByType(final Long memberId, final RoomType type) { + public List readEnteringRoomsByType(final Long memberId, final RoomType type) { return chatRoomMemberRepository.findAllByActiveTrueAndMemberId(memberId) .stream() .map(chatRoomMemberEntity -> readRoom(chatRoomMemberEntity.getChatRoomId())) @@ -69,7 +69,7 @@ public List readEnteringRoomsByType(final Long memberId, final R } public MemberDomain readReceiver(final Long senderId, final Long chatRoomId) { - final ChatRoomMember receiverEntity = chatRoomMemberRepository.findByChatRoomIdAndMemberIdNot( + final ChatRoomMemberEntity receiverEntity = chatRoomMemberRepository.findByChatRoomIdAndMemberIdNot( chatRoomId, senderId) .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); @@ -83,23 +83,23 @@ public List readRoomMembers(final Long chatRoomId) { .toList(); } - public ChatMessageDomain readLastMessage(final ChatRoomDomain chatRoom) { - final ChatMessage lastMessageEntity = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc( + public ChatMessage readLastMessage(final ChatRoom chatRoom) { + final ChatMessageEntity lastMessageEntity = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc( chatRoom.getChatRoomId()); final MemberDomain sender = memberReader.readByMemberId(lastMessageEntity.getSenderId()); return ChatMapper.mapChatMessageEntityToDomain(lastMessageEntity, sender, chatRoom); } - public List readMessagesAfterEntrance(final Long memberId, final Long chatRoomId) { - final ChatRoomDomain chatRoom = readRoom(chatRoomId); + public List readMessagesAfterEntrance(final Long memberId, final Long chatRoomId) { + final ChatRoom chatRoom = readRoom(chatRoomId); if (!chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoomId, memberId)) { throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, memberId); } final LocalDateTime entranceDatetime = chatMessageRepository.findLastEntranceDatetimeByMemberId(memberId); - final List chatMessageEntities = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( + final List chatMessageEntities = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( chatRoomId, entranceDatetime); return chatMessageEntities.stream() diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index 9f340d22..bbff3f03 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -12,11 +12,11 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.domain.ChatMessageDomain; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.domain.ChatRoomDomain; -import kr.pickple.back.chat.domain.ChatRoomMember; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.exception.ChatException; @@ -44,28 +44,28 @@ public class ChatWriter { private final ChatRoomMemberRepository chatRoomMemberRepository; private final ChatMessageRepository chatMessageRepository; - public ChatRoomDomain createNewPersonalRoom(final String name) { - final ChatRoom chatRoomEntity = ChatRoom.builder() + public ChatRoom createNewPersonalRoom(final String name) { + final ChatRoomEntity chatRoomEntity = ChatRoomEntity.builder() .name(name) .type(PERSONAL) .build(); - final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); } - public ChatRoomDomain createNewGroupRoom(final String name, final RoomType type, final Integer maxMemberCount) { - final ChatRoom chatRoomEntity = ChatRoom.builder() + public ChatRoom createNewGroupRoom(final String name, final RoomType type, final Integer maxMemberCount) { + final ChatRoomEntity chatRoomEntity = ChatRoomEntity.builder() .name(name) .type(type) .maxMemberCount(maxMemberCount) .build(); - final ChatRoom savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); } - public ChatMessageDomain enterRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { + public ChatMessage enterRoom(final MemberDomain member, final ChatRoom chatRoom) { final Long memberId = member.getMemberId(); final Long chatRoomId = chatRoom.getChatRoomId(); @@ -87,17 +87,17 @@ private void activateRoom(final Long chatRoomId, final Long memberId) { return; } - chatRoomMemberRepository.save(ChatRoomMember.builder() + chatRoomMemberRepository.save(ChatRoomMemberEntity.builder() .memberId(memberId) .chatRoomId(chatRoomId) .build()); } - public ChatMessageDomain sendMessage( + public ChatMessage sendMessage( final MessageType type, final String content, final MemberDomain sender, - final ChatRoomDomain chatRoom + final ChatRoom chatRoom ) { final Long chatRoomId = chatRoom.getChatRoomId(); final Long senderId = sender.getMemberId(); @@ -106,18 +106,18 @@ public ChatMessageDomain sendMessage( throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, senderId); } - final ChatMessage chatMessageEntity = ChatMessage.builder() + final ChatMessageEntity chatMessageEntity = ChatMessageEntity.builder() .type(type) .content(content) .senderId(senderId) .chatRoomId(chatRoomId) .build(); - final ChatMessage savedChatMessageEntity = chatMessageRepository.save(chatMessageEntity); + final ChatMessageEntity savedChatMessageEntity = chatMessageRepository.save(chatMessageEntity); return ChatMapper.mapChatMessageEntityToDomain(savedChatMessageEntity, sender, chatRoom); } - public ChatMessageDomain leaveRoom(final MemberDomain member, final ChatRoomDomain chatRoom) { + public ChatMessage leaveRoom(final MemberDomain member, final ChatRoom chatRoom) { final Long memberId = member.getMemberId(); final Long chatRoomId = chatRoom.getChatRoomId(); @@ -127,7 +127,7 @@ public ChatMessageDomain leaveRoom(final MemberDomain member, final ChatRoomDoma validateCanLeaveChatRoom(memberId, chatRoom); - final ChatMessageDomain leaveMessage = sendMessage( + final ChatMessage leaveMessage = sendMessage( LEAVE, MessageType.makeLeaveMessage(member.getNickname()), member, @@ -145,7 +145,7 @@ public ChatMessageDomain leaveRoom(final MemberDomain member, final ChatRoomDoma return leaveMessage; } - private void validateCanLeaveChatRoom(final Long memberId, final ChatRoomDomain chatRoom) { + private void validateCanLeaveChatRoom(final Long memberId, final ChatRoom chatRoom) { if (chatRoom.getType() == CREW) { validateCanLeaveCrewChatRoom(memberId, chatRoom); } @@ -155,7 +155,7 @@ private void validateCanLeaveChatRoom(final Long memberId, final ChatRoomDomain } } - private void validateCanLeaveCrewChatRoom(final Long memberId, final ChatRoomDomain chatRoom) { + private void validateCanLeaveCrewChatRoom(final Long memberId, final ChatRoom chatRoom) { final Optional crewEntity = crewRepository.findByChatRoomId(chatRoom.getChatRoomId()); if (crewEntity.isPresent() && existsMemberInCrew(crewEntity.get().getId(), memberId)) { @@ -167,7 +167,7 @@ private Boolean existsMemberInCrew(final Long crewId, final Long memberId) { return crewMemberRepository.existsByCrewIdAndMemberIdAndStatus(crewId, memberId, CONFIRMED); } - private void validateCanLeaveGameChatRoom(final ChatRoomDomain chatRoom) { + private void validateCanLeaveGameChatRoom(final ChatRoom chatRoom) { final Optional gameEntity = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()); if (gameEntity.isPresent() && isGameNotEnded(gameEntity.get().getPlayEndDatetime())) { diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 3baa4629..886c77f3 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -6,20 +6,20 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; -public interface ChatMessageRepository extends JpaRepository { +public interface ChatMessageRepository extends JpaRepository { - List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( + List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( final Long chatRoomId, final LocalDateTime createdAt ); - ChatMessage findTopByChatRoomIdOrderByCreatedAtDesc(final Long chatRoomId); + ChatMessageEntity findTopByChatRoomIdOrderByCreatedAtDesc(final Long chatRoomId); @Query(""" select cm.createdAt - from ChatMessage cm + from ChatMessageEntity cm where cm.senderId= :memberId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER order by cm.createdAt desc limit 1 diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java index a2f3e3d1..02f8d9e2 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java @@ -1,35 +1,30 @@ package kr.pickple.back.chat.repository; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.chat.domain.ChatRoomMember; -import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; -public interface ChatRoomMemberRepository extends JpaRepository { +public interface ChatRoomMemberRepository extends JpaRepository { Boolean existsByChatRoomIdAndMemberId(final Long chatRoomId, final Long memberId); Boolean existsByActiveTrueAndChatRoomIdAndMemberId(final Long chatRoomId, final Long memberId); - List findAllByMemberId(final Long memberId); - - List findAllByActiveTrueAndMemberId(final Long memberId); + List findAllByMemberId(final Long memberId); - List findAllByActiveTrueAndChatRoomId(final Long chatRoomId); + List findAllByActiveTrueAndMemberId(final Long memberId); - Optional findByMemberIdAndChatRoomId(final Long memberId, final Long chatRoomId); + List findAllByActiveTrueAndChatRoomId(final Long chatRoomId); // 개인 채팅방에서 상대방에 대한 ChatRoomMember 데이터 조회용 - Optional findByChatRoomIdAndMemberIdNot(final Long chatRoomId, final Long memberId); + Optional findByChatRoomIdAndMemberIdNot(final Long chatRoomId, final Long memberId); @Query(""" - update ChatRoomMember crm + update ChatRoomMemberEntity crm set crm.active = :activeStatus where crm.chatRoomId = :chatRoomId and crm.memberId = :memberId""") void updateChatRoomMemberActiveStatus( @@ -37,9 +32,4 @@ void updateChatRoomMemberActiveStatus( final Long memberId, final Boolean activeStatus ); - - default ChatRoomMember getByMemberIdAndChatRoomId(final Long memberId, final Long chatRoomId) { - return findByMemberIdAndChatRoomId(memberId, chatRoomId) - .orElseThrow(() -> new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, memberId, chatRoomId)); - } } diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java index d1d07b0e..e527784e 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java @@ -1,19 +1,12 @@ package kr.pickple.back.chat.repository; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -public interface ChatRoomRepository extends JpaRepository { +public interface ChatRoomRepository extends JpaRepository { - @Query("update ChatRoom cr set cr.memberCount = :memberCount where cr.id = :chatRoomId") + @Query("update ChatRoomEntity cr set cr.memberCount = :memberCount where cr.id = :chatRoomId") void updateMemberCount(final Long chatRoomId, final Integer memberCount); - - default ChatRoom getChatRoomById(final Long chatRoomId) { - return findById(chatRoomId).orElseThrow(() -> new ChatException(CHAT_ROOM_NOT_FOUND, chatRoomId)); - } } diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java new file mode 100644 index 00000000..956b6344 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java @@ -0,0 +1,49 @@ +package kr.pickple.back.chat.repository.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.chat.domain.MessageType; +import kr.pickple.back.chat.util.MessageTypeAttributeConverter; +import kr.pickple.back.common.domain.BaseEntity; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ChatMessageEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Convert(converter = MessageTypeAttributeConverter.class) + private MessageType type; + + @NotNull + @Column(length = 500) + private String content; + + @NotNull + private Long senderId; + + @NotNull + private Long chatRoomId; + + @Builder + private ChatMessageEntity(final MessageType type, final String content, final Long senderId, + final Long chatRoomId) { + this.type = type; + this.content = content; + this.senderId = senderId; + this.chatRoomId = chatRoomId; + } +} diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java new file mode 100644 index 00000000..41cc9f25 --- /dev/null +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java @@ -0,0 +1,59 @@ +package kr.pickple.back.chat.repository.entity; + +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.chat.domain.RoomType; +import kr.pickple.back.chat.exception.ChatException; +import kr.pickple.back.chat.util.RoomTypeAttributeConverter; +import kr.pickple.back.common.domain.BaseEntity; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ChatRoomEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(length = 20) + private String name; + + @NotNull + @Convert(converter = RoomTypeAttributeConverter.class) + private RoomType type; + + @NotNull + private Integer memberCount = 0; + + @NotNull + private Integer maxMemberCount = 2; + + @Builder + private ChatRoomEntity(final String name, final RoomType type, final Integer maxMemberCount) { + this.name = name; + this.type = type; + this.maxMemberCount = maxMemberCount; + } + + // TODO : Crew, Game 수정하면서 제거 예정 (김영주) + public void updateMaxMemberCount(final Integer maxMemberCount) { + if (maxMemberCount < memberCount) { + throw new ChatException(CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT, maxMemberCount); + } + + this.maxMemberCount = maxMemberCount; + } +} diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java similarity index 86% rename from src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java rename to src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java index 837a8dd8..7070b118 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatRoomMember.java +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java @@ -1,4 +1,4 @@ -package kr.pickple.back.chat.domain; +package kr.pickple.back.chat.repository.entity; import static java.lang.Boolean.*; @@ -22,7 +22,7 @@ @Table(uniqueConstraints = @UniqueConstraint(columnNames = {"member_id", "chat_room_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(of = {"memberId", "chatRoomId"}, callSuper = false) -public class ChatRoomMember extends BaseEntity { +public class ChatRoomMemberEntity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -40,7 +40,7 @@ public class ChatRoomMember extends BaseEntity { private Long chatRoomId; @Builder - private ChatRoomMember(final Long memberId, final Long chatRoomId) { + private ChatRoomMemberEntity(final Long memberId, final Long chatRoomId) { this.memberId = memberId; this.chatRoomId = chatRoomId; } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 18491a87..530a2473 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -7,19 +7,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatMessageDomain; -import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatMessage; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.request.ChatMessageCreateRequest; import kr.pickple.back.chat.dto.response.ChatMessageResponse; import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.chat.implement.ChatWriter; -import kr.pickple.back.chat.repository.ChatMessageRepository; -import kr.pickple.back.chat.repository.ChatRoomMemberRepository; -import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -30,11 +26,6 @@ public class ChatMessageService { private final MemberReader memberReader; private final ChatReader chatReader; private final ChatWriter chatWriter; - private final ChatMessageRepository chatMessageRepository; - private final ChatRoomRepository chatRoomRepository; - private final ChatRoomMemberRepository chatRoomMemberRepository; - private final MemberRepository memberRepository; - private final ChatValidator chatValidator; /** * 채팅방 입장 @@ -44,9 +35,9 @@ public ChatMessageResponse enterChatRoom( final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); final MemberDomain newMember = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); - final ChatMessageDomain entranceMessage = chatWriter.enterRoom(newMember, chatRoom); + final ChatMessage entranceMessage = chatWriter.enterRoom(newMember, chatRoom); return ChatResponseMapper.mapToChatMessageResponseDto(entranceMessage); } @@ -59,9 +50,9 @@ public ChatMessageResponse sendMessage( final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); final MemberDomain sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); - final ChatMessageDomain chatMessage = chatWriter.sendMessage( + final ChatMessage chatMessage = chatWriter.sendMessage( TALK, chatMessageCreateRequest.getContent(), sender, @@ -79,9 +70,9 @@ public ChatMessageResponse leaveChatRoom( final Long chatRoomId, final ChatMessageCreateRequest chatMessageCreateRequest ) { - final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); final MemberDomain member = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); - final ChatMessageDomain leaveMessage = chatWriter.leaveRoom(member, chatRoom); + final ChatMessage leaveMessage = chatWriter.leaveRoom(member, chatRoom); return ChatResponseMapper.mapToChatMessageResponseDto(leaveMessage); } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index f483e318..eb1449a6 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -8,14 +8,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.implement.ChatReader; -import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.game.domain.Game; @@ -33,7 +32,6 @@ public class ChatRoomFindService { private final MemberReader memberReader; private final CrewReader crewReader; private final ChatReader chatReader; - private final ChatRoomRepository chatRoomRepository; private final GameRepository gameRepository; /** @@ -56,12 +54,12 @@ public List findAllEnteringChatRoomsByType(final Long loggedIn * 단일 채팅방 정보 상세 조회 */ public ChatRoomDetailResponse findChatRoomById(final Long loggedInMemberId, final Long chatRoomId) { - final ChatRoomDomain chatRoom = chatReader.readRoom(chatRoomId); + final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); return getChatRoomDetailResponse(loggedInMemberId, chatRoom); } - private ChatRoomDetailResponse getChatRoomDetailResponse(final Long memberId, final ChatRoomDomain chatRoom) { + private ChatRoomDetailResponse getChatRoomDetailResponse(final Long memberId, final ChatRoom chatRoom) { return switch (chatRoom.getType()) { case PERSONAL -> getPersonalChatRoomDetailResponse(memberId, chatRoom); case CREW -> getCrewChatRoomDetailResponse(chatRoom); @@ -71,7 +69,7 @@ private ChatRoomDetailResponse getChatRoomDetailResponse(final Long memberId, fi private ChatRoomDetailResponse getPersonalChatRoomDetailResponse( final Long senderId, - final ChatRoomDomain chatRoom + final ChatRoom chatRoom ) { final MemberDomain sender = memberReader.readByMemberId(senderId); final MemberDomain receiver = chatReader.readReceiver(senderId, chatRoom.getChatRoomId()); @@ -79,14 +77,14 @@ private ChatRoomDetailResponse getPersonalChatRoomDetailResponse( return ChatResponseMapper.mapToPersonalChatRoomDetailResponseDto(sender, receiver, chatRoom); } - private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoomDomain chatRoom) { + private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { final Crew crew = crewReader.readByChatRoomId(chatRoom.getChatRoomId()); final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); return ChatResponseMapper.mapToCrewChatRoomDetailResponseDto(crew, chatRoom, members); } - private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoomDomain chatRoom) { + private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chatRoom) { final Game game = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()) .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getChatRoomId())); final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index 1f7fdd13..9092829e 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatRoomDomain; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; @@ -39,7 +39,7 @@ public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long final MemberDomain receiver = memberReader.readByMemberId(receiverId); final String roomName = MessageFormat.format("{0},{1}", sender.getNickname(), receiver.getNickname()); - final ChatRoomDomain chatRoom = chatWriter.createNewPersonalRoom(roomName); + final ChatRoom chatRoom = chatWriter.createNewPersonalRoom(roomName); chatWriter.enterRoom(sender, chatRoom); chatWriter.enterRoom(receiver, chatRoom); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java b/src/main/java/kr/pickple/back/chat/service/ChatValidator.java deleted file mode 100644 index ce5ed3b2..00000000 --- a/src/main/java/kr/pickple/back/chat/service/ChatValidator.java +++ /dev/null @@ -1,82 +0,0 @@ -package kr.pickple.back.chat.service; - -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import java.util.Optional; - -import org.springframework.stereotype.Component; - -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.chat.repository.ChatRoomMemberRepository; -import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class ChatValidator { - - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; - private final GameRepository gameRepository; - private final ChatRoomMemberRepository chatRoomMemberRepository; - - public void validateIsExistedRoomMember(final Member member, final ChatRoom chatRoom) { - if (!isExistedRoomMember(chatRoom, member)) { - throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, member.getId(), chatRoom.getId()); - } - } - - private Boolean isExistedRoomMember(final ChatRoom chatRoom, final Member member) { - return chatRoomMemberRepository.existsByActiveTrueAndChatRoomIdAndMemberId(chatRoom.getId(), member.getId()); - } - - public void validateChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - switch (chatRoom.getType()) { - case CREW -> validateCrewChatRoomLeavingConditions(member, chatRoom); - case GAME -> validateGameChatRoomLeavingConditions(member, chatRoom); - } - } - - private void validateCrewChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - final Optional optionalCrew = crewRepository.findByChatRoomId(chatRoom.getId()); - - if (optionalCrew.isEmpty()) { - return; - } - - final CrewEntity crew = optionalCrew.get(); - validateIsMemberConfirmedCrewMember(crew.getId(), member.getId(), chatRoom.getId()); - } - - private void validateIsMemberConfirmedCrewMember(final Long crewId, final Long memberId, final Long chatRoomId) { - if (crewMemberRepository.existsByCrewIdAndMemberIdAndStatus(crewId, memberId, CONFIRMED)) { - throw new ChatException(CHAT_CREW_CHATROOM_NOT_ALLOWED_TO_LEAVE, crewId, memberId, chatRoomId); - } - } - - private void validateGameChatRoomLeavingConditions(final Member member, final ChatRoom chatRoom) { - final Optional optionalGame = gameRepository.findByChatRoomId(chatRoom.getId()); - - if (optionalGame.isEmpty()) { - return; - } - - final Game game = optionalGame.get(); - - if (isGameNotOver(game)) { - throw new ChatException(CHAT_GAME_CHATROOM_NOT_ALLOWED_TO_LEAVE, member.getId(), game.getId()); - } - } - - private Boolean isGameNotOver(final Game game) { - return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); - } -} diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index abec2bb3..560af441 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -3,7 +3,6 @@ import static kr.pickple.back.crew.domain.CrewStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 15e2ac21..cdbace03 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -3,7 +3,6 @@ import java.util.List; import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewProfile; diff --git a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java index e7d0c0b6..716980d3 100644 --- a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java +++ b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java @@ -10,7 +10,7 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.crew.util.CrewStatusConverter; @@ -99,7 +99,7 @@ public Boolean isLeader(final Long memberId) { return memberId.equals(leaderId); } - public void makeNewCrewChatRoom(final ChatRoom chatRoom) { + public void makeNewCrewChatRoom(final ChatRoomEntity chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); this.chatRoomId = chatRoom.getId(); } diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 970ec8ab..e8f56bb6 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; @@ -56,7 +56,7 @@ public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewCreateRe final MemberDomain leader = memberReader.readByMemberId(loggedInMemberId); validateCreateCrewMoreThanMaxCount(loggedInMemberId); - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(leader, newCrew.getName(), CREW); + final ChatRoomEntity chatRoom = chatRoomService.saveNewChatRoom(leader, newCrew.getName(), CREW); chatRoom.updateMaxMemberCount(newCrew.getMaxMemberCount()); newCrew.assignLeader(leader); diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/domain/Game.java index 24fbc8dd..fca45eb9 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -16,7 +16,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.util.GameStatusConverter; @@ -164,7 +164,7 @@ public Boolean isHost(final Long hostId) { return hostId.equals(this.hostId); } - public void makeNewCrewChatRoom(final ChatRoom chatRoom) { + public void makeNewCrewChatRoom(final ChatRoomEntity chatRoom) { chatRoom.updateMaxMemberCount(maxMemberCount); this.chatRoomId = chatRoom.getId(); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index b26fa68b..e0a893b3 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -8,7 +8,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index da25b0f6..e7ca6185 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -13,7 +13,7 @@ import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; @@ -159,7 +159,7 @@ public void updateGameMemberRegistrationStatus( validateIsHost(loggedInMemberId, game); final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(game.getChatRoomId()); + final ChatRoomEntity chatRoom = chatRoomRepository.getChatRoomById(game.getChatRoomId()); enterGameChatRoom(updateStatus, gameMember, chatRoom); gameMember.updateStatus(updateStatus); @@ -184,7 +184,7 @@ private void validateIsHost(final Long loggedInMemberId, final Game game) { private void enterGameChatRoom( final RegistrationStatus updateStatus, final GameMember gameMember, - final ChatRoom chatRoom + final ChatRoomEntity chatRoom ) { final RegistrationStatus nowStatus = gameMember.getStatus(); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index c8dbb675..3b708463 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -23,7 +23,7 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Category; @@ -88,7 +88,7 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina gameHost.confirmRegistration(); - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); + final ChatRoomEntity chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); game.makeNewCrewChatRoom(chatRoom); final Game savedGame = gameRepository.save(game); diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java similarity index 98% rename from src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java rename to src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java index 50a3abdc..27e4622a 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java @@ -28,7 +28,7 @@ import kr.pickple.back.member.domain.Member; @Transactional -class ChatMessageDocumentTest extends IntegrationChatTest { +class ChatMessageEntityDocumentTest extends IntegrationChatTest { private static final String BASE_URL = "/messages"; diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java similarity index 99% rename from src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java rename to src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java index 1d8a4de6..01ae1c29 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java @@ -30,7 +30,7 @@ import kr.pickple.back.member.domain.Member; @Transactional -class ChatRoomDocumentTest extends IntegrationChatTest { +class ChatRoomEntityDocumentTest extends IntegrationChatTest { private static final String BASE_URL = "/rooms"; diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java index f8461625..ae6d6560 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java @@ -8,7 +8,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; @@ -39,8 +39,8 @@ public static CrewMemberEntity crewMemberBuild(final Member member, final CrewEn .build(); } - public static ChatRoom crewChatRoomBuild() { - return ChatRoom.builder() + public static ChatRoomEntity crewChatRoomBuild() { + return ChatRoomEntity.builder() .name("백둥크루1") .type(CREW) .build(); diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java index bdbed744..fd087074 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java @@ -13,8 +13,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.domain.RoomType; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; @@ -47,8 +46,8 @@ public static Game gameBuild( .build(); } - public static ChatRoom gameChatRoomBuild() { - return ChatRoom.builder() + public static ChatRoomEntity gameChatRoomBuild() { + return ChatRoomEntity.builder() .name("11.10 영등포구") .type(GAME) .build(); diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index 0c67035d..1c9ab5c8 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -9,7 +9,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; @@ -41,7 +41,7 @@ public CrewEntity save(final Member leader) { final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final CrewEntity crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); - final ChatRoom savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); + final ChatRoomEntity savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); final CrewMemberEntity crewLeader = CrewFixtures.crewMemberBuild(leader, crew); crewLeader.confirmRegistration(); diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index 620547c3..634fd531 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -9,7 +9,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.fixture.domain.GameFixtures; import kr.pickple.back.game.domain.Game; @@ -37,7 +37,7 @@ public Game save(final Member host) { final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final Game game = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); - final ChatRoom savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); + final ChatRoomEntity savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); game.addGameMember(host); savedChatRoom.updateMaxMemberCount(game.getMaxMemberCount()); From ae5a3e5c01ae5402b47e3af140f5f2c3456e194a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:30:55 +0900 Subject: [PATCH 065/117] =?UTF-8?q?refactor:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B4=88=EA=B8=B0=EC=84=B8=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/game/domain/NewGame.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/kr/pickple/back/game/domain/NewGame.java diff --git a/src/main/java/kr/pickple/back/game/domain/NewGame.java b/src/main/java/kr/pickple/back/game/domain/NewGame.java new file mode 100644 index 00000000..80771408 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/domain/NewGame.java @@ -0,0 +1,70 @@ +package kr.pickple.back.game.domain; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class NewGame { + + private String content; + private LocalDate playDate; + private LocalTime playStartTime; + private LocalTime playEndTime; + private Integer playTimeMinutes; + private String mainAddress; + private String detailAddress; + private Integer cost; + private Integer maxMemberCount; + private List positions; + private String addressDepth1Name; + private String addressDepth2Name; + private MemberDomain host; + private ChatRoom chatRoom; + + @Builder + private NewGame( + final String content, + final LocalDate playDate, + final LocalTime playStartTime, + final LocalTime playEndTime, + final Integer playTimeMinutes, + final String mainAddress, + final String detailAddress, + final Integer cost, + final Integer maxMemberCount, + final List positions, + final String addressDepth1Name, + final String addressDepth2Name + ) { + this.content = content; + this.playDate = playDate; + this.playStartTime = playStartTime; + this.playEndTime = playEndTime; + this.playTimeMinutes = playTimeMinutes; + this.mainAddress = mainAddress; + this.detailAddress = detailAddress; + this.cost = cost; + this.maxMemberCount = maxMemberCount; + this.positions = positions; + this.addressDepth1Name = addressDepth1Name; + this.addressDepth2Name = addressDepth2Name; + } + + public void assignHost(final MemberDomain host) { + this.host = host; + } + + public void assignChatRoom(final ChatRoom chatRoom) { + this.chatRoom = chatRoom; + } +} From b20dccdb43eb740efea349fec4118237f217759e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:31:35 +0900 Subject: [PATCH 066/117] =?UTF-8?q?refactor:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/game/domain/GameDomain.java | 66 +++++++++++++++++++ .../entity/GameEntity.java} | 11 ++-- 2 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/domain/GameDomain.java rename src/main/java/kr/pickple/back/game/{domain/Game.java => repository/entity/GameEntity.java} (93%) diff --git a/src/main/java/kr/pickple/back/game/domain/GameDomain.java b/src/main/java/kr/pickple/back/game/domain/GameDomain.java new file mode 100644 index 00000000..f8f71425 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/domain/GameDomain.java @@ -0,0 +1,66 @@ +package kr.pickple.back.game.domain; + +import static kr.pickple.back.game.domain.GameStatus.*; +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GameDomain { + + private Long gameId; + private String content; + private LocalDate playDate; + private LocalTime playStartTime; + private LocalTime playEndTime; + private Integer playTimeMinutes; + private String mainAddress; + private String detailAddress; + private Double latitude; + private Double longitude; + private GameStatus status; + private Integer viewCount; + private Integer cost; + private Integer memberCount; + private Integer maxMemberCount; + private MemberDomain host; + private String addressDepth1; + private String addressDepth2; + private List positions; + private ChatRoom chatRoom; + + public void increaseMemberCount() { + if (status != OPEN) { + throw new GameException(GAME_STATUS_IS_CLOSED, status); + } + + if (memberCount.equals(maxMemberCount)) { + throw new CrewException(GAME_CAPACITY_LIMIT_REACHED, memberCount); + } + + memberCount += 1; + + if (memberCount.equals(maxMemberCount)) { + this.status = CLOSED; + } + } + + public LocalDateTime getPlayEndDatetime() { + return LocalDateTime.of(playDate, playEndTime); + } +} diff --git a/src/main/java/kr/pickple/back/game/domain/Game.java b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java similarity index 93% rename from src/main/java/kr/pickple/back/game/domain/Game.java rename to src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java index fca45eb9..da74e62d 100644 --- a/src/main/java/kr/pickple/back/game/domain/Game.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java @@ -1,4 +1,4 @@ -package kr.pickple.back.game.domain; +package kr.pickple.back.game.repository.entity; import static kr.pickple.back.game.domain.GameStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; @@ -18,6 +18,7 @@ import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.util.GameStatusConverter; import lombok.AccessLevel; @@ -28,7 +29,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Game extends BaseEntity { +public class GameEntity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -90,7 +91,7 @@ public class Game extends BaseEntity { private Long chatRoomId; @Builder - private Game( + private GameEntity( final String content, final LocalDate playDate, final LocalTime playStartTime, @@ -103,7 +104,8 @@ private Game( final Long hostId, final Point point, final Long addressDepth1Id, - final Long addressDepth2Id + final Long addressDepth2Id, + final Long chatRoomId ) { this.content = content; this.playDate = playDate; @@ -118,6 +120,7 @@ private Game( this.point = point; this.addressDepth1Id = addressDepth1Id; this.addressDepth2Id = addressDepth2Id; + this.chatRoomId = chatRoomId; } public void updateGameStatus(final GameStatus gameStatus) { From 35b52d0d43e0dc097fe0f6de24db4eb413c7aa6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:32:14 +0900 Subject: [PATCH 067/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20Reader,=20Writer=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EA=B3=84=EC=B8=B5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameReader.java | 74 ++++++++++++++++++ .../back/game/implement/GameWriter.java | 75 +++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 src/main/java/kr/pickple/back/game/implement/GameReader.java create mode 100644 src/main/java/kr/pickple/back/game/implement/GameWriter.java diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java new file mode 100644 index 00000000..5bc14443 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -0,0 +1,74 @@ +package kr.pickple.back.game.implement; + +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import java.util.List; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GameReader { + + private final MemberReader memberReader; + private final AddressReader addressReader; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; + private final GamePositionRepository gamePositionRepository; + private final ChatRoomRepository chatRoomRepository; + + public GameDomain read(final Long gameId) { + final GameEntity gameEntity = readGameEntity(gameId); + gameEntity.increaseViewCount(); + + final MemberDomain host = memberReader.readByMemberId(gameEntity.getHostId()); + + final List positions = readPositionsByGameId(gameId); + + final MainAddress mainAddress = addressReader.readMainAddressById( + gameEntity.getAddressDepth1Id(), + gameEntity.getAddressDepth2Id() + ); + + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); + return GameMapper.mapToGameDomain(gameEntity, mainAddress, host, chatRoom, positions); + } + + private GameEntity readGameEntity(final Long gameId) { + return gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + } + + private List readPositionsByGameId(final Long gameId) { + return gamePositionRepository.findAllByGameId(gameId) + .stream() + .map(GamePosition::getPosition) + .toList(); + } + + public List readAllMembersByGameIdAndStatus(final Long gameId, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(gameId, status) + .stream() + .map(gameMemberEntity -> memberReader.readByMemberId(gameMemberEntity.getMemberId())) + .toList(); + } +} diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java new file mode 100644 index 00000000..72f804e2 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -0,0 +1,75 @@ +package kr.pickple.back.game.implement; + +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import java.util.List; + +import org.locationtech.jts.geom.Point; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.NewGame; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Component +@Transactional +@RequiredArgsConstructor +public class GameWriter { + + private final AddressReader addressReader; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; + private final KakaoAddressSearchClient kakaoAddressSearchClient; + private final GamePositionRepository gamePositionRepository; + + public GameDomain create(final NewGame newGame) { + final Point point = kakaoAddressSearchClient.fetchAddress(newGame.getMainAddress()); + + final MainAddress mainAddress = addressReader.readMainAddressByNames( + newGame.getAddressDepth1Name(), + newGame.getAddressDepth2Name() + ); + + final GameEntity gameEntity = GameMapper.mapNewGameDomainToEntity(newGame, point, mainAddress); + final GameEntity savedGameEntity = gameRepository.save(gameEntity); + + setPositionsToGame(newGame.getPositions(), savedGameEntity.getId()); + + return GameMapper.mapToGameDomain( + savedGameEntity, + mainAddress, + newGame.getHost(), + newGame.getChatRoom(), + newGame.getPositions() + ); + } + + private void setPositionsToGame(final List positions, final Long gameId) { + validateIsDuplicatedPositions(positions); + + final List gamePositions = GameMapper.mapToGamePositionEntities(positions, gameId); + + gamePositionRepository.saveAll(gamePositions); + } + + private void validateIsDuplicatedPositions(final List positions) { + final Long distinctPositionsSize = positions.stream() + .distinct() + .count(); + + if (distinctPositionsSize != positions.size()) { + throw new GameException(GAME_POSITIONS_IS_DUPLICATED, positions); + } + } +} From 45bb880b8c1dfaa2b7a9a9291bfcf977be241cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:34:27 +0900 Subject: [PATCH 068/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20DTO?= =?UTF-8?q?=EC=99=80=20Game=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=81?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20=EB=A7=A4?= =?UTF-8?q?=ED=8D=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/dto/mapper/GameRequestMapper.java | 30 +++++++++++++ .../game/dto/mapper/GameResponseMapper.java | 42 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java create mode 100644 src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java new file mode 100644 index 00000000..70d3c9ca --- /dev/null +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java @@ -0,0 +1,30 @@ +package kr.pickple.back.game.dto.mapper; + +import java.time.LocalTime; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.game.domain.NewGame; +import kr.pickple.back.game.dto.request.GameCreateRequest; + +public class GameRequestMapper { + + public static NewGame mapToNewGameDomain(final GameCreateRequest gameCreateRequest, final MainAddress mainAddress) { + LocalTime playEndTime = gameCreateRequest.getPlayStartTime() + .plusMinutes(gameCreateRequest.getPlayTimeMinutes()); + + return NewGame.builder() + .content(gameCreateRequest.getContent()) + .playDate(gameCreateRequest.getPlayDate()) + .playStartTime(gameCreateRequest.getPlayStartTime()) + .playEndTime(playEndTime) + .playTimeMinutes(gameCreateRequest.getPlayTimeMinutes()) + .mainAddress(gameCreateRequest.getMainAddress()) + .detailAddress(gameCreateRequest.getDetailAddress()) + .cost(gameCreateRequest.getCost()) + .maxMemberCount(gameCreateRequest.getMaxMemberCount()) + .positions(gameCreateRequest.getPositions()) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java new file mode 100644 index 00000000..e53ae9c4 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java @@ -0,0 +1,42 @@ +package kr.pickple.back.game.dto.mapper; + +import java.util.List; + +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.dto.response.GameResponse; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.dto.mapper.MemberResponseMapper; +import kr.pickple.back.member.dto.response.MemberResponse; + +public class GameResponseMapper { + + public static GameResponse mapToGameResponseDto(final GameDomain gameDomain, final List members) { + final List memberResponses = members + .stream() + .map(MemberResponseMapper::mapToMemberResponseDto) + .toList(); + + return GameResponse.builder() + .id(gameDomain.getGameId()) + .content(gameDomain.getContent()) + .playDate(gameDomain.getPlayDate()) + .playStartTime(gameDomain.getPlayStartTime()) + .playEndTime(gameDomain.getPlayEndTime()) + .playTimeMinutes(gameDomain.getPlayTimeMinutes()) + .mainAddress(gameDomain.getMainAddress()) + .detailAddress(gameDomain.getDetailAddress()) + .latitude(gameDomain.getLatitude()) + .longitude(gameDomain.getLongitude()) + .status(gameDomain.getStatus()) + .viewCount(gameDomain.getViewCount()) + .cost(gameDomain.getCost()) + .memberCount(gameDomain.getMemberCount()) + .maxMemberCount(gameDomain.getMaxMemberCount()) + .host(MemberResponseMapper.mapToMemberResponseDto(gameDomain.getHost())) + .addressDepth1(gameDomain.getAddressDepth1()) + .addressDepth2(gameDomain.getAddressDepth2()) + .positions(gameDomain.getPositions()) + .members(memberResponses) + .build(); + } +} From 82cd586386ae48ba3348c574c919a623b75c4adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:37:07 +0900 Subject: [PATCH 069/117] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20repository?= =?UTF-8?q?=EC=97=90=20=EA=B2=8C=EC=9E=84=EC=9D=98=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EC=88=98=EC=99=80=20=EB=AA=A8=EC=A7=91=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameMapper.java | 89 +++++++++++++++++++ .../back/game/repository/GameRepository.java | 14 +-- .../game/repository/GameSearchRepository.java | 6 +- .../repository/GameSearchRepositoryImpl.java | 6 +- 4 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/implement/GameMapper.java diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java new file mode 100644 index 00000000..78a1d7a9 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -0,0 +1,89 @@ +package kr.pickple.back.game.implement; + +import java.util.List; + +import org.locationtech.jts.geom.Point; + +import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.NewGame; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.position.domain.Position; + +public class GameMapper { + + public static GameDomain mapToGameDomain( + final GameEntity gameEntity, + final MainAddress mainAddress, + final MemberDomain host, + final ChatRoom chatRoom, + final List positions + ) { + return GameDomain.builder() + .gameId(gameEntity.getId()) + .content(gameEntity.getContent()) + .playDate(gameEntity.getPlayDate()) + .playStartTime(gameEntity.getPlayStartTime()) + .playEndTime(gameEntity.getPlayEndTime()) + .playTimeMinutes(gameEntity.getPlayTimeMinutes()) + .mainAddress(gameEntity.getMainAddress()) + .detailAddress(gameEntity.getDetailAddress()) + .latitude(gameEntity.getPoint().getY()) + .longitude(gameEntity.getPoint().getX()) + .status(gameEntity.getStatus()) + .viewCount(gameEntity.getViewCount()) + .cost(gameEntity.getCost()) + .memberCount(gameEntity.getMemberCount()) + .maxMemberCount(gameEntity.getMaxMemberCount()) + .host(host) + .addressDepth1(mainAddress.getAddressDepth1().getName()) + .addressDepth2(mainAddress.getAddressDepth2().getName()) + .positions(positions) + .chatRoom(chatRoom) + .build(); + } + + public static GameEntity mapNewGameDomainToEntity(NewGame newGame, Point point, MainAddress mainAddress) { + return GameEntity.builder() + .content(newGame.getContent()) + .playDate(newGame.getPlayDate()) + .playStartTime(newGame.getPlayStartTime()) + .playEndTime(newGame.getPlayEndTime()) + .playTimeMinutes(newGame.getPlayTimeMinutes()) + .mainAddress(newGame.getMainAddress()) + .detailAddress(newGame.getDetailAddress()) + .cost(newGame.getCost()) + .maxMemberCount(newGame.getMaxMemberCount()) + .hostId(newGame.getHost().getMemberId()) + .point(point) + .addressDepth1Id(mainAddress.getAddressDepth1().getId()) + .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .chatRoomId(newGame.getChatRoom().getId()) + .build(); + } + + public static List mapToGamePositionEntities(final List positions, final Long gameId) { + return positions.stream() + .map(position -> GamePosition.builder() + .gameId(gameId) + .position(position) + .build() + ).toList(); + } + + public static List mapToMemberPositionEntities( + final List positions, + final Long memberId + ) { + return positions.stream() + .map(position -> MemberPosition.builder() + .memberId(memberId) + .position(position) + .build() + ).toList(); + } +} diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index e0a893b3..f0d60e48 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -7,23 +7,27 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.entity.GameEntity; -public interface GameRepository extends JpaRepository, GameSearchRepository { +public interface GameRepository extends JpaRepository, GameSearchRepository { - Page findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + Page findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( final Long addressDepth1Id, final Long addressDepth2Id, final GameStatus status, final Pageable pageable ); - Optional findByChatRoomId(final Long chatRoomId); + Optional findByChatRoomId(final Long chatRoomId); - default Game getGameById(final Long gameId) { + default GameEntity getGameById(final Long gameId) { return findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); } + + @Query("update GameEntity g set g.memberCount = :memberCount, g.status = :status where g.id = :gameId") + void updateMemberCountAndStatus(final Long gameId, final Integer memberCount, final GameStatus status); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java index 1d555792..c906b93e 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java @@ -4,11 +4,11 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; public interface GameSearchRepository { - List findGamesWithInDistance(final Double latitude, final Double longitude, final Double distance); + List findGamesWithInDistance(final Double latitude, final Double longitude, final Double distance); - List findGamesWithInAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2); + List findGamesWithInAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java index 893b6c1c..f2ee11d5 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java @@ -12,7 +12,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @@ -21,7 +21,7 @@ public class GameSearchRepositoryImpl implements GameSearchRepository { private final JPAQueryFactory jpaQueryFactory; @Override - public List findGamesWithInDistance( + public List findGamesWithInDistance( final Double latitude, final Double longitude, final Double distance @@ -53,7 +53,7 @@ private OrderSpecifier getOrderByDistance(final String pointWKT) { } @Override - public List findGamesWithInAddress( + public List findGamesWithInAddress( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 ) { From 0b9f381a973e7a0144171a5d9094924de272e687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:41:44 +0900 Subject: [PATCH 070/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A9=A4=EB=B2=84=20=EB=8F=84=EB=A9=94=EC=9D=B8,=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/game/domain/GameMember.java | 71 ++++--------------- .../repository/entity/GameMemberEntity.java | 70 ++++++++++++++++++ .../game/repository/entity/GamePosition.java | 40 +++++++++++ 3 files changed, 125 insertions(+), 56 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java create mode 100644 src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index f59d5680..082d534a 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -1,70 +1,29 @@ package kr.pickple.back.game.domain; -import static java.lang.Boolean.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; +import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GameMember extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Convert(converter = RegistrationStatusAttributeConverter.class) - @Column(length = 10) - private RegistrationStatus status = WAITING; - - @NotNull - private Boolean isReview = FALSE; - - @NotNull - private Long memberId; - - @NotNull - private Long gameId; - - @Builder - private GameMember(final Long memberId, final Long gameId, final RegistrationStatus status) { - this.status = status; - this.memberId = memberId; - this.gameId = gameId; +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GameMember { + + private Long gameMemberId; + private RegistrationStatus status; + private MemberDomain member; + private GameDomain game; + + public void updateGameMemberId(final Long gameMemberId) { + this.gameMemberId = gameMemberId; } - public void confirmRegistration() { - this.status = CONFIRMED; - } - - public void updateStatus(final RegistrationStatus status) { + public void updateRegistrationStatus(final RegistrationStatus status) { this.status = status; } - - public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { - return this.status == WAITING && updateStatus == CONFIRMED; - } - - public Boolean isAlreadyReviewDone() { - return isReview; - } - - public void updateReviewDone() { - this.isReview = TRUE; - } } diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java new file mode 100644 index 00000000..0fb72a6f --- /dev/null +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java @@ -0,0 +1,70 @@ +package kr.pickple.back.game.repository.entity; + +import static java.lang.Boolean.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.common.util.RegistrationStatusAttributeConverter; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GameMemberEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Convert(converter = RegistrationStatusAttributeConverter.class) + @Column(length = 10) + private RegistrationStatus status = WAITING; + + @NotNull + private Boolean isReview = FALSE; + + @NotNull + private Long memberId; + + @NotNull + private Long gameId; + + @Builder + private GameMemberEntity(final Long memberId, final Long gameId, final RegistrationStatus status) { + this.status = status; + this.memberId = memberId; + this.gameId = gameId; + } + + public void confirmRegistration() { + this.status = CONFIRMED; + } + + public void updateStatus(final RegistrationStatus status) { + this.status = status; + } + + public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { + return this.status == WAITING && updateStatus == CONFIRMED; + } + + public Boolean isAlreadyReviewDone() { + return isReview; + } + + public void updateReviewDone() { + this.isReview = TRUE; + } +} diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java b/src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java new file mode 100644 index 00000000..e4a11489 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java @@ -0,0 +1,40 @@ +package kr.pickple.back.game.repository.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.validation.constraints.NotNull; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.position.domain.Position; +import kr.pickple.back.position.util.PositionConverter; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class GamePosition extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Getter + @NotNull + @Convert(converter = PositionConverter.class) + @Column(length = 2) + private Position position; + + @NotNull + private Long gameId; + + @Builder + private GamePosition(final Position position, final Long gameId) { + this.position = position; + this.gameId = gameId; + } +} From 9dae0744450ccc76272bd3d7733b5f379cb0807d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:43:36 +0900 Subject: [PATCH 071/117] =?UTF-8?q?refactor:=20=EB=B0=94=EB=80=90=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=84=B8=ED=8C=85?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EC=B6=94=EC=96=B4=20=EA=B2=8C=EC=9E=84ser?= =?UTF-8?q?vice=EC=9D=98=20=EC=83=9D=EC=84=B1,=20=EC=9D=BD=EA=B8=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/dto/request/GameCreateRequest.java | 16 +-- .../back/game/dto/response/GameResponse.java | 39 ------ .../back/game/implement/GameMemberMapper.java | 15 +++ .../back/game/implement/GameMemberWriter.java | 57 +++++++++ .../game/repository/GameMemberRepository.java | 20 +-- .../repository/GamePositionRepository.java | 2 +- .../back/game/service/GameMemberService.java | 115 +++++++++--------- .../GameReviewMannerScoresService.java | 42 +++---- .../back/game/service/GameService.java | 115 +++++++++--------- 9 files changed, 229 insertions(+), 192 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java create mode 100644 src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index f952c6d3..6fe41aac 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -16,8 +16,7 @@ import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GamePosition; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -66,12 +65,12 @@ public class GameCreateRequest { @NotNull(message = "포지션 목록은 null일 수 없음") private List positions; - public Game toEntity( + public GameEntity toEntity( final Long hostId, final MainAddress mainAddress, final Point point ) { - return Game.builder() + return GameEntity.builder() .content(content) .playDate(playDate) .playStartTime(playStartTime) @@ -87,13 +86,4 @@ public Game toEntity( .addressDepth2Id(mainAddress.getAddressDepth2().getId()) .build(); } - - public List toGamePositionEntities(final Game game) { - return positions.stream() - .map(position -> GamePosition.builder() - .game(game) - .position(position) - .build() - ).toList(); - } } diff --git a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java index d9dc0386..fb7f4e14 100644 --- a/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameResponse.java @@ -4,8 +4,6 @@ import java.time.LocalTime; import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.position.domain.Position; @@ -39,41 +37,4 @@ public class GameResponse { private String addressDepth2; private List positions; private List members; - - public static GameResponse of( - final Game game, - final List memberResponses, - final List positions, - final MainAddress mainAddress - ) { - return GameResponse.builder() - .id(game.getId()) - .content(game.getContent()) - .playDate(game.getPlayDate()) - .playStartTime(game.getPlayStartTime()) - .playEndTime(game.getPlayEndTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .mainAddress(game.getMainAddress()) - .detailAddress(game.getDetailAddress()) - .latitude(game.getPoint().getY()) - .longitude(game.getPoint().getX()) - .status(game.getStatus()) - .viewCount(game.getViewCount()) - .cost(game.getCost()) - .memberCount(game.getMemberCount()) - .maxMemberCount(game.getMaxMemberCount()) - .host(getHostResponse(memberResponses, game.getHostId())) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) - .positions(positions) - .members(memberResponses) - .build(); - } - - private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { - return memberResponses.stream() - .filter(memberResponse -> memberResponse.getId().equals(hostId)) - .findFirst() - .orElseThrow(); - } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java new file mode 100644 index 00000000..b12e6086 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java @@ -0,0 +1,15 @@ +package kr.pickple.back.game.implement; + +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameMemberEntity; + +public class GameMemberMapper { + + public static GameMemberEntity mapGameMemberDomainToEntity(final GameMember gameMember) { + return GameMemberEntity.builder() + .status(gameMember.getStatus()) + .memberId(gameMember.getMember().getMemberId()) + .gameId(gameMember.getGame().getGameId()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java new file mode 100644 index 00000000..4b3eeff9 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -0,0 +1,57 @@ +package kr.pickple.back.game.implement; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.member.domain.MemberDomain; +import lombok.RequiredArgsConstructor; + +@Component +@Transactional +@RequiredArgsConstructor +public class GameMemberWriter { + + private final GameMemberRepository gameMemberRepository; + private final GameRepository gameRepository; + + public GameMember register(final MemberDomain member, final GameDomain game) { + final Long memberId = member.getMemberId(); + final Long gameId = game.getGameId(); + + if (gameMemberRepository.existsByGameIdAndMemberId(gameId, memberId)) { + throw new GameException(GAME_MEMBER_IS_EXISTED, gameId, memberId); + } + + final GameMember gameMember = GameMember.builder() + .status(WAITING) + .member(member) + .game(game) + .build(); + + final GameMemberEntity gameMemberEntity = GameMemberMapper.mapGameMemberDomainToEntity(gameMember); + final GameMemberEntity savedGameMemberEntity = gameMemberRepository.save(gameMemberEntity); + gameMember.updateGameMemberId(savedGameMemberEntity.getId()); + + return gameMember; + } + + public void updateMemberRegistrationStatus(final GameMember gameMember, final RegistrationStatus status) { + gameMember.updateRegistrationStatus(status); + gameMemberRepository.updateRegistrationStatus(gameMember.getGameMemberId(), status); + + final GameDomain game = gameMember.getGame(); + game.increaseMemberCount(); + gameRepository.updateMemberCountAndStatus(game.getGameId(), game.getMemberCount(), game.getStatus()); + } + +} diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 5805ee34..13167ebf 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -4,23 +4,29 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameMemberEntity; -public interface GameMemberRepository extends JpaRepository { +public interface GameMemberRepository extends JpaRepository { - Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); + Optional findByMemberIdAndGameId(final Long memberId, final Long gameId); - Optional findByMemberIdAndGameIdAndStatus( + Optional findByMemberIdAndGameIdAndStatus( final Long memberId, final Long gameId, final RegistrationStatus status ); - List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); + List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); - List findAllByMemberId(final Long memberId); + List findAllByMemberId(final Long memberId); - List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); + List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); + + Boolean existsByGameIdAndMemberId(final Long gameId, final Long memberId); + + @Query("update GameMemberEntity gm set gm.status = :status where gm.id = :gameMemberId") + void updateRegistrationStatus(final Long gameMemberId, final RegistrationStatus status); } diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java index 9ca9cd1c..8c32456d 100644 --- a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java @@ -4,7 +4,7 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.game.domain.GamePosition; +import kr.pickple.back.game.repository.entity.GamePosition; public interface GamePositionRepository extends JpaRepository { diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index e7ca6185..a71195d5 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -17,9 +17,9 @@ import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; -import kr.pickple.back.game.domain.GamePosition; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; @@ -52,40 +52,40 @@ public class GameMemberService { @Transactional public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final Game game = gameRepository.getGameById(gameId); + final GameEntity gameEntity = gameRepository.getGameById(gameId); final Member member = memberRepository.getMemberById(loggedInMemberId); - validateIsAlreadyRegisteredGameMember(game, member); - final GameMember gameMember = buildGameMember(game, member); - gameMemberRepository.save(gameMember); + validateIsAlreadyRegisteredGameMember(gameEntity, member); + final GameMemberEntity gameMemberEntity = buildGameMember(gameEntity, member); + gameMemberRepository.save(gameMemberEntity); eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() .gameId(gameId) - .memberId(game.getHostId()) + .memberId(gameEntity.getHostId()) .build()); } - private void validateIsAlreadyRegisteredGameMember(final Game game, final Member member) { - if (isAlreadyRegistered(game, member)) { + private void validateIsAlreadyRegisteredGameMember(final GameEntity gameEntity, final Member member) { + if (isAlreadyRegistered(gameEntity, member)) { throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); } } - private boolean isAlreadyRegistered(final Game game, final Member member) { - return gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()).isPresent(); + private boolean isAlreadyRegistered(final GameEntity gameEntity, final Member member) { + return gameMemberRepository.findByMemberIdAndGameId(member.getId(), gameEntity.getId()).isPresent(); } - private GameMember buildGameMember(final Game game, final Member member) { + private GameMemberEntity buildGameMember(final GameEntity gameEntity, final Member member) { - return GameMember.builder() - .status(getRegistrationStatus(member, game)) + return GameMemberEntity.builder() + .status(getRegistrationStatus(member, gameEntity)) .memberId(member.getId()) - .gameId(game.getId()) + .gameId(gameEntity.getId()) .build(); } - private RegistrationStatus getRegistrationStatus(final Member member, final Game game) { - final Member host = memberRepository.getMemberById(game.getHostId()); + private RegistrationStatus getRegistrationStatus(final Member member, final GameEntity gameEntity) { + final Member host = memberRepository.getMemberById(gameEntity.getHostId()); if (member.equals(host)) { return CONFIRMED; @@ -99,24 +99,24 @@ public GameResponse findAllGameMembers( final Long gameId, final RegistrationStatus status ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); - final Game game = gameRepository.getGameById(gameMember.getGameId()); - final Member loggedInMember = memberRepository.getMemberById(gameMember.getMemberId()); + final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); + final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); + final Member loggedInMember = memberRepository.getMemberById(gameMemberEntity.getMemberId()); - if (!game.isHost(loggedInMember.getId()) && status == WAITING) { + if (!gameEntity.isHost(loggedInMember.getId()) && status == WAITING) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } return GameResponse.of( - game, - getMemberResponsesByStatus(game, status), - getPositionsByGame(game), - addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + gameEntity, + getMemberResponsesByStatus(gameEntity, status), + getPositionsByGame(gameEntity), + addressReader.readMainAddressById(gameEntity.getAddressDepth1Id(), gameEntity.getAddressDepth2Id()) ); } - private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) + private List getMemberResponsesByStatus(final GameEntity gameEntity, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), status) .stream() .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( @@ -135,13 +135,13 @@ private List getPositionsByMember(final Member member) { return Position.fromMemberPositions(memberPositions); } - private List getPositionsByGame(final Game game) { - final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + private List getPositionsByGame(final GameEntity gameEntity) { + final List gamePositions = gamePositionRepository.findAllByGameId(gameEntity.getId()); return Position.fromGamePositions(gamePositions); } - private GameMember findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { + private GameMemberEntity findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); } @@ -153,18 +153,23 @@ public void updateGameMemberRegistrationStatus( final Long memberId, final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest ) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameRepository.getGameById(gameMember.getGameId()); + final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, memberId); + final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); - validateIsHost(loggedInMemberId, game); + validateIsHost(loggedInMemberId, gameEntity); final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); +<<<<<<< HEAD final ChatRoomEntity chatRoom = chatRoomRepository.getChatRoomById(game.getChatRoomId()); enterGameChatRoom(updateStatus, gameMember, chatRoom); - - gameMember.updateStatus(updateStatus); - if (gameMember.isStatusChangedFromWaitingToConfirmed(updateStatus)) { - game.increaseMemberCount(); +======= + final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); + enterGameChatRoom(updateStatus, gameMemberEntity, chatRoom); +>>>>>>> ab89fd2 (refactor: 바뀐 구현계층 세팅에 맞추어 게임service의 생성, 읽기 기능 수정) + + gameMemberEntity.updateStatus(updateStatus); + if (gameMemberEntity.isStatusChangedFromWaitingToConfirmed(updateStatus)) { + gameEntity.increaseMemberCount(); } eventPublisher.publishEvent(GameMemberJoinedEvent.builder() @@ -173,34 +178,34 @@ public void updateGameMemberRegistrationStatus( .build()); } - private void validateIsHost(final Long loggedInMemberId, final Game game) { + private void validateIsHost(final Long loggedInMemberId, final GameEntity gameEntity) { final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - if (!game.isHost(loggedInMember.getId())) { + if (!gameEntity.isHost(loggedInMember.getId())) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } } private void enterGameChatRoom( final RegistrationStatus updateStatus, - final GameMember gameMember, - final ChatRoomEntity chatRoom + final GameMemberEntity gameMemberEntity, + final ChatRoom chatRoom ) { - final RegistrationStatus nowStatus = gameMember.getStatus(); + final RegistrationStatus nowStatus = gameMemberEntity.getStatus(); if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, memberRepository.getMemberById(gameMember.getMemberId())); + chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, memberRepository.getMemberById(gameMemberEntity.getMemberId())); } } @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMember gameMember = findGameMemberByGameIdAndMemberId(gameId, memberId); - final Game game = gameRepository.getGameById(gameMember.getGameId()); - final Member member = memberRepository.getMemberById(gameMember.getMemberId()); + final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, memberId); + final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); + final Member member = memberRepository.getMemberById(gameMemberEntity.getMemberId()); final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - if (game.isHost(loggedInMember.getId())) { + if (gameEntity.isHost(loggedInMember.getId())) { validateIsHostSelfDeleted(loggedInMember, member); eventPublisher.publishEvent(GameMemberRejectedEvent.builder() @@ -208,13 +213,13 @@ public void deleteGameMember(final Long loggedInMemberId, final Long gameId, fin .memberId(memberId) .build()); - deleteGameMember(gameMember); + deleteGameMember(gameMemberEntity); return; } if (loggedInMember.equals(member)) { - cancelGameMember(gameMember); + cancelGameMember(gameMemberEntity); return; } @@ -228,17 +233,17 @@ private void validateIsHostSelfDeleted(final Member loggedInMember, final Member } } - private void cancelGameMember(final GameMember gameMember) { - RegistrationStatus status = gameMember.getStatus(); + private void cancelGameMember(final GameMemberEntity gameMemberEntity) { + RegistrationStatus status = gameMemberEntity.getStatus(); if (status != WAITING) { throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); } - deleteGameMember(gameMember); + deleteGameMember(gameMemberEntity); } - private void deleteGameMember(final GameMember gameMember) { - gameMemberRepository.delete(gameMember); + private void deleteGameMember(final GameMemberEntity gameMemberEntity) { + gameMemberRepository.delete(gameMemberEntity); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 9875939a..b7ba2f1b 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -10,8 +10,8 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; @@ -37,32 +37,32 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameIdAndStatus( + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( loggedInMemberId, gameId, CONFIRMED ) .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); - if (gameMember.isAlreadyReviewDone()) { + if (gameMemberEntity.isAlreadyReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } - final Game game = gameRepository.getGameById(gameMember.getGameId()); - final Member loggedInMember = memberRepository.getMemberById(gameMember.getMemberId()); + final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); + final Member loggedInMember = memberRepository.getMemberById(gameMemberEntity.getMemberId()); - if (isNotReviewPeriod(game)) { - throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, game.getPlayDate(), - game.getPlayEndTime()); + if (isNotReviewPeriod(gameEntity)) { + throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, gameEntity.getPlayDate(), + gameEntity.getPlayEndTime()); } mannerScoreReviews.forEach(review -> { - final Member reviewedMember = getReviewedMember(game, review.getMemberId()); + final Member reviewedMember = getReviewedMember(gameEntity, review.getMemberId()); validateIsSelfReview(loggedInMember, reviewedMember); reviewedMember.updateMannerScore(review.getMannerScore()); }); - gameMember.updateReviewDone(); + gameMemberEntity.updateReviewDone(); } private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { @@ -71,30 +71,30 @@ private void validateIsSelfReview(final Member loggedInMember, final Member revi } } - private Boolean isNotReviewPeriod(final Game game) { - return isBeforeThanPlayEndTime(game) || isAfterReviewPossibleTime(game); + private Boolean isNotReviewPeriod(final GameEntity gameEntity) { + return isBeforeThanPlayEndTime(gameEntity) || isAfterReviewPossibleTime(gameEntity); } - private Boolean isBeforeThanPlayEndTime(final Game game) { - return DateTimeUtil.isAfterThanNow(game.getPlayEndDatetime()); + private Boolean isBeforeThanPlayEndTime(final GameEntity gameEntity) { + return DateTimeUtil.isAfterThanNow(gameEntity.getPlayEndDatetime()); } - private Boolean isAfterReviewPossibleTime(final Game game) { - final LocalDateTime reviewDeadlineDatetime = game.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); + private Boolean isAfterReviewPossibleTime(final GameEntity gameEntity) { + final LocalDateTime reviewDeadlineDatetime = gameEntity.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); } - private Member getReviewedMember(final Game game, final Long reviewedMemberId) { - return getConfirmedMembers(game) + private Member getReviewedMember(final GameEntity gameEntity, final Long reviewedMemberId) { + return getConfirmedMembers(gameEntity) .stream() .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) .findFirst() .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); } - private List getConfirmedMembers(Game game) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), CONFIRMED) + private List getConfirmedMembers(GameEntity gameEntity) { + return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), CONFIRMED) .stream() .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .toList(); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 3b708463..6d1f1a8f 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -11,7 +11,6 @@ import java.time.format.DateTimeFormatter; import java.util.List; -import org.locationtech.jts.geom.Point; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -23,24 +22,33 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Category; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameDomain; import kr.pickple.back.game.domain.GameMember; -import kr.pickple.back.game.domain.GamePosition; import kr.pickple.back.game.domain.GameStatus; +import kr.pickple.back.game.domain.NewGame; +import kr.pickple.back.game.dto.mapper.GameRequestMapper; +import kr.pickple.back.game.dto.mapper.GameResponseMapper; import kr.pickple.back.game.dto.request.GameCreateRequest; import kr.pickple.back.game.dto.response.GameIdResponse; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.implement.GameMemberWriter; +import kr.pickple.back.game.implement.GameReader; +import kr.pickple.back.game.implement.GameWriter; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; @@ -61,6 +69,10 @@ public class GameService { private final RedisRepository redisRepository; private final GamePositionRepository gamePositionRepository; private final GameMemberRepository gameMemberRepository; + private final GameReader gameReader; + private final MemberReader memberReader; + private final GameWriter gameWriter; + private final GameMemberWriter gameMemberWriter; private static long getSecondsBetween( final LocalDateTime gameCreatedDateTime, @@ -75,63 +87,59 @@ private static long getSecondsBetween( */ @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final Member host = memberRepository.getMemberById(loggedInMemberId); - final Point point = kakaoAddressSearchClient.fetchAddress(gameCreateRequest.getMainAddress()); - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( - gameCreateRequest.getMainAddress()); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(gameCreateRequest.getMainAddress()); + final NewGame newGame = GameRequestMapper.mapToNewGameDomain(gameCreateRequest, mainAddress); - final Game game = gameCreateRequest.toEntity(host.getId(), mainAddress, point); - final GameMember gameHost = GameMember.builder() - .memberId(host.getId()) - .gameId(game.getId()) - .build(); + final MemberDomain host = memberReader.readByMemberId(loggedInMemberId); - gameHost.confirmRegistration(); + final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(newGame), GAME); + chatRoom.updateMaxMemberCount(newGame.getMaxMemberCount()); - final ChatRoomEntity chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(game), GAME); - game.makeNewCrewChatRoom(chatRoom); + newGame.assignHost(host); + newGame.assignChatRoom(chatRoom); - final Game savedGame = gameRepository.save(game); - final List gamePositions = gameCreateRequest.toGamePositionEntities(savedGame); - gamePositionRepository.saveAll(gamePositions); + final GameDomain game = gameWriter.create(newGame); - final Long savedGameId = savedGame.getId(); - saveGameStatusUpdateEventToRedis(game, savedGameId); + final GameMember gameHost = gameMemberWriter.register(host, game); + gameMemberWriter.updateMemberRegistrationStatus(gameHost, CONFIRMED); - return GameIdResponse.from(savedGameId); + //9. 게임 상태 업데이트 이벤트를 레디스에 저장(엔티티를 도메인으로 대체하면 됨) + saveGameStatusUpdateEventToRedis(game); + + return GameIdResponse.from(game.getGameId()); } - private String makeGameRoomName(final Game game) { - final String playDateFormat = game.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); - final String addressDepth2Name = addressReader.getAddressDepth2ById(game.getAddressDepth2Id()).getName(); + private String makeGameRoomName(final NewGame newGame) { + final String playDateFormat = newGame.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); + final String addressDepth2Name = newGame.getAddressDepth2Name(); return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); } - private void saveGameStatusUpdateEventToRedis(final Game game, final Long savedGameId) { + private void saveGameStatusUpdateEventToRedis(final GameDomain gameDomain) { final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); // 경기를 생성한 시각과 경기 시작 시간의 차 - final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, game); + final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, gameDomain); // 경기를 생성한 시각과 경기 종료 시간의 차 - final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, game); + final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, gameDomain); - final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, savedGameId); - final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, savedGameId); + final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, gameDomain.getGameId()); + final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, gameDomain.getGameId()); redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); } - private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gamePlayDateTime = LocalDateTime.of(game.getPlayDate(), game.getPlayStartTime()); + private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final GameDomain gameDomain) { + final LocalDateTime gamePlayDateTime = LocalDateTime.of(gameDomain.getPlayDate(), gameDomain.getPlayStartTime()); return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); } - private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final Game game) { - final LocalDateTime gameEndDateTime = game.getPlayEndDatetime(); + private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final GameDomain gameDomain) { + final LocalDateTime gameEndDateTime = gameDomain.getPlayEndDatetime(); return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); } @@ -145,8 +153,8 @@ private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long i */ @Transactional public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - final Game game = gameRepository.getGameById(gameId); - game.updateGameStatus(gameStatus); + final GameEntity gameEntity = gameRepository.getGameById(gameId); + gameEntity.updateGameStatus(gameStatus); } /** @@ -154,15 +162,10 @@ public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { */ @Transactional public GameResponse findGameById(final Long gameId) { - final Game game = gameRepository.getGameById(gameId); - game.increaseViewCount(); - - return GameResponse.of( - game, - getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), - addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) - ); + final GameDomain gameDomain = gameReader.read(gameId); + final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, CONFIRMED); + + return GameResponseMapper.mapToGameResponseDto(gameDomain, members); } /** @@ -196,7 +199,7 @@ private List findGamesByAddress(final String address, final Pageab ) ); - final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( mainAddress.getAddressDepth1().getId(), mainAddress.getAddressDepth2().getId(), GameStatus.ENDED, @@ -218,13 +221,13 @@ private List findGamesByAddress(final String address, final Pageab * 특정 지역의 게스트 모집글 조회 */ public List findGamesWithInAddress(final MainAddress mainAddress) { - final List games = gameRepository.findGamesWithInAddress( + final List gameEntities = gameRepository.findGamesWithInAddress( mainAddress.getAddressDepth1(), mainAddress.getAddressDepth2() ); - return games.stream() - .filter(Game::isNotEndedGame) + return gameEntities.stream() + .filter(GameEntity::isNotEndedGame) .map(game -> GameResponse.of( game, getMemberResponsesByStatus(game, CONFIRMED), @@ -243,10 +246,10 @@ public List findGamesWithInDistance( final Double longitude, final Double distance ) { - final List games = gameRepository.findGamesWithInDistance(latitude, longitude, distance); + final List gameEntities = gameRepository.findGamesWithInDistance(latitude, longitude, distance); - return games.stream() - .filter(Game::isNotEndedGame) + return gameEntities.stream() + .filter(GameEntity::isNotEndedGame) .map(game -> GameResponse.of( game, getMemberResponsesByStatus(game, CONFIRMED), @@ -257,8 +260,8 @@ public List findGamesWithInDistance( .toList(); } - private List getMemberResponsesByStatus(final Game game, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), status) + private List getMemberResponsesByStatus(final GameEntity gameEntity, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), status) .stream() .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( @@ -276,8 +279,8 @@ private List getPositionsByMember(final Member member) { return Position.fromMemberPositions(memberPositions); } - private List getPositionsByGame(final Game game) { - final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); + private List getPositionsByGame(final GameEntity gameEntity) { + final List gamePositions = gamePositionRepository.findAllByGameId(gameEntity.getId()); return Position.fromGamePositions(gamePositions); } From 5b8b74aa9f82b9e03115a5b180588e11340cfc32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 10:43:59 +0900 Subject: [PATCH 072/117] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=93=B1=20=EA=B8=B0=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/game.adoc | 10 +- src/docs/asciidoc/index.adoc | 2 +- src/docs/asciidoc/member.adoc | 4 +- src/main/http/alarm/game-alarm.http | 2 +- src/main/http/game/game.http | 22 +-- src/main/http/member/member.http | 6 +- .../pickple/back/alarm/domain/GameAlarm.java | 8 +- .../alarm/dto/response/GameAlarmResponse.java | 14 +- .../back/alarm/service/GameAlarmService.java | 28 +-- .../chat/service/ChatRoomFindService.java | 1 - .../back/game/domain/GamePosition.java | 44 ----- .../dto/response/MemberGameResponse.java | 40 ++-- .../member/service/MemberGameService.java | 34 ++-- .../back/position/domain/Position.java | 2 +- .../resources/db/migration/V1.0__Init.sql | 6 +- ...ava => GameEntityAlarmControllerTest.java} | 9 +- ....java => GameEntityAlarmDocumentTest.java} | 10 +- .../fixture/domain/GameAlarmFixtures.java | 6 +- .../back/fixture/domain/GameFixtures.java | 6 +- .../pickple/back/fixture/setup/GameSetup.java | 42 ++-- ...est.java => GameEntityControllerTest.java} | 182 +++++++++--------- ...tTest.java => GameEntityDocumentTest.java} | 50 ++--- ...ceTest.java => GameEntityServiceTest.java} | 8 +- 23 files changed, 247 insertions(+), 289 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/game/domain/GamePosition.java rename src/test/java/kr/pickple/back/alarm/controller/{GameAlarmControllerTest.java => GameEntityAlarmControllerTest.java} (89%) rename src/test/java/kr/pickple/back/alarm/docs/{GameAlarmDocumentTest.java => GameEntityAlarmDocumentTest.java} (93%) rename src/test/java/kr/pickple/back/game/controller/{GameControllerTest.java => GameEntityControllerTest.java} (59%) rename src/test/java/kr/pickple/back/game/docs/{GameDocumentTest.java => GameEntityDocumentTest.java} (96%) rename src/test/java/kr/pickple/back/game/service/{GameServiceTest.java => GameEntityServiceTest.java} (88%) diff --git a/src/docs/asciidoc/game.adoc b/src/docs/asciidoc/game.adoc index aaea787b..c29a2e3c 100644 --- a/src/docs/asciidoc/game.adoc +++ b/src/docs/asciidoc/game.adoc @@ -9,27 +9,27 @@ --- === 4.3. 게스트 모집글 상세 조회 -operation::find-game[snippets='http-request,http-response'] +operation::find-gameEntity[snippets='http-request,http-response'] --- === 4.4. 게스트 모집 참여 신청 -operation::register-gameMember[snippets='http-request,http-response'] +operation::register-gameMemberEntity[snippets='http-request,http-response'] --- === 4.5. 게스트 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회 -operation::find-all-waiting-or-confirmed-gameMembers[snippets='http-request,http-response'] +operation::find-all-waiting-or-confirmed-gameMemberEntities[snippets='http-request,http-response'] --- === 4.6. 게스트 모집 참여 신청 수락 -operation::confirm-gameMember[snippets='http-request,http-response'] +operation::confirm-gameMemberEntity[snippets='http-request,http-response'] --- === 4.7. 게스트 모집 참여 신청 거절/취소 -operation::delete-gameMember[snippets='http-request,http-response'] +operation::delete-gameMemberEntity[snippets='http-request,http-response'] --- diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 2ce6fdb9..6337dee1 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -21,7 +21,7 @@ include::auth.adoc[] include::member.adoc[] include::crew.adoc[] -include::game.adoc[] +include::gameEntity.adoc[] include::address.adoc[] include::position.adoc[] include::chat.adoc[] diff --git a/src/docs/asciidoc/member.adoc b/src/docs/asciidoc/member.adoc index 72b436d8..1eb3145c 100644 --- a/src/docs/asciidoc/member.adoc +++ b/src/docs/asciidoc/member.adoc @@ -11,12 +11,12 @@ operation::find-member[snippets='http-request,http-response'] --- === 2.3. 사용자의 참여 확정 게스트 모집글 목록 조회 -operation::find-all-member-games[snippets='http-request,http-response'] +operation::find-all-member-gameEntities[snippets='http-request,http-response'] --- === 2.4. 사용자가 만든 게스트 모집글 목록 조회 -operation::find-all-created-games[snippets='http-request,http-response'] +operation::find-all-created-gameEntities[snippets='http-request,http-response'] --- diff --git a/src/main/http/alarm/game-alarm.http b/src/main/http/alarm/game-alarm.http index 71ae82c4..ea67406e 100644 --- a/src/main/http/alarm/game-alarm.http +++ b/src/main/http/alarm/game-alarm.http @@ -1,6 +1,6 @@ ### 게임 관련 알람 상태 수정 -PATCH http://localhost:8080/game-alarms/{gameAlarmId} +PATCH http://localhost:8080/gameEntity-alarms/{gameAlarmId} Authorization: Content-Type: application/json diff --git a/src/main/http/game/game.http b/src/main/http/game/game.http index cbb15120..0cf524a6 100644 --- a/src/main/http/game/game.http +++ b/src/main/http/game/game.http @@ -1,5 +1,5 @@ ### 게스트 모집하기 -POST http://localhost:8080/games +POST http://localhost:8080/gameEntities Content-Type: application/json Authorization: @@ -19,15 +19,15 @@ Authorization: } ### 게스트 모집 상세 조회 -GET http://localhost:8080/games/1 +GET http://localhost:8080/gameEntities/1 ### 게스트 모집 참여 신청 -POST http://localhost:8080/games/38/members +POST http://localhost:8080/gameEntities/38/members Content-Type: application/json Authorization: ### 게스트 모집 참여 신청 수락 -PATCH http://localhost:8080/games/2/members/3 +PATCH http://localhost:8080/gameEntities/2/members/3 Content-Type: application/json Authorization: @@ -36,19 +36,19 @@ Authorization: } ### 게스트 모집 참여 신청 거절/취소 -DELETE http://localhost:8080/games/2/members/3 +DELETE http://localhost:8080/gameEntities/2/members/3 Authorization: ### 게스트 모집에 참여 신청된 사용자 정보 목록 조회 -GET http://localhost:8080/games/2/members?status=대기 +GET http://localhost:8080/gameEntities/2/members?status=대기 Authorization: ### 게스트 모집에 확정된 사용자 정보 목록 조회 -GET http://localhost:8080/games/2/members?status=확정 +GET http://localhost:8080/gameEntities/2/members?status=확정 Authorization: ### 다른 사용자(호스트, 게스트) 매너 스코어 리뷰 -PATCH http://localhost:8080/games/1/members/manner-scores +PATCH http://localhost:8080/gameEntities/1/members/manner-scores Content-Type: application/json Authorization: @@ -66,10 +66,10 @@ Authorization: } ### 조건별 게스트 모집글 조회(장소) -GET http://localhost:8080/games?category=location&value=서울시+영등포구&page=0&size=3 +GET http://localhost:8080/gameEntities?category=location&value=서울시+영등포구&page=0&size=3 ### 위도, 경도, 거리를 통해 해당하는 게스트 모집글 조회 -GET http://localhost:8080/games/by-location?latitude=37.5066680941127&longitude=126.897412723839&distance=1000 +GET http://localhost:8080/gameEntities/by-location?latitude=37.5066680941127&longitude=126.897412723839&distance=1000 ### 사용자의 주 활동지역에 해당하는 게스트 모집글 조회 -GET http://localhost:8080/games/by-address?addressDepth1=서울시&addressDepth2=영등포구 +GET http://localhost:8080/gameEntities/by-address?addressDepth1=서울시&addressDepth2=영등포구 diff --git a/src/main/http/member/member.http b/src/main/http/member/member.http index 01a2cf3d..502ca66d 100644 --- a/src/main/http/member/member.http +++ b/src/main/http/member/member.http @@ -28,16 +28,16 @@ GET http://localhost:8080/members/1/created-crews Authorization: ### 사용자의 참여 확정 게스트 모집글 목록 조회 -GET http://localhost:8080/members/1/games?status=확정 +GET http://localhost:8080/members/1/gameEntities?status=확정 Authorization: ### 사용자가 만든 게스트 모집글 목록 조회 -GET http://localhost:8080/members/1/created-games +GET http://localhost:8080/members/1/created-gameEntities Authorization: ### 사용자의 게스트 모집 참여 여부 조회 -GET http://localhost:8080/members/5/games/1/registration-status +GET http://localhost:8080/members/5/gameEntities/1/registration-status Authorization: ### 사용자의 크루 가입 여부 조회 diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index ba0aa8b2..9aa34dbd 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -12,7 +12,7 @@ import jakarta.validation.constraints.NotNull; import kr.pickple.back.alarm.util.GameAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; @@ -38,7 +38,7 @@ public class GameAlarm extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_id") - private Game game; + private GameEntity gameEntity; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") @@ -47,11 +47,11 @@ public class GameAlarm extends BaseEntity { @Builder private GameAlarm( final GameAlarmType gameAlarmType, - final Game game, + final GameEntity gameEntity, final Member member ) { this.gameAlarmType = gameAlarmType; - this.game = game; + this.gameEntity = gameEntity; this.member = member; } diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index b694576a..97c47178 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -8,7 +8,7 @@ import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.alarm.domain.GameAlarmType; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -30,16 +30,16 @@ public class GameAlarmResponse implements AlarmResponse { private final GameAlarmType gameAlarmMessage; public static GameAlarmResponse from(final GameAlarm gameAlarm) { - final Game game = gameAlarm.getGame(); + final GameEntity gameEntity = gameAlarm.getGameEntity(); return GameAlarmResponse.builder() .gameAlarmId(gameAlarm.getId()) - .gameId(game.getId()) - .mainAddress(gameAlarm.getGame().getMainAddress()) + .gameId(gameEntity.getId()) + .mainAddress(gameAlarm.getGameEntity().getMainAddress()) .createdAt(gameAlarm.getCreatedAt()) - .playDate(gameAlarm.getGame().getPlayDate()) - .playStartTime(gameAlarm.getGame().getPlayStartTime()) - .playTimeMinutes(gameAlarm.getGame().getPlayTimeMinutes()) + .playDate(gameAlarm.getGameEntity().getPlayDate()) + .playStartTime(gameAlarm.getGameEntity().getPlayStartTime()) + .playTimeMinutes(gameAlarm.getGameEntity().getPlayTimeMinutes()) .isRead(gameAlarm.getIsRead()) .gameAlarmMessage(gameAlarm.getGameAlarmType()) .build(); diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index e39e8821..920b7dc9 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -20,7 +20,7 @@ import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.GameAlarmRepository; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; @@ -43,11 +43,11 @@ public void createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinR validateIsHost(gameJoinRequestNotificationEvent); final Long gameId = gameJoinRequestNotificationEvent.getGameId(); - final Game game = getGameInfo(gameId); - final Member host = getMemberInfo(game.getHostId()); + final GameEntity gameEntity = getGameInfo(gameId); + final Member host = getMemberInfo(gameEntity.getHostId()); final GameAlarm gameAlarm = GameAlarm.builder() - .game(game) + .game(gameEntity) .member(host) .gameAlarmType(HOST_WAITING) .build(); @@ -61,12 +61,12 @@ public void createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinR @Transactional public void createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoinedEvent) { final Long gameId = gameMemberJoinedEvent.getGameId(); - final Game game = getGameInfo(gameId); + final GameEntity gameEntity = getGameInfo(gameId); final Long memberId = gameMemberJoinedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() - .game(game) + .game(gameEntity) .member(member) .gameAlarmType(GUEST_ACCEPT) .build(); @@ -81,12 +81,12 @@ public void createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoined public void createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejectedEvent) { final Long gameId = gameMemberRejectedEvent.getGameId(); - final Game game = getGameInfo(gameId); + final GameEntity gameEntity = getGameInfo(gameId); final Long memberId = gameMemberRejectedEvent.getMemberId(); final Member member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() - .game(game) + .game(gameEntity) .member(member) .gameAlarmType(GUEST_DENIED) .build(); @@ -99,17 +99,17 @@ public void createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejec private void validateIsHost(final GameJoinRequestNotificationEvent gameJoinRequestNotificationEvent) { final Long gameId = gameJoinRequestNotificationEvent.getGameId(); - final Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + final GameEntity gameEntity = gameRepository.findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - if (!game.isHost(gameJoinRequestNotificationEvent.getMemberId())) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, gameId, game.getHostId()); + if (!gameEntity.isHost(gameJoinRequestNotificationEvent.getMemberId())) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, gameId, gameEntity.getHostId()); } } - private Game getGameInfo(final Long gameId) { - final Game game = gameRepository.findById(gameId) + private GameEntity getGameInfo(final Long gameId) { + final GameEntity gameEntity = gameRepository.findById(gameId) .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - return game; + return gameEntity; } private Member getMemberInfo(final Long memberId) { diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index eb1449a6..606cd52c 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -17,7 +17,6 @@ import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.MemberDomain; import kr.pickple.back.member.exception.MemberException; diff --git a/src/main/java/kr/pickple/back/game/domain/GamePosition.java b/src/main/java/kr/pickple/back/game/domain/GamePosition.java deleted file mode 100644 index 159ce78b..00000000 --- a/src/main/java/kr/pickple/back/game/domain/GamePosition.java +++ /dev/null @@ -1,44 +0,0 @@ -package kr.pickple.back.game.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.validation.constraints.NotNull; -import kr.pickple.back.common.domain.BaseEntity; -import kr.pickple.back.position.domain.Position; -import kr.pickple.back.position.util.PositionConverter; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GamePosition extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Getter - @NotNull - @Convert(converter = PositionConverter.class) - @Column(length = 2) - private Position position; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_id") - private Game game; - - @Builder - private GamePosition(final Position position, final Game game) { - this.position = position; - this.game = game; - } -} diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index 835a2482..35e7ff6e 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -5,8 +5,8 @@ import java.util.List; import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -41,26 +41,26 @@ public class MemberGameResponse { private List positions; private List members; - public static MemberGameResponse of(final GameMember gameMember, final Game game, final List memberResponses, + public static MemberGameResponse of(final GameMemberEntity gameMemberEntity, final GameEntity gameEntity, final List memberResponses, final List positions, final MainAddress mainAddress) { return MemberGameResponse.builder() - .id(game.getId()) - .content(game.getContent()) - .playDate(game.getPlayDate()) - .playStartTime(game.getPlayStartTime()) - .playEndTime(game.getPlayEndTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .mainAddress(game.getMainAddress()) - .detailAddress(game.getDetailAddress()) - .latitude(game.getPoint().getY()) - .longitude(game.getPoint().getX()) - .status(game.getStatus()) - .isReviewDone(gameMember.isAlreadyReviewDone()) - .viewCount(game.getViewCount()) - .cost(game.getCost()) - .memberCount(game.getMemberCount()) - .maxMemberCount(game.getMaxMemberCount()) - .host(getHostResponse(memberResponses, game.getHostId())) + .id(gameEntity.getId()) + .content(gameEntity.getContent()) + .playDate(gameEntity.getPlayDate()) + .playStartTime(gameEntity.getPlayStartTime()) + .playEndTime(gameEntity.getPlayEndTime()) + .playTimeMinutes(gameEntity.getPlayTimeMinutes()) + .mainAddress(gameEntity.getMainAddress()) + .detailAddress(gameEntity.getDetailAddress()) + .latitude(gameEntity.getPoint().getY()) + .longitude(gameEntity.getPoint().getX()) + .status(gameEntity.getStatus()) + .isReviewDone(gameMemberEntity.isAlreadyReviewDone()) + .viewCount(gameEntity.getViewCount()) + .cost(gameEntity.getCost()) + .memberCount(gameEntity.getMemberCount()) + .maxMemberCount(gameEntity.getMaxMemberCount()) + .host(getHostResponse(memberResponses, gameEntity.getHostId())) .addressDepth1(mainAddress.getAddressDepth1().getName()) .addressDepth2(mainAddress.getAddressDepth2().getName()) .positions(positions) diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index f5062ccb..f78886da 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -10,8 +10,8 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; @@ -42,7 +42,7 @@ public List findAllMemberGames( final RegistrationStatus memberStatus ) { final Member member = memberReader.readEntityByMemberId(memberId); - final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), + final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus); return convertToMemberGameResponses(memberGames, memberStatus); @@ -53,7 +53,7 @@ public List findAllMemberGames( */ public List findAllCreatedGames(final Long memberId) { final Member member = memberReader.readEntityByMemberId(memberId); - final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); + final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); return convertToMemberGameResponses(memberGames, CONFIRMED); } @@ -66,39 +66,39 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( final Long gameId ) { final Member member = memberReader.readEntityByMemberId(memberId); - final Game game = gameRepository.getGameById(gameId); + final GameEntity gameEntity = gameRepository.getGameById(gameId); - final GameMember gameMember = gameMemberRepository.findByMemberIdAndGameId(member.getId(), game.getId()) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), game.getId())); + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(member.getId(), gameEntity.getId()) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), gameEntity.getId())); - return GameMemberRegistrationStatusResponse.of(gameMember.getStatus(), gameMember.isAlreadyReviewDone()); + return GameMemberRegistrationStatusResponse.of(gameMemberEntity.getStatus(), gameMemberEntity.isAlreadyReviewDone()); } - + private List convertToMemberGameResponses( - final List memberGames, + final List memberGames, final RegistrationStatus memberStatus ) { return memberGames.stream() .map(memberGame -> { - Game game = gameRepository.getGameById(memberGame.getGameId()); + GameEntity gameEntity = gameRepository.getGameById(memberGame.getGameId()); Member member = memberRepository.getMemberById(memberGame.getMemberId()); return MemberGameResponse.of( memberGame, - game, - getMemberResponsesByGame(game, memberStatus), + gameEntity, + getMemberResponsesByGame(gameEntity, memberStatus), getPositionsByMember(member), addressReader.readMainAddressById( - game.getAddressDepth1Id(), - game.getAddressDepth2Id() + gameEntity.getAddressDepth1Id(), + gameEntity.getAddressDepth2Id() ) ); }) .toList(); } - private List getMemberResponsesByGame(final Game game, final RegistrationStatus memberStatus) { - return gameMemberRepository.findAllByGameIdAndStatus(game.getId(), memberStatus) + private List getMemberResponsesByGame(final GameEntity gameEntity, final RegistrationStatus memberStatus) { + return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), memberStatus) .stream() .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) .map(member -> MemberResponse.of( diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index 01e2a922..b18eb7d3 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.game.domain.GamePosition; +import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.position.exception.PositionException; import lombok.Getter; diff --git a/src/main/resources/db/migration/V1.0__Init.sql b/src/main/resources/db/migration/V1.0__Init.sql index d47b0179..afc4f3f1 100644 --- a/src/main/resources/db/migration/V1.0__Init.sql +++ b/src/main/resources/db/migration/V1.0__Init.sql @@ -92,7 +92,7 @@ CREATE TABLE IF NOT EXISTS `pickpledev`.`crew_member` REFERENCES `pickpledev`.`member` (`id`) ); -CREATE TABLE IF NOT EXISTS `pickpledev`.`game` +CREATE TABLE IF NOT EXISTS `pickpledev`.`gameEntity` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `content` VARCHAR(1000) NOT NULL, @@ -137,7 +137,7 @@ CREATE TABLE IF NOT EXISTS `pickpledev`.`game_member` PRIMARY KEY (`id`), CONSTRAINT `FK_game_TO_game_member_1` FOREIGN KEY (`game_id`) - REFERENCES `pickpledev`.`game` (`id`), + REFERENCES `pickpledev`.`gameEntity` (`id`), CONSTRAINT `FK_member_TO_game_member_1` FOREIGN KEY (`member_id`) REFERENCES `pickpledev`.`member` (`id`) @@ -153,7 +153,7 @@ CREATE TABLE IF NOT EXISTS `pickpledev`.`game_position` PRIMARY KEY (`id`), CONSTRAINT `FK_game_TO_game_position_1` FOREIGN KEY (`game_id`) - REFERENCES `pickpledev`.`game` (`id`) + REFERENCES `pickpledev`.`gameEntity` (`id`) ); CREATE TABLE IF NOT EXISTS `pickpledev`.`member_position` diff --git a/src/test/java/kr/pickple/back/alarm/controller/GameAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java similarity index 89% rename from src/test/java/kr/pickple/back/alarm/controller/GameAlarmControllerTest.java rename to src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java index 93dd7b75..05dde609 100644 --- a/src/test/java/kr/pickple/back/alarm/controller/GameAlarmControllerTest.java +++ b/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java @@ -6,8 +6,9 @@ import kr.pickple.back.alarm.repository.GameAlarmRepository; import kr.pickple.back.fixture.domain.GameAlarmFixtures; import kr.pickple.back.fixture.setup.GameSetup; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.domain.Member; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +22,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @Transactional -public class GameAlarmControllerTest extends IntegrationAlarmTest { +public class GameEntityAlarmControllerTest extends IntegrationAlarmTest { private static final String BASE_URL = "/game-alarms"; @@ -37,8 +38,8 @@ void updateGameAlarmStatus_Success() throws Exception { //given final Member member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final Game game = gameSetup.saveWithConfirmedMembers(1); - final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, game)); + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); + final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); final GameAlarmUpdateStatusRequest request = GameAlarmUpdateStatusRequest.from(true); //when diff --git a/src/test/java/kr/pickple/back/alarm/docs/GameAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java similarity index 93% rename from src/test/java/kr/pickple/back/alarm/docs/GameAlarmDocumentTest.java rename to src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java index cf48a9c8..1f06ca1f 100644 --- a/src/test/java/kr/pickple/back/alarm/docs/GameAlarmDocumentTest.java +++ b/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java @@ -1,14 +1,16 @@ package kr.pickple.back.alarm.docs; import com.epages.restdocs.apispec.ResourceSnippetParameters; + import kr.pickple.back.alarm.IntegrationAlarmTest; import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; import kr.pickple.back.alarm.repository.GameAlarmRepository; import kr.pickple.back.fixture.domain.GameAlarmFixtures; import kr.pickple.back.fixture.setup.GameSetup; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.domain.Member; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +28,7 @@ import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class GameAlarmDocumentTest extends IntegrationAlarmTest { +public class GameEntityAlarmDocumentTest extends IntegrationAlarmTest { private static final String BASE_URL = "/game-alarms"; @@ -42,8 +44,8 @@ void updateGameAlarmStatus_ReturnVoid() throws Exception { //given final Member member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final Game game = gameSetup.saveWithConfirmedMembers(1); - final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, game)); + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); + final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); final GameAlarmUpdateStatusRequest request = GameAlarmUpdateStatusRequest.from(true); //when diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java index e301ed32..40503f65 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java @@ -1,16 +1,16 @@ package kr.pickple.back.fixture.domain; import kr.pickple.back.alarm.domain.GameAlarm; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.domain.Member; import static kr.pickple.back.alarm.domain.GameAlarmType.HOST_WAITING; public class GameAlarmFixtures { - public static GameAlarm gameAlarmBuild(final Member member, final Game game) { + public static GameAlarm gameAlarmBuild(final Member member, final GameEntity gameEntity) { return GameAlarm.builder() - .game(game) + .game(gameEntity) .member(member) .gameAlarmType(HOST_WAITING) .build(); diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java index fd087074..fe85d74e 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java @@ -14,13 +14,13 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; public class GameFixtures { - public static Game gameBuild( + public static GameEntity gameBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, final Member host @@ -28,7 +28,7 @@ public static Game gameBuild( final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); final Point point = geometryFactory.createPoint(new Coordinate(37.125, 126.75)); - return Game.builder() + return GameEntity.builder() .content("하이하이 즐겜 한 판해요") .playDate(LocalDate.now().minusDays(1)) .playStartTime(LocalTime.of(11, 30)) diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index 634fd531..208438d2 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -9,12 +9,12 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.fixture.domain.GameFixtures; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.member.domain.Member; @Component @@ -32,45 +32,45 @@ public class GameSetup { @Autowired private AddressSetup addressSetup; - public Game save(final Member host) { + public GameEntity save(final Member host) { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final Game game = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); - final ChatRoomEntity savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); + final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); + final ChatRoom savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); - game.addGameMember(host); - savedChatRoom.updateMaxMemberCount(game.getMaxMemberCount()); - game.makeNewCrewChatRoom(savedChatRoom); + gameEntity.addGameMember(host); + savedChatRoom.updateMaxMemberCount(gameEntity.getMaxMemberCount()); + gameEntity.makeNewGameChatRoom(savedChatRoom); - final GameMember gameHost = game.getGameMembers().get(0); + final GameMemberEntity gameHost = gameEntity.getGameMembers().get(0); host.addMemberGame(gameHost); gameHost.updateStatus(CONFIRMED); - return gameRepository.save(game); + return gameRepository.save(gameEntity); } - public Game saveWithWaitingMembers(final Integer memberCount) { + public GameEntity saveWithWaitingMembers(final Integer memberCount) { final List members = memberSetup.save(memberCount); - final Game game = save(members.get(0)); + final GameEntity gameEntity = save(members.get(0)); final List guests = members.subList(1, members.size()); - guests.forEach(game::addGameMember); + guests.forEach(gameEntity::addGameMember); - return game; + return gameEntity; } - public Game saveWithConfirmedMembers(final Integer memberCount) { - final Game game = saveWithWaitingMembers(memberCount); - final Member host = game.getHost(); - final List gameMembers = game.getGameMembers(); + public GameEntity saveWithConfirmedMembers(final Integer memberCount) { + final GameEntity gameEntity = saveWithWaitingMembers(memberCount); + final Member host = gameEntity.getHost(); + final List gameMemberEntities = gameEntity.getGameMembers(); - gameMembers.forEach(gameMember -> { + gameMemberEntities.forEach(gameMember -> { if (!host.equals(gameMember.getMember())) { gameMember.updateStatus(CONFIRMED); } }); - return game; + return gameEntity; } } diff --git a/src/test/java/kr/pickple/back/game/controller/GameControllerTest.java b/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java similarity index 59% rename from src/test/java/kr/pickple/back/game/controller/GameControllerTest.java rename to src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java index 0a0ef5c5..5e33acd3 100644 --- a/src/test/java/kr/pickple/back/game/controller/GameControllerTest.java +++ b/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java @@ -17,14 +17,14 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.GameDtoFixtures; import kr.pickple.back.game.IntegrationGameTest; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; import kr.pickple.back.member.domain.Member; @Transactional -class GameControllerTest extends IntegrationGameTest { +class GameEntityControllerTest extends IntegrationGameTest { private static final String BASE_URL = "/games"; @@ -32,33 +32,33 @@ class GameControllerTest extends IntegrationGameTest { @DisplayName("사용자는 게스트 모집글의 상세 정보를 조회할 수 있다.") void findGameDetailsById_ReturnGameResponse() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); // when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", game.getId())); + final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", gameEntity.getId())); // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(game.getId())) - .andExpect(jsonPath("content").value(game.getContent())) - .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) - .andExpect(jsonPath("latitude").value(game.getPoint().getY())) - .andExpect(jsonPath("longitude").value(game.getPoint().getX())) - .andExpect(jsonPath("status").value(game.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(game.getViewCount())) - .andExpect(jsonPath("cost").value(game.getCost())) - .andExpect(jsonPath("memberCount").value(game.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) + .andExpect(jsonPath("id").value(gameEntity.getId())) + .andExpect(jsonPath("content").value(gameEntity.getContent())) + .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) + .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) + .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) + .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) + .andExpect(jsonPath("cost").value(gameEntity.getCost())) + .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -66,10 +66,10 @@ void findGameDetailsById_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(game.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(game.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(game.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(game.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) + .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) + .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) + .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) .andExpect(jsonPath("members[0].id").value(host.getId())) .andExpect(jsonPath("members[1].id").value(guest.getId())) .andDo(print()); @@ -82,14 +82,14 @@ void registerGameMember_Success() throws Exception { final List members = memberSetup.save(2); final Member host = members.get(0); final Member guest = members.get(1); - final Game game = gameSetup.save(host); + final GameEntity gameEntity = gameSetup.save(host); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - post(BASE_URL + "/{gameId}/members", game.getId()) + post(BASE_URL + "/{gameId}/members", gameEntity.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -101,9 +101,9 @@ void registerGameMember_Success() throws Exception { @DisplayName("호스트는 게스트 모집글에 참여 신청된 사용자 정보 목록을 조회할 수 있다.") void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -112,7 +112,7 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", game.getId()) + get(BASE_URL + "/{gameId}/members", gameEntity.getId()) .param("status", WAITING.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -120,21 +120,21 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(game.getId())) - .andExpect(jsonPath("content").value(game.getContent())) - .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) - .andExpect(jsonPath("latitude").value(game.getPoint().getY())) - .andExpect(jsonPath("longitude").value(game.getPoint().getX())) - .andExpect(jsonPath("status").value(game.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(game.getViewCount())) - .andExpect(jsonPath("cost").value(game.getCost())) - .andExpect(jsonPath("memberCount").value(game.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) + .andExpect(jsonPath("id").value(gameEntity.getId())) + .andExpect(jsonPath("content").value(gameEntity.getContent())) + .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) + .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) + .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) + .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) + .andExpect(jsonPath("cost").value(gameEntity.getCost())) + .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -142,10 +142,10 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(game.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(game.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(game.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(game.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) + .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) + .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) + .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) .andExpect(jsonPath("members[0].id").value(guest.getId())) .andDo(print()); } @@ -154,9 +154,9 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { @DisplayName("사용자는 게스트 모집글에 참여 확정된 사용자 정보 목록을 조회할 수 있다.") void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -165,7 +165,7 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", game.getId()) + get(BASE_URL + "/{gameId}/members", gameEntity.getId()) .param("status", CONFIRMED.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -173,21 +173,21 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(game.getId())) - .andExpect(jsonPath("content").value(game.getContent())) - .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) - .andExpect(jsonPath("latitude").value(game.getPoint().getY())) - .andExpect(jsonPath("longitude").value(game.getPoint().getX())) - .andExpect(jsonPath("status").value(game.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(game.getViewCount())) - .andExpect(jsonPath("cost").value(game.getCost())) - .andExpect(jsonPath("memberCount").value(game.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) + .andExpect(jsonPath("id").value(gameEntity.getId())) + .andExpect(jsonPath("content").value(gameEntity.getContent())) + .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) + .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) + .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) + .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) + .andExpect(jsonPath("cost").value(gameEntity.getCost())) + .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -195,10 +195,10 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(game.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(game.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(game.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(game.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) + .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) + .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) + .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) .andExpect(jsonPath("members[0].id").value(host.getId())) .andExpect(jsonPath("members[1].id").value(guest.getId())) .andDo(print()); @@ -208,9 +208,9 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { @DisplayName("호스트는 다른 사용자의 게스트 모집글 참여 신청을 수락할 수 있다.") void updateGameMemberRegistrationStatus_Success() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -223,7 +223,7 @@ void updateGameMemberRegistrationStatus_Success() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) + patch(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -237,9 +237,9 @@ void updateGameMemberRegistrationStatus_Success() throws Exception { @DisplayName("호스트는 다른 사용자의 게스트 모집글 참여 신청을 거절할 수 있다.") void deleteGameMember_Host_Success() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -248,7 +248,7 @@ void deleteGameMember_Host_Success() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -260,8 +260,8 @@ void deleteGameMember_Host_Success() throws Exception { @DisplayName("사용자는 자신의 게스트 모집글 참여 신청을 취소할 수 있다.") void deleteGameMember_GuestSelf_Success() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -270,7 +270,7 @@ void deleteGameMember_GuestSelf_Success() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -282,12 +282,12 @@ void deleteGameMember_GuestSelf_Success() throws Exception { @DisplayName("사용자는 경기에 참여한 다른 사용자의 매너 스코어를 리뷰할 수 있다.") void reviewMannerScores_Success() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(3); - final Member host = game.getHost(); - final List gameMembers = game.getGameMembers(); - final List guests = gameMembers.subList(1, gameMembers.size()) + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); + final Member host = gameEntity.getHost(); + final List gameMemberEntities = gameEntity.getGameMembers(); + final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) .stream() - .map(GameMember::getMember) + .map(GameMemberEntity::getMember) .toList(); final String subject = String.valueOf(host.getId()); @@ -299,7 +299,7 @@ void reviewMannerScores_Success() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/manner-scores", game.getId()) + patch(BASE_URL + "/{gameId}/members/manner-scores", gameEntity.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) diff --git a/src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java b/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java similarity index 96% rename from src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java rename to src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java index c5fbcbd2..edbee267 100644 --- a/src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java +++ b/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java @@ -26,14 +26,14 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.GameDtoFixtures; import kr.pickple.back.game.IntegrationGameTest; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; import kr.pickple.back.member.domain.Member; @Transactional -class GameDocumentTest extends IntegrationGameTest { +class GameEntityDocumentTest extends IntegrationGameTest { private static final String BASE_URL = "/games"; @@ -104,7 +104,7 @@ class GameDocumentTest extends IntegrationGameTest { @DisplayName("조건별(장소) 게스트 모집글 조회") void findGamesByCategory_ReturnGameResponses() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(3); + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); // when final ResultActions resultActions = mockMvc.perform( @@ -215,10 +215,10 @@ void findGamesByCategory_ReturnGameResponses() throws Exception { @DisplayName("게스트 모집글 상세 조회") void findGameById_ReturnGameResponse() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(3); + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); // when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", game.getId())) + final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", gameEntity.getId())) .andExpect(status().isOk()); // then @@ -312,14 +312,14 @@ void registerGameMember_ReturnVoid() throws Exception { final List members = memberSetup.save(2); final Member host = members.get(0); final Member guest = members.get(1); - final Game game = gameSetup.save(host); + final GameEntity gameEntity = gameSetup.save(host); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - post(BASE_URL + "/{gameId}/members", game.getId()) + post(BASE_URL + "/{gameId}/members", gameEntity.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ) .andExpect(status().isNoContent()); @@ -350,15 +350,15 @@ void registerGameMember_ReturnVoid() throws Exception { @DisplayName("게스트 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회") void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(3); - final Member host = game.getHost(); + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(3); + final Member host = gameEntity.getHost(); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", game.getId()) + get(BASE_URL + "/{gameId}/members", gameEntity.getId()) .param("status", WAITING.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken())) .andExpect(status().isOk()); @@ -458,9 +458,9 @@ void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception @DisplayName("게스트 모집 참여 신청 수락") void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -473,7 +473,7 @@ void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) + patch(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -512,9 +512,9 @@ void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { @DisplayName("게스트 모집 참여 신청 거절/취소") void deleteGameMember_ReturnVoid() throws Exception { // given - final Game game = gameSetup.saveWithWaitingMembers(2); - final Member host = game.getHost(); - final Member guest = game.getGameMembers() + final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); + final Member host = gameEntity.getHost(); + final Member guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -523,7 +523,7 @@ void deleteGameMember_ReturnVoid() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ) .andExpect(status().isNoContent()); @@ -555,12 +555,12 @@ void deleteGameMember_ReturnVoid() throws Exception { @DisplayName("다른 사용자 매너 스코어 리뷰") void reviewMannerScores_ReturnVoid() throws Exception { // given - final Game game = gameSetup.saveWithConfirmedMembers(3); - final Member host = game.getHost(); - final List gameMembers = game.getGameMembers(); - final List guests = gameMembers.subList(1, gameMembers.size()) + final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); + final Member host = gameEntity.getHost(); + final List gameMemberEntities = gameEntity.getGameMembers(); + final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) .stream() - .map(GameMember::getMember) + .map(GameMemberEntity::getMember) .toList(); final String subject = String.valueOf(host.getId()); @@ -572,7 +572,7 @@ void reviewMannerScores_ReturnVoid() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/manner-scores", game.getId()) + patch(BASE_URL + "/{gameId}/members/manner-scores", gameEntity.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) diff --git a/src/test/java/kr/pickple/back/game/service/GameServiceTest.java b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java similarity index 88% rename from src/test/java/kr/pickple/back/game/service/GameServiceTest.java rename to src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java index 7aac58a9..163de450 100644 --- a/src/test/java/kr/pickple/back/game/service/GameServiceTest.java +++ b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java @@ -17,13 +17,13 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.fixture.domain.GameFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.member.domain.Member; @ExtendWith(MockitoExtension.class) -public class GameServiceTest { +public class GameEntityServiceTest { @InjectMocks private GameService gameService; @@ -45,9 +45,9 @@ void findGameById_ReturnGameResponse() { final Member host = MemberFixtures.memberBuild(addressDepth1, addressDepth2); - final Game game = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); + final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); - given(gameRepository.findById(anyLong())).willReturn(Optional.ofNullable(game)); + given(gameRepository.findById(anyLong())).willReturn(Optional.ofNullable(gameEntity)); // when final GameResponse gameResponse = gameService.findGameById(1L); From 09a5fcf671f23e2feceba765fe234363d5060558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 14:25:30 +0900 Subject: [PATCH 073/117] =?UTF-8?q?refactor:=20=EC=A3=BC=EC=86=8C=EB=B3=84?= =?UTF-8?q?=20=EA=B2=8C=EC=8A=A4=ED=8A=B8=20=EB=AA=A8=EC=A7=91=EA=B8=80=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EB=90=9C=20=EC=84=A4=EA=B3=84=EC=97=90=20=EB=A7=9E=EC=B6=94?= =?UTF-8?q?=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameReader.java | 36 +++++++++++++ .../back/game/implement/GameWriter.java | 5 ++ .../back/game/repository/GameRepository.java | 3 ++ .../back/game/service/GameService.java | 52 +++++-------------- 4 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 5bc14443..7f09c8cb 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -4,6 +4,10 @@ import java.util.List; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -13,6 +17,7 @@ import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; @@ -71,4 +76,35 @@ public List readAllMembersByGameIdAndStatus(final Long gameId, fin .map(gameMemberEntity -> memberReader.readByMemberId(gameMemberEntity.getMemberId())) .toList(); } + + public List findGamesByAddress(final String address, final Pageable pageable) { + + final PageRequest pageRequest = PageRequest.of( + pageable.getPageNumber(), + pageable.getPageSize(), + Sort.by( + Sort.Order.asc("playDate"), + Sort.Order.asc("playStartTime"), + Sort.Order.asc("id") + ) + ); + + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(address); + + final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + mainAddress.getAddressDepth1().getId(), + mainAddress.getAddressDepth2().getId(), + GameStatus.ENDED, + pageRequest + ); + + return games.stream() + .map(gameEntity -> GameMapper.mapToGameDomain( + gameEntity, + mainAddress, + memberReader.readByMemberId(gameEntity.getHostId()), + chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), + readPositionsByGameId(gameEntity.getId()))) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 72f804e2..9230ef50 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -12,6 +12,7 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; @@ -72,4 +73,8 @@ private void validateIsDuplicatedPositions(final List positions) { throw new GameException(GAME_POSITIONS_IS_DUPLICATED, positions); } } + + public void updateMemberRegistrationStatus(final GameStatus status, final Long gameId) { + gameRepository.updateRegistrationStatus(status, gameId); + } } diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index f0d60e48..9aabc409 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -30,4 +30,7 @@ default GameEntity getGameById(final Long gameId) { @Query("update GameEntity g set g.memberCount = :memberCount, g.status = :status where g.id = :gameId") void updateMemberCountAndStatus(final Long gameId, final Integer memberCount, final GameStatus status); + + @Query("update GameEntity g set g.status = :status where g.id = :gameId") + void updateRegistrationStatus(final GameStatus status, final Long gameId); } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 6d1f1a8f..8c94e617 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -11,10 +11,7 @@ import java.time.format.DateTimeFormatter; import java.util.List; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -74,14 +71,6 @@ public class GameService { private final GameWriter gameWriter; private final GameMemberWriter gameMemberWriter; - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - /** * 게임 생성 */ @@ -103,7 +92,6 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina final GameMember gameHost = gameMemberWriter.register(host, game); gameMemberWriter.updateMemberRegistrationStatus(gameHost, CONFIRMED); - //9. 게임 상태 업데이트 이벤트를 레디스에 저장(엔티티를 도메인으로 대체하면 됨) saveGameStatusUpdateEventToRedis(game); return GameIdResponse.from(game.getGameId()); @@ -144,6 +132,14 @@ private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateT return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); } + private static long getSecondsBetween( + final LocalDateTime gameCreatedDateTime, + final LocalDateTime gamePlayDateTime + ) { + return Duration.between(gameCreatedDateTime, gamePlayDateTime) + .getSeconds(); + } + private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { return String.format("game:%s:%d", gameStatus.toString(), id); } @@ -153,8 +149,7 @@ private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long i */ @Transactional public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - final GameEntity gameEntity = gameRepository.getGameById(gameId); - gameEntity.updateGameStatus(gameStatus); + gameWriter.updateMemberRegistrationStatus(gameStatus, gameId); } /** @@ -187,33 +182,10 @@ public List findGamesByCategory( * 주소별 게스트 모집글 조회 */ private List findGamesByAddress(final String address, final Pageable pageable) { - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(address); - - final PageRequest pageRequest = PageRequest.of( - pageable.getPageNumber(), - pageable.getPageSize(), - Sort.by( - Sort.Order.asc("playDate"), - Sort.Order.asc("playStartTime"), - Sort.Order.asc("id") - ) - ); + final List gameDomains = gameReader.findGamesByAddress(address, pageable); - final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( - mainAddress.getAddressDepth1().getId(), - mainAddress.getAddressDepth2().getId(), - GameStatus.ENDED, - pageRequest - ); - - return games.stream() - .map(game -> GameResponse.of( - game, - getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), - addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) - ) - ) + return gameDomains.stream() + .map(gameDomain -> GameResponseMapper.mapToGameResponseDto(gameDomain, gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED))) .toList(); } From e81991c62c205c98c637ad985dac35d27a443320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 16:47:27 +0900 Subject: [PATCH 074/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=EB=B3=84,=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=EB=B3=84,=20=EC=A7=80=EC=97=AD=EB=B3=84,=20=EC=A4=91?= =?UTF-8?q?=EC=8B=AC=EC=A2=8C=ED=91=9C=20=EA=B8=B0=EC=A4=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EB=B0=94=EB=80=90=20?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EA=B5=AC=EC=A1=B0=EC=97=90=20=EB=A7=9E?= =?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 --- .../back/game/implement/GameMapper.java | 4 +- .../back/game/implement/GameReader.java | 38 +++++++- .../back/game/service/GameService.java | 94 +++++-------------- 3 files changed, 62 insertions(+), 74 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index 78a1d7a9..c9da72c5 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -40,8 +40,8 @@ public static GameDomain mapToGameDomain( .memberCount(gameEntity.getMemberCount()) .maxMemberCount(gameEntity.getMaxMemberCount()) .host(host) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1().getName()) + .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .positions(positions) .chatRoom(chatRoom) .build(); diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 7f09c8cb..fc73759f 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -88,17 +88,17 @@ public List findGamesByAddress(final String address, final Pageable Sort.Order.asc("id") ) ); - + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(address); - final Page games = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( + final Page gameEntities = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( mainAddress.getAddressDepth1().getId(), mainAddress.getAddressDepth2().getId(), GameStatus.ENDED, pageRequest ); - return games.stream() + return gameEntities.stream() .map(gameEntity -> GameMapper.mapToGameDomain( gameEntity, mainAddress, @@ -107,4 +107,36 @@ public List findGamesByAddress(final String address, final Pageable readPositionsByGameId(gameEntity.getId()))) .toList(); } + + public List findGamesWithInAddress(MainAddress mainAddress) { + final List gameEntities = gameRepository.findGamesWithInAddress( + mainAddress.getAddressDepth1(), + mainAddress.getAddressDepth2() + ); + + return gameEntities.stream() + .map(gameEntity -> GameMapper.mapToGameDomain( + gameEntity, + mainAddress, + memberReader.readByMemberId(gameEntity.getHostId()), + chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), + readPositionsByGameId(gameEntity.getId()))) + .toList(); + } + + public List findGamesWithInDistance(Double latitude, Double longitude, Double distance) { + final List gameEntities = gameRepository.findGamesWithInDistance(latitude, longitude, distance); + + return gameEntities.stream() + .map(gameEntity -> GameMapper.mapToGameDomain( + gameEntity, + addressReader.readMainAddressById( + gameEntity.getAddressDepth1Id(), + gameEntity.getAddressDepth2Id() + ), + memberReader.readByMemberId(gameEntity.getHostId()), + chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), + readPositionsByGameId(gameEntity.getId()))) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 8c94e617..fd86ac47 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -21,7 +21,6 @@ import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.service.ChatRoomService; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Category; import kr.pickple.back.game.domain.GameDomain; import kr.pickple.back.game.domain.GameMember; @@ -39,16 +38,10 @@ import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -71,6 +64,14 @@ public class GameService { private final GameWriter gameWriter; private final GameMemberWriter gameMemberWriter; + private static long getSecondsBetween( + final LocalDateTime gameCreatedDateTime, + final LocalDateTime gamePlayDateTime + ) { + return Duration.between(gameCreatedDateTime, gamePlayDateTime) + .getSeconds(); + } + /** * 게임 생성 */ @@ -132,26 +133,10 @@ private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateT return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); } - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { return String.format("game:%s:%d", gameStatus.toString(), id); } - /** - * 게임 상태 업데이트 - */ - @Transactional - public void updateGameStatus(final GameStatus gameStatus, final Long gameId) { - gameWriter.updateMemberRegistrationStatus(gameStatus, gameId); - } - /** * 게임 상세 조회 */ @@ -185,7 +170,11 @@ private List findGamesByAddress(final String address, final Pageab final List gameDomains = gameReader.findGamesByAddress(address, pageable); return gameDomains.stream() - .map(gameDomain -> GameResponseMapper.mapToGameResponseDto(gameDomain, gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED))) + .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( + gameDomain, + gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) + ) + ) .toList(); } @@ -193,18 +182,12 @@ private List findGamesByAddress(final String address, final Pageab * 특정 지역의 게스트 모집글 조회 */ public List findGamesWithInAddress(final MainAddress mainAddress) { - final List gameEntities = gameRepository.findGamesWithInAddress( - mainAddress.getAddressDepth1(), - mainAddress.getAddressDepth2() - ); - - return gameEntities.stream() - .filter(GameEntity::isNotEndedGame) - .map(game -> GameResponse.of( - game, - getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), - addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) + final List gameDomains = gameReader.findGamesWithInAddress(mainAddress); + + return gameDomains.stream() + .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( + gameDomain, + gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) ) ) .toList(); @@ -218,42 +201,15 @@ public List findGamesWithInDistance( final Double longitude, final Double distance ) { - final List gameEntities = gameRepository.findGamesWithInDistance(latitude, longitude, distance); - - return gameEntities.stream() - .filter(GameEntity::isNotEndedGame) - .map(game -> GameResponse.of( - game, - getMemberResponsesByStatus(game, CONFIRMED), - getPositionsByGame(game), - addressReader.readMainAddressById(game.getAddressDepth1Id(), game.getAddressDepth2Id()) - ) - ) - .toList(); - } + final List gameDomains = gameReader.findGamesWithInDistance(latitude, longitude, distance); - private List getMemberResponsesByStatus(final GameEntity gameEntity, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), status) - .stream() - .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositionsByMember(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) + return gameDomains.stream() + .filter(GameDomain::isNotEndedGame) + .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( + gameDomain, + gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) ) ) .toList(); } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId(member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - private List getPositionsByGame(final GameEntity gameEntity) { - final List gamePositions = gamePositionRepository.findAllByGameId(gameEntity.getId()); - - return Position.fromGamePositions(gamePositions); - } } From df7a56966db7128cece14cd2675c30214a2cd973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 16:50:22 +0900 Subject: [PATCH 075/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=82=B4=20addressDepth=ED=95=84?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/game/domain/GameDomain.java | 10 +++++++--- .../back/game/dto/mapper/GameResponseMapper.java | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/domain/GameDomain.java b/src/main/java/kr/pickple/back/game/domain/GameDomain.java index f8f71425..7e2a4d53 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameDomain.java +++ b/src/main/java/kr/pickple/back/game/domain/GameDomain.java @@ -39,8 +39,8 @@ public class GameDomain { private Integer memberCount; private Integer maxMemberCount; private MemberDomain host; - private String addressDepth1; - private String addressDepth2; + private String addressDepth1Name; + private String addressDepth2Name; private List positions; private ChatRoom chatRoom; @@ -59,8 +59,12 @@ public void increaseMemberCount() { this.status = CLOSED; } } - + public LocalDateTime getPlayEndDatetime() { return LocalDateTime.of(playDate, playEndTime); } + + public Boolean isNotEndedGame() { + return status != ENDED; + } } diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java index e53ae9c4..198bc600 100644 --- a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java @@ -33,8 +33,8 @@ public static GameResponse mapToGameResponseDto(final GameDomain gameDomain, fin .memberCount(gameDomain.getMemberCount()) .maxMemberCount(gameDomain.getMaxMemberCount()) .host(MemberResponseMapper.mapToMemberResponseDto(gameDomain.getHost())) - .addressDepth1(gameDomain.getAddressDepth1()) - .addressDepth2(gameDomain.getAddressDepth2()) + .addressDepth1(gameDomain.getAddressDepth1Name()) + .addressDepth2(gameDomain.getAddressDepth2Name()) .positions(gameDomain.getPositions()) .members(memberResponses) .build(); From 8d3d7a31c6f7df9b9c1dbf97ecabdcf37517dfda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 16:51:32 +0900 Subject: [PATCH 076/117] =?UTF-8?q?refactor:=20GameFacadeService,=20RedisE?= =?UTF-8?q?xpirationListener=20=EB=82=B4=20=ED=83=80=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0,?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EA=B3=84=EC=B8=B5=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/service/GameFacadeService.java | 19 ++++++++++++++++--- .../game/service/RedisExpirationListener.java | 7 ++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index 430a7386..d19bc2a3 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -1,13 +1,18 @@ package kr.pickple.back.game.service; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + import java.util.List; import org.springframework.stereotype.Component; import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.dto.mapper.GameResponseMapper; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; +import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.map.domain.MapPolygon; import kr.pickple.back.map.service.MapService; import lombok.RequiredArgsConstructor; @@ -17,13 +22,21 @@ public class GameFacadeService { private final AddressReader addressReader; - - private final GameService gameService; private final MapService mapService; + private final GameReader gameReader; public GamesAndLocationResponse findGamesWithInAddress(final String addressDepth1, final String addressDepth2) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); - final List gameResponses = gameService.findGamesWithInAddress(mainAddress); + + final List gameDomains = gameReader.findGamesWithInAddress(mainAddress); + final List gameResponses = gameDomains.stream() + .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( + gameDomain, + gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) + ) + ) + .toList(); + final MapPolygon mapPolygon = mapService.findMapPolygonByMainAddress(mainAddress); return GamesAndLocationResponse.of(gameResponses, mapPolygon); diff --git a/src/main/java/kr/pickple/back/game/service/RedisExpirationListener.java b/src/main/java/kr/pickple/back/game/service/RedisExpirationListener.java index 69ae611b..d7e74561 100644 --- a/src/main/java/kr/pickple/back/game/service/RedisExpirationListener.java +++ b/src/main/java/kr/pickple/back/game/service/RedisExpirationListener.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import kr.pickple.back.game.domain.GameStatus; +import kr.pickple.back.game.implement.GameWriter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,8 +15,8 @@ @Component @RequiredArgsConstructor public class RedisExpirationListener implements MessageListener { - - private final GameService gameService; + + private final GameWriter gameWriter; @Override public void onMessage(final Message message, final byte[] pattern) { @@ -26,7 +27,7 @@ public void onMessage(final Message message, final byte[] pattern) { final GameStatus gameStatus = GameStatus.valueOf(stringTokenizer.nextToken()); final Long gameId = Long.parseLong(stringTokenizer.nextToken()); - gameService.updateGameStatus(gameStatus, gameId); + gameWriter.updateMemberRegistrationStatus(gameStatus, gameId); } } } From fc35cfc5806a1a572d47f02a4373922b50b732d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 18:53:13 +0900 Subject: [PATCH 077/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EA=B8=B0=EB=8A=A5=20=EC=84=A4=EA=B3=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=A7=9E=EC=B6=94=EC=96=B4=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 --- .../back/game/implement/GameMapper.java | 2 +- .../back/game/implement/GameMemberMapper.java | 11 +++ .../back/game/implement/GameReader.java | 8 +- .../back/game/implement/GameWriter.java | 42 +++++++++- .../GameReviewMannerScoresService.java | 80 +++++++------------ 5 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index c9da72c5..39753a94 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -16,7 +16,7 @@ public class GameMapper { - public static GameDomain mapToGameDomain( + public static GameDomain mapGameEntityToDomain( final GameEntity gameEntity, final MainAddress mainAddress, final MemberDomain host, diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java index b12e6086..92e42e69 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java @@ -1,7 +1,9 @@ package kr.pickple.back.game.implement; +import kr.pickple.back.game.domain.GameDomain; import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.member.domain.MemberDomain; public class GameMemberMapper { @@ -12,4 +14,13 @@ public static GameMemberEntity mapGameMemberDomainToEntity(final GameMember game .gameId(gameMember.getGame().getGameId()) .build(); } + + public static GameMember mapGameMemberEntityToDomain(GameMemberEntity gameMemberEntity, MemberDomain memberDomain, GameDomain gameDomain) { + return GameMember.builder() + .gameMemberId(gameMemberEntity.getId()) + .status(gameMemberEntity.getStatus()) + .member(memberDomain) + .game(gameDomain) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index fc73759f..71007620 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -55,7 +55,7 @@ public GameDomain read(final Long gameId) { ); final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); - return GameMapper.mapToGameDomain(gameEntity, mainAddress, host, chatRoom, positions); + return GameMapper.mapGameEntityToDomain(gameEntity, mainAddress, host, chatRoom, positions); } private GameEntity readGameEntity(final Long gameId) { @@ -99,7 +99,7 @@ public List findGamesByAddress(final String address, final Pageable ); return gameEntities.stream() - .map(gameEntity -> GameMapper.mapToGameDomain( + .map(gameEntity -> GameMapper.mapGameEntityToDomain( gameEntity, mainAddress, memberReader.readByMemberId(gameEntity.getHostId()), @@ -115,7 +115,7 @@ public List findGamesWithInAddress(MainAddress mainAddress) { ); return gameEntities.stream() - .map(gameEntity -> GameMapper.mapToGameDomain( + .map(gameEntity -> GameMapper.mapGameEntityToDomain( gameEntity, mainAddress, memberReader.readByMemberId(gameEntity.getHostId()), @@ -128,7 +128,7 @@ public List findGamesWithInDistance(Double latitude, Double longitud final List gameEntities = gameRepository.findGamesWithInDistance(latitude, longitude, distance); return gameEntities.stream() - .map(gameEntity -> GameMapper.mapToGameDomain( + .map(gameEntity -> GameMapper.mapGameEntityToDomain( gameEntity, addressReader.readMainAddressById( gameEntity.getAddressDepth1Id(), diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 9230ef50..41cd3c64 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -1,5 +1,6 @@ package kr.pickple.back.game.implement; +import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; import java.util.List; @@ -14,12 +15,16 @@ import kr.pickple.back.game.domain.GameDomain; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.domain.NewGame; +import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; +import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -33,6 +38,8 @@ public class GameWriter { private final GameMemberRepository gameMemberRepository; private final KakaoAddressSearchClient kakaoAddressSearchClient; private final GamePositionRepository gamePositionRepository; + private final MemberReader memberReader; + private final MemberRepository memberRepository; public GameDomain create(final NewGame newGame) { final Point point = kakaoAddressSearchClient.fetchAddress(newGame.getMainAddress()); @@ -47,7 +54,7 @@ public GameDomain create(final NewGame newGame) { setPositionsToGame(newGame.getPositions(), savedGameEntity.getId()); - return GameMapper.mapToGameDomain( + return GameMapper.mapGameEntityToDomain( savedGameEntity, mainAddress, newGame.getHost(), @@ -77,4 +84,37 @@ private void validateIsDuplicatedPositions(final List positions) { public void updateMemberRegistrationStatus(final GameStatus status, final Long gameId) { gameRepository.updateRegistrationStatus(status, gameId); } + + public void reviewMannerScores(Long loggedInMemberId, Long gameId, List mannerScoreReviews) { + final MemberDomain memberDomain = memberReader.readByMemberId(loggedInMemberId); + + mannerScoreReviews.forEach(review -> { + final MemberDomain reviewedMember = getReviewedMember(gameId, review.getMemberId()); + validateIsSelfReview(memberDomain, reviewedMember); + reviewedMember.updateMannerScore(review.getMannerScore()); + memberRepository.updateMannerScore(reviewedMember.getMannerScore(), reviewedMember.getMemberId()); + }); + + } + + private MemberDomain getReviewedMember(final Long gameId, final Long reviewedMemberId) { + return getConfirmedMembers(gameId) + .stream() + .filter(confirmedMember -> confirmedMember.getMemberId() == reviewedMemberId) + .findFirst() + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); + } + + private List getConfirmedMembers(Long gameId) { + return gameMemberRepository.findAllByGameIdAndStatus(gameId, CONFIRMED) + .stream() + .map(gameMember -> memberReader.readByMemberId(gameMember.getMemberId())) + .toList(); + } + + private void validateIsSelfReview(final MemberDomain loggedInMember, final MemberDomain reviewedMember) { + if (loggedInMember.getMemberId().equals(reviewedMember.getMemberId())) { + throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getMemberId(), reviewedMember.getMemberId()); + } + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index b7ba2f1b..98a99609 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -1,6 +1,5 @@ package kr.pickple.back.game.service; -import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; import java.time.LocalDateTime; @@ -10,13 +9,17 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.implement.GameMemberReader; +import kr.pickple.back.game.implement.GameMemberWriter; +import kr.pickple.back.game.implement.GameReader; +import kr.pickple.back.game.implement.GameWriter; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -30,6 +33,11 @@ public class GameReviewMannerScoresService { private final GameMemberRepository gameMemberRepository; private final GameRepository gameRepository; private final MemberRepository memberRepository; + private final GameMemberReader gameMemberReader; + private final GameReader gameReader; + private final MemberReader memberReader; + private final GameWriter gameWriter; + private final GameMemberWriter gameMemberWriter; @Transactional public void reviewMannerScores( @@ -37,66 +45,36 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( - loggedInMemberId, - gameId, - CONFIRMED - ) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); - - if (gameMemberEntity.isAlreadyReviewDone()) { + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + + if (gameMember.isAlreadyReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } - final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); - final Member loggedInMember = memberRepository.getMemberById(gameMemberEntity.getMemberId()); + // -- - if (isNotReviewPeriod(gameEntity)) { - throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, gameEntity.getPlayDate(), - gameEntity.getPlayEndTime()); + final GameDomain gameDomain = gameReader.read(gameId); + if (isNotReviewPeriod(gameDomain)) { + throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, gameDomain.getPlayDate(), + gameDomain.getPlayEndTime()); } - mannerScoreReviews.forEach(review -> { - final Member reviewedMember = getReviewedMember(gameEntity, review.getMemberId()); - validateIsSelfReview(loggedInMember, reviewedMember); - reviewedMember.updateMannerScore(review.getMannerScore()); - }); - - gameMemberEntity.updateReviewDone(); - } - - private void validateIsSelfReview(final Member loggedInMember, final Member reviewedMember) { - if (loggedInMember.equals(reviewedMember)) { - throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getId(), reviewedMember.getId()); - } + // -- + gameWriter.reviewMannerScores(loggedInMemberId, gameId, mannerScoreReviews); + gameMemberWriter.updateReviewDone(loggedInMemberId, gameId); } - private Boolean isNotReviewPeriod(final GameEntity gameEntity) { - return isBeforeThanPlayEndTime(gameEntity) || isAfterReviewPossibleTime(gameEntity); + private Boolean isNotReviewPeriod(final GameDomain gameDomain) { + return isBeforeThanPlayEndTime(gameDomain) || isAfterReviewPossibleTime(gameDomain); } - private Boolean isBeforeThanPlayEndTime(final GameEntity gameEntity) { - return DateTimeUtil.isAfterThanNow(gameEntity.getPlayEndDatetime()); + private Boolean isBeforeThanPlayEndTime(final GameDomain gameDomain) { + return DateTimeUtil.isAfterThanNow(gameDomain.getPlayEndDatetime()); } - private Boolean isAfterReviewPossibleTime(final GameEntity gameEntity) { - final LocalDateTime reviewDeadlineDatetime = gameEntity.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); + private Boolean isAfterReviewPossibleTime(final GameDomain gameDomain) { + final LocalDateTime reviewDeadlineDatetime = gameDomain.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); } - - private Member getReviewedMember(final GameEntity gameEntity, final Long reviewedMemberId) { - return getConfirmedMembers(gameEntity) - .stream() - .filter(confirmedMember -> confirmedMember.getId() == reviewedMemberId) - .findFirst() - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); - } - - private List getConfirmedMembers(GameEntity gameEntity) { - return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), CONFIRMED) - .stream() - .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) - .toList(); - } } From 80b28f970c900294110b9446fa14cdfa3906dc5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 18:54:23 +0900 Subject: [PATCH 078/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EA=B5=AC=ED=98=84=20=EA=B3=84=EC=B8=B5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=EB=A9=A4=EB=B2=84=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=EC=97=90=20=EB=A7=A4=EB=84=88=20=EC=8A=A4=EC=BD=94=EC=96=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameMemberReader.java | 40 +++++++++++++++++++ .../back/game/implement/GameMemberWriter.java | 6 +++ .../back/game/service/GameMemberService.java | 1 + .../back/member/domain/MemberDomain.java | 16 ++++++++ 4 files changed, 63 insertions(+) create mode 100644 src/main/java/kr/pickple/back/game/implement/GameMemberReader.java diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java new file mode 100644 index 00000000..0e810b3a --- /dev/null +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java @@ -0,0 +1,40 @@ +package kr.pickple.back.game.implement; + +import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static kr.pickple.back.game.exception.GameExceptionCode.*; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GameMemberReader { + + private final GameMemberRepository gameMemberRepository; + private final MemberReader memberReader; + private final GameReader gameReader; + + public GameMember readGameMemberByMemberIdAndGameId(Long loggedInMemberId, Long gameId) { + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( + loggedInMemberId, + gameId, + CONFIRMED + ) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); + + final MemberDomain memberDomain = memberReader.readByMemberId(gameMemberEntity.getMemberId()); + final GameDomain gameDomain = gameReader.read(gameMemberEntity.getGameId()); + + return GameMemberMapper.mapGameMemberEntityToDomain(gameMemberEntity, memberDomain, gameDomain); + } +} diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index 4b3eeff9..9fb7cbf2 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -23,6 +23,7 @@ public class GameMemberWriter { private final GameMemberRepository gameMemberRepository; private final GameRepository gameRepository; + private final GameMemberReader gameMemberReader; public GameMember register(final MemberDomain member, final GameDomain game) { final Long memberId = member.getMemberId(); @@ -54,4 +55,9 @@ public void updateMemberRegistrationStatus(final GameMember gameMember, final Re gameRepository.updateMemberCountAndStatus(game.getGameId(), game.getMemberCount(), game.getStatus()); } + public void updateReviewDone(Long loggedInMemberId, Long gameId) { + GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + + gameMemberRepository.updateReviewDone(gameMember.getGameMemberId(), true); + } } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index a71195d5..724e502a 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -13,6 +13,7 @@ import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.chat.service.ChatMessageService; diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java index 4924c6fe..06ed00b8 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java +++ b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java @@ -1,7 +1,10 @@ package kr.pickple.back.member.domain; +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + import java.util.List; +import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -15,6 +18,8 @@ @EqualsAndHashCode(of = "memberId") public class MemberDomain { + public static final List MANNER_SCORE_POINT_RANGE = List.of(-1, 0, 1); + private Long memberId; private String email; private String nickname; @@ -29,4 +34,15 @@ public class MemberDomain { public Boolean isIdMatched(final Long memberId) { return this.memberId.equals(memberId); } + + public void updateMannerScore(final Integer mannerScorePoint) { + if (MANNER_SCORE_POINT_RANGE.contains(mannerScorePoint)) { + this.mannerScore += mannerScorePoint; + this.mannerScoreCount += 1; + + return; + } + + throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); + } } From a68b988dca8900c835929e2521dd924714bd38c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 18:55:18 +0900 Subject: [PATCH 079/117] =?UTF-8?q?refactor:=20=EB=A7=A4=EB=84=88=20?= =?UTF-8?q?=EC=8A=A4=EC=BD=94=EC=96=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=EB=A6=AC=EB=B7=B0=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=94=84=EB=9D=BC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/game/domain/GameMember.java | 7 +++++++ .../pickple/back/game/repository/GameMemberRepository.java | 3 +++ .../pickple/back/member/repository/MemberRepository.java | 2 ++ 3 files changed, 12 insertions(+) diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 082d534a..1f69b8d6 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -1,5 +1,7 @@ package kr.pickple.back.game.domain; +import static java.lang.Boolean.*; + import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.member.domain.MemberDomain; import lombok.AccessLevel; @@ -18,6 +20,7 @@ public class GameMember { private RegistrationStatus status; private MemberDomain member; private GameDomain game; + private Boolean isReview = FALSE; public void updateGameMemberId(final Long gameMemberId) { this.gameMemberId = gameMemberId; @@ -26,4 +29,8 @@ public void updateGameMemberId(final Long gameMemberId) { public void updateRegistrationStatus(final RegistrationStatus status) { this.status = status; } + + public Boolean isAlreadyReviewDone() { + return isReview; + } } diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 13167ebf..2666cf26 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -29,4 +29,7 @@ Optional findByMemberIdAndGameIdAndStatus( @Query("update GameMemberEntity gm set gm.status = :status where gm.id = :gameMemberId") void updateRegistrationStatus(final Long gameMemberId, final RegistrationStatus status); + + @Query("update GameMemberEntity gm set gm.isReview = :isReview where gm.id = :gameMemberId") + void updateReviewDone(Long gameMemberId, Boolean isReview); } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index b8658dea..15e2b5f1 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -11,4 +11,6 @@ public interface MemberRepository extends JpaRepository { Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); Optional findByOauthId(final Long oauthId); + + void updateMannerScore(Integer mannerScore, Long memberId); } From bf0532afc216bb462468c00ca7843e3d59dcf103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 23:26:22 +0900 Subject: [PATCH 080/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A9=A4=EB=B2=84=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EA=B2=8C=EC=9E=84=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/game/domain/GameDomain.java | 4 ++ .../back/game/domain/GameMemberDomain.java | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java diff --git a/src/main/java/kr/pickple/back/game/domain/GameDomain.java b/src/main/java/kr/pickple/back/game/domain/GameDomain.java index 7e2a4d53..22771c12 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameDomain.java +++ b/src/main/java/kr/pickple/back/game/domain/GameDomain.java @@ -67,4 +67,8 @@ public LocalDateTime getPlayEndDatetime() { public Boolean isNotEndedGame() { return status != ENDED; } + + public Boolean isHost(final Long hostId) { + return hostId.equals(this.host.getMemberId()); + } } diff --git a/src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java b/src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java new file mode 100644 index 00000000..53d88a55 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java @@ -0,0 +1,41 @@ +package kr.pickple.back.game.domain; + +import static java.lang.Boolean.*; +import static kr.pickple.back.common.domain.RegistrationStatus.*; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.member.domain.MemberDomain; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GameMemberDomain { + + private Long gameMemberId; + private RegistrationStatus status; + private MemberDomain member; + private GameDomain game; + private Boolean isReview = FALSE; + + public void updateGameMemberId(final Long gameMemberId) { + this.gameMemberId = gameMemberId; + } + + public void updateRegistrationStatus(final RegistrationStatus status) { + this.status = status; + } + + public Boolean isAlreadyReviewDone() { + return isReview; + } + + public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { + return this.status == WAITING && updateStatus == CONFIRMED; + } +} From a863b5b0a5d364c0ca72d4284f4b46d3d8ccdb3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 23:28:41 +0900 Subject: [PATCH 081/117] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EB=93=B1=EB=A1=9D,=20=EC=A1=B0=ED=9A=8C,=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EB=B3=80=ED=99=94=EB=90=9C=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84=EC=97=90=20=EB=A7=9E=EC=B6=94=EC=96=B4=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 --- .../pickple/back/game/domain/GameMember.java | 36 ------------------- .../back/game/implement/GameMemberMapper.java | 14 ++++---- 2 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 src/main/java/kr/pickple/back/game/domain/GameMember.java diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java deleted file mode 100644 index 1f69b8d6..00000000 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ /dev/null @@ -1,36 +0,0 @@ -package kr.pickple.back.game.domain; - -import static java.lang.Boolean.*; - -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.member.domain.MemberDomain; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class GameMember { - - private Long gameMemberId; - private RegistrationStatus status; - private MemberDomain member; - private GameDomain game; - private Boolean isReview = FALSE; - - public void updateGameMemberId(final Long gameMemberId) { - this.gameMemberId = gameMemberId; - } - - public void updateRegistrationStatus(final RegistrationStatus status) { - this.status = status; - } - - public Boolean isAlreadyReviewDone() { - return isReview; - } -} diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java index 92e42e69..342f17d1 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java @@ -1,22 +1,22 @@ package kr.pickple.back.game.implement; import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GameMemberDomain; import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.member.domain.MemberDomain; public class GameMemberMapper { - public static GameMemberEntity mapGameMemberDomainToEntity(final GameMember gameMember) { + public static GameMemberEntity mapGameMemberDomainToEntity(final GameMemberDomain gameMemberDomain) { return GameMemberEntity.builder() - .status(gameMember.getStatus()) - .memberId(gameMember.getMember().getMemberId()) - .gameId(gameMember.getGame().getGameId()) + .status(gameMemberDomain.getStatus()) + .memberId(gameMemberDomain.getMember().getMemberId()) + .gameId(gameMemberDomain.getGame().getGameId()) .build(); } - public static GameMember mapGameMemberEntityToDomain(GameMemberEntity gameMemberEntity, MemberDomain memberDomain, GameDomain gameDomain) { - return GameMember.builder() + public static GameMemberDomain mapGameMemberEntityToDomain(GameMemberEntity gameMemberEntity, MemberDomain memberDomain, GameDomain gameDomain) { + return GameMemberDomain.builder() .gameMemberId(gameMemberEntity.getId()) .status(gameMemberEntity.getStatus()) .member(memberDomain) From cbfa410cbb67b526502609a699ecda8dd962bc3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 6 Mar 2024 23:29:39 +0900 Subject: [PATCH 082/117] =?UTF-8?q?refactor:=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EA=B3=84=EC=B8=B5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameMemberReader.java | 4 +- .../back/game/implement/GameMemberWriter.java | 34 ++-- .../game/repository/GameMemberRepository.java | 2 + .../back/game/service/GameMemberService.java | 168 +++++------------- .../GameReviewMannerScoresService.java | 6 +- .../back/game/service/GameService.java | 20 +-- 6 files changed, 83 insertions(+), 151 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java index 0e810b3a..c4e59726 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java @@ -7,7 +7,7 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GameMemberDomain; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.entity.GameMemberEntity; @@ -24,7 +24,7 @@ public class GameMemberReader { private final MemberReader memberReader; private final GameReader gameReader; - public GameMember readGameMemberByMemberIdAndGameId(Long loggedInMemberId, Long gameId) { + public GameMemberDomain readGameMemberByMemberIdAndGameId(Long loggedInMemberId, Long gameId) { final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( loggedInMemberId, gameId, diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index 9fb7cbf2..01cc0fd4 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -8,7 +8,7 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GameMemberDomain; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; @@ -25,7 +25,7 @@ public class GameMemberWriter { private final GameRepository gameRepository; private final GameMemberReader gameMemberReader; - public GameMember register(final MemberDomain member, final GameDomain game) { + public GameMemberDomain register(final MemberDomain member, final GameDomain game) { final Long memberId = member.getMemberId(); final Long gameId = game.getGameId(); @@ -33,31 +33,37 @@ public GameMember register(final MemberDomain member, final GameDomain game) { throw new GameException(GAME_MEMBER_IS_EXISTED, gameId, memberId); } - final GameMember gameMember = GameMember.builder() + final GameMemberDomain gameMemberDomain = GameMemberDomain.builder() .status(WAITING) .member(member) .game(game) .build(); - final GameMemberEntity gameMemberEntity = GameMemberMapper.mapGameMemberDomainToEntity(gameMember); + final GameMemberEntity gameMemberEntity = GameMemberMapper.mapGameMemberDomainToEntity(gameMemberDomain); final GameMemberEntity savedGameMemberEntity = gameMemberRepository.save(gameMemberEntity); - gameMember.updateGameMemberId(savedGameMemberEntity.getId()); + gameMemberDomain.updateGameMemberId(savedGameMemberEntity.getId()); - return gameMember; + return gameMemberDomain; } - public void updateMemberRegistrationStatus(final GameMember gameMember, final RegistrationStatus status) { - gameMember.updateRegistrationStatus(status); - gameMemberRepository.updateRegistrationStatus(gameMember.getGameMemberId(), status); + public void updateMemberRegistrationStatus(final GameMemberDomain gameMemberDomain, final RegistrationStatus status) { + gameMemberDomain.updateRegistrationStatus(status); + gameMemberRepository.updateRegistrationStatus(gameMemberDomain.getGameMemberId(), status); - final GameDomain game = gameMember.getGame(); - game.increaseMemberCount(); - gameRepository.updateMemberCountAndStatus(game.getGameId(), game.getMemberCount(), game.getStatus()); + if (gameMemberDomain.isStatusChangedFromWaitingToConfirmed(status)) { + final GameDomain game = gameMemberDomain.getGame(); + game.increaseMemberCount(); + gameRepository.updateMemberCountAndStatus(game.getGameId(), game.getMemberCount(), game.getStatus()); + } } public void updateReviewDone(Long loggedInMemberId, Long gameId) { - GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + GameMemberDomain gameMemberDomain = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + + gameMemberRepository.updateReviewDone(gameMemberDomain.getGameMemberId(), true); + } - gameMemberRepository.updateReviewDone(gameMember.getGameMemberId(), true); + public void deleteGameMember(GameMemberDomain gameMemberDomain) { + gameMemberRepository.deleteByGameIdAndMemberId(gameMemberDomain.getGame().getGameId(), gameMemberDomain.getMember().getMemberId()); } } diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 2666cf26..8428ac0b 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -32,4 +32,6 @@ Optional findByMemberIdAndGameIdAndStatus( @Query("update GameMemberEntity gm set gm.isReview = :isReview where gm.id = :gameMemberId") void updateReviewDone(Long gameMemberId, Boolean isReview); + + void deleteByGameIdAndMemberId(Long gameId, Long memberId); } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 724e502a..ad2f2abf 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -14,25 +14,27 @@ import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.service.ChatMessageService; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.dto.mapper.GameResponseMapper; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.implement.GameMemberReader; +import kr.pickple.back.game.implement.GameMemberWriter; +import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; -import kr.pickple.back.member.dto.response.MemberResponse; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -50,101 +52,40 @@ public class GameMemberService { private final ApplicationEventPublisher eventPublisher; private final GameMemberRepository gameMemberRepository; private final GamePositionRepository gamePositionRepository; + private final GameReader gameReader; + private final MemberReader memberReader; + private final GameMemberWriter gameMemberWriter; + private final GameMemberReader gameMemberReader; @Transactional public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final GameEntity gameEntity = gameRepository.getGameById(gameId); - final Member member = memberRepository.getMemberById(loggedInMemberId); + final GameDomain gameDomain = gameReader.read(gameId); + final MemberDomain memberDomain = memberReader.readByMemberId(loggedInMemberId); - validateIsAlreadyRegisteredGameMember(gameEntity, member); - final GameMemberEntity gameMemberEntity = buildGameMember(gameEntity, member); - gameMemberRepository.save(gameMemberEntity); + gameMemberWriter.register(memberDomain, gameDomain); eventPublisher.publishEvent(GameJoinRequestNotificationEvent.builder() .gameId(gameId) - .memberId(gameEntity.getHostId()) + .memberId(loggedInMemberId) .build()); } - private void validateIsAlreadyRegisteredGameMember(final GameEntity gameEntity, final Member member) { - if (isAlreadyRegistered(gameEntity, member)) { - throw new GameException(GAME_MEMBER_IS_EXISTED, member.getId()); - } - } - - private boolean isAlreadyRegistered(final GameEntity gameEntity, final Member member) { - return gameMemberRepository.findByMemberIdAndGameId(member.getId(), gameEntity.getId()).isPresent(); - } - - private GameMemberEntity buildGameMember(final GameEntity gameEntity, final Member member) { - - return GameMemberEntity.builder() - .status(getRegistrationStatus(member, gameEntity)) - .memberId(member.getId()) - .gameId(gameEntity.getId()) - .build(); - } - - private RegistrationStatus getRegistrationStatus(final Member member, final GameEntity gameEntity) { - final Member host = memberRepository.getMemberById(gameEntity.getHostId()); - - if (member.equals(host)) { - return CONFIRMED; - } - - return WAITING; - } - public GameResponse findAllGameMembers( final Long loggedInMemberId, final Long gameId, final RegistrationStatus status ) { - final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, loggedInMemberId); - final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); - final Member loggedInMember = memberRepository.getMemberById(gameMemberEntity.getMemberId()); + final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameDomain game = gameReader.read(gameId); + final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); - if (!gameEntity.isHost(loggedInMember.getId()) && status == WAITING) { + if (!game.isHost(member.getMemberId()) && status == WAITING) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - return GameResponse.of( - gameEntity, - getMemberResponsesByStatus(gameEntity, status), - getPositionsByGame(gameEntity), - addressReader.readMainAddressById(gameEntity.getAddressDepth1Id(), gameEntity.getAddressDepth2Id()) - ); - } + final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, status); - private List getMemberResponsesByStatus(final GameEntity gameEntity, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), status) - .stream() - .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositionsByMember(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) - ) - ) - .toList(); - } - - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionRepository.findAllByMemberId( - member.getId()); - - return Position.fromMemberPositions(memberPositions); - } - - private List getPositionsByGame(final GameEntity gameEntity) { - final List gamePositions = gamePositionRepository.findAllByGameId(gameEntity.getId()); - - return Position.fromGamePositions(gamePositions); - } - - private GameMemberEntity findGameMemberByGameIdAndMemberId(final Long gameId, final Long memberId) { - return gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + return GameResponseMapper.mapToGameResponseDto(game, members); } @Transactional @@ -154,24 +95,16 @@ public void updateGameMemberRegistrationStatus( final Long memberId, final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest ) { - final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, memberId); - final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); - - validateIsHost(loggedInMemberId, gameEntity); + final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameDomain game = gameReader.read(gameId); + validateIsHost(loggedInMemberId, game); final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); -<<<<<<< HEAD - final ChatRoomEntity chatRoom = chatRoomRepository.getChatRoomById(game.getChatRoomId()); - enterGameChatRoom(updateStatus, gameMember, chatRoom); -======= - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); + + final ChatRoomEntity chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); enterGameChatRoom(updateStatus, gameMemberEntity, chatRoom); ->>>>>>> ab89fd2 (refactor: 바뀐 구현계층 세팅에 맞추어 게임service의 생성, 읽기 기능 수정) - gameMemberEntity.updateStatus(updateStatus); - if (gameMemberEntity.isStatusChangedFromWaitingToConfirmed(updateStatus)) { - gameEntity.increaseMemberCount(); - } + gameMemberWriter.updateMemberRegistrationStatus(gameMember, updateStatus); eventPublisher.publishEvent(GameMemberJoinedEvent.builder() .gameId(gameId) @@ -179,10 +112,8 @@ >>>>>>> ab89fd2 (refactor: 바뀐 구현계층 세팅에 맞추어 게임service .build()); } - private void validateIsHost(final Long loggedInMemberId, final GameEntity gameEntity) { - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); - - if (!gameEntity.isHost(loggedInMember.getId())) { + private void validateIsHost(final Long loggedInMemberId, final GameDomain gameDomain) { + if (!gameDomain.isHost(loggedInMemberId)) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } } @@ -201,50 +132,43 @@ private void enterGameChatRoom( @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMemberEntity gameMemberEntity = findGameMemberByGameIdAndMemberId(gameId, memberId); - final GameEntity gameEntity = gameRepository.getGameById(gameMemberEntity.getGameId()); - final Member member = memberRepository.getMemberById(gameMemberEntity.getMemberId()); - final Member loggedInMember = memberRepository.getMemberById(loggedInMemberId); + final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); + final GameDomain game = gameReader.read(gameId); + final MemberDomain member = memberReader.readByMemberId(gameMember.getMember().getMemberId()); + final MemberDomain loggedInMember = memberReader.readByMemberId(loggedInMemberId); - if (gameEntity.isHost(loggedInMember.getId())) { + if (game.isHost(loggedInMemberId)) { validateIsHostSelfDeleted(loggedInMember, member); - eventPublisher.publishEvent(GameMemberRejectedEvent.builder() .gameId(gameId) .memberId(memberId) .build()); - deleteGameMember(gameMemberEntity); - + gameMemberWriter.deleteGameMember(gameMember); return; } - if (loggedInMember.equals(member)) { - cancelGameMember(gameMemberEntity); - + if (loggedInMember.getMemberId().equals(member.getMemberId())) { + cancelGameMember(gameMember); return; } throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); } - private void validateIsHostSelfDeleted(final Member loggedInMember, final Member member) { - if (loggedInMember.equals(member)) { - throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getId()); + private void validateIsHostSelfDeleted(final MemberDomain loggedInMember, final MemberDomain member) { + if (loggedInMember.getMemberId().equals(member.getMemberId())) { + throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getMemberId()); } } - private void cancelGameMember(final GameMemberEntity gameMemberEntity) { - RegistrationStatus status = gameMemberEntity.getStatus(); + private void cancelGameMember(final GameMemberDomain gameMember) { + RegistrationStatus status = gameMember.getStatus(); if (status != WAITING) { throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); } - deleteGameMember(gameMemberEntity); - } - - private void deleteGameMember(final GameMemberEntity gameMemberEntity) { - gameMemberRepository.delete(gameMemberEntity); + gameMemberWriter.deleteGameMember(gameMember); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 98a99609..f519c269 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -10,7 +10,7 @@ import kr.pickple.back.common.util.DateTimeUtil; import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GameMemberDomain; import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.implement.GameMemberReader; @@ -45,9 +45,9 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMemberDomain gameMemberDomain = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); - if (gameMember.isAlreadyReviewDone()) { + if (gameMemberDomain.isAlreadyReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index fd86ac47..15682622 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -23,7 +23,7 @@ import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.game.domain.Category; import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.GameMemberDomain; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.dto.mapper.GameRequestMapper; @@ -64,14 +64,6 @@ public class GameService { private final GameWriter gameWriter; private final GameMemberWriter gameMemberWriter; - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - /** * 게임 생성 */ @@ -90,7 +82,7 @@ public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, fina final GameDomain game = gameWriter.create(newGame); - final GameMember gameHost = gameMemberWriter.register(host, game); + final GameMemberDomain gameHost = gameMemberWriter.register(host, game); gameMemberWriter.updateMemberRegistrationStatus(gameHost, CONFIRMED); saveGameStatusUpdateEventToRedis(game); @@ -133,6 +125,14 @@ private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateT return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); } + private static long getSecondsBetween( + final LocalDateTime gameCreatedDateTime, + final LocalDateTime gamePlayDateTime + ) { + return Duration.between(gameCreatedDateTime, gamePlayDateTime) + .getSeconds(); + } + private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { return String.format("game:%s:%d", gameStatus.toString(), id); } From e74468476fb7591540c5979dfc8bf9f51c0256b8 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 20:30:11 +0900 Subject: [PATCH 083/117] =?UTF-8?q?refactor:=20Game,=20Member=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=9D=98=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=EC=9D=84=20repository?= =?UTF-8?q?=EB=82=B4=EC=9D=98=20entity=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20?= =?UTF-8?q?=EC=98=AE=EA=B8=B0=EA=B3=A0=20=EC=9D=B4=EB=A6=84=EB=8F=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alarm/domain/CrewAlarm.java | 6 +- .../pickple/back/alarm/domain/GameAlarm.java | 6 +- .../back/alarm/service/AlarmService.java | 6 +- .../back/alarm/service/CrewAlarmService.java | 18 +-- .../back/alarm/service/GameAlarmService.java | 14 +-- .../back/auth/service/OauthService.java | 6 +- .../pickple/back/chat/domain/ChatMessage.java | 4 +- .../chat/dto/mapper/ChatResponseMapper.java | 14 +-- .../back/chat/implement/ChatMapper.java | 4 +- .../back/chat/implement/ChatReader.java | 26 ++-- .../back/chat/implement/ChatWriter.java | 20 +-- .../back/chat/service/ChatMessageService.java | 8 +- .../chat/service/ChatRoomFindService.java | 20 ++- .../back/chat/service/ChatRoomService.java | 6 +- .../kr/pickple/back/crew/domain/Crew.java | 6 +- .../pickple/back/crew/domain/CrewMember.java | 4 +- .../pickple/back/crew/domain/CrewProfile.java | 6 +- .../kr/pickple/back/crew/domain/NewCrew.java | 6 +- .../crew/dto/mapper/CrewResponseMapper.java | 4 +- .../crew/dto/request/CrewCreateRequest.java | 11 -- .../back/crew/implement/CrewMapper.java | 12 +- .../back/crew/implement/CrewReader.java | 30 +++-- .../back/crew/implement/CrewWriter.java | 4 +- .../crew/repository/CrewMemberRepository.java | 8 -- .../back/crew/repository/CrewRepository.java | 10 +- .../back/game/controller/GameController.java | 2 +- .../domain/{GameDomain.java => Game.java} | 12 +- ...{GameMemberDomain.java => GameMember.java} | 8 +- .../kr/pickple/back/game/domain/NewGame.java | 6 +- .../game/dto/mapper/GameRequestMapper.java | 6 +- .../game/dto/mapper/GameResponseMapper.java | 6 +- .../back/game/implement/GameMapper.java | 39 +++--- .../back/game/implement/GameMemberMapper.java | 31 +++-- .../back/game/implement/GameMemberReader.java | 14 +-- .../back/game/implement/GameMemberWriter.java | 36 +++--- .../back/game/implement/GameReader.java | 56 +++++---- .../back/game/implement/GameWriter.java | 42 +++---- .../game/repository/GameMemberRepository.java | 2 - .../back/game/repository/GameRepository.java | 3 + .../back/game/service/GameFacadeService.java | 10 +- .../GameReviewMannerScoresService.java | 46 +++---- .../kr/pickple/back/member/domain/Member.java | 98 +++------------ .../back/member/domain/MemberDomain.java | 48 ------- .../dto/mapper/MemberResponseMapper.java | 6 +- .../response/AuthenticatedMemberResponse.java | 4 +- .../member/dto/response/MemberResponse.java | 4 +- .../back/member/implement/MemberMapper.java | 20 +-- .../back/member/implement/MemberReader.java | 72 ++++------- .../back/member/implement/MemberWriter.java | 24 ++-- .../repository/MemberPositionRepository.java | 6 +- .../member/repository/MemberRepository.java | 6 +- .../repository/entity/MemberEntity.java | 117 ++++++++++++++++++ .../entity/MemberPositionEntity.java} | 6 +- .../member/service/MemberCrewService.java | 10 +- .../member/service/MemberGameService.java | 16 +-- .../back/position/domain/Position.java | 6 +- .../alarm/controller/AlarmControllerTest.java | 8 +- .../CrewEntityAlarmControllerTest.java | 4 +- .../GameEntityAlarmControllerTest.java | 4 +- .../back/alarm/docs/AlarmDocumentTest.java | 9 +- .../docs/CrewEntityAlarmDocumentTest.java | 5 +- .../docs/GameEntityAlarmDocumentTest.java | 4 +- .../back/auth/service/AuthServiceTest.java | 6 +- .../docs/ChatMessageEntityDocumentTest.java | 8 +- .../chat/docs/ChatRoomEntityDocumentTest.java | 28 ++--- .../controller/CrewEntityControllerTest.java | 29 ++--- .../crew/docs/CrewEntityDocumentTest.java | 18 +-- .../fixture/domain/CrewAlarmFixtures.java | 4 +- .../back/fixture/domain/CrewFixtures.java | 8 +- .../fixture/domain/GameAlarmFixtures.java | 4 +- .../back/fixture/domain/GameFixtures.java | 4 +- .../back/fixture/domain/MemberFixtures.java | 12 +- .../back/fixture/dto/GameDtoFixtures.java | 4 +- .../pickple/back/fixture/setup/CrewSetup.java | 6 +- .../pickple/back/fixture/setup/GameSetup.java | 10 +- .../back/fixture/setup/MemberSetup.java | 11 +- .../controller/GameEntityControllerTest.java | 34 ++--- .../game/docs/GameEntityDocumentTest.java | 22 ++-- .../game/service/GameEntityServiceTest.java | 4 +- ...t.java => MemberEntityControllerTest.java} | 10 +- ...est.java => MemberEntityDocumentTest.java} | 14 +-- ...{MemberTest.java => MemberEntityTest.java} | 9 +- ...=> MemberEntityCrewServiceTestEntity.java} | 12 +- ...Test.java => MemberEntityServiceTest.java} | 12 +- 84 files changed, 652 insertions(+), 672 deletions(-) rename src/main/java/kr/pickple/back/game/domain/{GameDomain.java => Game.java} (90%) rename src/main/java/kr/pickple/back/game/domain/{GameMemberDomain.java => GameMember.java} (87%) delete mode 100644 src/main/java/kr/pickple/back/member/domain/MemberDomain.java create mode 100644 src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java rename src/main/java/kr/pickple/back/member/{domain/MemberPosition.java => repository/entity/MemberPositionEntity.java} (83%) rename src/test/java/kr/pickple/back/member/controller/{MemberControllerTest.java => MemberEntityControllerTest.java} (97%) rename src/test/java/kr/pickple/back/member/docs/{MemberDocumentTest.java => MemberEntityDocumentTest.java} (99%) rename src/test/java/kr/pickple/back/member/domain/{MemberTest.java => MemberEntityTest.java} (84%) rename src/test/java/kr/pickple/back/member/service/{MemberCrewServiceTestEntity.java => MemberEntityCrewServiceTestEntity.java} (91%) rename src/test/java/kr/pickple/back/member/service/{MemberServiceTest.java => MemberEntityServiceTest.java} (92%) diff --git a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java index 08b7d032..c8d8d77b 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/CrewAlarm.java @@ -13,7 +13,7 @@ import kr.pickple.back.alarm.util.CrewAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -42,13 +42,13 @@ public class CrewAlarm extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") - private Member member; + private MemberEntity member; @Builder private CrewAlarm( final CrewAlarmType crewAlarmType, final CrewEntity crew, - final Member member + final MemberEntity member ) { this.crewAlarmType = crewAlarmType; this.crew = crew; diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index 9aa34dbd..e2fb0967 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -13,7 +13,7 @@ import kr.pickple.back.alarm.util.GameAlarmTypeConverter; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -42,13 +42,13 @@ public class GameAlarm extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") - private Member member; + private MemberEntity member; @Builder private GameAlarm( final GameAlarmType gameAlarmType, final GameEntity gameEntity, - final Member member + final MemberEntity member ) { this.gameAlarmType = gameAlarmType; this.gameEntity = gameEntity; diff --git a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java index 5e56b320..4664057e 100644 --- a/src/main/java/kr/pickple/back/alarm/service/AlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/AlarmService.java @@ -16,7 +16,7 @@ import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; import kr.pickple.back.alarm.dto.response.GameAlarmResponse; import kr.pickple.back.alarm.util.CursorResult; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -77,13 +77,13 @@ public AlarmExistStatusResponse checkUnReadAlarms(final Long loggedInMemberId) { @Transactional public void deleteAllAlarms(final Long loggedInMemberId) { - final Member member = findMemberById(loggedInMemberId); + final MemberEntity member = findMemberById(loggedInMemberId); crewAlarmService.deleteAllCrewAlarms(member.getId()); gameAlarmService.deleteAllGameAlarms(member.getId()); } - private Member findMemberById(final Long memberId) { + private MemberEntity findMemberById(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index b102fa1f..bb123725 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -23,7 +23,7 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -44,7 +44,7 @@ public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinR final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); final CrewEntity crew = getCrewInfo(crewId); - final Member leader = memberRepository.getMemberById(crew.getLeaderId()); + final MemberEntity leader = memberRepository.getMemberById(crew.getLeaderId()); final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) @@ -63,7 +63,7 @@ public void createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJ final Long crewId = crewMemberJoinedEvent.getCrewId(); final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberJoinedEvent.getMemberId(); - final Member member = getMemberInfo(memberId); + final MemberEntity member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) @@ -82,7 +82,7 @@ public void createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMember final Long crewId = crewMemberRejectedEvent.getCrewId(); final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberRejectedEvent.getMemberId(); - final Member member = getMemberInfo(memberId); + final MemberEntity member = getMemberInfo(memberId); final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) @@ -103,8 +103,8 @@ private CrewEntity getCrewInfo(final Long crewId) { return crew; } - private Member getMemberInfo(final Long memberId) { - final Member member = memberRepository.findById(memberId) + private MemberEntity getMemberInfo(final Long memberId) { + final MemberEntity member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); return member; @@ -114,7 +114,7 @@ private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEv final Long crewId = crewAlarmEvent.getCrewId(); final CrewEntity crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - final Member leader = memberRepository.getMemberById(crew.getLeaderId()); + final MemberEntity leader = memberRepository.getMemberById(crew.getLeaderId()); if (!crew.isLeader(crewAlarmEvent.getMemberId())) { throw new CrewException(CREW_IS_NOT_LEADER, crewId, leader.getId()); @@ -156,13 +156,13 @@ public void updateCrewAlarmById( final Long crewAlarmId, final CrewAlarmUpdateStatusRequest crewAlarmUpdateStatusRequest ) { - final Member member = findMemberById(loggedInMemberId); + final MemberEntity member = findMemberById(loggedInMemberId); final CrewAlarm crewAlarm = checkExistCrewAlarm(loggedInMemberId, crewAlarmId); crewAlarm.updateStatus(crewAlarmUpdateStatusRequest.getIsRead()); } - private Member findMemberById(final Long memberId) { + private MemberEntity findMemberById(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } diff --git a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java index 920b7dc9..838d2699 100644 --- a/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/GameAlarmService.java @@ -23,7 +23,7 @@ import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -44,7 +44,7 @@ public void createGameJoinAlarm(final GameJoinRequestNotificationEvent gameJoinR final Long gameId = gameJoinRequestNotificationEvent.getGameId(); final GameEntity gameEntity = getGameInfo(gameId); - final Member host = getMemberInfo(gameEntity.getHostId()); + final MemberEntity host = getMemberInfo(gameEntity.getHostId()); final GameAlarm gameAlarm = GameAlarm.builder() .game(gameEntity) @@ -63,7 +63,7 @@ public void createGuestApproveAlarm(final GameMemberJoinedEvent gameMemberJoined final Long gameId = gameMemberJoinedEvent.getGameId(); final GameEntity gameEntity = getGameInfo(gameId); final Long memberId = gameMemberJoinedEvent.getMemberId(); - final Member member = getMemberInfo(memberId); + final MemberEntity member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() .game(gameEntity) @@ -83,7 +83,7 @@ public void createGuestDeniedAlarm(final GameMemberRejectedEvent gameMemberRejec final Long gameId = gameMemberRejectedEvent.getGameId(); final GameEntity gameEntity = getGameInfo(gameId); final Long memberId = gameMemberRejectedEvent.getMemberId(); - final Member member = getMemberInfo(memberId); + final MemberEntity member = getMemberInfo(memberId); final GameAlarm gameAlarm = GameAlarm.builder() .game(gameEntity) @@ -112,7 +112,7 @@ private GameEntity getGameInfo(final Long gameId) { return gameEntity; } - private Member getMemberInfo(final Long memberId) { + private MemberEntity getMemberInfo(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } @@ -155,13 +155,13 @@ public void updateGameAlarmById( final Long gameAlarmId, final GameAlarmUpdateStatusRequest gameAlarmUpdateStatusRequest ) { - final Member member = findMemberById(loggedInMemberId); + final MemberEntity member = findMemberById(loggedInMemberId); final GameAlarm gameAlarm = checkExistGameAlarm(loggedInMemberId, gameAlarmId); gameAlarm.updateStatus(gameAlarmUpdateStatusRequest.getIsRead()); } - private Member findMemberById(final Long memberId) { + private MemberEntity findMemberById(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); } diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index c37f6f2b..46175bf0 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -22,7 +22,7 @@ import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.auth.service.authcode.AuthCodeRequestUrlProviderComposite; import kr.pickple.back.auth.service.memberclient.OauthMemberClientComposite; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -53,11 +53,11 @@ public AuthenticatedMemberResponse processLoginOrRegistration( final String authCode ) { final OauthMember oauthMember = oauthMemberClientComposite.fetch(oauthProvider, authCode); - final Optional member = memberReader.readByOauthId(oauthMember.getOauthId()); + final Optional member = memberReader.readByOauthId(oauthMember.getOauthId()); // 사용자가 로그인 하는 경우 if (member.isPresent()) { - final Member loginMember = member.get(); + final MemberEntity loginMember = member.get(); final AuthTokens loginTokens = jwtProvider.createLoginToken(String.valueOf(loginMember.getId())); final RefreshToken refreshToken = RefreshToken.builder() diff --git a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java index 77ec4e0a..23324f60 100644 --- a/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java +++ b/src/main/java/kr/pickple/back/chat/domain/ChatMessage.java @@ -2,7 +2,7 @@ import java.time.LocalDateTime; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -18,7 +18,7 @@ public class ChatMessage { private Long chatMessageId; private MessageType type; private String content; - private MemberDomain sender; + private Member sender; private ChatRoom chatRoom; private LocalDateTime createdAt; } diff --git a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java index b2067115..27bf9917 100644 --- a/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java +++ b/src/main/java/kr/pickple/back/chat/dto/mapper/ChatResponseMapper.java @@ -12,7 +12,7 @@ import kr.pickple.back.chat.dto.response.PersonalChatRoomStatusResponse; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.game.domain.Game; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -39,8 +39,8 @@ public static ChatRoomResponse mapToChatRoomResponseDto( } public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( - final MemberDomain sender, - final MemberDomain receiver, + final Member sender, + final Member receiver, final ChatRoom chatRoom ) { final List chatMemberResponses = List.of( @@ -64,7 +64,7 @@ public static ChatRoomDetailResponse mapToPersonalChatRoomDetailResponseDto( public static ChatRoomDetailResponse mapToCrewChatRoomDetailResponseDto( final Crew crew, final ChatRoom chatRoom, - final List members + final List members ) { final List chatMemberResponses = members.stream() .map(ChatResponseMapper::mapToChatMemberResponseDto) @@ -86,7 +86,7 @@ public static ChatRoomDetailResponse mapToCrewChatRoomDetailResponseDto( public static ChatRoomDetailResponse mapToGameChatRoomDetailResponseDto( final Game game, final ChatRoom chatRoom, - final List members + final List members ) { final List chatMemberResponses = members.stream() .map(ChatResponseMapper::mapToChatMemberResponseDto) @@ -96,7 +96,7 @@ public static ChatRoomDetailResponse mapToGameChatRoomDetailResponseDto( .id(chatRoom.getChatRoomId()) .roomName(chatRoom.getName()) .type(chatRoom.getType()) - .domainId(game.getId()) + .domainId(game.getGameId()) .memberCount(chatRoom.getMemberCount()) .maxMemberCount(chatRoom.getMaxMemberCount()) .playStartTime(game.getPlayStartTime()) @@ -106,7 +106,7 @@ public static ChatRoomDetailResponse mapToGameChatRoomDetailResponseDto( .build(); } - public static ChatMemberResponse mapToChatMemberResponseDto(final MemberDomain member) { + public static ChatMemberResponse mapToChatMemberResponseDto(final Member member) { return ChatMemberResponse.builder() .id(member.getMemberId()) .nickname(member.getNickname()) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java index 541b3410..aa8c11d3 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatMapper.java @@ -4,7 +4,7 @@ import kr.pickple.back.chat.domain.ChatMessage; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -24,7 +24,7 @@ public static ChatRoom mapChatRoomEntityToDomain(final ChatRoomEntity chatRoomEn public static ChatMessage mapChatMessageEntityToDomain( final ChatMessageEntity chatMessageEntity, - final MemberDomain sender, + final Member sender, final ChatRoom chatRoom ) { return ChatMessage.builder() diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index d7e0509d..4b51364f 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -9,18 +9,20 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.repository.entity.ChatMessageEntity; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; import kr.pickple.back.chat.domain.PersonalChatRoomStatus; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -30,6 +32,8 @@ public class ChatReader { private final MemberReader memberReader; + private final CrewRepository crewRepository; + private final GameRepository gameRepository; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; private final ChatMessageRepository chatMessageRepository; @@ -41,6 +45,14 @@ public ChatRoom readRoom(final Long chatRoomId) { return ChatMapper.mapChatRoomEntityToDomain(chatRoomEntity); } + public ChatRoom readRoomByCrewId(final Long crewId) { + return readRoom(crewRepository.findChatRoomId(crewId)); + } + + public ChatRoom readRoomByGameId(final Long gameId) { + return readRoom(gameRepository.findChatRoomId(gameId)); + } + public PersonalChatRoomStatus readPersonalRoomStatus(final Long senderId, final Long receiverId) { final ChatRoomMemberEntity receiverEntity = chatRoomMemberRepository.findAllByMemberId(senderId) .stream() @@ -68,7 +80,7 @@ public List readEnteringRoomsByType(final Long memberId, final RoomTyp .toList(); } - public MemberDomain readReceiver(final Long senderId, final Long chatRoomId) { + public Member readReceiver(final Long senderId, final Long chatRoomId) { final ChatRoomMemberEntity receiverEntity = chatRoomMemberRepository.findByChatRoomIdAndMemberIdNot( chatRoomId, senderId) .orElseThrow(() -> new ChatException(CHAT_RECEIVER_NOT_FOUND)); @@ -76,7 +88,7 @@ public MemberDomain readReceiver(final Long senderId, final Long chatRoomId) { return memberReader.readByMemberId(receiverEntity.getMemberId()); } - public List readRoomMembers(final Long chatRoomId) { + public List readRoomMembers(final Long chatRoomId) { return chatRoomMemberRepository.findAllByActiveTrueAndChatRoomId(chatRoomId) .stream() .map(chatRoomMember -> memberReader.readByMemberId(chatRoomMember.getMemberId())) @@ -86,7 +98,7 @@ public List readRoomMembers(final Long chatRoomId) { public ChatMessage readLastMessage(final ChatRoom chatRoom) { final ChatMessageEntity lastMessageEntity = chatMessageRepository.findTopByChatRoomIdOrderByCreatedAtDesc( chatRoom.getChatRoomId()); - final MemberDomain sender = memberReader.readByMemberId(lastMessageEntity.getSenderId()); + final Member sender = memberReader.readByMemberId(lastMessageEntity.getSenderId()); return ChatMapper.mapChatMessageEntityToDomain(lastMessageEntity, sender, chatRoom); } diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index bbff3f03..b834460c 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -12,24 +12,24 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.repository.entity.ChatMessageEntity; import kr.pickple.back.chat.domain.ChatMessage; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; import kr.pickple.back.common.util.DateTimeUtil; import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -54,7 +54,7 @@ public ChatRoom createNewPersonalRoom(final String name) { return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); } - public ChatRoom createNewGroupRoom(final String name, final RoomType type, final Integer maxMemberCount) { + public ChatRoom createNewGroupRoom(final RoomType type, final String name, final Integer maxMemberCount) { final ChatRoomEntity chatRoomEntity = ChatRoomEntity.builder() .name(name) .type(type) @@ -65,7 +65,7 @@ public ChatRoom createNewGroupRoom(final String name, final RoomType type, final return ChatMapper.mapChatRoomEntityToDomain(savedChatRoomEntity); } - public ChatMessage enterRoom(final MemberDomain member, final ChatRoom chatRoom) { + public ChatMessage enterRoom(final Member member, final ChatRoom chatRoom) { final Long memberId = member.getMemberId(); final Long chatRoomId = chatRoom.getChatRoomId(); @@ -96,7 +96,7 @@ private void activateRoom(final Long chatRoomId, final Long memberId) { public ChatMessage sendMessage( final MessageType type, final String content, - final MemberDomain sender, + final Member sender, final ChatRoom chatRoom ) { final Long chatRoomId = chatRoom.getChatRoomId(); @@ -117,7 +117,7 @@ public ChatMessage sendMessage( return ChatMapper.mapChatMessageEntityToDomain(savedChatMessageEntity, sender, chatRoom); } - public ChatMessage leaveRoom(final MemberDomain member, final ChatRoom chatRoom) { + public ChatMessage leaveRoom(final Member member, final ChatRoom chatRoom) { final Long memberId = member.getMemberId(); final Long chatRoomId = chatRoom.getChatRoomId(); @@ -168,7 +168,7 @@ private Boolean existsMemberInCrew(final Long crewId, final Long memberId) { } private void validateCanLeaveGameChatRoom(final ChatRoom chatRoom) { - final Optional gameEntity = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()); + final Optional gameEntity = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()); if (gameEntity.isPresent() && isGameNotEnded(gameEntity.get().getPlayEndDatetime())) { throw new ChatException(CHAT_GAME_CHATROOM_NOT_ALLOWED_TO_LEAVE); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java index 530a2473..7823b860 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatMessageService.java @@ -14,7 +14,7 @@ import kr.pickple.back.chat.dto.response.ChatMessageResponse; import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.chat.implement.ChatWriter; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -36,7 +36,7 @@ public ChatMessageResponse enterChatRoom( final ChatMessageCreateRequest chatMessageCreateRequest ) { final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); - final MemberDomain newMember = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final Member newMember = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); final ChatMessage entranceMessage = chatWriter.enterRoom(newMember, chatRoom); return ChatResponseMapper.mapToChatMessageResponseDto(entranceMessage); @@ -51,7 +51,7 @@ public ChatMessageResponse sendMessage( final ChatMessageCreateRequest chatMessageCreateRequest ) { final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); - final MemberDomain sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final Member sender = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); final ChatMessage chatMessage = chatWriter.sendMessage( TALK, chatMessageCreateRequest.getContent(), @@ -71,7 +71,7 @@ public ChatMessageResponse leaveChatRoom( final ChatMessageCreateRequest chatMessageCreateRequest ) { final ChatRoom chatRoom = chatReader.readRoom(chatRoomId); - final MemberDomain member = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); + final Member member = memberReader.readByMemberId(chatMessageCreateRequest.getSenderId()); final ChatMessage leaveMessage = chatWriter.leaveRoom(member, chatRoom); return ChatResponseMapper.mapToChatMessageResponseDto(leaveMessage); diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java index 606cd52c..fc1cf393 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomFindService.java @@ -1,6 +1,5 @@ package kr.pickple.back.chat.service; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -13,12 +12,12 @@ import kr.pickple.back.chat.dto.mapper.ChatResponseMapper; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.chat.dto.response.ChatRoomResponse; -import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.implement.GameReader; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -30,8 +29,8 @@ public class ChatRoomFindService { private final MemberReader memberReader; private final CrewReader crewReader; + private final GameReader gameReader; private final ChatReader chatReader; - private final GameRepository gameRepository; /** * 채팅방 타입에 따른 참여중인 모든 채팅방 목록 조회 @@ -70,23 +69,22 @@ private ChatRoomDetailResponse getPersonalChatRoomDetailResponse( final Long senderId, final ChatRoom chatRoom ) { - final MemberDomain sender = memberReader.readByMemberId(senderId); - final MemberDomain receiver = chatReader.readReceiver(senderId, chatRoom.getChatRoomId()); + final Member sender = memberReader.readByMemberId(senderId); + final Member receiver = chatReader.readReceiver(senderId, chatRoom.getChatRoomId()); return ChatResponseMapper.mapToPersonalChatRoomDetailResponseDto(sender, receiver, chatRoom); } private ChatRoomDetailResponse getCrewChatRoomDetailResponse(final ChatRoom chatRoom) { final Crew crew = crewReader.readByChatRoomId(chatRoom.getChatRoomId()); - final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); + final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); return ChatResponseMapper.mapToCrewChatRoomDetailResponseDto(crew, chatRoom, members); } private ChatRoomDetailResponse getGameChatRoomDetailResponse(final ChatRoom chatRoom) { - final Game game = gameRepository.findByChatRoomId(chatRoom.getChatRoomId()) - .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoom.getChatRoomId())); - final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); + final Game game = gameReader.readByChatRoomId(chatRoom.getChatRoomId()); + final List members = chatReader.readRoomMembers(chatRoom.getChatRoomId()); return ChatResponseMapper.mapToGameChatRoomDetailResponseDto(game, chatRoom, members); } diff --git a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java index 9092829e..73e43974 100644 --- a/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java +++ b/src/main/java/kr/pickple/back/chat/service/ChatRoomService.java @@ -15,7 +15,7 @@ import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.implement.ChatReader; import kr.pickple.back.chat.implement.ChatWriter; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -35,8 +35,8 @@ public class ChatRoomService { public ChatRoomDetailResponse createPersonalRoom(final Long senderId, final Long receiverId) { validateSelfChat(senderId, receiverId); - final MemberDomain sender = memberReader.readByMemberId(senderId); - final MemberDomain receiver = memberReader.readByMemberId(receiverId); + final Member sender = memberReader.readByMemberId(senderId); + final Member receiver = memberReader.readByMemberId(receiverId); final String roomName = MessageFormat.format("{0},{1}", sender.getNickname(), receiver.getNickname()); final ChatRoom chatRoom = chatWriter.createNewPersonalRoom(roomName); diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 560af441..06cc0569 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -3,8 +3,9 @@ import static kr.pickple.back.crew.domain.CrewStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -23,13 +24,14 @@ public class Crew { private Integer memberCount; private Integer maxMemberCount; private CrewStatus status = OPEN; - private MemberDomain leader; + private Member leader; private String addressDepth1Name; private String addressDepth2Name; private String profileImageUrl; private String backgroundImageUrl; private Integer likeCount; private Integer competitionPoint; + private ChatRoom chatRoom; public void increaseMemberCount() { if (status == CLOSED) { diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java index 9752d707..e0e8087f 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewMember.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewMember.java @@ -4,7 +4,7 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.exception.CrewException; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -19,7 +19,7 @@ public class CrewMember { private Long crewMemberId; private RegistrationStatus status; - private MemberDomain member; + private Member member; private Crew crew; public void updateCrewMemberId(final Long crewMemberId) { diff --git a/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java b/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java index d6c1cb5f..cf21d9ba 100644 --- a/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java +++ b/src/main/java/kr/pickple/back/crew/domain/CrewProfile.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -23,8 +23,8 @@ public class CrewProfile { private CrewStatus status; private Integer likeCount; private Integer competitionPoint; - private MemberDomain leader; + private Member leader; private String addressDepth1; private String addressDepth2; - private List members; + private List members; } diff --git a/src/main/java/kr/pickple/back/crew/domain/NewCrew.java b/src/main/java/kr/pickple/back/crew/domain/NewCrew.java index 97435cc3..d24573c0 100644 --- a/src/main/java/kr/pickple/back/crew/domain/NewCrew.java +++ b/src/main/java/kr/pickple/back/crew/domain/NewCrew.java @@ -1,7 +1,7 @@ package kr.pickple.back.crew.domain; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -18,7 +18,7 @@ public class NewCrew { private String addressDepth2Name; private String profileImageUrl; private String backgroundImageUrl; - private MemberDomain leader; + private Member leader; private ChatRoom chatRoom; @Builder @@ -41,7 +41,7 @@ public void assignImageUrls(final String profileImageUrl, final String backgroun this.backgroundImageUrl = backgroundImageUrl; } - public void assignLeader(final MemberDomain leader) { + public void assignLeader(final Member leader) { this.leader = leader; } diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java index ed03ff3d..e446a359 100644 --- a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -8,7 +8,7 @@ import kr.pickple.back.crew.dto.response.CrewIdResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberResponse; @@ -22,7 +22,7 @@ public static CrewIdResponse mapToCrewIdResponseDto(final Long crewId) { return CrewIdResponse.from(crewId); } - public static CrewProfileResponse mapToCrewProfileResponseDto(final Crew crew, final List members) { + public static CrewProfileResponse mapToCrewProfileResponseDto(final Crew crew, final List members) { final List memberResponses = members.stream() .map(MemberResponseMapper::mapToMemberResponseDto) .toList(); diff --git a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java index 11edbd6a..1245f773 100644 --- a/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java +++ b/src/main/java/kr/pickple/back/crew/dto/request/CrewCreateRequest.java @@ -5,7 +5,6 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import kr.pickple.back.crew.domain.Crew; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -35,14 +34,4 @@ public class CrewCreateRequest { @NotBlank(message = "해당 크루의 활동 장소(구) 정보는 필수입니다.") private String addressDepth2; - - public Crew toDomain() { - return Crew.builder() - .name(name) - .content(content) - .maxMemberCount(maxMemberCount) - .addressDepth1Name(addressDepth1) - .addressDepth2Name(addressDepth2) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index cdbace03..d2a16add 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -9,7 +9,7 @@ import kr.pickple.back.crew.domain.NewCrew; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -26,14 +26,14 @@ public static CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew, final M .backgroundImageUrl(newCrew.getBackgroundImageUrl()) .addressDepth1Id(mainAddress.getAddressDepth1().getId()) .addressDepth2Id(mainAddress.getAddressDepth2().getId()) - .chatRoomId(newCrew.getChatRoom().getId()) + .chatRoomId(newCrew.getChatRoom().getChatRoomId()) .build(); } public static Crew mapCrewEntityToDomain( final CrewEntity crewEntity, final MainAddress mainAddress, - final MemberDomain leader + final Member leader ) { return Crew.builder() .crewId(crewEntity.getId()) @@ -61,7 +61,7 @@ public static CrewMemberEntity mapCrewMemberDomainToEntity(final CrewMember crew public static CrewMember mapCrewMemberEntityToDomain( final CrewMemberEntity crewMemberEntity, - final MemberDomain member, + final Member member, final Crew crew ) { return CrewMember.builder() @@ -75,8 +75,8 @@ public static CrewMember mapCrewMemberEntityToDomain( public static CrewProfile mapCrewEntityToCrewProfile( final CrewEntity crewEntity, final MainAddress mainAddress, - final MemberDomain leader, - final List members + final Member leader, + final List members ) { return CrewProfile.builder() .crewId(crewEntity.getId()) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 7f947b7e..96f45d53 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -25,12 +25,12 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.implement.MemberMapper; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -50,12 +50,16 @@ public Integer countByLeaderId(final Long leaderId) { } public Crew read(final Long crewId) { - final CrewEntity crewEntity = crewRepository.findById(crewId) - .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + final CrewEntity crewEntity = getCrewById(crewId); return mapCrewEntityToDomain(crewEntity); } + private CrewEntity getCrewById(final Long crewId) { + return crewRepository.findById(crewId) + .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); + } + public Crew readByChatRoomId(final Long chatRoomId) { final CrewEntity crewEntity = crewRepository.findByChatRoomId(chatRoomId) .orElseThrow(() -> new ChatException(CHAT_CREW_NOT_FOUND, chatRoomId)); @@ -69,7 +73,7 @@ private Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { crewEntity.getAddressDepth2Id() ); - final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); + final Member leader = readMemberById(crewEntity.getLeaderId()); return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader); } @@ -98,21 +102,21 @@ public List readNearCrewsByAddress( public CrewMember readCrewMember(final Long memberId, final Long crewId) { final CrewMemberEntity crewMemberEntity = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - final MemberDomain member = readMemberById(memberId); + final Member member = readMemberById(memberId); final Crew crew = read(crewId); return CrewMapper.mapCrewMemberEntityToDomain(crewMemberEntity, member, crew); } - public List readAllMembersInStatus(final Long crewId, final RegistrationStatus status) { + public List readAllMembersInStatus(final Long crewId, final RegistrationStatus status) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) .stream() .map(crewMemberEntity -> readMemberById(crewMemberEntity.getMemberId())) .toList(); } - private MemberDomain readMemberById(final Long memberId) { - final Member memberEntity = memberRepository.findById(memberId) + private Member readMemberById(final Long memberId) { + final MemberEntity memberEntity = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); final MainAddress mainAddress = addressReader.readMainAddressById( @@ -122,7 +126,7 @@ private MemberDomain readMemberById(final Long memberId) { final List positions = memberPositionRepository.findAllByMemberId(memberId) .stream() - .map(MemberPosition::getPosition) + .map(MemberPositionEntity::getPosition) .toList(); return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); @@ -134,7 +138,7 @@ public List readAllCrewProfilesByMemberIdAndStatus( ) { final List crewEntities = crewMemberRepository.findAllByMemberIdAndStatus(memberId, memberStatus) .stream() - .map(crewMember -> crewRepository.getCrewById(crewMember.getCrewId())) + .map(crewMember -> getCrewById(crewMember.getCrewId())) .toList(); return mapCrewEntitiesToCrewProfiles(crewEntities, memberStatus); @@ -152,12 +156,12 @@ private List mapCrewEntitiesToCrewProfiles( ) { return crewEntities.stream() .map(crew -> { - final List members = readAllMembersInStatus(crew.getId(), registrationStatus); + final List members = readAllMembersInStatus(crew.getId(), registrationStatus); final MainAddress mainAddress = addressReader.readMainAddressById( crew.getAddressDepth1Id(), crew.getAddressDepth2Id() ); - final MemberDomain leader = readMemberById(crew.getLeaderId()); + final Member leader = readMemberById(crew.getLeaderId()); return CrewMapper.mapCrewEntityToCrewProfile(crew, mainAddress, leader, members); }) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 3555c84c..5bb363ec 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -17,7 +17,7 @@ import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -49,7 +49,7 @@ public Crew create(final NewCrew newCrew) { ); } - public CrewMember register(final MemberDomain member, final Crew crew) { + public CrewMember register(final Member member, final Crew crew) { final Long memberId = member.getMemberId(); final Long crewId = crew.getCrewId(); diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 440d0003..6f917b42 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -1,7 +1,5 @@ package kr.pickple.back.crew.repository; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; - import java.util.List; import java.util.Optional; @@ -10,7 +8,6 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.crew.exception.CrewException; public interface CrewMemberRepository extends JpaRepository { @@ -26,9 +23,4 @@ public interface CrewMemberRepository extends JpaRepository new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - } } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java index 6559e4c8..1a57f1fe 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewRepository.java @@ -1,7 +1,5 @@ package kr.pickple.back.crew.repository; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; - import java.util.List; import java.util.Optional; @@ -10,9 +8,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.domain.CrewStatus; -import kr.pickple.back.crew.exception.CrewException; +import kr.pickple.back.crew.repository.entity.CrewEntity; public interface CrewRepository extends JpaRepository { @@ -33,7 +30,6 @@ Page findByAddressDepth1IdAndAddressDepth2Id( @Query("update CrewEntity c set c.memberCount = :memberCount, c.status = :status where c.id = :crewId") void updateMemberCountAndStatus(final Long crewId, final Integer memberCount, final CrewStatus status); - default CrewEntity getCrewById(final Long crewId) { - return findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - } + @Query("select c.chatRoomId from CrewEntity c where c.id = :crewId") + Long findChatRoomId(final Long crewId); } diff --git a/src/main/java/kr/pickple/back/game/controller/GameController.java b/src/main/java/kr/pickple/back/game/controller/GameController.java index f71ab66d..a7fbdc6e 100644 --- a/src/main/java/kr/pickple/back/game/controller/GameController.java +++ b/src/main/java/kr/pickple/back/game/controller/GameController.java @@ -102,7 +102,7 @@ public ResponseEntity updateGameMemberRegistrationStatus( loggedInMemberId, gameId, memberId, - gameMemberRegistrationStatusUpdateRequest + gameMemberRegistrationStatusUpdateRequest.getStatus() ); return ResponseEntity.status(NO_CONTENT) diff --git a/src/main/java/kr/pickple/back/game/domain/GameDomain.java b/src/main/java/kr/pickple/back/game/domain/Game.java similarity index 90% rename from src/main/java/kr/pickple/back/game/domain/GameDomain.java rename to src/main/java/kr/pickple/back/game/domain/Game.java index 22771c12..6211e2b2 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameDomain.java +++ b/src/main/java/kr/pickple/back/game/domain/Game.java @@ -8,10 +8,9 @@ import java.time.LocalTime; import java.util.List; -import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -21,7 +20,7 @@ @Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class GameDomain { +public class Game { private Long gameId; private String content; @@ -38,11 +37,10 @@ public class GameDomain { private Integer cost; private Integer memberCount; private Integer maxMemberCount; - private MemberDomain host; + private Member host; private String addressDepth1Name; private String addressDepth2Name; private List positions; - private ChatRoom chatRoom; public void increaseMemberCount() { if (status != OPEN) { @@ -60,6 +58,10 @@ public void increaseMemberCount() { } } + public LocalDateTime getPlayStartDatetime() { + return LocalDateTime.of(playDate, playStartTime); + } + public LocalDateTime getPlayEndDatetime() { return LocalDateTime.of(playDate, playEndTime); } diff --git a/src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java similarity index 87% rename from src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java rename to src/main/java/kr/pickple/back/game/domain/GameMember.java index 53d88a55..3d1cb753 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMemberDomain.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -4,7 +4,7 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,12 +15,12 @@ @Builder @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class GameMemberDomain { +public class GameMember { private Long gameMemberId; private RegistrationStatus status; - private MemberDomain member; - private GameDomain game; + private Member member; + private Game game; private Boolean isReview = FALSE; public void updateGameMemberId(final Long gameMemberId) { diff --git a/src/main/java/kr/pickple/back/game/domain/NewGame.java b/src/main/java/kr/pickple/back/game/domain/NewGame.java index 80771408..7334686d 100644 --- a/src/main/java/kr/pickple/back/game/domain/NewGame.java +++ b/src/main/java/kr/pickple/back/game/domain/NewGame.java @@ -5,7 +5,7 @@ import java.util.List; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -28,7 +28,7 @@ public class NewGame { private List positions; private String addressDepth1Name; private String addressDepth2Name; - private MemberDomain host; + private Member host; private ChatRoom chatRoom; @Builder @@ -60,7 +60,7 @@ private NewGame( this.addressDepth2Name = addressDepth2Name; } - public void assignHost(final MemberDomain host) { + public void assignHost(final Member host) { this.host = host; } diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java index 70d3c9ca..c363b379 100644 --- a/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java @@ -9,7 +9,7 @@ public class GameRequestMapper { public static NewGame mapToNewGameDomain(final GameCreateRequest gameCreateRequest, final MainAddress mainAddress) { - LocalTime playEndTime = gameCreateRequest.getPlayStartTime() + final LocalTime playEndTime = gameCreateRequest.getPlayStartTime() .plusMinutes(gameCreateRequest.getPlayTimeMinutes()); return NewGame.builder() @@ -23,8 +23,8 @@ public static NewGame mapToNewGameDomain(final GameCreateRequest gameCreateReque .cost(gameCreateRequest.getCost()) .maxMemberCount(gameCreateRequest.getMaxMemberCount()) .positions(gameCreateRequest.getPositions()) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1().getName()) + .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .build(); } } diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java index 198bc600..d49e8d07 100644 --- a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java @@ -2,15 +2,15 @@ import java.util.List; -import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.dto.response.GameResponse; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.MemberResponse; public class GameResponseMapper { - public static GameResponse mapToGameResponseDto(final GameDomain gameDomain, final List members) { + public static GameResponse mapToGameResponseDto(final Game gameDomain, final List members) { final List memberResponses = members .stream() .map(MemberResponseMapper::mapToMemberResponseDto) diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index 39753a94..e060184f 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -5,25 +5,25 @@ import org.locationtech.jts.geom.Point; import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; -public class GameMapper { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class GameMapper { - public static GameDomain mapGameEntityToDomain( + public static Game mapGameEntityToDomain( final GameEntity gameEntity, final MainAddress mainAddress, - final MemberDomain host, - final ChatRoom chatRoom, + final Member host, final List positions ) { - return GameDomain.builder() + return Game.builder() .gameId(gameEntity.getId()) .content(gameEntity.getContent()) .playDate(gameEntity.getPlayDate()) @@ -43,11 +43,14 @@ public static GameDomain mapGameEntityToDomain( .addressDepth1Name(mainAddress.getAddressDepth1().getName()) .addressDepth2Name(mainAddress.getAddressDepth2().getName()) .positions(positions) - .chatRoom(chatRoom) .build(); } - public static GameEntity mapNewGameDomainToEntity(NewGame newGame, Point point, MainAddress mainAddress) { + public static GameEntity mapNewGameDomainToEntity( + final NewGame newGame, + final Point point, + final MainAddress mainAddress + ) { return GameEntity.builder() .content(newGame.getContent()) .playDate(newGame.getPlayDate()) @@ -62,7 +65,7 @@ public static GameEntity mapNewGameDomainToEntity(NewGame newGame, Point point, .point(point) .addressDepth1Id(mainAddress.getAddressDepth1().getId()) .addressDepth2Id(mainAddress.getAddressDepth2().getId()) - .chatRoomId(newGame.getChatRoom().getId()) + .chatRoomId(newGame.getChatRoom().getChatRoomId()) .build(); } @@ -74,16 +77,4 @@ public static List mapToGamePositionEntities(final List .build() ).toList(); } - - public static List mapToMemberPositionEntities( - final List positions, - final Long memberId - ) { - return positions.stream() - .map(position -> MemberPosition.builder() - .memberId(memberId) - .position(position) - .build() - ).toList(); - } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java index 342f17d1..92950601 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java @@ -1,26 +1,33 @@ package kr.pickple.back.game.implement; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; -public class GameMemberMapper { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class GameMemberMapper { - public static GameMemberEntity mapGameMemberDomainToEntity(final GameMemberDomain gameMemberDomain) { + public static GameMemberEntity mapGameMemberDomainToEntity(final GameMember gameMember) { return GameMemberEntity.builder() - .status(gameMemberDomain.getStatus()) - .memberId(gameMemberDomain.getMember().getMemberId()) - .gameId(gameMemberDomain.getGame().getGameId()) + .status(gameMember.getStatus()) + .memberId(gameMember.getMember().getMemberId()) + .gameId(gameMember.getGame().getGameId()) .build(); } - public static GameMemberDomain mapGameMemberEntityToDomain(GameMemberEntity gameMemberEntity, MemberDomain memberDomain, GameDomain gameDomain) { - return GameMemberDomain.builder() + public static GameMember mapGameMemberEntityToDomain( + final GameMemberEntity gameMemberEntity, + final Member member, + final Game game + ) { + return GameMember.builder() .gameMemberId(gameMemberEntity.getId()) .status(gameMemberEntity.getStatus()) - .member(memberDomain) - .game(gameDomain) + .member(member) + .game(game) .build(); } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java index c4e59726..ae46e208 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java @@ -6,12 +6,12 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -24,7 +24,7 @@ public class GameMemberReader { private final MemberReader memberReader; private final GameReader gameReader; - public GameMemberDomain readGameMemberByMemberIdAndGameId(Long loggedInMemberId, Long gameId) { + public GameMember readGameMemberByMemberIdAndGameId(final Long loggedInMemberId, final Long gameId) { final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( loggedInMemberId, gameId, @@ -32,9 +32,9 @@ public GameMemberDomain readGameMemberByMemberIdAndGameId(Long loggedInMemberId, ) .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); - final MemberDomain memberDomain = memberReader.readByMemberId(gameMemberEntity.getMemberId()); - final GameDomain gameDomain = gameReader.read(gameMemberEntity.getGameId()); + final Member member = memberReader.readByMemberId(gameMemberEntity.getMemberId()); + final Game game = gameReader.read(gameMemberEntity.getGameId()); - return GameMemberMapper.mapGameMemberEntityToDomain(gameMemberEntity, memberDomain, gameDomain); + return GameMemberMapper.mapGameMemberEntityToDomain(gameMemberEntity, member, game); } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index 01cc0fd4..dbcf2d05 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -7,13 +7,13 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import lombok.RequiredArgsConstructor; @Component @@ -25,7 +25,7 @@ public class GameMemberWriter { private final GameRepository gameRepository; private final GameMemberReader gameMemberReader; - public GameMemberDomain register(final MemberDomain member, final GameDomain game) { + public GameMember register(final Member member, final Game game) { final Long memberId = member.getMemberId(); final Long gameId = game.getGameId(); @@ -33,37 +33,37 @@ public GameMemberDomain register(final MemberDomain member, final GameDomain gam throw new GameException(GAME_MEMBER_IS_EXISTED, gameId, memberId); } - final GameMemberDomain gameMemberDomain = GameMemberDomain.builder() + final GameMember gameMember = GameMember.builder() .status(WAITING) .member(member) .game(game) .build(); - final GameMemberEntity gameMemberEntity = GameMemberMapper.mapGameMemberDomainToEntity(gameMemberDomain); + final GameMemberEntity gameMemberEntity = GameMemberMapper.mapGameMemberDomainToEntity(gameMember); final GameMemberEntity savedGameMemberEntity = gameMemberRepository.save(gameMemberEntity); - gameMemberDomain.updateGameMemberId(savedGameMemberEntity.getId()); + gameMember.updateGameMemberId(savedGameMemberEntity.getId()); - return gameMemberDomain; + return gameMember; } - public void updateMemberRegistrationStatus(final GameMemberDomain gameMemberDomain, final RegistrationStatus status) { - gameMemberDomain.updateRegistrationStatus(status); - gameMemberRepository.updateRegistrationStatus(gameMemberDomain.getGameMemberId(), status); + public void updateMemberRegistrationStatus(final GameMember gameMember, final RegistrationStatus status) { + gameMember.updateRegistrationStatus(status); + gameMemberRepository.updateRegistrationStatus(gameMember.getGameMemberId(), status); - if (gameMemberDomain.isStatusChangedFromWaitingToConfirmed(status)) { - final GameDomain game = gameMemberDomain.getGame(); + if (gameMember.isStatusChangedFromWaitingToConfirmed(status)) { + final Game game = gameMember.getGame(); game.increaseMemberCount(); gameRepository.updateMemberCountAndStatus(game.getGameId(), game.getMemberCount(), game.getStatus()); } } - public void updateReviewDone(Long loggedInMemberId, Long gameId) { - GameMemberDomain gameMemberDomain = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + public void updateReviewDone(final Long memberId, final Long gameId) { + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); - gameMemberRepository.updateReviewDone(gameMemberDomain.getGameMemberId(), true); + gameMemberRepository.updateReviewDone(gameMember.getGameMemberId(), true); } - public void deleteGameMember(GameMemberDomain gameMemberDomain) { - gameMemberRepository.deleteByGameIdAndMemberId(gameMemberDomain.getGame().getGameId(), gameMemberDomain.getMember().getMemberId()); + public void deleteGameMember(final GameMember gameMember) { + gameMemberRepository.deleteById(gameMember.getGameMemberId()); } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 71007620..437b270b 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -1,5 +1,6 @@ package kr.pickple.back.game.implement; +import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; import java.util.List; @@ -13,10 +14,9 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; @@ -24,7 +24,7 @@ import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -34,33 +34,39 @@ @Transactional(readOnly = true) public class GameReader { - private final MemberReader memberReader; private final AddressReader addressReader; + private final MemberReader memberReader; private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; private final GamePositionRepository gamePositionRepository; - private final ChatRoomRepository chatRoomRepository; - public GameDomain read(final Long gameId) { - final GameEntity gameEntity = readGameEntity(gameId); + public Game read(final Long gameId) { + final GameEntity gameEntity = gameRepository.findById(gameId) + .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + gameEntity.increaseViewCount(); - final MemberDomain host = memberReader.readByMemberId(gameEntity.getHostId()); + return mapGameEntityToDomain(gameEntity); + } + + public Game readByChatRoomId(final Long chatRoomId) { + final GameEntity gameEntity = gameRepository.findByChatRoomId(chatRoomId) + .orElseThrow(() -> new ChatException(CHAT_GAME_NOT_FOUND, chatRoomId)); - final List positions = readPositionsByGameId(gameId); + return mapGameEntityToDomain(gameEntity); + } + + private Game mapGameEntityToDomain(final GameEntity gameEntity) { + final Member host = memberReader.readByMemberId(gameEntity.getHostId()); + + final List positions = readPositionsByGameId(gameEntity.getId()); final MainAddress mainAddress = addressReader.readMainAddressById( gameEntity.getAddressDepth1Id(), gameEntity.getAddressDepth2Id() ); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); - return GameMapper.mapGameEntityToDomain(gameEntity, mainAddress, host, chatRoom, positions); - } - - private GameEntity readGameEntity(final Long gameId) { - return gameRepository.findById(gameId) - .orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); + return GameMapper.mapGameEntityToDomain(gameEntity, mainAddress, host, positions); } private List readPositionsByGameId(final Long gameId) { @@ -70,15 +76,14 @@ private List readPositionsByGameId(final Long gameId) { .toList(); } - public List readAllMembersByGameIdAndStatus(final Long gameId, final RegistrationStatus status) { + public List readAllMembersByGameIdAndStatus(final Long gameId, final RegistrationStatus status) { return gameMemberRepository.findAllByGameIdAndStatus(gameId, status) .stream() .map(gameMemberEntity -> memberReader.readByMemberId(gameMemberEntity.getMemberId())) .toList(); } - public List findGamesByAddress(final String address, final Pageable pageable) { - + public List findGamesByAddress(final String address, final Pageable pageable) { final PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), pageable.getPageSize(), @@ -103,12 +108,11 @@ public List findGamesByAddress(final String address, final Pageable gameEntity, mainAddress, memberReader.readByMemberId(gameEntity.getHostId()), - chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), readPositionsByGameId(gameEntity.getId()))) .toList(); } - public List findGamesWithInAddress(MainAddress mainAddress) { + public List findGamesWithInAddress(final MainAddress mainAddress) { final List gameEntities = gameRepository.findGamesWithInAddress( mainAddress.getAddressDepth1(), mainAddress.getAddressDepth2() @@ -119,12 +123,15 @@ public List findGamesWithInAddress(MainAddress mainAddress) { gameEntity, mainAddress, memberReader.readByMemberId(gameEntity.getHostId()), - chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), readPositionsByGameId(gameEntity.getId()))) .toList(); } - public List findGamesWithInDistance(Double latitude, Double longitude, Double distance) { + public List findGamesWithInDistance( + final Double latitude, + final Double longitude, + final Double distance + ) { final List gameEntities = gameRepository.findGamesWithInDistance(latitude, longitude, distance); return gameEntities.stream() @@ -135,7 +142,6 @@ public List findGamesWithInDistance(Double latitude, Double longitud gameEntity.getAddressDepth2Id() ), memberReader.readByMemberId(gameEntity.getHostId()), - chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()), readPositionsByGameId(gameEntity.getId()))) .toList(); } diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 41cd3c64..9a31233d 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -12,7 +12,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; -import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.dto.request.MannerScoreReview; @@ -21,8 +21,7 @@ import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.MemberRepository; import kr.pickple.back.position.domain.Position; @@ -41,7 +40,7 @@ public class GameWriter { private final MemberReader memberReader; private final MemberRepository memberRepository; - public GameDomain create(final NewGame newGame) { + public Game create(final NewGame newGame) { final Point point = kakaoAddressSearchClient.fetchAddress(newGame.getMainAddress()); final MainAddress mainAddress = addressReader.readMainAddressByNames( @@ -58,7 +57,6 @@ public GameDomain create(final NewGame newGame) { savedGameEntity, mainAddress, newGame.getHost(), - newGame.getChatRoom(), newGame.getPositions() ); } @@ -66,13 +64,11 @@ public GameDomain create(final NewGame newGame) { private void setPositionsToGame(final List positions, final Long gameId) { validateIsDuplicatedPositions(positions); - final List gamePositions = GameMapper.mapToGamePositionEntities(positions, gameId); - - gamePositionRepository.saveAll(gamePositions); + gamePositionRepository.saveAll(GameMapper.mapToGamePositionEntities(positions, gameId)); } private void validateIsDuplicatedPositions(final List positions) { - final Long distinctPositionsSize = positions.stream() + final long distinctPositionsSize = positions.stream() .distinct() .count(); @@ -85,36 +81,38 @@ public void updateMemberRegistrationStatus(final GameStatus status, final Long g gameRepository.updateRegistrationStatus(status, gameId); } - public void reviewMannerScores(Long loggedInMemberId, Long gameId, List mannerScoreReviews) { - final MemberDomain memberDomain = memberReader.readByMemberId(loggedInMemberId); + public void reviewMannerScores( + final Long memberId, + final Long gameId, + final List mannerScoreReviews + ) { + final Member member = memberReader.readByMemberId(memberId); mannerScoreReviews.forEach(review -> { - final MemberDomain reviewedMember = getReviewedMember(gameId, review.getMemberId()); - validateIsSelfReview(memberDomain, reviewedMember); + final Member reviewedMember = getReviewedMember(gameId, review.getMemberId()); + + if (member.equals(reviewedMember)) { + throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, memberId, reviewedMember.getMemberId()); + } + reviewedMember.updateMannerScore(review.getMannerScore()); memberRepository.updateMannerScore(reviewedMember.getMannerScore(), reviewedMember.getMemberId()); }); } - private MemberDomain getReviewedMember(final Long gameId, final Long reviewedMemberId) { + private Member getReviewedMember(final Long gameId, final Long reviewedMemberId) { return getConfirmedMembers(gameId) .stream() - .filter(confirmedMember -> confirmedMember.getMemberId() == reviewedMemberId) + .filter(confirmedMember -> confirmedMember.isIdMatched(reviewedMemberId)) .findFirst() .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, reviewedMemberId)); } - private List getConfirmedMembers(Long gameId) { + private List getConfirmedMembers(final Long gameId) { return gameMemberRepository.findAllByGameIdAndStatus(gameId, CONFIRMED) .stream() .map(gameMember -> memberReader.readByMemberId(gameMember.getMemberId())) .toList(); } - - private void validateIsSelfReview(final MemberDomain loggedInMember, final MemberDomain reviewedMember) { - if (loggedInMember.getMemberId().equals(reviewedMember.getMemberId())) { - throw new GameException(GAME_MEMBER_CANNOT_REVIEW_SELF, loggedInMember.getMemberId(), reviewedMember.getMemberId()); - } - } } diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 8428ac0b..2666cf26 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -32,6 +32,4 @@ Optional findByMemberIdAndGameIdAndStatus( @Query("update GameMemberEntity gm set gm.isReview = :isReview where gm.id = :gameMemberId") void updateReviewDone(Long gameMemberId, Boolean isReview); - - void deleteByGameIdAndMemberId(Long gameId, Long memberId); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index 9aabc409..e907bada 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -33,4 +33,7 @@ default GameEntity getGameById(final Long gameId) { @Query("update GameEntity g set g.status = :status where g.id = :gameId") void updateRegistrationStatus(final GameStatus status, final Long gameId); + + @Query("select g.chatRoomId from GameEntity g where g.id = :gameId") + Long findChatRoomId(final Long gameId); } diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index d19bc2a3..0953d643 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -8,7 +8,7 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.game.domain.GameDomain; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.dto.mapper.GameResponseMapper; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; @@ -25,11 +25,15 @@ public class GameFacadeService { private final MapService mapService; private final GameReader gameReader; + /** + * 특정 지역의 게스트 모집글 조회 + */ public GamesAndLocationResponse findGamesWithInAddress(final String addressDepth1, final String addressDepth2) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); - final List gameDomains = gameReader.findGamesWithInAddress(mainAddress); - final List gameResponses = gameDomains.stream() + final List games = gameReader.findGamesWithInAddress(mainAddress); + + final List gameResponses = games.stream() .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( gameDomain, gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index f519c269..10b6b21a 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -9,18 +9,13 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.common.util.DateTimeUtil; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameMemberWriter; -import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.game.implement.GameWriter; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -30,13 +25,8 @@ public class GameReviewMannerScoresService { private static final int REVIEW_POSSIBLE_DAYS = 7; - private final GameMemberRepository gameMemberRepository; - private final GameRepository gameRepository; - private final MemberRepository memberRepository; - private final GameMemberReader gameMemberReader; - private final GameReader gameReader; - private final MemberReader memberReader; private final GameWriter gameWriter; + private final GameMemberReader gameMemberReader; private final GameMemberWriter gameMemberWriter; @Transactional @@ -45,35 +35,37 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMemberDomain gameMemberDomain = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); - if (gameMemberDomain.isAlreadyReviewDone()) { + if (gameMember.isAlreadyReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } - // -- + final Game game = gameMember.getGame(); + final LocalDateTime gamePlayEndDateTime = game.getPlayEndDatetime(); - final GameDomain gameDomain = gameReader.read(gameId); - if (isNotReviewPeriod(gameDomain)) { - throw new GameException(GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, gameDomain.getPlayDate(), - gameDomain.getPlayEndTime()); + if (isNotReviewPeriod(gamePlayEndDateTime)) { + throw new GameException( + GAME_MEMBERS_CAN_REVIEW_DURING_POSSIBLE_PERIOD, + game.getPlayDate(), + game.getPlayEndTime() + ); } - // -- gameWriter.reviewMannerScores(loggedInMemberId, gameId, mannerScoreReviews); gameMemberWriter.updateReviewDone(loggedInMemberId, gameId); } - private Boolean isNotReviewPeriod(final GameDomain gameDomain) { - return isBeforeThanPlayEndTime(gameDomain) || isAfterReviewPossibleTime(gameDomain); + private Boolean isNotReviewPeriod(final LocalDateTime gamePlayEndDateTime) { + return isBeforeThanPlayEndTime(gamePlayEndDateTime) || isAfterReviewPossibleTime(gamePlayEndDateTime); } - private Boolean isBeforeThanPlayEndTime(final GameDomain gameDomain) { - return DateTimeUtil.isAfterThanNow(gameDomain.getPlayEndDatetime()); + private Boolean isBeforeThanPlayEndTime(final LocalDateTime gamePlayEndDateTime) { + return DateTimeUtil.isAfterThanNow(gamePlayEndDateTime); } - private Boolean isAfterReviewPossibleTime(final GameDomain gameDomain) { - final LocalDateTime reviewDeadlineDatetime = gameDomain.getPlayEndDatetime().plusDays(REVIEW_POSSIBLE_DAYS); + private Boolean isAfterReviewPossibleTime(final LocalDateTime gamePlayEndDateTime) { + final LocalDateTime reviewDeadlineDatetime = gamePlayEndDateTime.plusDays(REVIEW_POSSIBLE_DAYS); return DateTimeUtil.isEqualOrAfter(reviewDeadlineDatetime, LocalDateTime.now()); } diff --git a/src/main/java/kr/pickple/back/member/domain/Member.java b/src/main/java/kr/pickple/back/member/domain/Member.java index e5478b28..b5684aa9 100644 --- a/src/main/java/kr/pickple/back/member/domain/Member.java +++ b/src/main/java/kr/pickple/back/member/domain/Member.java @@ -2,105 +2,37 @@ import static kr.pickple.back.member.exception.MemberExceptionCode.*; -import java.text.MessageFormat; import java.util.List; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -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.validation.constraints.NotNull; -import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.util.MemberStatusConverter; +import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.NoArgsConstructor; -@Entity @Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@EqualsAndHashCode(of = "id", callSuper = false) -public class Member extends BaseEntity { +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@EqualsAndHashCode(of = "memberId") +public class Member { public static final List MANNER_SCORE_POINT_RANGE = List.of(-1, 0, 1); - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Column(unique = true, length = 100) + private Long memberId; private String email; - - @NotNull - @Column(unique = true, length = 20) private String nickname; - - @Column(length = 1000) private String introduction; - - @NotNull - @Column(length = 300) private String profileImageUrl; - - @NotNull - @Convert(converter = MemberStatusConverter.class) - @Column(length = 10) - private MemberStatus status; - - @NotNull - private Integer mannerScore = 0; - - @NotNull - private Integer mannerScoreCount = 0; - - @NotNull - @Column(unique = true) - private Long oauthId; - - @NotNull - @Enumerated(value = EnumType.STRING) - private OauthProvider oauthProvider; - - @NotNull - private Long addressDepth1Id; - - @NotNull - private Long addressDepth2Id; - - @Builder - private Member( - final String email, - final String nickname, - final String profileImageUrl, - final MemberStatus status, - final Long oauthId, - final OauthProvider oauthProvider, - final Long addressDepth1Id, - final Long addressDepth2Id - ) { - this.email = email; - this.nickname = nickname; - this.profileImageUrl = profileImageUrl; - this.status = status; - this.oauthId = oauthId; - this.oauthProvider = oauthProvider; - this.addressDepth1Id = addressDepth1Id; - this.addressDepth2Id = addressDepth2Id; - - setDefaultIntroduction(nickname); - } - - private void setDefaultIntroduction(final String nickname) { - this.introduction = MessageFormat.format("안녕하세요. {0}입니다.", nickname); + private Integer mannerScore; + private Integer mannerScoreCount; + private String addressDepth1Name; + private String addressDepth2Name; + private List positions; + + public Boolean isIdMatched(final Long memberId) { + return this.memberId.equals(memberId); } public void updateMannerScore(final Integer mannerScorePoint) { diff --git a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java b/src/main/java/kr/pickple/back/member/domain/MemberDomain.java deleted file mode 100644 index 06ed00b8..00000000 --- a/src/main/java/kr/pickple/back/member/domain/MemberDomain.java +++ /dev/null @@ -1,48 +0,0 @@ -package kr.pickple.back.member.domain; - -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.util.List; - -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.position.domain.Position; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; - -@Getter -@Builder -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@EqualsAndHashCode(of = "memberId") -public class MemberDomain { - - public static final List MANNER_SCORE_POINT_RANGE = List.of(-1, 0, 1); - - private Long memberId; - private String email; - private String nickname; - private String introduction; - private String profileImageUrl; - private Integer mannerScore; - private Integer mannerScoreCount; - private String addressDepth1Name; - private String addressDepth2Name; - private List positions; - - public Boolean isIdMatched(final Long memberId) { - return this.memberId.equals(memberId); - } - - public void updateMannerScore(final Integer mannerScorePoint) { - if (MANNER_SCORE_POINT_RANGE.contains(mannerScorePoint)) { - this.mannerScore += mannerScorePoint; - this.mannerScoreCount += 1; - - return; - } - - throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); - } -} diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index e0a55740..df5a44ce 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -4,7 +4,7 @@ import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; @@ -52,7 +52,7 @@ public static MemberProfileResponse mapToMemberProfileResponseDto(final MemberPr .build(); } - public static MemberResponse mapToMemberResponseDto(final MemberDomain member) { + public static MemberResponse mapToMemberResponseDto(final Member member) { return MemberResponse.builder() .id(member.getMemberId()) .email(member.getEmail()) @@ -67,7 +67,7 @@ public static MemberResponse mapToMemberResponseDto(final MemberDomain member) { .build(); } - public static List mapToMemberResponseDtos(final List members) { + public static List mapToMemberResponseDtos(final List members) { return members.stream() .map(MemberResponseMapper::mapToMemberResponseDto) .toList(); diff --git a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java index 51073322..2b946535 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java @@ -4,7 +4,7 @@ import kr.pickple.back.auth.domain.oauth.OauthMember; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import lombok.Builder; import lombok.Getter; @@ -48,7 +48,7 @@ private AuthenticatedMemberResponse( } public static AuthenticatedMemberResponse of( - final Member member, + final MemberEntity member, final AuthTokens authTokens, final MainAddress mainAddress ) { diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index bdf2f5c5..49198e57 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -3,7 +3,7 @@ import java.util.List; import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -28,7 +28,7 @@ public class MemberResponse { //TODO: member -> memberDomain 으로 변환 완료되면 삭제 예정 (김영주) public static MemberResponse of( - final Member member, + final MemberEntity member, final List positions, final MainAddress mainAddress ) { diff --git a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java index fe0a6cdc..202a52eb 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java @@ -4,9 +4,9 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.crew.domain.Crew; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.domain.NewMember; @@ -17,8 +17,8 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MemberMapper { - public static Member mapToMemberEntity(final NewMember newMember, final MainAddress mainAddress) { - return Member.builder() + public static MemberEntity mapToMemberEntity(final NewMember newMember, final MainAddress mainAddress) { + return MemberEntity.builder() .email(newMember.getEmail()) .nickname(newMember.getNickname()) .profileImageUrl(newMember.getProfileImageUrl()) @@ -30,12 +30,12 @@ public static Member mapToMemberEntity(final NewMember newMember, final MainAddr .build(); } - public static List mapToMemberPositionEntities( + public static List mapToMemberPositionEntities( final List positions, final Long memberId ) { return positions.stream() - .map(position -> MemberPosition.builder() + .map(position -> MemberPositionEntity.builder() .memberId(memberId) .position(position) .build() @@ -43,7 +43,7 @@ public static List mapToMemberPositionEntities( } public static MemberProfile mapToMemberProfileDomain( - final Member member, + final MemberEntity member, final MainAddress mainAddress, final List positions, final List crews @@ -63,12 +63,12 @@ public static MemberProfile mapToMemberProfileDomain( .build(); } - public static MemberDomain mapToMemberDomain( - final Member memberEntity, + public static Member mapToMemberDomain( + final MemberEntity memberEntity, final MainAddress mainAddress, final List positions ) { - return MemberDomain.builder() + return Member.builder() .memberId(memberEntity.getId()) .email(memberEntity.getEmail()) .nickname(memberEntity.getNickname()) diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index b5d14562..16a5cab3 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -12,8 +12,6 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewMapper; @@ -22,12 +20,12 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberDomain; -import kr.pickple.back.member.domain.MemberPosition; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -37,18 +35,21 @@ public class MemberReader { private final AddressReader addressReader; - private final CrewRepository crewRepository; - private final CrewMemberRepository crewMemberRepository; private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; - private final ChatRoomRepository chatRoomRepository; + private final CrewRepository crewRepository; + private final CrewMemberRepository crewMemberRepository; public Boolean existsByMemberId(final Long memberId) { return memberRepository.existsById(memberId); } - public MemberDomain readByMemberId(final Long memberId) { - final Member memberEntity = readEntityByMemberId(memberId); + public Optional readByOauthId(final Long oauthId) { + return memberRepository.findByOauthId(oauthId); + } + + public Member readByMemberId(final Long memberId) { + final MemberEntity memberEntity = readEntityByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( memberEntity.getAddressDepth1Id(), @@ -57,14 +58,14 @@ public MemberDomain readByMemberId(final Long memberId) { final List positions = memberPositionRepository.findAllByMemberId(memberId) .stream() - .map(MemberPosition::getPosition) + .map(MemberPositionEntity::getPosition) .toList(); return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); } public MemberProfile readProfileByMemberId(final Long memberId) { - final Member member = readEntityByMemberId(memberId); + final MemberEntity member = readEntityByMemberId(memberId); final MainAddress mainAddress = addressReader.readMainAddressById( member.getAddressDepth1Id(), member.getAddressDepth2Id() @@ -76,6 +77,18 @@ public MemberProfile readProfileByMemberId(final Long memberId) { return MemberMapper.mapToMemberProfileDomain(member, mainAddress, positions, crews); } + private MemberEntity readEntityByMemberId(final Long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); + } + + private List readPositionsByMemberId(final Long memberId) { + return memberPositionRepository.findAllByMemberId(memberId) + .stream() + .map(MemberPositionEntity::getPosition) + .toList(); + } + private List readCrewsByMemberId(final Long memberId) { return crewMemberRepository.findAllByMemberIdAndStatus(memberId, CONFIRMED) .stream() @@ -85,48 +98,15 @@ private List readCrewsByMemberId(final Long memberId) { crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() ); - final MemberDomain leader = readMemberById(crewEntity.getLeaderId()); - final ChatRoom chatRoom = chatRoomRepository.getChatRoomById(crewEntity.getChatRoomId()); + final Member leader = readByMemberId(crewEntity.getLeaderId()); - return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader, chatRoom); + return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader); }) .toList(); } - private MemberDomain readMemberById(final Long memberId) { - final Member memberEntity = readEntityByMemberId(memberId); - - final MainAddress mainAddress = addressReader.readMainAddressById( - memberEntity.getAddressDepth1Id(), - memberEntity.getAddressDepth2Id() - ); - - final List positions = memberPositionRepository.findAllByMemberId(memberId) - .stream() - .map(MemberPosition::getPosition) - .toList(); - - return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); - } - private CrewEntity readCrewEntityByCrewId(final CrewMemberEntity crewMember) { return crewRepository.findById(crewMember.getCrewId()) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewMember.getCrewId())); } - - private List readPositionsByMemberId(final Long memberId) { - return memberPositionRepository.findAllByMemberId(memberId) - .stream() - .map(MemberPosition::getPosition) - .toList(); - } - - public Optional readByOauthId(final Long oauthId) { - return memberRepository.findByOauthId(oauthId); - } - - private Member readEntityByMemberId(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java index 6ef38dc4..c9252d47 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -10,8 +10,8 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.implement.TokenManager; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberPositionRepository; @@ -37,8 +37,8 @@ public NewMember create(final NewMember newMember) { newMember.getAddressDepth2Name() ); - final Member memberEntity = MemberMapper.mapToMemberEntity(newMember, mainAddress); - final Member savedMemberEntity = memberRepository.save(memberEntity); + final MemberEntity memberEntity = MemberMapper.mapToMemberEntity(newMember, mainAddress); + final MemberEntity savedMemberEntity = memberRepository.save(memberEntity); newMember.updateMemberId(savedMemberEntity.getId()); setPositionsToMember(newMember.getPositions(), newMember.getMemberId()); @@ -46,14 +46,6 @@ public NewMember create(final NewMember newMember) { return newMember; } - private void setPositionsToMember(final List positions, final Long memberId) { - validateIsDuplicatedPositions(positions); - - final List memberPositions = MemberMapper.mapToMemberPositionEntities(positions, memberId); - - memberPositionRepository.saveAll(memberPositions); - } - private void validateIsDuplicatedMemberInfo(final NewMember newMember) { final String email = newMember.getEmail(); final String nickname = newMember.getNickname(); @@ -64,6 +56,14 @@ private void validateIsDuplicatedMemberInfo(final NewMember newMember) { } } + private void setPositionsToMember(final List positions, final Long memberId) { + validateIsDuplicatedPositions(positions); + + final List memberPositions = MemberMapper.mapToMemberPositionEntities(positions, memberId); + + memberPositionRepository.saveAll(memberPositions); + } + private void validateIsDuplicatedPositions(final List positions) { final Long distinctPositionsSize = positions.stream() .distinct() diff --git a/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java index bf013976..14eaf8cc 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberPositionRepository.java @@ -4,9 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; -public interface MemberPositionRepository extends JpaRepository { +public interface MemberPositionRepository extends JpaRepository { - List findAllByMemberId(final Long memberId); + List findAllByMemberId(final Long memberId); } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index 15e2b5f1..991b71d0 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -4,13 +4,13 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; -public interface MemberRepository extends JpaRepository { +public interface MemberRepository extends JpaRepository { Boolean existsByEmailOrNicknameOrOauthId(final String email, final String nickname, final Long oauthId); - Optional findByOauthId(final Long oauthId); + Optional findByOauthId(final Long oauthId); void updateMannerScore(Integer mannerScore, Long memberId); } diff --git a/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java new file mode 100644 index 00000000..dc6d6128 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java @@ -0,0 +1,117 @@ +package kr.pickple.back.member.repository.entity; + +import static kr.pickple.back.member.exception.MemberExceptionCode.*; + +import java.text.MessageFormat; +import java.util.List; + +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +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.validation.constraints.NotNull; +import kr.pickple.back.auth.domain.oauth.OauthProvider; +import kr.pickple.back.common.domain.BaseEntity; +import kr.pickple.back.member.domain.MemberStatus; +import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.util.MemberStatusConverter; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@EqualsAndHashCode(of = "id", callSuper = false) +public class MemberEntity extends BaseEntity { + + public static final List MANNER_SCORE_POINT_RANGE = List.of(-1, 0, 1); + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(unique = true, length = 100) + private String email; + + @NotNull + @Column(unique = true, length = 20) + private String nickname; + + @Column(length = 1000) + private String introduction; + + @NotNull + @Column(length = 300) + private String profileImageUrl; + + @NotNull + @Convert(converter = MemberStatusConverter.class) + @Column(length = 10) + private MemberStatus status; + + @NotNull + private Integer mannerScore = 0; + + @NotNull + private Integer mannerScoreCount = 0; + + @NotNull + @Column(unique = true) + private Long oauthId; + + @NotNull + @Enumerated(value = EnumType.STRING) + private OauthProvider oauthProvider; + + @NotNull + private Long addressDepth1Id; + + @NotNull + private Long addressDepth2Id; + + @Builder + private MemberEntity( + final String email, + final String nickname, + final String profileImageUrl, + final MemberStatus status, + final Long oauthId, + final OauthProvider oauthProvider, + final Long addressDepth1Id, + final Long addressDepth2Id + ) { + this.email = email; + this.nickname = nickname; + this.profileImageUrl = profileImageUrl; + this.status = status; + this.oauthId = oauthId; + this.oauthProvider = oauthProvider; + this.addressDepth1Id = addressDepth1Id; + this.addressDepth2Id = addressDepth2Id; + + setDefaultIntroduction(nickname); + } + + private void setDefaultIntroduction(final String nickname) { + this.introduction = MessageFormat.format("안녕하세요. {0}입니다.", nickname); + } + + public void updateMannerScore(final Integer mannerScorePoint) { + if (MANNER_SCORE_POINT_RANGE.contains(mannerScorePoint)) { + this.mannerScore += mannerScorePoint; + this.mannerScoreCount += 1; + + return; + } + + throw new MemberException(MEMBER_UPDATING_MANNER_SCORE_POINT_OUT_OF_RANGE, mannerScorePoint); + } +} diff --git a/src/main/java/kr/pickple/back/member/domain/MemberPosition.java b/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java similarity index 83% rename from src/main/java/kr/pickple/back/member/domain/MemberPosition.java rename to src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java index 5451e858..c5684ebe 100644 --- a/src/main/java/kr/pickple/back/member/domain/MemberPosition.java +++ b/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java @@ -1,4 +1,4 @@ -package kr.pickple.back.member.domain; +package kr.pickple.back.member.repository.entity; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -18,7 +18,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class MemberPosition extends BaseEntity { +public class MemberPositionEntity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -33,7 +33,7 @@ public class MemberPosition extends BaseEntity { private Long memberId; @Builder - private MemberPosition(final Position position, final Long memberId) { + private MemberPositionEntity(final Position position, final Long memberId) { this.position = position; this.memberId = memberId; } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java index 613f2544..be157def 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java @@ -11,7 +11,7 @@ import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -31,9 +31,9 @@ public List findAllCrewsByMemberId( final Long memberId, final RegistrationStatus memberStatus ) { - final MemberDomain memberDomain = memberReader.readByMemberId(memberId); + final Member member = memberReader.readByMemberId(memberId); final List crewProfiles = crewReader.readAllCrewProfilesByMemberIdAndStatus( - memberDomain.getMemberId(), + member.getMemberId(), memberStatus ); @@ -44,8 +44,8 @@ public List findAllCrewsByMemberId( * 사용자가 만든 크루 목록 조회 */ public List findCreatedCrewsByMemberId(final Long memberId) { - final MemberDomain memberDomain = memberReader.readByMemberId(memberId); - final List crewProfiles = crewReader.readAllCrewProfilesByLeaderId(memberDomain.getMemberId()); + final Member member = memberReader.readByMemberId(memberId); + final List crewProfiles = crewReader.readAllCrewProfilesByLeaderId(member.getMemberId()); return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index f78886da..e22d1f8c 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -14,8 +14,8 @@ import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberResponse; @@ -41,7 +41,7 @@ public List findAllMemberGames( final Long memberId, final RegistrationStatus memberStatus ) { - final Member member = memberReader.readEntityByMemberId(memberId); + final MemberEntity member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), memberStatus); @@ -52,7 +52,7 @@ public List findAllMemberGames( * 사용자가 만든 게스트 모집글 목록 조회 */ public List findAllCreatedGames(final Long memberId) { - final Member member = memberReader.readEntityByMemberId(memberId); + final MemberEntity member = memberReader.readEntityByMemberId(memberId); final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); return convertToMemberGameResponses(memberGames, CONFIRMED); @@ -65,7 +65,7 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( final Long memberId, final Long gameId ) { - final Member member = memberReader.readEntityByMemberId(memberId); + final MemberEntity member = memberReader.readEntityByMemberId(memberId); final GameEntity gameEntity = gameRepository.getGameById(gameId); final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(member.getId(), gameEntity.getId()) @@ -81,7 +81,7 @@ private List convertToMemberGameResponses( return memberGames.stream() .map(memberGame -> { GameEntity gameEntity = gameRepository.getGameById(memberGame.getGameId()); - Member member = memberRepository.getMemberById(memberGame.getMemberId()); + MemberEntity member = memberRepository.getMemberById(memberGame.getMemberId()); return MemberGameResponse.of( memberGame, @@ -110,8 +110,8 @@ private List getMemberResponsesByGame(final GameEntity gameEntit .toList(); } - private List getPositionsByMember(final Member member) { - final List memberPositions = memberPositionReader.readAll(member.getId()); + private List getPositionsByMember(final MemberEntity member) { + final List memberPositions = memberPositionReader.readAll(member.getId()); return Position.fromMemberPositions(memberPositions); } diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index b18eb7d3..6f15e34e 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -13,7 +13,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.domain.MemberPosition; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.exception.PositionException; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -49,9 +49,9 @@ public static Position fromGamePositions(final String positionAcronym) { throw new PositionException(POSITION_NOT_FOUND, positionAcronym); } - public static List fromMemberPositions(final List memberPositions) { + public static List fromMemberPositions(final List memberPositions) { return memberPositions.stream() - .map(MemberPosition::getPosition) + .map(MemberPositionEntity::getPosition) .toList(); } diff --git a/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java index 903f366b..d94b6c19 100644 --- a/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java +++ b/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java @@ -1,7 +1,7 @@ package kr.pickple.back.alarm.controller; import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -22,7 +22,7 @@ public class AlarmControllerTest extends IntegrationAlarmTest { @DisplayName("사용자는 재접속 시 읽지 않은 알람이 있는지 알 수 있다.") void findUnreadAlarm_Success() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); @@ -40,7 +40,7 @@ void findUnreadAlarm_Success() throws Exception { @DisplayName("사용자는 해당 사용자에게 온 모든 알람 목록을 조회할 수 있다.") void findAllAlarms_Success() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); @@ -60,7 +60,7 @@ void findAllAlarms_Success() throws Exception { @DisplayName("사용자는 해당 사용자에게 온 모든 알람을 모두 삭제할 수 있다.") void deleteAllAlarms_Success() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); diff --git a/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java index 693c09e3..89eecb08 100644 --- a/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java +++ b/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java @@ -7,7 +7,7 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.domain.CrewAlarmFixtures; import kr.pickple.back.fixture.setup.CrewSetup; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -35,7 +35,7 @@ public class CrewEntityAlarmControllerTest extends IntegrationAlarmTest { @DisplayName("사용자는 보내진 크루 알람에 대하여 읽음 처리를 할 수 있다.") void updateCrewAlarmStatus_Success() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); diff --git a/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java index 05dde609..c71753f2 100644 --- a/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java +++ b/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java @@ -7,7 +7,7 @@ import kr.pickple.back.fixture.domain.GameAlarmFixtures; import kr.pickple.back.fixture.setup.GameSetup; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,7 +36,7 @@ public class GameEntityAlarmControllerTest extends IntegrationAlarmTest { @DisplayName("사용자는 보내진 게임 알람에 대하여 읽음 처리를 할 수 있다.") void updateGameAlarmStatus_Success() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); diff --git a/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java index 52c0ba0a..cd2a14b0 100644 --- a/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java +++ b/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java @@ -2,7 +2,8 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; @@ -28,7 +29,7 @@ public class AlarmDocumentTest extends IntegrationAlarmTest { @DisplayName("사용자의 재접속 시 읽지 않은 알람이 있는지 확인") void findUnreadAlarm_ReturnAlarmExistStatusResponse() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); @@ -66,7 +67,7 @@ void findUnreadAlarm_ReturnAlarmExistStatusResponse() throws Exception { @DisplayName("해당 사용자에게 온 모든 알람 목록을 조회") void findAllAlarms_ReturnAlarmResponse() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); @@ -113,7 +114,7 @@ void findAllAlarms_ReturnAlarmResponse() throws Exception { @DisplayName("해당 사용자에게 온 모든 알람을 모두 삭제") void deleteAllAlarms_ReturnVoid() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); diff --git a/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java index f0cac0bb..6f80e864 100644 --- a/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java +++ b/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java @@ -8,7 +8,8 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.domain.CrewAlarmFixtures; import kr.pickple.back.fixture.setup.CrewSetup; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +43,7 @@ public class CrewEntityAlarmDocumentTest extends IntegrationAlarmTest { @DisplayName("사용자의 크루 알람에 대하여 읽음 여부 수정") void updateCrewAlarmStatus_ReturnVoid() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); diff --git a/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java index 1f06ca1f..e41aed11 100644 --- a/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java +++ b/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java @@ -9,7 +9,7 @@ import kr.pickple.back.fixture.domain.GameAlarmFixtures; import kr.pickple.back.fixture.setup.GameSetup; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -42,7 +42,7 @@ public class GameEntityAlarmDocumentTest extends IntegrationAlarmTest { @DisplayName("사용자의 게임 알람에 대하여 읽음 여부 수정") void updateGameAlarmStatus_ReturnVoid() throws Exception { //given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); diff --git a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java index 8fafd11a..f921b831 100644 --- a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java +++ b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java @@ -31,7 +31,7 @@ import kr.pickple.back.fixture.domain.AddressFixtures; import kr.pickple.back.fixture.domain.AuthFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.repository.MemberRepository; @@ -88,7 +88,7 @@ void oauthLogin_ReturnAuthenticated() { final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); final AddressDepth1 addressDepth1 = AddressFixtures.addressDepth1Build(); final AddressDepth2 addressDepth2 = AddressFixtures.addressDepth2Build(); - final Member member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); final AuthTokens loginTokens = AuthFixtures.authTokensBuild(); final Long refreshTokenExpirationTime = 10000L; @@ -125,7 +125,7 @@ void oauthLogin_ReturnRegistration() { // given final String authCode = "authCode"; final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); - final Member member = null; + final MemberEntity member = null; final AuthTokens registerToken = AuthFixtures.authTokensBuild(); given(memberRepository.findByOauthId(anyLong())).willReturn(Optional.ofNullable(member)); diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java index 27e4622a..43ebdc55 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java @@ -25,7 +25,7 @@ import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.fixture.dto.ChatDtoFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional class ChatMessageEntityDocumentTest extends IntegrationChatTest { @@ -36,9 +36,9 @@ class ChatMessageEntityDocumentTest extends IntegrationChatTest { @DisplayName("특정 채팅방의 모든 메시지 목록 조회") void findAllMessagesInRoom_ReturnChatMessageResponses() throws Exception { // given - final List members = memberSetup.save(2); - final Member sender = members.get(0); - final Member receiver = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java index 01ae1c29..890f4210 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java @@ -27,7 +27,7 @@ import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; import kr.pickple.back.fixture.dto.ChatDtoFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional class ChatRoomEntityDocumentTest extends IntegrationChatTest { @@ -38,9 +38,9 @@ class ChatRoomEntityDocumentTest extends IntegrationChatTest { @DisplayName("새 1:1 채팅방 생성") void createPersonalRoom_ReturnChatRoomDetailResponse() throws Exception { // given - final List members = memberSetup.save(2); - final Member sender = members.get(0); - final Member receiver = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); @@ -117,9 +117,9 @@ void createPersonalRoom_ReturnChatRoomDetailResponse() throws Exception { @DisplayName("특정 사용자와의 1:1 채팅방 존재 여부 조회") void findActivePersonalChatRoomWithReceiver_ReturnPersonalChatRoomExistedResponse() throws Exception { // given - final List members = memberSetup.save(2); - final Member sender = members.get(0); - final Member receiver = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); @@ -168,10 +168,10 @@ void findActivePersonalChatRoomWithReceiver_ReturnPersonalChatRoomExistedRespons @DisplayName("채팅방 타입에 따른 참여중인 모든 채팅방 목록 조회") void findAllActiveChatRoomsByType_ReturnChatRoomResponses() throws Exception { // given - final List members = memberSetup.save(3); - final Member sender = members.get(0); - final Member receiver1 = members.get(1); - final Member receiver2 = members.get(2); + final List members = memberSetup.save(3); + final MemberEntity sender = members.get(0); + final MemberEntity receiver1 = members.get(1); + final MemberEntity receiver2 = members.get(2); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest1 = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver1.getId()); @@ -241,9 +241,9 @@ void findAllActiveChatRoomsByType_ReturnChatRoomResponses() throws Exception { @DisplayName("단일 채팅방 정보 상세 조회") void findChatRoomById_ReturnChatRoomDetailResponse() throws Exception { // given - final List members = memberSetup.save(2); - final Member sender = members.get(0); - final Member receiver = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); diff --git a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java index a2c38279..5c7fc729 100644 --- a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java @@ -9,7 +9,8 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.fixture.dto.CrewDtoFixtures; import kr.pickple.back.fixture.setup.AddressSetup; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -41,8 +42,8 @@ public class CrewEntityControllerTest extends IntegrationCrewTest { void findCrewDetailsById_ReturnCrewResponse() throws Exception { //given final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) .getMember(); @@ -82,9 +83,9 @@ void findCrewDetailsById_ReturnCrewResponse() throws Exception { @DisplayName("사용자는 크루 모집글에 참여 신청을 할 수 있다.") void applyForCrewMemberShip_Success() throws Exception { //given - final List members = memberSetup.save(2); - final Member crewLeader = members.get(0); - final Member crewApplyMember = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity crewLeader = members.get(0); + final MemberEntity crewApplyMember = members.get(1); final CrewEntity crew = crewSetup.save(crewLeader); final String subject = String.valueOf(crewApplyMember.getId()); @@ -105,8 +106,8 @@ void applyForCrewMemberShip_Success() throws Exception { void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { //given final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) .getMember(); @@ -153,8 +154,8 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { void updateCrewMemberRegistrationStatus_Success() throws Exception { //given final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) .getMember(); @@ -182,8 +183,8 @@ void updateCrewMemberRegistrationStatus_Success() throws Exception { void deleteCrewMember_CrewLeader_Success() throws Exception { //given final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) .getMember(); @@ -207,8 +208,8 @@ void findCrewsByAddress_Success() throws Exception { final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) .getMember(); diff --git a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java index 9b61f3bc..fd888502 100644 --- a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java @@ -32,7 +32,7 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.fixture.dto.CrewDtoFixtures; import kr.pickple.back.fixture.setup.AddressSetup; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional public class CrewEntityDocumentTest extends IntegrationCrewTest { @@ -143,9 +143,9 @@ void findCrewById_ReturnCrewResponse() throws Exception { @DisplayName("크루 가입 신청") void applyForCrewMemberShip_ReturnVoid() throws Exception { //given - final List members = memberSetup.save(2); - final Member crewLeader = members.get(0); - final Member crewApplyMember = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity crewLeader = members.get(0); + final MemberEntity crewApplyMember = members.get(1); final CrewEntity crew = crewSetup.save(crewLeader); final String subject = String.valueOf(crewApplyMember.getId()); @@ -185,7 +185,7 @@ void applyForCrewMemberShip_ReturnVoid() throws Exception { void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception { //given final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final Member crewLeader = crew.getLeader(); + final MemberEntity crewLeader = crew.getLeader(); final String subject = String.valueOf(crewLeader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -287,8 +287,8 @@ void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { //given final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) .getMember(); @@ -341,8 +341,8 @@ void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { void deleteCrewMember_ReturnVoid() throws Exception { //given final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final Member crewLeader = crew.getLeader(); - final Member crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) + final MemberEntity crewLeader = crew.getLeader(); + final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) .get(0) .getMember(); diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java index 852c78a4..ed43d572 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java @@ -2,13 +2,13 @@ import kr.pickple.back.alarm.domain.CrewAlarm; import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import static kr.pickple.back.alarm.domain.CrewAlarmType.CREW_LEADER_WAITING; public class CrewAlarmFixtures { - public static CrewAlarm crewAlarmBuild(final Member member,final CrewEntity crew) { + public static CrewAlarm crewAlarmBuild(final MemberEntity member,final CrewEntity crew) { return CrewAlarm.builder() .crew(crew) .member(member) diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java index ae6d6560..d1bd17a6 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java @@ -11,14 +11,14 @@ import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; public class CrewFixtures { public static CrewEntity crewBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, - final Member leader + final MemberEntity leader ) { return CrewEntity.builder() .name("백둥크루1") @@ -32,7 +32,7 @@ public static CrewEntity crewBuild( .build(); } - public static CrewMemberEntity crewMemberBuild(final Member member, final CrewEntity crew) { + public static CrewMemberEntity crewMemberBuild(final MemberEntity member, final CrewEntity crew) { return CrewMemberEntity.builder() .member(member) .crew(crew) @@ -50,7 +50,7 @@ public static List crewsBuild( final Integer count, final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, - final Member leader + final MemberEntity leader ) { final List crews = new ArrayList<>(); diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java index 40503f65..c62f4078 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java @@ -2,13 +2,13 @@ import kr.pickple.back.alarm.domain.GameAlarm; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import static kr.pickple.back.alarm.domain.GameAlarmType.HOST_WAITING; public class GameAlarmFixtures { - public static GameAlarm gameAlarmBuild(final Member member, final GameEntity gameEntity) { + public static GameAlarm gameAlarmBuild(final MemberEntity member, final GameEntity gameEntity) { return GameAlarm.builder() .game(gameEntity) .member(member) diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java index fe85d74e..82a8f4b5 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java @@ -15,7 +15,7 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.position.domain.Position; public class GameFixtures { @@ -23,7 +23,7 @@ public class GameFixtures { public static GameEntity gameBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2, - final Member host + final MemberEntity host ) { final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); final Point point = geometryFactory.createPoint(new Coordinate(37.125, 126.75)); diff --git a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java index a5ef8ce5..10c017c2 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java @@ -3,7 +3,7 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.position.domain.Position; @@ -13,11 +13,11 @@ public class MemberFixtures { - public static Member memberBuild( + public static MemberEntity memberBuild( final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 ) { - return Member.builder() + return MemberEntity.builder() .email("pickple1@pickple.kr") .nickname("pickple1") .profileImageUrl("https://amazon.image") @@ -30,16 +30,16 @@ public static Member memberBuild( .build(); } - public static List membersBuild( + public static List membersBuild( final int count, final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2 ) { - final List members = new ArrayList<>(); + final List members = new ArrayList<>(); IntStream.range(0, count).forEach(i -> { members.add( - Member.builder() + MemberEntity.builder() .email(String.format("pickple%d@pickple.kr", i)) .nickname(String.format("pickple%d", i)) .profileImageUrl("https://amazon.image") diff --git a/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java index b2fcab33..373759b2 100644 --- a/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java @@ -9,7 +9,7 @@ import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.position.domain.Position; public class GameDtoFixtures { @@ -36,7 +36,7 @@ public static GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationSt .build(); } - public static MannerScoreReviewsRequest mannerScoreReviewsRequestBuild(final List members) { + public static MannerScoreReviewsRequest mannerScoreReviewsRequestBuild(final List members) { final List mannerScoreReviews = members.stream() .map(member -> MannerScoreReview.builder() .memberId(member.getId()) diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index 1c9ab5c8..4f8896d6 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -16,7 +16,7 @@ import kr.pickple.back.crew.repository.CrewMemberRepository; import kr.pickple.back.crew.repository.CrewRepository; import kr.pickple.back.fixture.domain.CrewFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Component public class CrewSetup { @@ -36,7 +36,7 @@ public class CrewSetup { @Autowired private AddressSetup addressSetup; - public CrewEntity save(final Member leader) { + public CrewEntity save(final MemberEntity leader) { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); @@ -57,7 +57,7 @@ public CrewEntity save(final Member leader) { } public CrewEntity saveWithWaitingMembers(final Integer memberCount) { - final List members = memberSetup.save(memberCount); + final List members = memberSetup.save(memberCount); final CrewEntity crew = save(members.get(0)); members.subList(1, members.size()) diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index 208438d2..033f527c 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -15,7 +15,7 @@ import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Component public class GameSetup { @@ -32,7 +32,7 @@ public class GameSetup { @Autowired private AddressSetup addressSetup; - public GameEntity save(final Member host) { + public GameEntity save(final MemberEntity host) { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); @@ -51,9 +51,9 @@ public GameEntity save(final Member host) { } public GameEntity saveWithWaitingMembers(final Integer memberCount) { - final List members = memberSetup.save(memberCount); + final List members = memberSetup.save(memberCount); final GameEntity gameEntity = save(members.get(0)); - final List guests = members.subList(1, members.size()); + final List guests = members.subList(1, members.size()); guests.forEach(gameEntity::addGameMember); @@ -62,7 +62,7 @@ public GameEntity saveWithWaitingMembers(final Integer memberCount) { public GameEntity saveWithConfirmedMembers(final Integer memberCount) { final GameEntity gameEntity = saveWithWaitingMembers(memberCount); - final Member host = gameEntity.getHost(); + final MemberEntity host = gameEntity.getHost(); final List gameMemberEntities = gameEntity.getGameMembers(); gameMemberEntities.forEach(gameMember -> { diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java index f69e6260..8252dc30 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java @@ -3,8 +3,9 @@ import kr.pickple.back.address.domain.AddressDepth1; import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.repository.MemberRepository; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,22 +20,22 @@ public class MemberSetup { @Autowired private AddressSetup addressSetup; - public Member save() { + public MemberEntity save() { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final Member member = MemberFixtures.memberBuild( + final MemberEntity member = MemberFixtures.memberBuild( addressDepth1, addressDepth2 ); return memberRepository.save(member); } - public List save(final int count) { + public List save(final int count) { final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final List members = MemberFixtures.membersBuild(count, addressDepth1, addressDepth2); + final List members = MemberFixtures.membersBuild(count, addressDepth1, addressDepth2); return members.stream() .map(memberRepository::save) diff --git a/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java b/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java index 5e33acd3..2b50a7cb 100644 --- a/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java @@ -21,7 +21,7 @@ import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional class GameEntityControllerTest extends IntegrationGameTest { @@ -33,8 +33,8 @@ class GameEntityControllerTest extends IntegrationGameTest { void findGameDetailsById_ReturnGameResponse() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -79,9 +79,9 @@ void findGameDetailsById_ReturnGameResponse() throws Exception { @DisplayName("사용자는 게스트 모집글에 참여 신청을 할 수 있다.") void registerGameMember_Success() throws Exception { // given - final List members = memberSetup.save(2); - final Member host = members.get(0); - final Member guest = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); final GameEntity gameEntity = gameSetup.save(host); final String subject = String.valueOf(guest.getId()); @@ -102,8 +102,8 @@ void registerGameMember_Success() throws Exception { void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -155,8 +155,8 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -209,8 +209,8 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { void updateGameMemberRegistrationStatus_Success() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -238,8 +238,8 @@ void updateGameMemberRegistrationStatus_Success() throws Exception { void deleteGameMember_Host_Success() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -261,7 +261,7 @@ void deleteGameMember_Host_Success() throws Exception { void deleteGameMember_GuestSelf_Success() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member guest = gameEntity.getGameMembers() + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -283,9 +283,9 @@ void deleteGameMember_GuestSelf_Success() throws Exception { void reviewMannerScores_Success() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); - final Member host = gameEntity.getHost(); + final MemberEntity host = gameEntity.getHost(); final List gameMemberEntities = gameEntity.getGameMembers(); - final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) + final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) .stream() .map(GameMemberEntity::getMember) .toList(); diff --git a/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java b/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java index edbee267..937018fe 100644 --- a/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java @@ -30,7 +30,7 @@ import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional class GameEntityDocumentTest extends IntegrationGameTest { @@ -309,9 +309,9 @@ void findGameById_ReturnGameResponse() throws Exception { @DisplayName("게스트 모집 참여 신청") void registerGameMember_ReturnVoid() throws Exception { // given - final List members = memberSetup.save(2); - final Member host = members.get(0); - final Member guest = members.get(1); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); final GameEntity gameEntity = gameSetup.save(host); final String subject = String.valueOf(guest.getId()); @@ -351,7 +351,7 @@ void registerGameMember_ReturnVoid() throws Exception { void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(3); - final Member host = gameEntity.getHost(); + final MemberEntity host = gameEntity.getHost(); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -459,8 +459,8 @@ void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -513,8 +513,8 @@ void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { void deleteGameMember_ReturnVoid() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final Member host = gameEntity.getHost(); - final Member guest = gameEntity.getGameMembers() + final MemberEntity host = gameEntity.getHost(); + final MemberEntity guest = gameEntity.getGameMembers() .get(1) .getMember(); @@ -556,9 +556,9 @@ void deleteGameMember_ReturnVoid() throws Exception { void reviewMannerScores_ReturnVoid() throws Exception { // given final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); - final Member host = gameEntity.getHost(); + final MemberEntity host = gameEntity.getHost(); final List gameMemberEntities = gameEntity.getGameMembers(); - final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) + final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) .stream() .map(GameMemberEntity::getMember) .toList(); diff --git a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java index 163de450..caaf10e7 100644 --- a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java +++ b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java @@ -20,7 +20,7 @@ import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; @ExtendWith(MockitoExtension.class) public class GameEntityServiceTest { @@ -43,7 +43,7 @@ void findGameById_ReturnGameResponse() { .addressDepth1(addressDepth1) .build(); - final Member host = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + final MemberEntity host = MemberFixtures.memberBuild(addressDepth1, addressDepth2); final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); diff --git a/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java b/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java similarity index 97% rename from src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java rename to src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java index d0afe507..f31b0509 100644 --- a/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java +++ b/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java @@ -14,11 +14,11 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.IntegrationMemberTest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.request.MemberCreateRequest; @Transactional -class MemberControllerTest extends IntegrationMemberTest { +class MemberEntityControllerTest extends IntegrationMemberTest { private static final String BASE_URL = "/members"; @@ -61,7 +61,7 @@ void createMemberById_ReturnAuthenticatedMemberResponse() throws Exception { @DisplayName("회원 프로필을 조회할 수 있다.") void findMemberById_ReturnMemberProfileResponse() throws Exception { // given - final Member savedMember = memberSetup.save(); + final MemberEntity savedMember = memberSetup.save(); final CrewEntity savedCrew = crewSetup.save(savedMember); // when @@ -112,7 +112,7 @@ void findMemberById_ReturnMemberProfileResponse() throws Exception { @DisplayName("회원이 가입한 크루 목록을 조회할 수 있다.") void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final CrewEntity crew = crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -164,7 +164,7 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { @DisplayName("회원이 만든 크루 목록을 조회할 수 있다.") void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); final CrewEntity crew = crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); diff --git a/src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java b/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java similarity index 99% rename from src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java rename to src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java index 8151099f..9fdebf78 100644 --- a/src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java +++ b/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java @@ -23,11 +23,11 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.IntegrationMemberTest; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.request.MemberCreateRequest; @Transactional -class MemberDocumentTest extends IntegrationMemberTest { +class MemberEntityDocumentTest extends IntegrationMemberTest { @Test @DisplayName("회원 생성") @@ -105,7 +105,7 @@ void createMember_ReturnAuthenticatedMemberResponse() throws Exception { @DisplayName("회원 프로필 조회") void findMemberById_ReturnMemberProfileResponse() throws Exception { // given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); crewSetup.save(member); // when @@ -194,7 +194,7 @@ void findMemberById_ReturnMemberProfileResponse() throws Exception { @DisplayName("회원이 가입한 크루 목록 조회") void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -298,7 +298,7 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { @DisplayName("회원이 만든 크루 목록 조회") void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given - final Member member = memberSetup.save(); + final MemberEntity member = memberSetup.save(); crewSetup.save(member); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -398,7 +398,7 @@ void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { @DisplayName("회원이 참여 확정된 게스트 모집글 목록 조회") void findAllMemberGames_ReturnGameResponses() throws Exception { // given - final Member host = memberSetup.save(); + final MemberEntity host = memberSetup.save(); gameSetup.save(host); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(host.getId())); @@ -513,7 +513,7 @@ void findAllMemberGames_ReturnGameResponses() throws Exception { @DisplayName("회원이 만든 게스트 모집글 목록 조회") void findAllCreatedGames_ReturnGameResponses() throws Exception { // given - final Member host = memberSetup.save(); + final MemberEntity host = memberSetup.save(); gameSetup.save(host); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(host.getId())); diff --git a/src/test/java/kr/pickple/back/member/domain/MemberTest.java b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java similarity index 84% rename from src/test/java/kr/pickple/back/member/domain/MemberTest.java rename to src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java index be73afa7..02139e89 100644 --- a/src/test/java/kr/pickple/back/member/domain/MemberTest.java +++ b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java @@ -1,6 +1,6 @@ package kr.pickple.back.member.domain; -import static kr.pickple.back.member.domain.Member.*; +import static kr.pickple.back.member.repository.entity.MemberEntity.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; import static org.assertj.core.api.Assertions.*; @@ -14,8 +14,9 @@ import kr.pickple.back.fixture.domain.AddressFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.entity.MemberEntity; -class MemberTest { +class MemberEntityTest { @Test @DisplayName("회원의 매너스코어를 업데이트 시킬 수 있다.") @@ -26,7 +27,7 @@ void updateMannerScore() { // when & then MANNER_SCORE_POINT_RANGE.forEach((mannerScorePoint) -> { - final Member member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); member.updateMannerScore(mannerScorePoint); assertThat(member.getMannerScore()).isEqualTo(mannerScorePoint); @@ -41,7 +42,7 @@ void updateMannerScore_ThrowException(int mannerScorePoint) { final AddressDepth1 addressDepth1 = AddressFixtures.addressDepth1Build(); final AddressDepth2 addressDepth2 = AddressFixtures.addressDepth2Build(); - final Member member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); // when & then assertThatThrownBy(() -> member.updateMannerScore(mannerScorePoint)) diff --git a/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java b/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java similarity index 91% rename from src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java rename to src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java index 1ddee1b1..c1a8d1b5 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberCrewServiceTestEntity.java +++ b/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java @@ -18,11 +18,11 @@ import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; -public class MemberCrewServiceTestEntity { +public class MemberEntityCrewServiceTestEntity { @InjectMocks private MemberCrewService memberCrewService; @@ -36,7 +36,7 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() { // given final Long memberId = 1L; final Long loggedInMemberId = 1L; - final Member member = buildMember(); + final MemberEntity member = buildMember(); given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); // when @@ -53,7 +53,7 @@ void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() { // given final Long memberId = 1L; final Long loggedInMemberId = 1L; - final Member member = buildMember(); + final MemberEntity member = buildMember(); given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); @@ -73,7 +73,7 @@ void findCreatedCrewsByMemberId_ThrowException() { // given final Long memberId = 1L; final Long loggedInMemberId = 2L; - final Member member = buildMember(); + final MemberEntity member = buildMember(); // when && then assertThatThrownBy(() -> memberCrewService.findCreatedCrewsByMemberId( @@ -83,7 +83,7 @@ void findCreatedCrewsByMemberId_ThrowException() { .hasMessage(MEMBER_MISMATCH.getMessage()); } - private Member buildMember() { + private MemberEntity buildMember() { final AddressDepth1 addressDepth1 = AddressDepth1.builder() .name("서울시") .build(); diff --git a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java similarity index 92% rename from src/test/java/kr/pickple/back/member/service/MemberServiceTest.java rename to src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java index c5d7720c..1ddf5589 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberServiceTest.java +++ b/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java @@ -24,14 +24,14 @@ import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.fixture.dto.MemberDtoFixtures; -import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.repository.MemberRepository; @ExtendWith(MockitoExtension.class) -class MemberServiceTest { +class MemberEntityServiceTest { @InjectMocks private MemberService memberService; @@ -73,10 +73,10 @@ void createMember_ReturnAuthenticatedMemberResponse() { .refreshToken("refreshToken") .build(); - final Member member = memberCreateRequest.toEntity(mainAddress); + final MemberEntity member = memberCreateRequest.toEntity(mainAddress); given(addressReader.readMainAddressByNames(anyString(), anyString())).willReturn(mainAddress); - given(memberRepository.save(any(Member.class))).willReturn(member); + given(memberRepository.save(any(MemberEntity.class))).willReturn(member); given(jwtProvider.createLoginToken(anyString())).willReturn(authTokens); given(jwtProperties.getRefreshTokenExpirationTime()).willReturn(1000L); @@ -93,7 +93,7 @@ void createMember_ReturnAuthenticatedMemberResponse() { void findMemberById_ReturnMemberProfileResponse() { // given final Long memberId = 1L; - final Member member = buildMember(); + final MemberEntity member = buildMember(); given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); // when @@ -103,7 +103,7 @@ void findMemberById_ReturnMemberProfileResponse() { assertThat(memberProfileResponse).isNotNull(); } - private Member buildMember() { + private MemberEntity buildMember() { final AddressDepth1 addressDepth1 = AddressDepth1.builder() .name("서울시") .build(); From a2d281fb159e84b1947d391367cfa8dc6e1c6e20 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 20:31:02 +0900 Subject: [PATCH 084/117] =?UTF-8?q?refactor:=20Crew,=20Game=20=EA=B7=B8?= =?UTF-8?q?=EB=A3=B9=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=9E=85=EC=9E=A5=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/service/CrewMemberService.java | 15 +- .../back/crew/service/CrewService.java | 19 ++- .../back/game/service/GameMemberService.java | 109 +++++--------- .../back/game/service/GameService.java | 137 ++++++------------ 4 files changed, 98 insertions(+), 182 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 1909950f..195c60f4 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -11,7 +11,8 @@ import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.crew.CrewMemberJoinedEvent; import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; -import kr.pickple.back.chat.service.ChatMessageService; +import kr.pickple.back.chat.implement.ChatReader; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; @@ -20,7 +21,7 @@ import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -32,8 +33,8 @@ public class CrewMemberService { private final MemberReader memberReader; private final CrewReader crewReader; private final CrewWriter crewWriter; - - private final ChatMessageService chatMessageService; + private final ChatReader chatReader; + private final ChatWriter chatWriter; private final ApplicationEventPublisher eventPublisher; /** @@ -42,7 +43,7 @@ public class CrewMemberService { @Transactional public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { final Crew crew = crewReader.read(crewId); - final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); + final Member member = memberReader.readByMemberId(loggedInMemberId); crewWriter.register(member, crew); @@ -66,7 +67,7 @@ public CrewProfileResponse findCrewMembersByStatus( throw new CrewException(CREW_IS_NOT_LEADER, loggedInMemberId); } - final List members = crewReader.readAllMembersInStatus(crewId, status); + final List members = crewReader.readAllMembersInStatus(crewId, status); return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); } @@ -89,7 +90,7 @@ public void updateCrewMemberRegistrationStatus( } crewWriter.updateMemberRegistrationStatus(crewMember, newRegistrationStatus); - chatMessageService.enterRoomAndSaveEnteringMessages(crew.getChatRoom(), crewMember.getMember()); + chatWriter.enterRoom(crewMember.getMember(), chatReader.readRoomByCrewId(crewId)); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() .crewId(crewId) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index e8f56bb6..99a71b24 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -11,8 +11,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.chat.service.ChatRoomService; +import kr.pickple.back.chat.domain.ChatRoom; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.common.config.property.S3Properties; import kr.pickple.back.common.util.RandomUtil; import kr.pickple.back.crew.domain.Crew; @@ -26,7 +26,7 @@ import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; import kr.pickple.back.crew.implement.CrewWriter; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @@ -42,8 +42,7 @@ public class CrewService { private final MemberReader memberReader; private final CrewReader crewReader; private final CrewWriter crewWriter; - - private final ChatRoomService chatRoomService; + private final ChatWriter chatWriter; private final S3Properties s3Properties; /** @@ -53,11 +52,10 @@ public class CrewService { public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewCreateRequest crewCreateRequest) { final NewCrew newCrew = CrewRequestMapper.mapToNewCrewDomain(crewCreateRequest); - final MemberDomain leader = memberReader.readByMemberId(loggedInMemberId); + final Member leader = memberReader.readByMemberId(loggedInMemberId); validateCreateCrewMoreThanMaxCount(loggedInMemberId); - final ChatRoomEntity chatRoom = chatRoomService.saveNewChatRoom(leader, newCrew.getName(), CREW); - chatRoom.updateMaxMemberCount(newCrew.getMaxMemberCount()); + final ChatRoom chatRoom = chatWriter.createNewGroupRoom(CREW, newCrew.getName(), newCrew.getMaxMemberCount()); newCrew.assignLeader(leader); newCrew.assignChatRoom(chatRoom); @@ -66,6 +64,7 @@ public CrewIdResponse createCrew(final Long loggedInMemberId, final CrewCreateRe final Crew crew = crewWriter.create(newCrew); final CrewMember crewLeader = crewWriter.register(leader, crew); crewWriter.updateMemberRegistrationStatus(crewLeader, CONFIRMED); + chatWriter.enterRoom(leader, chatRoom); return CrewResponseMapper.mapToCrewIdResponseDto(crew.getCrewId()); } @@ -91,7 +90,7 @@ private void assignImageUrls(final NewCrew newCrew) { */ public CrewProfileResponse findCrewById(final Long crewId) { final Crew crew = crewReader.read(crewId); - final List members = crewReader.readAllMembersInStatus(crewId, CONFIRMED); + final List members = crewReader.readAllMembersInStatus(crewId, CONFIRMED); return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); } @@ -107,7 +106,7 @@ public List findNearCrewsByAddress( return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable) .stream() .map(crew -> { - final List members = crewReader.readAllMembersInStatus(crew.getCrewId(), CONFIRMED); + final List members = crewReader.readAllMembersInStatus(crew.getCrewId(), CONFIRMED); return CrewResponseMapper.mapToCrewProfileResponseDto(crew, members); }) diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index ad2f2abf..d3a60844 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -9,32 +9,22 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.alarm.event.game.GameJoinRequestNotificationEvent; import kr.pickple.back.alarm.event.game.GameMemberJoinedEvent; import kr.pickple.back.alarm.event.game.GameMemberRejectedEvent; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.chat.service.ChatMessageService; +import kr.pickple.back.chat.implement.ChatReader; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.dto.mapper.GameResponseMapper; -import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameMemberWriter; import kr.pickple.back.game.implement.GameReader; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GamePositionRepository; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -42,25 +32,18 @@ @RequiredArgsConstructor public class GameMemberService { - private final AddressReader addressReader; - - private final GameRepository gameRepository; - private final MemberRepository memberRepository; - private final MemberPositionRepository memberPositionRepository; - private final ChatRoomRepository chatRoomRepository; - private final ChatMessageService chatMessageService; - private final ApplicationEventPublisher eventPublisher; - private final GameMemberRepository gameMemberRepository; - private final GamePositionRepository gamePositionRepository; - private final GameReader gameReader; private final MemberReader memberReader; - private final GameMemberWriter gameMemberWriter; + private final GameReader gameReader; private final GameMemberReader gameMemberReader; + private final GameMemberWriter gameMemberWriter; + private final ChatReader chatReader; + private final ChatWriter chatWriter; + private final ApplicationEventPublisher eventPublisher; @Transactional public void registerGameMember(final Long gameId, final Long loggedInMemberId) { - final GameDomain gameDomain = gameReader.read(gameId); - final MemberDomain memberDomain = memberReader.readByMemberId(loggedInMemberId); + final Game gameDomain = gameReader.read(gameId); + final Member memberDomain = memberReader.readByMemberId(loggedInMemberId); gameMemberWriter.register(memberDomain, gameDomain); @@ -75,15 +58,15 @@ public GameResponse findAllGameMembers( final Long gameId, final RegistrationStatus status ) { - final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); - final GameDomain game = gameReader.read(gameId); - final MemberDomain member = memberReader.readByMemberId(loggedInMemberId); + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final Game game = gameMember.getGame(); + final Member member = gameMember.getMember(); if (!game.isHost(member.getMemberId()) && status == WAITING) { throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, status); + final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, status); return GameResponseMapper.mapToGameResponseDto(game, members); } @@ -93,18 +76,17 @@ public void updateGameMemberRegistrationStatus( final Long loggedInMemberId, final Long gameId, final Long memberId, - final GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequest + final RegistrationStatus newRegistrationStatus ) { - final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); - final GameDomain game = gameReader.read(gameId); - - validateIsHost(loggedInMemberId, game); - final RegistrationStatus updateStatus = gameMemberRegistrationStatusUpdateRequest.getStatus(); + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final Game game = gameMember.getGame(); - final ChatRoomEntity chatRoom = chatRoomRepository.getChatRoomById(gameEntity.getChatRoomId()); - enterGameChatRoom(updateStatus, gameMemberEntity, chatRoom); + if (!game.isHost(loggedInMemberId)) { + throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); + } - gameMemberWriter.updateMemberRegistrationStatus(gameMember, updateStatus); + gameMemberWriter.updateMemberRegistrationStatus(gameMember, newRegistrationStatus); + chatWriter.enterRoom(gameMember.getMember(), chatReader.readRoomByGameId(gameId)); eventPublisher.publishEvent(GameMemberJoinedEvent.builder() .gameId(gameId) @@ -112,58 +94,41 @@ public void updateGameMemberRegistrationStatus( .build()); } - private void validateIsHost(final Long loggedInMemberId, final GameDomain gameDomain) { - if (!gameDomain.isHost(loggedInMemberId)) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } - } - - private void enterGameChatRoom( - final RegistrationStatus updateStatus, - final GameMemberEntity gameMemberEntity, - final ChatRoom chatRoom - ) { - final RegistrationStatus nowStatus = gameMemberEntity.getStatus(); - - if (nowStatus == WAITING && updateStatus == CONFIRMED) { - chatMessageService.enterRoomAndSaveEnteringMessages(chatRoom, memberRepository.getMemberById(gameMemberEntity.getMemberId())); - } - } - @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMemberDomain gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); - final GameDomain game = gameReader.read(gameId); - final MemberDomain member = memberReader.readByMemberId(gameMember.getMember().getMemberId()); - final MemberDomain loggedInMember = memberReader.readByMemberId(loggedInMemberId); + final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); + final Game game = gameMember.getGame(); if (game.isHost(loggedInMemberId)) { - validateIsHostSelfDeleted(loggedInMember, member); + validateIsHostSelfDeleted(loggedInMemberId, memberId); + + gameMemberWriter.deleteGameMember(gameMember); + eventPublisher.publishEvent(GameMemberRejectedEvent.builder() .gameId(gameId) .memberId(memberId) .build()); - gameMemberWriter.deleteGameMember(gameMember); return; } - if (loggedInMember.getMemberId().equals(member.getMemberId())) { + if (loggedInMemberId.equals(memberId)) { cancelGameMember(gameMember); + return; } throw new GameException(GAME_NOT_ALLOWED_TO_DELETE_GAME_MEMBER, loggedInMemberId); } - private void validateIsHostSelfDeleted(final MemberDomain loggedInMember, final MemberDomain member) { - if (loggedInMember.getMemberId().equals(member.getMemberId())) { - throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMember.getMemberId()); + private void validateIsHostSelfDeleted(final Long loggedInMemberId, final Long memberId) { + if (loggedInMemberId.equals(memberId)) { + throw new GameException(GAME_HOST_CANNOT_BE_DELETED, loggedInMemberId); } } - private void cancelGameMember(final GameMemberDomain gameMember) { - RegistrationStatus status = gameMember.getStatus(); + private void cancelGameMember(final GameMember gameMember) { + final RegistrationStatus status = gameMember.getStatus(); if (status != WAITING) { throw new GameException(GAME_MEMBER_STATUS_IS_NOT_WAITING, status); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 15682622..a8594a19 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -17,14 +17,12 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.service.ChatRoomService; +import kr.pickple.back.chat.implement.ChatWriter; import kr.pickple.back.game.domain.Category; -import kr.pickple.back.game.domain.GameDomain; -import kr.pickple.back.game.domain.GameMemberDomain; -import kr.pickple.back.game.domain.GameStatus; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.dto.mapper.GameRequestMapper; import kr.pickple.back.game.dto.mapper.GameResponseMapper; @@ -35,13 +33,8 @@ import kr.pickple.back.game.implement.GameMemberWriter; import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.game.implement.GameWriter; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GamePositionRepository; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.domain.MemberDomain; +import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; import lombok.RequiredArgsConstructor; @Service @@ -50,91 +43,66 @@ public class GameService { private final AddressReader addressReader; - - private final GameRepository gameRepository; - private final MemberPositionRepository memberPositionRepository; - private final MemberRepository memberRepository; - private final KakaoAddressSearchClient kakaoAddressSearchClient; - private final ChatRoomService chatRoomService; - private final RedisRepository redisRepository; - private final GamePositionRepository gamePositionRepository; - private final GameMemberRepository gameMemberRepository; - private final GameReader gameReader; private final MemberReader memberReader; + private final GameReader gameReader; private final GameWriter gameWriter; private final GameMemberWriter gameMemberWriter; + private final ChatWriter chatWriter; + private final RedisRepository redisRepository; /** * 게임 생성 */ @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(gameCreateRequest.getMainAddress()); + final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( + gameCreateRequest.getMainAddress()); final NewGame newGame = GameRequestMapper.mapToNewGameDomain(gameCreateRequest, mainAddress); - - final MemberDomain host = memberReader.readByMemberId(loggedInMemberId); - - final ChatRoom chatRoom = chatRoomService.saveNewChatRoom(host, makeGameRoomName(newGame), GAME); - chatRoom.updateMaxMemberCount(newGame.getMaxMemberCount()); + final Member host = memberReader.readByMemberId(loggedInMemberId); + final ChatRoom chatRoom = chatWriter.createNewGroupRoom( + GAME, + makeGameChatRoomName(newGame), + newGame.getMaxMemberCount() + ); newGame.assignHost(host); newGame.assignChatRoom(chatRoom); - final GameDomain game = gameWriter.create(newGame); - - final GameMemberDomain gameHost = gameMemberWriter.register(host, game); + final Game game = gameWriter.create(newGame); + final GameMember gameHost = gameMemberWriter.register(host, game); gameMemberWriter.updateMemberRegistrationStatus(gameHost, CONFIRMED); + chatWriter.enterRoom(host, chatRoom); saveGameStatusUpdateEventToRedis(game); return GameIdResponse.from(game.getGameId()); } - private String makeGameRoomName(final NewGame newGame) { + private String makeGameChatRoomName(final NewGame newGame) { final String playDateFormat = newGame.getPlayDate().format(DateTimeFormatter.ofPattern("MM.dd")); final String addressDepth2Name = newGame.getAddressDepth2Name(); return MessageFormat.format("{0} {1}", playDateFormat, addressDepth2Name); } - private void saveGameStatusUpdateEventToRedis(final GameDomain gameDomain) { + private void saveGameStatusUpdateEventToRedis(final Game game) { final LocalDateTime gameCreatedDateTime = LocalDateTime.now(); // 경기를 생성한 시각과 경기 시작 시간의 차 - final Long secondsOfBetweenCreatedAndPlay = getSecondsBetweenCreatedAndPlay(gameCreatedDateTime, gameDomain); + final Long secondsBetweenCreatedAndPlay = getSecondsBetween(gameCreatedDateTime, game.getPlayStartDatetime()); // 경기를 생성한 시각과 경기 종료 시간의 차 - final Long secondsOfBetweenCreatedAndEnd = getSecondsBetweenCreatedAndEnd(gameCreatedDateTime, gameDomain); - - final String closedGameStatusUpdateKey = makeGameStatusUpdateKey(CLOSED, gameDomain.getGameId()); - final String endedGameStatusUpdateKey = makeGameStatusUpdateKey(ENDED, gameDomain.getGameId()); + final Long secondsBetweenCreatedAndEnd = getSecondsBetween(gameCreatedDateTime, game.getPlayEndDatetime()); - redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndPlay); - redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsOfBetweenCreatedAndEnd); - } - - private Long getSecondsBetweenCreatedAndPlay(final LocalDateTime gameCreatedDateTime, final GameDomain gameDomain) { - final LocalDateTime gamePlayDateTime = LocalDateTime.of(gameDomain.getPlayDate(), gameDomain.getPlayStartTime()); + final String closedGameStatusUpdateKey = MessageFormat.format("game:{0}:{1}", CLOSED, game.getGameId()); + final String endedGameStatusUpdateKey = MessageFormat.format("game:{0}:{1}", ENDED, game.getGameId()); - return getSecondsBetween(gameCreatedDateTime, gamePlayDateTime); + redisRepository.saveHash(closedGameStatusUpdateKey, "", "", secondsBetweenCreatedAndPlay); + redisRepository.saveHash(endedGameStatusUpdateKey, "", "", secondsBetweenCreatedAndEnd); } - private Long getSecondsBetweenCreatedAndEnd(final LocalDateTime gameCreatedDateTime, final GameDomain gameDomain) { - final LocalDateTime gameEndDateTime = gameDomain.getPlayEndDatetime(); - - return getSecondsBetween(gameCreatedDateTime, gameEndDateTime); - } - - private static long getSecondsBetween( - final LocalDateTime gameCreatedDateTime, - final LocalDateTime gamePlayDateTime - ) { - return Duration.between(gameCreatedDateTime, gamePlayDateTime) - .getSeconds(); - } - - private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long id) { - return String.format("game:%s:%d", gameStatus.toString(), id); + private Long getSecondsBetween(final LocalDateTime start, final LocalDateTime end) { + return Duration.between(start, end).getSeconds(); } /** @@ -142,10 +110,10 @@ private String makeGameStatusUpdateKey(final GameStatus gameStatus, final Long i */ @Transactional public GameResponse findGameById(final Long gameId) { - final GameDomain gameDomain = gameReader.read(gameId); - final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, CONFIRMED); + final Game game = gameReader.read(gameId); + final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, CONFIRMED); - return GameResponseMapper.mapToGameResponseDto(gameDomain, members); + return GameResponseMapper.mapToGameResponseDto(game, members); } /** @@ -167,30 +135,14 @@ public List findGamesByCategory( * 주소별 게스트 모집글 조회 */ private List findGamesByAddress(final String address, final Pageable pageable) { - final List gameDomains = gameReader.findGamesByAddress(address, pageable); - - return gameDomains.stream() - .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( - gameDomain, - gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) - ) - ) - .toList(); - } - - /** - * 특정 지역의 게스트 모집글 조회 - */ - public List findGamesWithInAddress(final MainAddress mainAddress) { - final List gameDomains = gameReader.findGamesWithInAddress(mainAddress); + final List games = gameReader.findGamesByAddress(address, pageable); - return gameDomains.stream() - .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( - gameDomain, - gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) + return games.stream() + .map(game -> GameResponseMapper.mapToGameResponseDto( + game, + gameReader.readAllMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) ) - ) - .toList(); + ).toList(); } /** @@ -201,15 +153,14 @@ public List findGamesWithInDistance( final Double longitude, final Double distance ) { - final List gameDomains = gameReader.findGamesWithInDistance(latitude, longitude, distance); + final List games = gameReader.findGamesWithInDistance(latitude, longitude, distance); - return gameDomains.stream() - .filter(GameDomain::isNotEndedGame) - .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( - gameDomain, - gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) + return games.stream() + .filter(Game::isNotEndedGame) + .map(game -> GameResponseMapper.mapToGameResponseDto( + game, + gameReader.readAllMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) ) - ) - .toList(); + ).toList(); } } From bfd5f46233a274d54e50931b6f9132d0b61a8bc6 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 21:18:39 +0900 Subject: [PATCH 085/117] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=B0=B8=EC=97=AC=20=ED=99=95=EC=A0=95=20=EA=B2=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=AA=A8=EC=A7=91=EA=B8=80=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/implement/CrewReader.java | 39 +++------------- .../pickple/back/game/domain/GameMember.java | 8 ++-- .../back/game/implement/GameMapper.java | 16 +++++++ .../back/game/implement/GameReader.java | 15 +++++++ .../game/repository/entity/GameEntity.java | 44 +------------------ .../repository/entity/GameMemberEntity.java | 25 +++-------- .../GameReviewMannerScoresService.java | 2 +- .../dto/mapper/MemberResponseMapper.java | 36 +++++++++++++++ .../dto/response/MemberGameResponse.java | 37 ---------------- .../member/service/MemberGameService.java | 41 ++++++++++------- 10 files changed, 113 insertions(+), 150 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 96f45d53..3c9f9b19 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -3,7 +3,6 @@ import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.crew.exception.CrewExceptionCode.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; import java.util.List; @@ -25,13 +24,7 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.implement.MemberMapper; -import kr.pickple.back.member.repository.MemberPositionRepository; -import kr.pickple.back.member.repository.MemberRepository; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; -import kr.pickple.back.position.domain.Position; +import kr.pickple.back.member.implement.MemberReader; import lombok.RequiredArgsConstructor; @Component @@ -40,8 +33,7 @@ public class CrewReader { private final AddressReader addressReader; - private final MemberRepository memberRepository; - private final MemberPositionRepository memberPositionRepository; + private final MemberReader memberReader; private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; @@ -73,7 +65,7 @@ private Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { crewEntity.getAddressDepth2Id() ); - final Member leader = readMemberById(crewEntity.getLeaderId()); + final Member leader = memberReader.readByMemberId(crewEntity.getLeaderId()); return CrewMapper.mapCrewEntityToDomain(crewEntity, mainAddress, leader); } @@ -94,7 +86,7 @@ public List readNearCrewsByAddress( .map(crewEntity -> CrewMapper.mapCrewEntityToDomain( crewEntity, mainAddress, - readMemberById(crewEntity.getLeaderId()) + memberReader.readByMemberId(crewEntity.getLeaderId()) ) ).toList(); } @@ -102,7 +94,7 @@ public List readNearCrewsByAddress( public CrewMember readCrewMember(final Long memberId, final Long crewId) { final CrewMemberEntity crewMemberEntity = crewMemberRepository.findByMemberIdAndCrewId(memberId, crewId) .orElseThrow(() -> new CrewException(CREW_MEMBER_NOT_FOUND, memberId, crewId)); - final Member member = readMemberById(memberId); + final Member member = memberReader.readByMemberId(memberId); final Crew crew = read(crewId); return CrewMapper.mapCrewMemberEntityToDomain(crewMemberEntity, member, crew); @@ -111,27 +103,10 @@ public CrewMember readCrewMember(final Long memberId, final Long crewId) { public List readAllMembersInStatus(final Long crewId, final RegistrationStatus status) { return crewMemberRepository.findAllByCrewIdAndStatus(crewId, status) .stream() - .map(crewMemberEntity -> readMemberById(crewMemberEntity.getMemberId())) + .map(crewMemberEntity -> memberReader.readByMemberId(crewMemberEntity.getMemberId())) .toList(); } - private Member readMemberById(final Long memberId) { - final MemberEntity memberEntity = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - - final MainAddress mainAddress = addressReader.readMainAddressById( - memberEntity.getAddressDepth1Id(), - memberEntity.getAddressDepth2Id() - ); - - final List positions = memberPositionRepository.findAllByMemberId(memberId) - .stream() - .map(MemberPositionEntity::getPosition) - .toList(); - - return MemberMapper.mapToMemberDomain(memberEntity, mainAddress, positions); - } - public List readAllCrewProfilesByMemberIdAndStatus( final Long memberId, final RegistrationStatus memberStatus @@ -161,7 +136,7 @@ private List mapCrewEntitiesToCrewProfiles( crew.getAddressDepth1Id(), crew.getAddressDepth2Id() ); - final Member leader = readMemberById(crew.getLeaderId()); + final Member leader = memberReader.readByMemberId(crew.getLeaderId()); return CrewMapper.mapCrewEntityToCrewProfile(crew, mainAddress, leader, members); }) diff --git a/src/main/java/kr/pickple/back/game/domain/GameMember.java b/src/main/java/kr/pickple/back/game/domain/GameMember.java index 3d1cb753..6167070c 100644 --- a/src/main/java/kr/pickple/back/game/domain/GameMember.java +++ b/src/main/java/kr/pickple/back/game/domain/GameMember.java @@ -31,11 +31,11 @@ public void updateRegistrationStatus(final RegistrationStatus status) { this.status = status; } - public Boolean isAlreadyReviewDone() { - return isReview; + public Boolean isReviewDone() { + return this.isReview; } - public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { - return this.status == WAITING && updateStatus == CONFIRMED; + public Boolean isStatusChangedFromWaitingToConfirmed(final RegistrationStatus newRegistrationStatus) { + return this.status == WAITING && newRegistrationStatus == CONFIRMED; } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index e060184f..040ca2a6 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -6,8 +6,10 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; @@ -77,4 +79,18 @@ public static List mapToGamePositionEntities(final List .build() ).toList(); } + + public static GameMember mapGameMemberEntityToDomain( + final GameMemberEntity gameMemberEntity, + final Member member, + final Game game + ) { + return GameMember.builder() + .gameMemberId(gameMemberEntity.getId()) + .status(gameMemberEntity.getStatus()) + .member(member) + .game(game) + .isReview(gameMemberEntity.isReviewDone()) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 437b270b..07b072bf 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -17,6 +17,7 @@ import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; @@ -83,6 +84,20 @@ public List readAllMembersByGameIdAndStatus(final Long gameId, final Reg .toList(); } + public List readAllGameMembersByMemberIdAndStatus( + final Long memberId, + final RegistrationStatus status + ) { + return gameMemberRepository.findAllByMemberIdAndStatus(memberId, status) + .stream() + .map(gameMemberEntity -> GameMapper.mapGameMemberEntityToDomain( + gameMemberEntity, + memberReader.readByMemberId(gameMemberEntity.getMemberId()), + read(gameMemberEntity.getGameId()) + ) + ).toList(); + } + public List findGamesByAddress(final String address, final Pageable pageable) { final PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java index da74e62d..decf17d5 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java @@ -1,7 +1,6 @@ package kr.pickple.back.game.repository.entity; import static kr.pickple.back.game.domain.GameStatus.*; -import static kr.pickple.back.game.exception.GameExceptionCode.*; import java.time.LocalDate; import java.time.LocalDateTime; @@ -16,10 +15,8 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.GameStatus; -import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.util.GameStatusConverter; import lombok.AccessLevel; import lombok.Builder; @@ -64,7 +61,7 @@ public class GameEntity extends BaseEntity { @NotNull @Convert(converter = GameStatusConverter.class) @Column(length = 10) - private GameStatus status = OPEN; + private final GameStatus status = OPEN; //todo 현호: 게시글 상세 조회 기능 구현시 viewCount 올리는 기능 구현 @NotNull @@ -74,7 +71,7 @@ public class GameEntity extends BaseEntity { private Integer cost = 0; @NotNull - private Integer memberCount = 1; + private final Integer memberCount = 1; @NotNull private Integer maxMemberCount = 2; @@ -123,42 +120,10 @@ private GameEntity( this.chatRoomId = chatRoomId; } - public void updateGameStatus(final GameStatus gameStatus) { - status = gameStatus; - } - public LocalDateTime getPlayEndDatetime() { return LocalDateTime.of(playDate, playEndTime); } - public void increaseMemberCount() { - if (isClosedGame()) { - throw new GameException(GAME_STATUS_IS_CLOSED, status); - } - - if (isFullGame()) { - throw new GameException(GAME_CAPACITY_LIMIT_REACHED, memberCount); - } - - memberCount += 1; - - if (isFullGame()) { - status = CLOSED; - } - } - - private Boolean isClosedGame() { - return status == CLOSED; - } - - public Boolean isNotEndedGame() { - return status != ENDED; - } - - private Boolean isFullGame() { - return memberCount.equals(maxMemberCount); - } - public void increaseViewCount() { viewCount++; } @@ -166,9 +131,4 @@ public void increaseViewCount() { public Boolean isHost(final Long hostId) { return hostId.equals(this.hostId); } - - public void makeNewCrewChatRoom(final ChatRoomEntity chatRoom) { - chatRoom.updateMaxMemberCount(maxMemberCount); - this.chatRoomId = chatRoom.getId(); - } } diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java index 0fb72a6f..534f9a0a 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java @@ -18,15 +18,16 @@ import lombok.Getter; import lombok.NoArgsConstructor; -@Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class GameMemberEntity extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Getter @NotNull @Convert(converter = RegistrationStatusAttributeConverter.class) @Column(length = 10) @@ -35,9 +36,11 @@ public class GameMemberEntity extends BaseEntity { @NotNull private Boolean isReview = FALSE; + @Getter @NotNull private Long memberId; + @Getter @NotNull private Long gameId; @@ -48,23 +51,7 @@ private GameMemberEntity(final Long memberId, final Long gameId, final Registrat this.gameId = gameId; } - public void confirmRegistration() { - this.status = CONFIRMED; - } - - public void updateStatus(final RegistrationStatus status) { - this.status = status; - } - - public Boolean isStatusChangedFromWaitingToConfirmed(RegistrationStatus updateStatus) { - return this.status == WAITING && updateStatus == CONFIRMED; - } - - public Boolean isAlreadyReviewDone() { - return isReview; - } - - public void updateReviewDone() { - this.isReview = TRUE; + public Boolean isReviewDone() { + return this.isReview; } } diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 10b6b21a..b52c5a23 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -37,7 +37,7 @@ public void reviewMannerScores( ) { final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); - if (gameMember.isAlreadyReviewDone()) { + if (gameMember.isReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); } diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index df5a44ce..b4a2e3a4 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -4,10 +4,12 @@ import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.response.CrewResponse; +import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; +import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; @@ -72,4 +74,38 @@ public static List mapToMemberResponseDtos(final List me .map(MemberResponseMapper::mapToMemberResponseDto) .toList(); } + + public static MemberGameResponse mapToMemberGameResponseDto( + final Game game, + final List members, + final Boolean isReviewDone + ) { + final List memberResponses = members.stream() + .map(MemberResponseMapper::mapToMemberResponseDto) + .toList(); + + return MemberGameResponse.builder() + .id(game.getGameId()) + .content(game.getContent()) + .playDate(game.getPlayDate()) + .playStartTime(game.getPlayStartTime()) + .playEndTime(game.getPlayEndTime()) + .playTimeMinutes(game.getPlayTimeMinutes()) + .mainAddress(game.getMainAddress()) + .detailAddress(game.getDetailAddress()) + .latitude(game.getLatitude()) + .longitude(game.getLongitude()) + .status(game.getStatus()) + .isReviewDone(isReviewDone) + .viewCount(game.getViewCount()) + .cost(game.getCost()) + .memberCount(game.getMemberCount()) + .maxMemberCount(game.getMaxMemberCount()) + .host(mapToMemberResponseDto(game.getHost())) + .addressDepth1(game.getAddressDepth1Name()) + .addressDepth2(game.getAddressDepth2Name()) + .positions(game.getPositions()) + .members(memberResponses) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java index 35e7ff6e..84da7b94 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java @@ -4,9 +4,6 @@ import java.time.LocalTime; import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -40,38 +37,4 @@ public class MemberGameResponse { private String addressDepth2; private List positions; private List members; - - public static MemberGameResponse of(final GameMemberEntity gameMemberEntity, final GameEntity gameEntity, final List memberResponses, - final List positions, final MainAddress mainAddress) { - return MemberGameResponse.builder() - .id(gameEntity.getId()) - .content(gameEntity.getContent()) - .playDate(gameEntity.getPlayDate()) - .playStartTime(gameEntity.getPlayStartTime()) - .playEndTime(gameEntity.getPlayEndTime()) - .playTimeMinutes(gameEntity.getPlayTimeMinutes()) - .mainAddress(gameEntity.getMainAddress()) - .detailAddress(gameEntity.getDetailAddress()) - .latitude(gameEntity.getPoint().getY()) - .longitude(gameEntity.getPoint().getX()) - .status(gameEntity.getStatus()) - .isReviewDone(gameMemberEntity.isAlreadyReviewDone()) - .viewCount(gameEntity.getViewCount()) - .cost(gameEntity.getCost()) - .memberCount(gameEntity.getMemberCount()) - .maxMemberCount(gameEntity.getMaxMemberCount()) - .host(getHostResponse(memberResponses, gameEntity.getHostId())) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) - .positions(positions) - .members(memberResponses) - .build(); - } - - private static MemberResponse getHostResponse(final List memberResponses, final Long hostId) { - return memberResponses.stream() - .filter(memberResponse -> memberResponse.getId().equals(hostId)) - .findFirst() - .orElseThrow(); - } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index e22d1f8c..ea78c61b 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -10,17 +10,20 @@ import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.implement.MemberReader; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -31,21 +34,17 @@ public class MemberGameService { private final AddressReader addressReader; private final MemberReader memberReader; + private final GameReader gameReader; private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 */ - public List findAllMemberGames( - final Long memberId, - final RegistrationStatus memberStatus - ) { - final MemberEntity member = memberReader.readEntityByMemberId(memberId); - final List memberGames = gameMemberRepository.findAllByMemberIdAndStatus(member.getId(), - memberStatus); + public List findAllMemberGames(final Long memberId, final RegistrationStatus status) { + final List gameMembers = gameReader.readAllGameMembersByMemberIdAndStatus(memberId, status); - return convertToMemberGameResponses(memberGames, memberStatus); + return getMemberGameResponses(gameMembers); } /** @@ -58,6 +57,16 @@ public List findAllCreatedGames(final Long memberId) { return convertToMemberGameResponses(memberGames, CONFIRMED); } + private List getMemberGameResponses(final List gameMembers) { + return gameMembers.stream() + .map(gameMember -> MemberResponseMapper.mapToMemberGameResponseDto( + gameMember.getGame(), + gameReader.readAllMembersByGameIdAndStatus(gameMember.getGame().getGameId(), CONFIRMED), + gameMember.isReviewDone() + ) + ).toList(); + } + /** * 회원의 게스트 모집 신청 여부 조회 */ @@ -68,10 +77,11 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( final MemberEntity member = memberReader.readEntityByMemberId(memberId); final GameEntity gameEntity = gameRepository.getGameById(gameId); - final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(member.getId(), gameEntity.getId()) + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(member.getId(), + gameEntity.getId()) .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), gameEntity.getId())); - return GameMemberRegistrationStatusResponse.of(gameMemberEntity.getStatus(), gameMemberEntity.isAlreadyReviewDone()); + return GameMemberRegistrationStatusResponse.of(gameMemberEntity.getStatus(), gameMemberEntity.isReviewDone()); } private List convertToMemberGameResponses( @@ -97,7 +107,8 @@ private List convertToMemberGameResponses( .toList(); } - private List getMemberResponsesByGame(final GameEntity gameEntity, final RegistrationStatus memberStatus) { + private List getMemberResponsesByGame(final GameEntity gameEntity, + final RegistrationStatus memberStatus) { return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), memberStatus) .stream() .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) From 051e72d02a34bb5f796d17323589ccf14d986b69 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 21:49:33 +0900 Subject: [PATCH 086/117] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EB=A7=8C=EB=93=A0=20=EA=B2=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=AA=A8=EC=A7=91=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EA=B3=84=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameMapper.java | 16 ---- .../back/game/implement/GameMemberMapper.java | 1 + .../back/game/implement/GameMemberReader.java | 39 +++++++- .../back/game/implement/GameMemberWriter.java | 2 +- .../back/game/implement/GameReader.java | 52 ++++------- .../back/game/repository/GameRepository.java | 5 +- .../back/game/service/GameFacadeService.java | 6 +- .../back/game/service/GameMemberService.java | 8 +- .../GameReviewMannerScoresService.java | 2 +- .../back/game/service/GameService.java | 12 +-- .../member/service/MemberGameService.java | 88 ++++--------------- 11 files changed, 91 insertions(+), 140 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index 040ca2a6..e060184f 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -6,10 +6,8 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; @@ -79,18 +77,4 @@ public static List mapToGamePositionEntities(final List .build() ).toList(); } - - public static GameMember mapGameMemberEntityToDomain( - final GameMemberEntity gameMemberEntity, - final Member member, - final Game game - ) { - return GameMember.builder() - .gameMemberId(gameMemberEntity.getId()) - .status(gameMemberEntity.getStatus()) - .member(member) - .game(game) - .isReview(gameMemberEntity.isReviewDone()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java index 92950601..61d2e48f 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberMapper.java @@ -28,6 +28,7 @@ public static GameMember mapGameMemberEntityToDomain( .status(gameMemberEntity.getStatus()) .member(member) .game(game) + .isReview(gameMemberEntity.isReviewDone()) .build(); } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java index ae46e208..9715d936 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java @@ -3,9 +3,12 @@ import static kr.pickple.back.common.domain.RegistrationStatus.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; +import java.util.List; + import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.exception.GameException; @@ -20,21 +23,49 @@ @Transactional(readOnly = true) public class GameMemberReader { - private final GameMemberRepository gameMemberRepository; private final MemberReader memberReader; private final GameReader gameReader; + private final GameMemberRepository gameMemberRepository; - public GameMember readGameMemberByMemberIdAndGameId(final Long loggedInMemberId, final Long gameId) { + public GameMember readByMemberIdAndGameId(final Long memberId, final Long gameId) { final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( - loggedInMemberId, + memberId, gameId, CONFIRMED ) - .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, loggedInMemberId)); + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); final Member member = memberReader.readByMemberId(gameMemberEntity.getMemberId()); final Game game = gameReader.read(gameMemberEntity.getGameId()); return GameMemberMapper.mapGameMemberEntityToDomain(gameMemberEntity, member, game); } + + public List readAllByMemberIdAndStatus( + final Long memberId, + final RegistrationStatus status + ) { + return gameMemberRepository.findAllByMemberIdAndStatus(memberId, status) + .stream() + .map(gameMemberEntity -> GameMemberMapper.mapGameMemberEntityToDomain( + gameMemberEntity, + memberReader.readByMemberId(gameMemberEntity.getMemberId()), + gameReader.read(gameMemberEntity.getGameId()) + ) + ).toList(); + } + + public List readMembersByGameIdAndStatus(final Long gameId, final RegistrationStatus status) { + return gameMemberRepository.findAllByGameIdAndStatus(gameId, status) + .stream() + .map(gameMemberEntity -> memberReader.readByMemberId(gameMemberEntity.getMemberId())) + .toList(); + } + + public Boolean isReviewDoneByGameIdAndMemberId(final Long gameId, final Long memberId) { + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + + return gameMemberEntity.isReviewDone(); + } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index dbcf2d05..2ac1a9db 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -58,7 +58,7 @@ public void updateMemberRegistrationStatus(final GameMember gameMember, final Re } public void updateReviewDone(final Long memberId, final Long gameId) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); gameMemberRepository.updateReviewDone(gameMember.getGameMemberId(), true); } diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 07b072bf..840f70e5 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -15,12 +15,9 @@ import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.exception.ChatException; -import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.domain.GameStatus; import kr.pickple.back.game.exception.GameException; -import kr.pickple.back.game.repository.GameMemberRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; @@ -38,7 +35,6 @@ public class GameReader { private final AddressReader addressReader; private final MemberReader memberReader; private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; private final GamePositionRepository gamePositionRepository; public Game read(final Long gameId) { @@ -57,6 +53,13 @@ public Game readByChatRoomId(final Long chatRoomId) { return mapGameEntityToDomain(gameEntity); } + public List readAllByHostId(final Long hostId) { + return gameRepository.findAllByHostId(hostId) + .stream() + .map(this::mapGameEntityToDomain) + .toList(); + } + private Game mapGameEntityToDomain(final GameEntity gameEntity) { final Member host = memberReader.readByMemberId(gameEntity.getHostId()); @@ -70,35 +73,7 @@ private Game mapGameEntityToDomain(final GameEntity gameEntity) { return GameMapper.mapGameEntityToDomain(gameEntity, mainAddress, host, positions); } - private List readPositionsByGameId(final Long gameId) { - return gamePositionRepository.findAllByGameId(gameId) - .stream() - .map(GamePosition::getPosition) - .toList(); - } - - public List readAllMembersByGameIdAndStatus(final Long gameId, final RegistrationStatus status) { - return gameMemberRepository.findAllByGameIdAndStatus(gameId, status) - .stream() - .map(gameMemberEntity -> memberReader.readByMemberId(gameMemberEntity.getMemberId())) - .toList(); - } - - public List readAllGameMembersByMemberIdAndStatus( - final Long memberId, - final RegistrationStatus status - ) { - return gameMemberRepository.findAllByMemberIdAndStatus(memberId, status) - .stream() - .map(gameMemberEntity -> GameMapper.mapGameMemberEntityToDomain( - gameMemberEntity, - memberReader.readByMemberId(gameMemberEntity.getMemberId()), - read(gameMemberEntity.getGameId()) - ) - ).toList(); - } - - public List findGamesByAddress(final String address, final Pageable pageable) { + public List readAllByAddress(final String address, final Pageable pageable) { final PageRequest pageRequest = PageRequest.of( pageable.getPageNumber(), pageable.getPageSize(), @@ -127,7 +102,7 @@ public List findGamesByAddress(final String address, final Pageable pageab .toList(); } - public List findGamesWithInAddress(final MainAddress mainAddress) { + public List readAllWithInAddress(final MainAddress mainAddress) { final List gameEntities = gameRepository.findGamesWithInAddress( mainAddress.getAddressDepth1(), mainAddress.getAddressDepth2() @@ -142,7 +117,7 @@ public List findGamesWithInAddress(final MainAddress mainAddress) { .toList(); } - public List findGamesWithInDistance( + public List readAllWithInDistance( final Double latitude, final Double longitude, final Double distance @@ -160,4 +135,11 @@ public List findGamesWithInDistance( readPositionsByGameId(gameEntity.getId()))) .toList(); } + + private List readPositionsByGameId(final Long gameId) { + return gamePositionRepository.findAllByGameId(gameId) + .stream() + .map(GamePosition::getPosition) + .toList(); + } } diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index e907bada..6c3d2e66 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -2,6 +2,7 @@ import static kr.pickple.back.game.exception.GameExceptionCode.*; +import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; @@ -24,9 +25,7 @@ Page findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( Optional findByChatRoomId(final Long chatRoomId); - default GameEntity getGameById(final Long gameId) { - return findById(gameId).orElseThrow(() -> new GameException(GAME_NOT_FOUND, gameId)); - } + List findAllByHostId(final Long hostId); @Query("update GameEntity g set g.memberCount = :memberCount, g.status = :status where g.id = :gameId") void updateMemberCountAndStatus(final Long gameId, final Integer memberCount, final GameStatus status); diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index 0953d643..2dc11f9b 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -12,6 +12,7 @@ import kr.pickple.back.game.dto.mapper.GameResponseMapper; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.dto.response.GamesAndLocationResponse; +import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.map.domain.MapPolygon; import kr.pickple.back.map.service.MapService; @@ -24,6 +25,7 @@ public class GameFacadeService { private final AddressReader addressReader; private final MapService mapService; private final GameReader gameReader; + private final GameMemberReader gameMemberReader; /** * 특정 지역의 게스트 모집글 조회 @@ -31,12 +33,12 @@ public class GameFacadeService { public GamesAndLocationResponse findGamesWithInAddress(final String addressDepth1, final String addressDepth2) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); - final List games = gameReader.findGamesWithInAddress(mainAddress); + final List games = gameReader.readAllWithInAddress(mainAddress); final List gameResponses = games.stream() .map(gameDomain -> GameResponseMapper.mapToGameResponseDto( gameDomain, - gameReader.readAllMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) + gameMemberReader.readMembersByGameIdAndStatus(gameDomain.getGameId(), CONFIRMED) ) ) .toList(); diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index d3a60844..8e9caee8 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -58,7 +58,7 @@ public GameResponse findAllGameMembers( final Long gameId, final RegistrationStatus status ) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); final Game game = gameMember.getGame(); final Member member = gameMember.getMember(); @@ -66,7 +66,7 @@ public GameResponse findAllGameMembers( throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); } - final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, status); + final List members = gameMemberReader.readMembersByGameIdAndStatus(gameId, status); return GameResponseMapper.mapToGameResponseDto(game, members); } @@ -78,7 +78,7 @@ public void updateGameMemberRegistrationStatus( final Long memberId, final RegistrationStatus newRegistrationStatus ) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); final Game game = gameMember.getGame(); if (!game.isHost(loggedInMemberId)) { @@ -96,7 +96,7 @@ public void updateGameMemberRegistrationStatus( @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(memberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); final Game game = gameMember.getGame(); if (game.isHost(loggedInMemberId)) { diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index b52c5a23..42abbb40 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -35,7 +35,7 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMember gameMember = gameMemberReader.readGameMemberByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); if (gameMember.isReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index a8594a19..4f0508f1 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -30,6 +30,7 @@ import kr.pickple.back.game.dto.response.GameIdResponse; import kr.pickple.back.game.dto.response.GameResponse; import kr.pickple.back.game.exception.GameException; +import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameMemberWriter; import kr.pickple.back.game.implement.GameReader; import kr.pickple.back.game.implement.GameWriter; @@ -45,6 +46,7 @@ public class GameService { private final AddressReader addressReader; private final MemberReader memberReader; private final GameReader gameReader; + private final GameMemberReader gameMemberReader; private final GameWriter gameWriter; private final GameMemberWriter gameMemberWriter; private final ChatWriter chatWriter; @@ -111,7 +113,7 @@ private Long getSecondsBetween(final LocalDateTime start, final LocalDateTime en @Transactional public GameResponse findGameById(final Long gameId) { final Game game = gameReader.read(gameId); - final List members = gameReader.readAllMembersByGameIdAndStatus(gameId, CONFIRMED); + final List members = gameMemberReader.readMembersByGameIdAndStatus(gameId, CONFIRMED); return GameResponseMapper.mapToGameResponseDto(game, members); } @@ -135,12 +137,12 @@ public List findGamesByCategory( * 주소별 게스트 모집글 조회 */ private List findGamesByAddress(final String address, final Pageable pageable) { - final List games = gameReader.findGamesByAddress(address, pageable); + final List games = gameReader.readAllByAddress(address, pageable); return games.stream() .map(game -> GameResponseMapper.mapToGameResponseDto( game, - gameReader.readAllMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) + gameMemberReader.readMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) ) ).toList(); } @@ -153,13 +155,13 @@ public List findGamesWithInDistance( final Double longitude, final Double distance ) { - final List games = gameReader.findGamesWithInDistance(latitude, longitude, distance); + final List games = gameReader.readAllWithInDistance(latitude, longitude, distance); return games.stream() .filter(Game::isNotEndedGame) .map(game -> GameResponseMapper.mapToGameResponseDto( game, - gameReader.readAllMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) + gameMemberReader.readMembersByGameIdAndStatus(game.getGameId(), CONFIRMED) ) ).toList(); } diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java index ea78c61b..249a1fb0 100644 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ b/src/main/java/kr/pickple/back/member/service/MemberGameService.java @@ -8,23 +8,18 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.GameMember; +import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameReader; -import kr.pickple.back.game.repository.GameMemberRepository; -import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberGameResponse; -import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; -import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @Service @@ -32,37 +27,35 @@ @Transactional(readOnly = true) public class MemberGameService { - private final AddressReader addressReader; private final MemberReader memberReader; private final GameReader gameReader; - private final GameRepository gameRepository; - private final GameMemberRepository gameMemberRepository; + private final GameMemberReader gameMemberReader; /** * 사용자의 참여 확정 게스트 모집글 목록 조회 */ public List findAllMemberGames(final Long memberId, final RegistrationStatus status) { - final List gameMembers = gameReader.readAllGameMembersByMemberIdAndStatus(memberId, status); - - return getMemberGameResponses(gameMembers); + return gameMemberReader.readAllByMemberIdAndStatus(memberId, status) + .stream() + .map(memberGame -> MemberResponseMapper.mapToMemberGameResponseDto( + memberGame.getGame(), + gameMemberReader.readMembersByGameIdAndStatus(memberGame.getGame().getGameId(), CONFIRMED), + memberGame.isReviewDone() + ) + ).toList(); } /** * 사용자가 만든 게스트 모집글 목록 조회 */ - public List findAllCreatedGames(final Long memberId) { - final MemberEntity member = memberReader.readEntityByMemberId(memberId); - final List memberGames = gameMemberRepository.findAllByMemberId(member.getId()); - - return convertToMemberGameResponses(memberGames, CONFIRMED); - } - - private List getMemberGameResponses(final List gameMembers) { - return gameMembers.stream() - .map(gameMember -> MemberResponseMapper.mapToMemberGameResponseDto( - gameMember.getGame(), - gameReader.readAllMembersByGameIdAndStatus(gameMember.getGame().getGameId(), CONFIRMED), - gameMember.isReviewDone() + public List findAllCreatedGames(final Long hostId) { + final List createdGames = gameReader.readAllByHostId(hostId); + + return createdGames.stream() + .map(game -> MemberResponseMapper.mapToMemberGameResponseDto( + game, + gameMemberReader.readMembersByGameIdAndStatus(game.getGameId(), CONFIRMED), + gameMemberReader.isReviewDoneByGameIdAndMemberId(game.getGameId(), hostId) ) ).toList(); } @@ -83,47 +76,4 @@ public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( return GameMemberRegistrationStatusResponse.of(gameMemberEntity.getStatus(), gameMemberEntity.isReviewDone()); } - - private List convertToMemberGameResponses( - final List memberGames, - final RegistrationStatus memberStatus - ) { - return memberGames.stream() - .map(memberGame -> { - GameEntity gameEntity = gameRepository.getGameById(memberGame.getGameId()); - MemberEntity member = memberRepository.getMemberById(memberGame.getMemberId()); - - return MemberGameResponse.of( - memberGame, - gameEntity, - getMemberResponsesByGame(gameEntity, memberStatus), - getPositionsByMember(member), - addressReader.readMainAddressById( - gameEntity.getAddressDepth1Id(), - gameEntity.getAddressDepth2Id() - ) - ); - }) - .toList(); - } - - private List getMemberResponsesByGame(final GameEntity gameEntity, - final RegistrationStatus memberStatus) { - return gameMemberRepository.findAllByGameIdAndStatus(gameEntity.getId(), memberStatus) - .stream() - .map(gameMember -> memberRepository.getMemberById(gameMember.getMemberId())) - .map(member -> MemberResponse.of( - member, - getPositionsByMember(member), - addressReader.readMainAddressById(member.getAddressDepth1Id(), member.getAddressDepth2Id()) - ) - ) - .toList(); - } - - private List getPositionsByMember(final MemberEntity member) { - final List memberPositions = memberPositionReader.readAll(member.getId()); - - return Position.fromMemberPositions(memberPositions); - } } From e03b8c0501246a79147c92690f2b4838dce69f94 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 23:27:12 +0900 Subject: [PATCH 087/117] =?UTF-8?q?refactor:=20Crew,=20Game=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EC=9D=98?= =?UTF-8?q?=ED=95=9C=20=EC=95=8C=EB=9E=8C=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/alarm/domain/GameAlarm.java | 6 +- .../alarm/dto/response/GameAlarmResponse.java | 10 +- .../back/alarm/service/CrewAlarmService.java | 103 +++++------------- 3 files changed, 38 insertions(+), 81 deletions(-) diff --git a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java index e2fb0967..43bf1436 100644 --- a/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java +++ b/src/main/java/kr/pickple/back/alarm/domain/GameAlarm.java @@ -38,7 +38,7 @@ public class GameAlarm extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "game_id") - private GameEntity gameEntity; + private GameEntity game; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") @@ -47,11 +47,11 @@ public class GameAlarm extends BaseEntity { @Builder private GameAlarm( final GameAlarmType gameAlarmType, - final GameEntity gameEntity, + final GameEntity game, final MemberEntity member ) { this.gameAlarmType = gameAlarmType; - this.gameEntity = gameEntity; + this.game = game; this.member = member; } diff --git a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java index 97c47178..e5fc24ed 100644 --- a/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java +++ b/src/main/java/kr/pickple/back/alarm/dto/response/GameAlarmResponse.java @@ -30,16 +30,16 @@ public class GameAlarmResponse implements AlarmResponse { private final GameAlarmType gameAlarmMessage; public static GameAlarmResponse from(final GameAlarm gameAlarm) { - final GameEntity gameEntity = gameAlarm.getGameEntity(); + final GameEntity gameEntity = gameAlarm.getGame(); return GameAlarmResponse.builder() .gameAlarmId(gameAlarm.getId()) .gameId(gameEntity.getId()) - .mainAddress(gameAlarm.getGameEntity().getMainAddress()) + .mainAddress(gameEntity.getMainAddress()) .createdAt(gameAlarm.getCreatedAt()) - .playDate(gameAlarm.getGameEntity().getPlayDate()) - .playStartTime(gameAlarm.getGameEntity().getPlayStartTime()) - .playTimeMinutes(gameAlarm.getGameEntity().getPlayTimeMinutes()) + .playDate(gameEntity.getPlayDate()) + .playStartTime(gameEntity.getPlayStartTime()) + .playTimeMinutes(gameEntity.getPlayTimeMinutes()) .isRead(gameAlarm.getIsRead()) .gameAlarmMessage(gameAlarm.getGameAlarmType()) .build(); diff --git a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java index bb123725..4b4cb0ea 100644 --- a/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java +++ b/src/main/java/kr/pickple/back/alarm/service/CrewAlarmService.java @@ -13,6 +13,7 @@ import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.alarm.domain.CrewAlarm; +import kr.pickple.back.alarm.domain.CrewAlarmType; import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; import kr.pickple.back.alarm.dto.response.CrewAlarmResponse; import kr.pickple.back.alarm.event.crew.CrewJoinRequestNotificationEvent; @@ -20,12 +21,12 @@ import kr.pickple.back.alarm.event.crew.CrewMemberRejectedEvent; import kr.pickple.back.alarm.exception.AlarmException; import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.member.exception.MemberException; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; import lombok.RequiredArgsConstructor; @Service @@ -39,90 +40,58 @@ public class CrewAlarmService { @Transactional public void createCrewJoinAlarm(final CrewJoinRequestNotificationEvent crewJoinRequestNotificationEvent) { - - validateIsLeader(crewJoinRequestNotificationEvent); - final Long crewId = crewJoinRequestNotificationEvent.getCrewId(); - final CrewEntity crew = getCrewInfo(crewId); - final MemberEntity leader = memberRepository.getMemberById(crew.getLeaderId()); + final Long leaderId = crewJoinRequestNotificationEvent.getMemberId(); + final CrewEntity crew = getCrewById(crewId); - final CrewAlarm crewAlarm = CrewAlarm.builder() - .crew(crew) - .member(leader) - .crewAlarmType(CREW_LEADER_WAITING) - .build(); - - crewAlarmRepository.save(crewAlarm); + if (!crew.isLeader(leaderId)) { + throw new CrewException(CREW_IS_NOT_LEADER, crewId, leaderId); + } - final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitterService.sendAlarm(leader.getId(), response); + createCrewMemberAlarm(crewId, leaderId, CREW_LEADER_WAITING); } @Transactional public void createCrewMemberApproveAlarm(final CrewMemberJoinedEvent crewMemberJoinedEvent) { final Long crewId = crewMemberJoinedEvent.getCrewId(); - final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberJoinedEvent.getMemberId(); - final MemberEntity member = getMemberInfo(memberId); - - final CrewAlarm crewAlarm = CrewAlarm.builder() - .crew(crew) - .member(member) - .crewAlarmType(CREW_ACCEPT) - .build(); - crewAlarmRepository.save(crewAlarm); - - final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitterService.sendAlarm(member.getId(), response); + createCrewMemberAlarm(crewId, memberId, CREW_ACCEPT); } @Transactional public void createCrewMemberDeniedAlarm(final CrewMemberRejectedEvent crewMemberRejectedEvent) { final Long crewId = crewMemberRejectedEvent.getCrewId(); - final CrewEntity crew = getCrewInfo(crewId); final Long memberId = crewMemberRejectedEvent.getMemberId(); - final MemberEntity member = getMemberInfo(memberId); + + createCrewMemberAlarm(crewId, memberId, CREW_DENIED); + } + + private void createCrewMemberAlarm(final Long crewId, final Long memberId, final CrewAlarmType crewAlarmType) { + final CrewEntity crew = getCrewById(crewId); + final MemberEntity member = memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); final CrewAlarm crewAlarm = CrewAlarm.builder() .crew(crew) .member(member) - .crewAlarmType(CREW_DENIED) + .crewAlarmType(crewAlarmType) .build(); crewAlarmRepository.save(crewAlarm); - - final CrewAlarmResponse response = CrewAlarmResponse.from(crewAlarm); - sseEmitterService.sendAlarm(member.getId(), response); + sseEmitterService.sendAlarm(memberId, CrewAlarmResponse.from(crewAlarm)); } - private CrewEntity getCrewInfo(final Long crewId) { - final CrewEntity crew = crewRepository.findById(crewId) + private CrewEntity getCrewById(final Long crewId) { + return crewRepository.findById(crewId) .orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - - return crew; - } - - private MemberEntity getMemberInfo(final Long memberId) { - final MemberEntity member = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - - return member; - } - - private void validateIsLeader(final CrewJoinRequestNotificationEvent crewAlarmEvent) { - final Long crewId = crewAlarmEvent.getCrewId(); - final CrewEntity crew = crewRepository.findById(crewId).orElseThrow(() -> new CrewException(CREW_NOT_FOUND, crewId)); - - final MemberEntity leader = memberRepository.getMemberById(crew.getLeaderId()); - - if (!crew.isLeader(crewAlarmEvent.getMemberId())) { - throw new CrewException(CREW_IS_NOT_LEADER, crewId, leader.getId()); - } } - public List findByMemberId(final Long loggedInMemberId, final Optional optionalCursorId, - final Integer size) { + public List findByMemberId( + final Long loggedInMemberId, + final Optional optionalCursorId, + final Integer size + ) { final List crewAlarms = optionalCursorId .map(cursorId -> crewAlarmRepository.findByMemberIdAndIdLessThanOrderByCreatedAtDesc( loggedInMemberId, @@ -140,9 +109,7 @@ public List findByMemberId(final Long loggedInMemberId, final } public boolean checkUnreadCrewAlarm(final Long memberId) { - final boolean existsUnreadCrewAlarm = crewAlarmRepository.existsByMemberIdAndIsRead(memberId, false); - - return existsUnreadCrewAlarm; + return crewAlarmRepository.existsByMemberIdAndIsRead(memberId, false); } @Transactional @@ -156,19 +123,9 @@ public void updateCrewAlarmById( final Long crewAlarmId, final CrewAlarmUpdateStatusRequest crewAlarmUpdateStatusRequest ) { - final MemberEntity member = findMemberById(loggedInMemberId); - final CrewAlarm crewAlarm = checkExistCrewAlarm(loggedInMemberId, crewAlarmId); + final CrewAlarm crewAlarm = crewAlarmRepository.findByMemberIdAndId(loggedInMemberId, crewAlarmId) + .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, loggedInMemberId, crewAlarmId)); crewAlarm.updateStatus(crewAlarmUpdateStatusRequest.getIsRead()); } - - private MemberEntity findMemberById(final Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, memberId)); - } - - public CrewAlarm checkExistCrewAlarm(final Long memberId, final Long crewAlarmId) { - return crewAlarmRepository.findByMemberIdAndId(memberId, crewAlarmId) - .orElseThrow(() -> new AlarmException(ALARM_NOT_FOUND, memberId, crewAlarmId)); - } } From 51047f8108358be9fbdf1b62df19620f0df6088c Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 8 Mar 2024 23:35:16 +0900 Subject: [PATCH 088/117] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=ED=81=AC=EB=A3=A8,=20=EA=B2=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=B4=20=EA=B5=AC=ED=98=84=EA=B3=84?= =?UTF-8?q?=EC=B8=B5=20=EC=A0=81=EC=9A=A9=20=EB=B0=8F=20=EA=B0=81=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/controller/CrewController.java | 4 +- .../crew/dto/mapper/CrewResponseMapper.java | 3 +- .../CrewMemberRegistrationStatusResponse.java | 2 +- .../back/crew/service/CrewMemberService.java | 40 +++++++++- .../back/game/controller/GameController.java | 4 +- .../game/dto/mapper/GameResponseMapper.java | 53 ++++++++++++- .../GameMemberRegistrationStatusResponse.java | 7 +- .../dto/response/MemberGameResponse.java | 3 +- .../back/game/implement/GameMemberWriter.java | 4 +- .../back/game/implement/GameWriter.java | 6 +- .../back/game/service/GameMemberService.java | 60 +++++++++++++- .../member/controller/MemberController.java | 54 ++++++------- .../dto/mapper/MemberResponseMapper.java | 36 --------- .../member/service/MemberCrewService.java | 64 --------------- .../member/service/MemberGameService.java | 79 ------------------- 15 files changed, 195 insertions(+), 224 deletions(-) rename src/main/java/kr/pickple/back/{member => crew}/dto/response/CrewMemberRegistrationStatusResponse.java (86%) rename src/main/java/kr/pickple/back/{member => game}/dto/response/GameMemberRegistrationStatusResponse.java (64%) rename src/main/java/kr/pickple/back/{member => game}/dto/response/MemberGameResponse.java (91%) delete mode 100644 src/main/java/kr/pickple/back/member/service/MemberCrewService.java delete mode 100644 src/main/java/kr/pickple/back/member/service/MemberGameService.java diff --git a/src/main/java/kr/pickple/back/crew/controller/CrewController.java b/src/main/java/kr/pickple/back/crew/controller/CrewController.java index 0a130d2f..0f629f3e 100644 --- a/src/main/java/kr/pickple/back/crew/controller/CrewController.java +++ b/src/main/java/kr/pickple/back/crew/controller/CrewController.java @@ -64,13 +64,13 @@ public ResponseEntity registerCrewMember( } @GetMapping("/{crewId}/members") - public ResponseEntity findAllCrewMembers( + public ResponseEntity findAllCrewMembersByStatus( @Login final Long loggedInMemberId, @PathVariable final Long crewId, @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(crewMemberService.findCrewMembersByStatus(loggedInMemberId, crewId, status)); + .body(crewMemberService.findAllCrewMembersByStatus(loggedInMemberId, crewId, status)); } @PatchMapping("/{crewId}/members/{memberId}") diff --git a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java index e446a359..83eac04b 100644 --- a/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java +++ b/src/main/java/kr/pickple/back/crew/dto/mapper/CrewResponseMapper.java @@ -6,11 +6,11 @@ import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewProfile; import kr.pickple.back.crew.dto.response.CrewIdResponse; +import kr.pickple.back.crew.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.dto.response.CrewResponse; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; -import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -66,7 +66,6 @@ public static CrewResponse mapToCrewResponseDto(final Crew crew) { public static List mapToCrewProfilesResponseDto( final List crewProfiles ) { - return crewProfiles.stream() .map(crewProfile -> CrewProfileResponse.builder() .id(crewProfile.getCrewId()) diff --git a/src/main/java/kr/pickple/back/member/dto/response/CrewMemberRegistrationStatusResponse.java b/src/main/java/kr/pickple/back/crew/dto/response/CrewMemberRegistrationStatusResponse.java similarity index 86% rename from src/main/java/kr/pickple/back/member/dto/response/CrewMemberRegistrationStatusResponse.java rename to src/main/java/kr/pickple/back/crew/dto/response/CrewMemberRegistrationStatusResponse.java index 5c81301b..30748702 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/CrewMemberRegistrationStatusResponse.java +++ b/src/main/java/kr/pickple/back/crew/dto/response/CrewMemberRegistrationStatusResponse.java @@ -1,4 +1,4 @@ -package kr.pickple.back.member.dto.response; +package kr.pickple.back.crew.dto.response; import kr.pickple.back.common.domain.RegistrationStatus; import lombok.AllArgsConstructor; diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 195c60f4..05e8b5f7 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -16,7 +16,9 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; +import kr.pickple.back.crew.domain.CrewProfile; import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; +import kr.pickple.back.crew.dto.response.CrewMemberRegistrationStatusResponse; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.crew.exception.CrewException; import kr.pickple.back.crew.implement.CrewReader; @@ -56,7 +58,7 @@ public void registerCrewMember(final Long crewId, final Long loggedInMemberId) { /** * 크루에 가입 신청된 혹은 확정된 사용자 정보 목록 조회 */ - public CrewProfileResponse findCrewMembersByStatus( + public CrewProfileResponse findAllCrewMembersByStatus( final Long loggedInMemberId, final Long crewId, final RegistrationStatus status @@ -132,4 +134,40 @@ private void validateLeaderDeleteSelf(final Long leaderId, final Long deletingMe throw new CrewException(CREW_LEADER_CANNOT_BE_DELETED, deletingMemberId); } } + + /** + * 사용자가 가입한 크루 목록 조회 + */ + public List findAllJoinedCrews( + final Long memberId, + final RegistrationStatus memberStatus + ) { + final List crewProfiles = crewReader.readAllCrewProfilesByMemberIdAndStatus( + memberId, + memberStatus + ); + + return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); + } + + /** + * 사용자가 만든 크루 목록 조회 + */ + public List findCreatedCrews(final Long memberId) { + final List crewProfiles = crewReader.readAllCrewProfilesByLeaderId(memberId); + + return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); + } + + /** + * 사용자의 크루 가입 신청 여부 조회 + */ + public CrewMemberRegistrationStatusResponse findRegistrationStatusForCrew( + final Long memberId, + final Long crewId + ) { + final CrewMember crewMember = crewReader.readCrewMember(crewId, memberId); + + return CrewResponseMapper.mapToCrewMemberRegistrationStatusResponse(crewMember.getStatus()); + } } diff --git a/src/main/java/kr/pickple/back/game/controller/GameController.java b/src/main/java/kr/pickple/back/game/controller/GameController.java index a7fbdc6e..3fcdd665 100644 --- a/src/main/java/kr/pickple/back/game/controller/GameController.java +++ b/src/main/java/kr/pickple/back/game/controller/GameController.java @@ -82,13 +82,13 @@ public ResponseEntity registerGameMember( } @GetMapping("/{gameId}/members") - public ResponseEntity findAllGameMembers( + public ResponseEntity findAllGameMembersByStatus( @Login final Long loggedInMemberId, @PathVariable final Long gameId, @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(gameMemberService.findAllGameMembers(loggedInMemberId, gameId, status)); + .body(gameMemberService.findAllGameMembersByStatus(loggedInMemberId, gameId, status)); } @PatchMapping("/{gameId}/members/{memberId}") diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java index d49e8d07..a11719b5 100644 --- a/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameResponseMapper.java @@ -2,13 +2,19 @@ import java.util.List; +import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.domain.Game; +import kr.pickple.back.game.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.game.dto.response.GameResponse; +import kr.pickple.back.game.dto.response.MemberGameResponse; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.dto.mapper.MemberResponseMapper; import kr.pickple.back.member.dto.response.MemberResponse; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; -public class GameResponseMapper { +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class GameResponseMapper { public static GameResponse mapToGameResponseDto(final Game gameDomain, final List members) { final List memberResponses = members @@ -39,4 +45,49 @@ public static GameResponse mapToGameResponseDto(final Game gameDomain, final Lis .members(memberResponses) .build(); } + + public static MemberGameResponse mapToMemberGameResponseDto( + final Game game, + final List members, + final Boolean isReviewDone + ) { + final List memberResponses = members.stream() + .map(MemberResponseMapper::mapToMemberResponseDto) + .toList(); + + return MemberGameResponse.builder() + .id(game.getGameId()) + .content(game.getContent()) + .playDate(game.getPlayDate()) + .playStartTime(game.getPlayStartTime()) + .playEndTime(game.getPlayEndTime()) + .playTimeMinutes(game.getPlayTimeMinutes()) + .mainAddress(game.getMainAddress()) + .detailAddress(game.getDetailAddress()) + .latitude(game.getLatitude()) + .longitude(game.getLongitude()) + .status(game.getStatus()) + .isReviewDone(isReviewDone) + .viewCount(game.getViewCount()) + .cost(game.getCost()) + .memberCount(game.getMemberCount()) + .maxMemberCount(game.getMaxMemberCount()) + .host(MemberResponseMapper.mapToMemberResponseDto(game.getHost())) + .addressDepth1(game.getAddressDepth1Name()) + .addressDepth2(game.getAddressDepth2Name()) + .positions(game.getPositions()) + .members(memberResponses) + .build(); + } + + public static GameMemberRegistrationStatusResponse mapToGameMemberRegistrationStatusResponseDto( + final RegistrationStatus status, + final Boolean isReviewDone + ) { + return GameMemberRegistrationStatusResponse + .builder() + .memberRegistrationStatus(status) + .isReviewDone(isReviewDone) + .build(); + } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/GameMemberRegistrationStatusResponse.java b/src/main/java/kr/pickple/back/game/dto/response/GameMemberRegistrationStatusResponse.java similarity index 64% rename from src/main/java/kr/pickple/back/member/dto/response/GameMemberRegistrationStatusResponse.java rename to src/main/java/kr/pickple/back/game/dto/response/GameMemberRegistrationStatusResponse.java index 15732042..95920841 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/GameMemberRegistrationStatusResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/GameMemberRegistrationStatusResponse.java @@ -1,11 +1,14 @@ -package kr.pickple.back.member.dto.response; +package kr.pickple.back.game.dto.response; import kr.pickple.back.common.domain.RegistrationStatus; +import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter -@AllArgsConstructor(staticName = "of") +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class GameMemberRegistrationStatusResponse { private final RegistrationStatus memberRegistrationStatus; diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java b/src/main/java/kr/pickple/back/game/dto/response/MemberGameResponse.java similarity index 91% rename from src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java rename to src/main/java/kr/pickple/back/game/dto/response/MemberGameResponse.java index 84da7b94..092921f2 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberGameResponse.java +++ b/src/main/java/kr/pickple/back/game/dto/response/MemberGameResponse.java @@ -1,10 +1,11 @@ -package kr.pickple.back.member.dto.response; +package kr.pickple.back.game.dto.response; import java.time.LocalDate; import java.time.LocalTime; import java.util.List; import kr.pickple.back.game.domain.GameStatus; +import kr.pickple.back.member.dto.response.MemberResponse; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index 2ac1a9db..50819868 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -21,9 +21,9 @@ @RequiredArgsConstructor public class GameMemberWriter { - private final GameMemberRepository gameMemberRepository; - private final GameRepository gameRepository; private final GameMemberReader gameMemberReader; + private final GameRepository gameRepository; + private final GameMemberRepository gameMemberRepository; public GameMember register(final Member member, final Game game) { final Long memberId = member.getMemberId(); diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 9a31233d..4e353417 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -33,12 +33,12 @@ public class GameWriter { private final AddressReader addressReader; + private final MemberReader memberReader; + private final MemberRepository memberRepository; private final GameRepository gameRepository; private final GameMemberRepository gameMemberRepository; - private final KakaoAddressSearchClient kakaoAddressSearchClient; private final GamePositionRepository gamePositionRepository; - private final MemberReader memberReader; - private final MemberRepository memberRepository; + private final KakaoAddressSearchClient kakaoAddressSearchClient; public Game create(final NewGame newGame) { final Point point = kakaoAddressSearchClient.fetchAddress(newGame.getMainAddress()); diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 8e9caee8..14d26e2c 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -18,7 +18,9 @@ import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameMember; import kr.pickple.back.game.dto.mapper.GameResponseMapper; +import kr.pickple.back.game.dto.response.GameMemberRegistrationStatusResponse; import kr.pickple.back.game.dto.response.GameResponse; +import kr.pickple.back.game.dto.response.MemberGameResponse; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.implement.GameMemberReader; import kr.pickple.back.game.implement.GameMemberWriter; @@ -40,6 +42,9 @@ public class GameMemberService { private final ChatWriter chatWriter; private final ApplicationEventPublisher eventPublisher; + /** + * 게스트 모집 참여 신청 + */ @Transactional public void registerGameMember(final Long gameId, final Long loggedInMemberId) { final Game gameDomain = gameReader.read(gameId); @@ -53,7 +58,10 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { .build()); } - public GameResponse findAllGameMembers( + /** + * 게스트 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회 + */ + public GameResponse findAllGameMembersByStatus( final Long loggedInMemberId, final Long gameId, final RegistrationStatus status @@ -71,6 +79,9 @@ public GameResponse findAllGameMembers( return GameResponseMapper.mapToGameResponseDto(game, members); } + /** + * 게스트 모집 참여 신청 수락 + */ @Transactional public void updateGameMemberRegistrationStatus( final Long loggedInMemberId, @@ -94,6 +105,9 @@ public void updateGameMemberRegistrationStatus( .build()); } + /** + * 게스트 모집 참여 신청 거절/취소 + */ @Transactional public void deleteGameMember(final Long loggedInMemberId, final Long gameId, final Long memberId) { final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); @@ -136,4 +150,48 @@ private void cancelGameMember(final GameMember gameMember) { gameMemberWriter.deleteGameMember(gameMember); } + + /** + * 사용자의 참여 확정 게스트 모집글 목록 조회 + */ + public List findAllJoinedGames(final Long memberId, final RegistrationStatus status) { + return gameMemberReader.readAllByMemberIdAndStatus(memberId, status) + .stream() + .map(memberGame -> GameResponseMapper.mapToMemberGameResponseDto( + memberGame.getGame(), + gameMemberReader.readMembersByGameIdAndStatus(memberGame.getGame().getGameId(), CONFIRMED), + memberGame.isReviewDone() + ) + ).toList(); + } + + /** + * 사용자가 만든 게스트 모집글 목록 조회 + */ + public List findAllCreatedGames(final Long hostId) { + final List createdGames = gameReader.readAllByHostId(hostId); + + return createdGames.stream() + .map(game -> GameResponseMapper.mapToMemberGameResponseDto( + game, + gameMemberReader.readMembersByGameIdAndStatus(game.getGameId(), CONFIRMED), + gameMemberReader.isReviewDoneByGameIdAndMemberId(game.getGameId(), hostId) + ) + ).toList(); + } + + /** + * 사용자의 게스트 모집 신청 여부 조회 + */ + public GameMemberRegistrationStatusResponse findRegistrationStatusForGame( + final Long memberId, + final Long gameId + ) { + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); + + return GameResponseMapper.mapToGameMemberRegistrationStatusResponseDto( + gameMember.getStatus(), + gameMember.isReviewDone() + ); + } } diff --git a/src/main/java/kr/pickple/back/member/controller/MemberController.java b/src/main/java/kr/pickple/back/member/controller/MemberController.java index e2022d29..51147e64 100644 --- a/src/main/java/kr/pickple/back/member/controller/MemberController.java +++ b/src/main/java/kr/pickple/back/member/controller/MemberController.java @@ -23,17 +23,17 @@ import kr.pickple.back.auth.config.resolver.SignUp; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.dto.response.CrewProfileResponse; +import kr.pickple.back.crew.service.CrewMemberService; +import kr.pickple.back.game.service.GameMemberService; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.mapper.MemberRequestMapper; import kr.pickple.back.member.dto.request.MemberCreateRequest; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.MemberGameResponse; +import kr.pickple.back.crew.dto.response.CrewMemberRegistrationStatusResponse; +import kr.pickple.back.game.dto.response.GameMemberRegistrationStatusResponse; +import kr.pickple.back.game.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.service.MemberCrewService; -import kr.pickple.back.member.service.MemberGameService; import kr.pickple.back.member.service.MemberService; import lombok.RequiredArgsConstructor; @@ -43,8 +43,8 @@ public class MemberController { private final MemberService memberService; - private final MemberCrewService memberCrewService; - private final MemberGameService memberGameService; + private final CrewMemberService crewMemberService; + private final GameMemberService gameMemberService; private final JwtProperties jwtProperties; @PostMapping @@ -89,34 +89,45 @@ public ResponseEntity findMemberProfileById(@PathVariable @Identification @GetMapping("/{memberId}/crews") - public ResponseEntity> findAllCrewsByMemberId( + public ResponseEntity> findAllJoinedCrews( @Login final Long loggedInMemberId, @PathVariable final Long memberId, @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberCrewService.findAllCrewsByMemberId(memberId, status)); + .body(crewMemberService.findAllJoinedCrews(memberId, status)); } @Identification @GetMapping("/{memberId}/created-crews") - public ResponseEntity> findCreatedCrewsByMemberId( + public ResponseEntity> findCreatedCrews( @Login final Long loggedInMemberId, @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberCrewService.findCreatedCrewsByMemberId(memberId)); + .body(crewMemberService.findCreatedCrews(memberId)); + } + + @Identification + @GetMapping("/{memberId}/crews/{crewId}/registration-status") + public ResponseEntity findRegistrationStatusForCrew( + @Login final Long loggedInMemberId, + @PathVariable final Long memberId, + @PathVariable final Long crewId + ) { + return ResponseEntity.status(OK) + .body(crewMemberService.findRegistrationStatusForCrew(memberId, crewId)); } @Identification @GetMapping("/{memberId}/games") - public ResponseEntity> findAllMemberGames( + public ResponseEntity> findAllJoinedGames( @Login final Long loggedInMemberId, @PathVariable final Long memberId, @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(memberGameService.findAllMemberGames(memberId, status)); + .body(gameMemberService.findAllJoinedGames(memberId, status)); } @Identification @@ -126,28 +137,17 @@ public ResponseEntity> findAllCreatedGames( @PathVariable final Long memberId ) { return ResponseEntity.status(OK) - .body(memberGameService.findAllCreatedGames(memberId)); + .body(gameMemberService.findAllCreatedGames(memberId)); } @Identification @GetMapping("/{memberId}/games/{gameId}/registration-status") - public ResponseEntity findMemberRegistrationStatusForGame( + public ResponseEntity findRegistrationStatusForGame( @Login final Long loggedInMemberId, @PathVariable final Long memberId, @PathVariable final Long gameId ) { return ResponseEntity.status(OK) - .body(memberGameService.findMemberRegistrationStatusForGame(memberId, gameId)); - } - - @Identification - @GetMapping("/{memberId}/crews/{crewId}/registration-status") - public ResponseEntity findMemberRegistrationStatusForCrew( - @Login final Long loggedInMemberId, - @PathVariable final Long memberId, - @PathVariable final Long crewId - ) { - return ResponseEntity.status(OK) - .body(memberCrewService.findMemberRegistrationStatusForCrew(memberId, crewId)); + .body(gameMemberService.findRegistrationStatusForGame(memberId, gameId)); } } diff --git a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java index b4a2e3a4..df5a44ce 100644 --- a/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java +++ b/src/main/java/kr/pickple/back/member/dto/mapper/MemberResponseMapper.java @@ -4,12 +4,10 @@ import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; import kr.pickple.back.crew.dto.response.CrewResponse; -import kr.pickple.back.game.domain.Game; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.MemberGameResponse; import kr.pickple.back.member.dto.response.MemberProfileResponse; import kr.pickple.back.member.dto.response.MemberResponse; import lombok.AccessLevel; @@ -74,38 +72,4 @@ public static List mapToMemberResponseDtos(final List me .map(MemberResponseMapper::mapToMemberResponseDto) .toList(); } - - public static MemberGameResponse mapToMemberGameResponseDto( - final Game game, - final List members, - final Boolean isReviewDone - ) { - final List memberResponses = members.stream() - .map(MemberResponseMapper::mapToMemberResponseDto) - .toList(); - - return MemberGameResponse.builder() - .id(game.getGameId()) - .content(game.getContent()) - .playDate(game.getPlayDate()) - .playStartTime(game.getPlayStartTime()) - .playEndTime(game.getPlayEndTime()) - .playTimeMinutes(game.getPlayTimeMinutes()) - .mainAddress(game.getMainAddress()) - .detailAddress(game.getDetailAddress()) - .latitude(game.getLatitude()) - .longitude(game.getLongitude()) - .status(game.getStatus()) - .isReviewDone(isReviewDone) - .viewCount(game.getViewCount()) - .cost(game.getCost()) - .memberCount(game.getMemberCount()) - .maxMemberCount(game.getMaxMemberCount()) - .host(mapToMemberResponseDto(game.getHost())) - .addressDepth1(game.getAddressDepth1Name()) - .addressDepth2(game.getAddressDepth2Name()) - .positions(game.getPositions()) - .members(memberResponses) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java b/src/main/java/kr/pickple/back/member/service/MemberCrewService.java deleted file mode 100644 index be157def..00000000 --- a/src/main/java/kr/pickple/back/member/service/MemberCrewService.java +++ /dev/null @@ -1,64 +0,0 @@ -package kr.pickple.back.member.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.domain.CrewMember; -import kr.pickple.back.crew.domain.CrewProfile; -import kr.pickple.back.crew.dto.mapper.CrewResponseMapper; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; -import kr.pickple.back.crew.implement.CrewReader; -import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.dto.response.CrewMemberRegistrationStatusResponse; -import kr.pickple.back.member.implement.MemberReader; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberCrewService { - - private final MemberReader memberReader; - private final CrewReader crewReader; - - /** - * 사용자가 가입한 크루 목록 조회 - */ - public List findAllCrewsByMemberId( - final Long memberId, - final RegistrationStatus memberStatus - ) { - final Member member = memberReader.readByMemberId(memberId); - final List crewProfiles = crewReader.readAllCrewProfilesByMemberIdAndStatus( - member.getMemberId(), - memberStatus - ); - - return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); - } - - /** - * 사용자가 만든 크루 목록 조회 - */ - public List findCreatedCrewsByMemberId(final Long memberId) { - final Member member = memberReader.readByMemberId(memberId); - final List crewProfiles = crewReader.readAllCrewProfilesByLeaderId(member.getMemberId()); - - return CrewResponseMapper.mapToCrewProfilesResponseDto(crewProfiles); - } - - /** - * 회원의 크루 가입 신청 여부 조회 - */ - public CrewMemberRegistrationStatusResponse findMemberRegistrationStatusForCrew( - final Long memberId, - final Long crewId - ) { - final CrewMember crewMember = crewReader.readCrewMember(crewId, memberId); - - return CrewResponseMapper.mapToCrewMemberRegistrationStatusResponse(crewMember.getStatus()); - } -} diff --git a/src/main/java/kr/pickple/back/member/service/MemberGameService.java b/src/main/java/kr/pickple/back/member/service/MemberGameService.java deleted file mode 100644 index 249a1fb0..00000000 --- a/src/main/java/kr/pickple/back/member/service/MemberGameService.java +++ /dev/null @@ -1,79 +0,0 @@ -package kr.pickple.back.member.service; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.domain.Game; -import kr.pickple.back.game.implement.GameMemberReader; -import kr.pickple.back.game.implement.GameReader; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.dto.mapper.MemberResponseMapper; -import kr.pickple.back.member.dto.response.GameMemberRegistrationStatusResponse; -import kr.pickple.back.member.dto.response.MemberGameResponse; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.implement.MemberReader; -import kr.pickple.back.member.repository.entity.MemberEntity; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberGameService { - - private final MemberReader memberReader; - private final GameReader gameReader; - private final GameMemberReader gameMemberReader; - - /** - * 사용자의 참여 확정 게스트 모집글 목록 조회 - */ - public List findAllMemberGames(final Long memberId, final RegistrationStatus status) { - return gameMemberReader.readAllByMemberIdAndStatus(memberId, status) - .stream() - .map(memberGame -> MemberResponseMapper.mapToMemberGameResponseDto( - memberGame.getGame(), - gameMemberReader.readMembersByGameIdAndStatus(memberGame.getGame().getGameId(), CONFIRMED), - memberGame.isReviewDone() - ) - ).toList(); - } - - /** - * 사용자가 만든 게스트 모집글 목록 조회 - */ - public List findAllCreatedGames(final Long hostId) { - final List createdGames = gameReader.readAllByHostId(hostId); - - return createdGames.stream() - .map(game -> MemberResponseMapper.mapToMemberGameResponseDto( - game, - gameMemberReader.readMembersByGameIdAndStatus(game.getGameId(), CONFIRMED), - gameMemberReader.isReviewDoneByGameIdAndMemberId(game.getGameId(), hostId) - ) - ).toList(); - } - - /** - * 회원의 게스트 모집 신청 여부 조회 - */ - public GameMemberRegistrationStatusResponse findMemberRegistrationStatusForGame( - final Long memberId, - final Long gameId - ) { - final MemberEntity member = memberReader.readEntityByMemberId(memberId); - final GameEntity gameEntity = gameRepository.getGameById(gameId); - - final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(member.getId(), - gameEntity.getId()) - .orElseThrow(() -> new MemberException(MEMBER_NOT_FOUND, member.getId(), gameEntity.getId())); - - return GameMemberRegistrationStatusResponse.of(gameMemberEntity.getStatus(), gameMemberEntity.isReviewDone()); - } -} From 0e145933c4bfeafd174b6269d5db5848bc41f5e6 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 9 Mar 2024 03:45:44 +0900 Subject: [PATCH 089/117] =?UTF-8?q?refactor:=20=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B5=AC=ED=98=84=EA=B3=84?= =?UTF-8?q?=EC=B8=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/address/domain/Address.java | 15 +++ .../back/address/domain/AllAddress.java | 17 +++ .../back/address/implement/AddressMapper.java | 38 +++++++ .../back/address/implement/AddressReader.java | 100 ++++++++---------- .../repository/AddressDepth1Repository.java | 6 +- .../repository/AddressDepth2Repository.java | 9 +- .../entity/AddressDepth1Entity.java} | 6 +- .../entity/AddressDepth2Entity.java} | 15 +-- .../repository/entity/AddressEntity.java | 8 ++ .../back/address/service/AddressService.java | 13 ++- .../back/address/util/AddressParser.java | 8 +- 11 files changed, 154 insertions(+), 81 deletions(-) create mode 100644 src/main/java/kr/pickple/back/address/domain/Address.java create mode 100644 src/main/java/kr/pickple/back/address/domain/AllAddress.java create mode 100644 src/main/java/kr/pickple/back/address/implement/AddressMapper.java rename src/main/java/kr/pickple/back/address/{domain/AddressDepth1.java => repository/entity/AddressDepth1Entity.java} (78%) rename src/main/java/kr/pickple/back/address/{domain/AddressDepth2.java => repository/entity/AddressDepth2Entity.java} (60%) create mode 100644 src/main/java/kr/pickple/back/address/repository/entity/AddressEntity.java diff --git a/src/main/java/kr/pickple/back/address/domain/Address.java b/src/main/java/kr/pickple/back/address/domain/Address.java new file mode 100644 index 00000000..b7a18d3f --- /dev/null +++ b/src/main/java/kr/pickple/back/address/domain/Address.java @@ -0,0 +1,15 @@ +package kr.pickple.back.address.domain; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Address { + + private Long id; + private String name; +} diff --git a/src/main/java/kr/pickple/back/address/domain/AllAddress.java b/src/main/java/kr/pickple/back/address/domain/AllAddress.java new file mode 100644 index 00000000..a8c2533a --- /dev/null +++ b/src/main/java/kr/pickple/back/address/domain/AllAddress.java @@ -0,0 +1,17 @@ +package kr.pickple.back.address.domain; + +import java.util.List; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class AllAddress { + + private String addressDepth1Name; + private List addressDepth2Names; +} diff --git a/src/main/java/kr/pickple/back/address/implement/AddressMapper.java b/src/main/java/kr/pickple/back/address/implement/AddressMapper.java new file mode 100644 index 00000000..32463d27 --- /dev/null +++ b/src/main/java/kr/pickple/back/address/implement/AddressMapper.java @@ -0,0 +1,38 @@ +package kr.pickple.back.address.implement; + +import java.util.List; + +import kr.pickple.back.address.domain.Address; +import kr.pickple.back.address.domain.AllAddress; +import kr.pickple.back.address.domain.MainAddress; +import kr.pickple.back.address.repository.entity.AddressEntity; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class AddressMapper { + + public static AllAddress mapToAllAddressDomain( + final String addressDepth1Name, + final List addressDepth2Names + ) { + return AllAddress.builder() + .addressDepth1Name(addressDepth1Name) + .addressDepth2Names(addressDepth2Names) + .build(); + } + + public static MainAddress mapToMainAddressDomain(final Address addressDepth1, final Address addressDepth2) { + return MainAddress.builder() + .addressDepth1(addressDepth1) + .addressDepth2(addressDepth2) + .build(); + } + + public static Address mapAddressEntityToDomain(final AddressEntity addressEntity) { + return Address.builder() + .id(addressEntity.getId()) + .name(addressEntity.getName()) + .build(); + } +} diff --git a/src/main/java/kr/pickple/back/address/implement/AddressReader.java b/src/main/java/kr/pickple/back/address/implement/AddressReader.java index 4aff9bd3..49867baa 100644 --- a/src/main/java/kr/pickple/back/address/implement/AddressReader.java +++ b/src/main/java/kr/pickple/back/address/implement/AddressReader.java @@ -8,13 +8,13 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.AllAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.exception.AddressException; import kr.pickple.back.address.repository.AddressDepth1Repository; import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.address.util.AddressParser; import lombok.RequiredArgsConstructor; @@ -26,72 +26,62 @@ public class AddressReader { private final AddressDepth1Repository addressDepth1Repository; private final AddressDepth2Repository addressDepth2Repository; + /** + * 지역 목록 조회 + */ @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "address", key = "'all'") - public AllAddressResponse readAllAddress() { - final AddressDepth1 addressDepth1 = addressDepth1Repository.findAll() - .get(0); - - final List addressDepth2List = addressDepth2Repository.findByAddressDepth1(addressDepth1) + public AllAddress readAllAddress() { + final AddressDepth1Entity addressDepth1Entity = addressDepth1Repository.findAll().get(0); + final List addressDepth2Names = addressDepth2Repository.findAllByAddressDepth1Id( + addressDepth1Entity.getId()) .stream() - .map(AddressDepth2::getName) + .map(AddressDepth2Entity::getName) .toList(); - return AllAddressResponse.builder() - .addressDepth1(addressDepth1.getName()) - .addressDepth2List(addressDepth2List) - .build(); + return AddressMapper.mapToAllAddressDomain(addressDepth1Entity.getName(), addressDepth2Names); } - public MainAddress readMainAddressByNames(final String addressDepth1Name, final String addressDepth2Name) { - final AddressDepth1 addressDepth1 = getAddressDepth1ByName(addressDepth1Name); - final AddressDepth2 addressDepth2 = getAddressDepth2ByNamesAndAddressDepth1( - addressDepth1Name, - addressDepth2Name, - addressDepth1 - ); + /** + * 주소1과 주소2의 ID를 통해 MainAddress 조회 + */ + public MainAddress readMainAddressByIds(final Long addressDepth1Id, final Long addressDepth2Id) { + final AddressDepth1Entity addressDepth1Entity = addressDepth1Repository.findById(addressDepth1Id) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Id)); - return MainAddress.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); + final AddressDepth2Entity addressDepth2Entity = addressDepth2Repository.findById(addressDepth2Id) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth2Id)); + + return AddressMapper.mapToMainAddressDomain( + AddressMapper.mapAddressEntityToDomain(addressDepth1Entity), + AddressMapper.mapAddressEntityToDomain(addressDepth2Entity) + ); } - private AddressDepth1 getAddressDepth1ByName(final String addressDepth1Name) { - return addressDepth1Repository.findByName(addressDepth1Name) + /** + * 주소1과 주소2의 이름을 통해 MainAddress 조회 + */ + public MainAddress readMainAddressByNames(final String addressDepth1Name, final String addressDepth2Name) { + final AddressDepth1Entity addressDepth1Entity = addressDepth1Repository.findByName(addressDepth1Name) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); - } - private AddressDepth2 getAddressDepth2ByNamesAndAddressDepth1( - final String addressDepth1Name, - final String addressDepth2Name, - final AddressDepth1 addressDepth1 - ) { - return addressDepth2Repository.findByNameAndAddressDepth1(addressDepth2Name, addressDepth1) + final AddressDepth2Entity addressDepth2Entity = addressDepth2Repository.findByNameAndAddressDepth1Id( + addressDepth2Name, addressDepth1Entity.getId()) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); - } - - //기존 메서드 네이밍 및 시그니처 유지를 위해 임시적으로 아래와 구현했습니다. - //todo 현호:서로 다른 입력을 받아 MainAddressResponse를 반환하는 두 메서드를 어떻게 통합하면 좋을 지 논의해보면 좋겠습니다. - public MainAddress readMainAddressByAddressStrings(final String mainAddress) { - final List depthedAddress = AddressParser.splitToAddressDepth1And2(mainAddress); - - return readMainAddressByNames(depthedAddress.get(0), depthedAddress.get(1)); - } - public MainAddress readMainAddressById(final Long addressDepth1Id, final Long addressDepth2Id) { - return MainAddress.builder() - .addressDepth1(getAddressDepth1ById(addressDepth1Id)) - .addressDepth2(getAddressDepth2ById(addressDepth2Id)) - .build(); + return AddressMapper.mapToMainAddressDomain( + AddressMapper.mapAddressEntityToDomain(addressDepth1Entity), + AddressMapper.mapAddressEntityToDomain(addressDepth2Entity) + ); } - private AddressDepth1 getAddressDepth1ById(final Long addressDepth1Id) { - return addressDepth1Repository.findById(addressDepth1Id) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Id)); - } + /** + * 전체 주소를 주소1과 주소2로 나누고, 이를 이용해 MainAddress 조회 + */ + public MainAddress readMainAddressFromFullAddress(final String mainAddressName) { + final List addressDepth1And2Names = AddressParser.splitToAddressDepth1And2(mainAddressName); + final String addressDepth1Name = addressDepth1And2Names.get(0); + final String addressDepth2Name = addressDepth1And2Names.get(1); - public AddressDepth2 getAddressDepth2ById(final Long addressDepth2Id) { - return addressDepth2Repository.findById(addressDepth2Id) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth2Id)); + return readMainAddressByNames(addressDepth1Name, addressDepth2Name); } } diff --git a/src/main/java/kr/pickple/back/address/repository/AddressDepth1Repository.java b/src/main/java/kr/pickple/back/address/repository/AddressDepth1Repository.java index 42a0679c..97a77e27 100644 --- a/src/main/java/kr/pickple/back/address/repository/AddressDepth1Repository.java +++ b/src/main/java/kr/pickple/back/address/repository/AddressDepth1Repository.java @@ -4,9 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.address.domain.AddressDepth1; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -public interface AddressDepth1Repository extends JpaRepository { +public interface AddressDepth1Repository extends JpaRepository { - Optional findByName(final String name); + Optional findByName(final String name); } diff --git a/src/main/java/kr/pickple/back/address/repository/AddressDepth2Repository.java b/src/main/java/kr/pickple/back/address/repository/AddressDepth2Repository.java index 5721c897..01f1b567 100644 --- a/src/main/java/kr/pickple/back/address/repository/AddressDepth2Repository.java +++ b/src/main/java/kr/pickple/back/address/repository/AddressDepth2Repository.java @@ -5,12 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -public interface AddressDepth2Repository extends JpaRepository { +public interface AddressDepth2Repository extends JpaRepository { - List findByAddressDepth1(final AddressDepth1 addressDepth1); + List findAllByAddressDepth1Id(final Long addressDepth1Id); - Optional findByNameAndAddressDepth1(final String name, final AddressDepth1 addressDepth1); + Optional findByNameAndAddressDepth1Id(final String name, final Long addressDepth1Id); } diff --git a/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java similarity index 78% rename from src/main/java/kr/pickple/back/address/domain/AddressDepth1.java rename to src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java index ef181549..c650f949 100644 --- a/src/main/java/kr/pickple/back/address/domain/AddressDepth1.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java @@ -1,4 +1,4 @@ -package kr.pickple.back.address.domain; +package kr.pickple.back.address.repository.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -15,7 +15,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AddressDepth1 extends BaseEntity { +public class AddressDepth1Entity extends BaseEntity implements AddressEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -26,7 +26,7 @@ public class AddressDepth1 extends BaseEntity { private String name; @Builder - private AddressDepth1(final String name) { + private AddressDepth1Entity(final String name) { this.name = name; } } diff --git a/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java similarity index 60% rename from src/main/java/kr/pickple/back/address/domain/AddressDepth2.java rename to src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java index f632dfc6..34d25c26 100644 --- a/src/main/java/kr/pickple/back/address/domain/AddressDepth2.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java @@ -1,13 +1,10 @@ -package kr.pickple.back.address.domain; +package kr.pickple.back.address.repository.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import lombok.AccessLevel; @@ -18,7 +15,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class AddressDepth2 extends BaseEntity { +public class AddressDepth2Entity extends BaseEntity implements AddressEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,13 +26,11 @@ public class AddressDepth2 extends BaseEntity { private String name; @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "address_depth1_id") - private AddressDepth1 addressDepth1; + private Long addressDepth1Id; @Builder - private AddressDepth2(final String name, final AddressDepth1 addressDepth1) { + private AddressDepth2Entity(final String name, final Long addressDepth1Id) { this.name = name; - this.addressDepth1 = addressDepth1; + this.addressDepth1Id = addressDepth1Id; } } diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressEntity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressEntity.java new file mode 100644 index 00000000..2647f9a2 --- /dev/null +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressEntity.java @@ -0,0 +1,8 @@ +package kr.pickple.back.address.repository.entity; + +public interface AddressEntity { + + Long getId(); + + String getName(); +} diff --git a/src/main/java/kr/pickple/back/address/service/AddressService.java b/src/main/java/kr/pickple/back/address/service/AddressService.java index 2e5c529e..d3b861f0 100644 --- a/src/main/java/kr/pickple/back/address/service/AddressService.java +++ b/src/main/java/kr/pickple/back/address/service/AddressService.java @@ -1,18 +1,29 @@ package kr.pickple.back.address.service; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.domain.AllAddress; import kr.pickple.back.address.dto.response.AllAddressResponse; import kr.pickple.back.address.implement.AddressReader; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class AddressService { private final AddressReader addressReader; + /** + * 지역 목록 조회 + */ public AllAddressResponse findAllAddress() { - return addressReader.readAllAddress(); + final AllAddress allAddress = addressReader.readAllAddress(); + + return AllAddressResponse.builder() + .addressDepth1(allAddress.getAddressDepth1Name()) + .addressDepth2List(allAddress.getAddressDepth2Names()) + .build(); } } diff --git a/src/main/java/kr/pickple/back/address/util/AddressParser.java b/src/main/java/kr/pickple/back/address/util/AddressParser.java index f34b92fc..958c5c19 100644 --- a/src/main/java/kr/pickple/back/address/util/AddressParser.java +++ b/src/main/java/kr/pickple/back/address/util/AddressParser.java @@ -8,14 +8,14 @@ public final class AddressParser { public static final int ADDRESS_DEPTH_SIZE = 2; private static final String ADDRESS_DELIMITER_REGEX = "[\\s+]"; - public static List splitToAddressDepth1And2(final String mainAddress) { - return Arrays.stream(mainAddress.split(ADDRESS_DELIMITER_REGEX)) + public static List splitToAddressDepth1And2(final String mainAddressName) { + return Arrays.stream(mainAddressName.split(ADDRESS_DELIMITER_REGEX)) .limit(ADDRESS_DEPTH_SIZE) .map(AddressParser::addCitySuffixToFirstAddress) .toList(); } - private static String addCitySuffixToFirstAddress(final String addressDepth1) { - return addressDepth1.equals("서울") ? "서울시" : addressDepth1; + private static String addCitySuffixToFirstAddress(final String firstAddressName) { + return firstAddressName.equals("서울") ? "서울시" : firstAddressName; } } From b9589e83f73f9d90171e692eabb40fd5ace8bfd3 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 9 Mar 2024 03:46:57 +0900 Subject: [PATCH 090/117] =?UTF-8?q?refactor:=20=EC=A3=BC=EC=86=8C=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9D=98=20AddressDepth1,=20Address?= =?UTF-8?q?Depth2=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=B4=20repository=EC=9D=98=20entity?= =?UTF-8?q?=20=ED=8F=B4=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EA=B4=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/domain/MainAddress.java | 29 ++++++++++ .../address/dto/response/MainAddress.java | 17 ------ .../back/auth/service/OauthService.java | 4 +- .../repository/entity/ChatRoomEntity.java | 12 ----- .../back/crew/implement/CrewMapper.java | 14 ++--- .../back/crew/implement/CrewReader.java | 10 ++-- .../back/crew/implement/CrewWriter.java | 2 +- .../crew/repository/entity/CrewEntity.java | 6 --- .../game/dto/mapper/GameRequestMapper.java | 6 +-- .../game/dto/request/GameCreateRequest.java | 26 --------- .../back/game/implement/GameMapper.java | 10 ++-- .../back/game/implement/GameReader.java | 33 +++++++++--- .../back/game/implement/GameWriter.java | 2 +- .../game/repository/GameMemberRepository.java | 2 - .../game/repository/GameSearchRepository.java | 9 ++-- .../repository/GameSearchRepositoryImpl.java | 53 ++++++++++--------- .../back/game/service/GameFacadeService.java | 9 ++-- .../back/game/service/GameService.java | 4 +- .../pickple/back/map/domain/MapPolygon.java | 8 +-- .../pickple/back/map/service/MapService.java | 6 +-- .../response/AuthenticatedMemberResponse.java | 6 +-- .../member/dto/response/MemberResponse.java | 22 -------- .../back/member/implement/MemberMapper.java | 18 +++---- .../back/member/implement/MemberReader.java | 8 +-- .../back/member/implement/MemberWriter.java | 2 +- .../back/position/domain/Position.java | 15 ------ .../address/service/AddressServiceTest.java | 6 +-- .../back/auth/service/AuthServiceTest.java | 8 +-- .../controller/CrewEntityControllerTest.java | 8 +-- .../crew/docs/CrewEntityDocumentTest.java | 8 +-- .../back/fixture/domain/AddressFixtures.java | 14 ++--- .../back/fixture/domain/CrewFixtures.java | 12 ++--- .../back/fixture/domain/GameFixtures.java | 8 +-- .../back/fixture/domain/MemberFixtures.java | 12 ++--- .../back/fixture/dto/AddressDtoFixtures.java | 31 ----------- .../back/fixture/setup/AddressSetup.java | 10 ++-- .../pickple/back/fixture/setup/CrewSetup.java | 8 +-- .../pickple/back/fixture/setup/GameSetup.java | 8 +-- .../back/fixture/setup/MemberSetup.java | 12 ++--- .../game/service/GameEntityServiceTest.java | 8 +-- .../back/member/domain/MemberEntityTest.java | 12 ++--- .../MemberEntityCrewServiceTestEntity.java | 8 +-- .../service/MemberEntityServiceTest.java | 14 ++--- 43 files changed, 221 insertions(+), 299 deletions(-) create mode 100644 src/main/java/kr/pickple/back/address/domain/MainAddress.java delete mode 100644 src/main/java/kr/pickple/back/address/dto/response/MainAddress.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java diff --git a/src/main/java/kr/pickple/back/address/domain/MainAddress.java b/src/main/java/kr/pickple/back/address/domain/MainAddress.java new file mode 100644 index 00000000..b85f15f7 --- /dev/null +++ b/src/main/java/kr/pickple/back/address/domain/MainAddress.java @@ -0,0 +1,29 @@ +package kr.pickple.back.address.domain; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; + +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MainAddress { + + private Address addressDepth1; + private Address addressDepth2; + + public Long getAddressDepth1Id() { + return this.addressDepth1.getId(); + } + + public String getAddressDepth1Name() { + return this.addressDepth1.getName(); + } + + public Long getAddressDepth2Id() { + return this.addressDepth2.getId(); + } + + public String getAddressDepth2Name() { + return this.addressDepth2.getName(); + } +} diff --git a/src/main/java/kr/pickple/back/address/dto/response/MainAddress.java b/src/main/java/kr/pickple/back/address/dto/response/MainAddress.java deleted file mode 100644 index b6e730ae..00000000 --- a/src/main/java/kr/pickple/back/address/dto/response/MainAddress.java +++ /dev/null @@ -1,17 +0,0 @@ -package kr.pickple.back.address.dto.response; - -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -@AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MainAddress { - - private AddressDepth1 addressDepth1; - private AddressDepth2 addressDepth2; -} diff --git a/src/main/java/kr/pickple/back/auth/service/OauthService.java b/src/main/java/kr/pickple/back/auth/service/OauthService.java index 46175bf0..5a62a1b7 100644 --- a/src/main/java/kr/pickple/back/auth/service/OauthService.java +++ b/src/main/java/kr/pickple/back/auth/service/OauthService.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.TokenExtractor; @@ -73,7 +73,7 @@ public AuthenticatedMemberResponse processLoginOrRegistration( jwtProperties.getRefreshTokenExpirationTime() ); - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( loginMember.getAddressDepth1Id(), loginMember.getAddressDepth2Id() ); diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java index 41cc9f25..314d0f1b 100644 --- a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java @@ -1,7 +1,5 @@ package kr.pickple.back.chat.repository.entity; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; - import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; @@ -10,7 +8,6 @@ import jakarta.persistence.Id; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.RoomType; -import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.chat.util.RoomTypeAttributeConverter; import kr.pickple.back.common.domain.BaseEntity; import lombok.AccessLevel; @@ -47,13 +44,4 @@ private ChatRoomEntity(final String name, final RoomType type, final Integer max this.type = type; this.maxMemberCount = maxMemberCount; } - - // TODO : Crew, Game 수정하면서 제거 예정 (김영주) - public void updateMaxMemberCount(final Integer maxMemberCount) { - if (maxMemberCount < memberCount) { - throw new ChatException(CHAT_MAX_MEMBER_COUNT_SHOULD_BE_BIGGER_THAN_MEMBER_COUNT, maxMemberCount); - } - - this.maxMemberCount = maxMemberCount; - } } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index d2a16add..7833572a 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -2,7 +2,7 @@ import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.domain.CrewMember; import kr.pickple.back.crew.domain.CrewProfile; @@ -24,8 +24,8 @@ public static CrewEntity mapNewCrewDomainToEntity(final NewCrew newCrew, final M .leaderId(newCrew.getLeader().getMemberId()) .profileImageUrl(newCrew.getProfileImageUrl()) .backgroundImageUrl(newCrew.getBackgroundImageUrl()) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .addressDepth1Id(mainAddress.getAddressDepth1Id()) + .addressDepth2Id(mainAddress.getAddressDepth2Id()) .chatRoomId(newCrew.getChatRoom().getChatRoomId()) .build(); } @@ -42,8 +42,8 @@ public static Crew mapCrewEntityToDomain( .memberCount(crewEntity.getMemberCount()) .maxMemberCount(crewEntity.getMaxMemberCount()) .leader(leader) - .addressDepth1Name(mainAddress.getAddressDepth1().getName()) - .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1Name()) + .addressDepth2Name(mainAddress.getAddressDepth2Name()) .profileImageUrl(crewEntity.getProfileImageUrl()) .backgroundImageUrl(crewEntity.getBackgroundImageUrl()) .likeCount(crewEntity.getLikeCount()) @@ -90,8 +90,8 @@ public static CrewProfile mapCrewEntityToCrewProfile( .likeCount(crewEntity.getLikeCount()) .competitionPoint(crewEntity.getCompetitionPoint()) .leader(leader) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1Name()) + .addressDepth2(mainAddress.getAddressDepth2Name()) .members(members) .build(); } diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java index 3c9f9b19..16fc76bb 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewReader.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewReader.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.common.domain.RegistrationStatus; @@ -60,7 +60,7 @@ public Crew readByChatRoomId(final Long chatRoomId) { } private Crew mapCrewEntityToDomain(final CrewEntity crewEntity) { - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() ); @@ -77,8 +77,8 @@ public List readNearCrewsByAddress( ) { final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); final Page crewEntities = crewRepository.findByAddressDepth1IdAndAddressDepth2Id( - mainAddress.getAddressDepth1().getId(), - mainAddress.getAddressDepth2().getId(), + mainAddress.getAddressDepth1Id(), + mainAddress.getAddressDepth2Id(), pageable ); @@ -132,7 +132,7 @@ private List mapCrewEntitiesToCrewProfiles( return crewEntities.stream() .map(crew -> { final List members = readAllMembersInStatus(crew.getId(), registrationStatus); - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( crew.getAddressDepth1Id(), crew.getAddressDepth2Id() ); diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 5bb363ec..1a76f8ee 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.domain.Crew; diff --git a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java index 716980d3..8f7d57a8 100644 --- a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java +++ b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java @@ -10,7 +10,6 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.crew.domain.CrewStatus; import kr.pickple.back.crew.util.CrewStatusConverter; @@ -98,9 +97,4 @@ private CrewEntity( public Boolean isLeader(final Long memberId) { return memberId.equals(leaderId); } - - public void makeNewCrewChatRoom(final ChatRoomEntity chatRoom) { - chatRoom.updateMaxMemberCount(maxMemberCount); - this.chatRoomId = chatRoom.getId(); - } } diff --git a/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java index c363b379..fbac5d50 100644 --- a/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java +++ b/src/main/java/kr/pickple/back/game/dto/mapper/GameRequestMapper.java @@ -2,7 +2,7 @@ import java.time.LocalTime; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.dto.request.GameCreateRequest; @@ -23,8 +23,8 @@ public static NewGame mapToNewGameDomain(final GameCreateRequest gameCreateReque .cost(gameCreateRequest.getCost()) .maxMemberCount(gameCreateRequest.getMaxMemberCount()) .positions(gameCreateRequest.getPositions()) - .addressDepth1Name(mainAddress.getAddressDepth1().getName()) - .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1Name()) + .addressDepth2Name(mainAddress.getAddressDepth2Name()) .build(); } } diff --git a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java index 6fe41aac..0ec1c929 100644 --- a/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java +++ b/src/main/java/kr/pickple/back/game/dto/request/GameCreateRequest.java @@ -4,8 +4,6 @@ import java.time.LocalTime; import java.util.List; -import org.locationtech.jts.geom.Point; - import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.Max; @@ -15,8 +13,6 @@ import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -64,26 +60,4 @@ public class GameCreateRequest { @NotNull(message = "포지션 목록은 null일 수 없음") private List positions; - - public GameEntity toEntity( - final Long hostId, - final MainAddress mainAddress, - final Point point - ) { - return GameEntity.builder() - .content(content) - .playDate(playDate) - .playStartTime(playStartTime) - .playEndTime(playStartTime.plusMinutes(playTimeMinutes)) - .playTimeMinutes(playTimeMinutes) - .mainAddress(this.mainAddress) - .detailAddress(detailAddress) - .cost(cost) - .maxMemberCount(maxMemberCount) - .hostId(hostId) - .point(point) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index e060184f..488441dc 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -4,7 +4,7 @@ import org.locationtech.jts.geom.Point; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.repository.entity.GameEntity; @@ -40,8 +40,8 @@ public static Game mapGameEntityToDomain( .memberCount(gameEntity.getMemberCount()) .maxMemberCount(gameEntity.getMaxMemberCount()) .host(host) - .addressDepth1Name(mainAddress.getAddressDepth1().getName()) - .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1Name()) + .addressDepth2Name(mainAddress.getAddressDepth2Name()) .positions(positions) .build(); } @@ -63,8 +63,8 @@ public static GameEntity mapNewGameDomainToEntity( .maxMemberCount(newGame.getMaxMemberCount()) .hostId(newGame.getHost().getMemberId()) .point(point) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .addressDepth1Id(mainAddress.getAddressDepth1Id()) + .addressDepth2Id(mainAddress.getAddressDepth2Id()) .chatRoomId(newGame.getChatRoom().getChatRoomId()) .build(); } diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 840f70e5..6b2bcf63 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -1,5 +1,6 @@ package kr.pickple.back.game.implement; +import static kr.pickple.back.address.exception.AddressExceptionCode.*; import static kr.pickple.back.chat.exception.ChatExceptionCode.*; import static kr.pickple.back.game.exception.GameExceptionCode.*; @@ -12,8 +13,13 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; +import kr.pickple.back.address.exception.AddressException; import kr.pickple.back.address.implement.AddressReader; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.chat.exception.ChatException; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.GameStatus; @@ -33,6 +39,8 @@ public class GameReader { private final AddressReader addressReader; + private final AddressDepth1Repository addressDepth1Repository; + private final AddressDepth2Repository addressDepth2Repository; private final MemberReader memberReader; private final GameRepository gameRepository; private final GamePositionRepository gamePositionRepository; @@ -65,7 +73,7 @@ private Game mapGameEntityToDomain(final GameEntity gameEntity) { final List positions = readPositionsByGameId(gameEntity.getId()); - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( gameEntity.getAddressDepth1Id(), gameEntity.getAddressDepth2Id() ); @@ -84,11 +92,11 @@ public List readAllByAddress(final String address, final Pageable pageable ) ); - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings(address); + final MainAddress mainAddress = addressReader.readMainAddressFromFullAddress(address); final Page gameEntities = gameRepository.findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( - mainAddress.getAddressDepth1().getId(), - mainAddress.getAddressDepth2().getId(), + mainAddress.getAddressDepth1Id(), + mainAddress.getAddressDepth2Id(), GameStatus.ENDED, pageRequest ); @@ -103,9 +111,18 @@ public List readAllByAddress(final String address, final Pageable pageable } public List readAllWithInAddress(final MainAddress mainAddress) { + final String addressDepth1Name = mainAddress.getAddressDepth1Name(); + final String addressDepth2Name = mainAddress.getAddressDepth2Name(); + + final AddressDepth1Entity addressDepth1Entity = addressDepth1Repository.findByName(addressDepth1Name) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name)); + final AddressDepth2Entity addressDepth2Entity = addressDepth2Repository.findByNameAndAddressDepth1Id( + addressDepth2Name, addressDepth1Entity.getId()) + .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, addressDepth1Name, addressDepth2Name)); + final List gameEntities = gameRepository.findGamesWithInAddress( - mainAddress.getAddressDepth1(), - mainAddress.getAddressDepth2() + addressDepth1Entity, + addressDepth2Entity ); return gameEntities.stream() @@ -127,7 +144,7 @@ public List readAllWithInDistance( return gameEntities.stream() .map(gameEntity -> GameMapper.mapGameEntityToDomain( gameEntity, - addressReader.readMainAddressById( + addressReader.readMainAddressByIds( gameEntity.getAddressDepth1Id(), gameEntity.getAddressDepth2Id() ), diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 4e353417..1d18ed14 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -9,7 +9,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.address.service.kakao.KakaoAddressSearchClient; import kr.pickple.back.game.domain.Game; diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 2666cf26..0475c4d4 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -21,8 +21,6 @@ Optional findByMemberIdAndGameIdAndStatus( List findAllByMemberIdAndStatus(final Long memberId, final RegistrationStatus memberStatus); - List findAllByMemberId(final Long memberId); - List findAllByGameIdAndStatus(final Long gameId, final RegistrationStatus status); Boolean existsByGameIdAndMemberId(final Long gameId, final Long memberId); diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java index c906b93e..80cc8173 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepository.java @@ -2,13 +2,16 @@ import java.util.List; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.game.repository.entity.GameEntity; public interface GameSearchRepository { List findGamesWithInDistance(final Double latitude, final Double longitude, final Double distance); - List findGamesWithInAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2); + List findGamesWithInAddress( + final AddressDepth1Entity addressDepth1Entity, + final AddressDepth2Entity addressDepth2Entity + ); } diff --git a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java index f2ee11d5..97f41eb7 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java +++ b/src/main/java/kr/pickple/back/game/repository/GameSearchRepositoryImpl.java @@ -1,6 +1,6 @@ package kr.pickple.back.game.repository; -import static kr.pickple.back.game.domain.QGame.*; +import static kr.pickple.back.game.repository.entity.QGameEntity.*; import static kr.pickple.back.map.domain.QMapPolygon.*; import java.util.List; @@ -10,8 +10,8 @@ import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.game.repository.entity.GameEntity; import lombok.RequiredArgsConstructor; @@ -29,7 +29,7 @@ public List findGamesWithInDistance( final String pointWKT = String.format("POINT(%s %s)", latitude, longitude); return jpaQueryFactory - .selectFrom(game) + .selectFrom(gameEntity) .where(isWithInDistance(pointWKT, distance)) .orderBy(getOrderByDistance(pointWKT)) .fetch(); @@ -45,23 +45,22 @@ private BooleanExpression isWithInDistance(final String pointWKT, final Double d private OrderSpecifier getOrderByDistance(final String pointWKT) { return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", - pointWKT - ) - .asc(); + Double.class, + "ST_Distance_Sphere(point, ST_GeomFromText({0}, 4326))", + pointWKT + ).asc(); } @Override public List findGamesWithInAddress( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final AddressDepth1Entity addressDepth1Entity, + final AddressDepth2Entity addressDepth2Entity ) { return jpaQueryFactory - .select(game) - .from(game) + .select(gameEntity) + .from(gameEntity) .join(mapPolygon).on(isWithInAddress()) - .where(isAddress(addressDepth1, addressDepth2)) + .where(isAddress(addressDepth1Entity, addressDepth2Entity)) .orderBy(getOrderByAddress()) .fetch(); } @@ -70,28 +69,30 @@ private BooleanExpression isWithInAddress() { return Expressions.booleanTemplate( "ST_Contains({0}, {1})", mapPolygon.polygon, - game.point + gameEntity.point ); } - private BooleanExpression isAddress(final AddressDepth1 addressDepth1, final AddressDepth2 addressDepth2) { - return isAddressDepth1(addressDepth1).and(isAddressDepth2(addressDepth2)); + private BooleanExpression isAddress( + final AddressDepth1Entity addressDepth1Entity, + final AddressDepth2Entity addressDepth2Entity + ) { + return isAddressDepth1(addressDepth1Entity).and(isAddressDepth2(addressDepth2Entity)); } - private BooleanExpression isAddressDepth1(final AddressDepth1 addressDepth1) { - return mapPolygon.addressDepth1.eq(addressDepth1); + private BooleanExpression isAddressDepth1(final AddressDepth1Entity addressDepth1Entity) { + return mapPolygon.addressDepth1.eq(addressDepth1Entity); } - private BooleanExpression isAddressDepth2(final AddressDepth2 addressDepth2) { - return mapPolygon.addressDepth2.eq(addressDepth2); + private BooleanExpression isAddressDepth2(final AddressDepth2Entity addressDepth2Entity) { + return mapPolygon.addressDepth2.eq(addressDepth2Entity); } private OrderSpecifier getOrderByAddress() { return Expressions.numberTemplate( - Double.class, - "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", - game.point, mapPolygon.latitude, mapPolygon.longitude - ) - .asc(); + Double.class, + "ST_Distance_Sphere({0}, ST_GeomFromText('POINT(' || {1} || ' ' || {2} || ')', 4326))", + gameEntity.point, mapPolygon.latitude, mapPolygon.longitude + ).asc(); } } diff --git a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java index 2dc11f9b..17b79cb0 100644 --- a/src/main/java/kr/pickple/back/game/service/GameFacadeService.java +++ b/src/main/java/kr/pickple/back/game/service/GameFacadeService.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Component; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.dto.mapper.GameResponseMapper; @@ -30,8 +30,11 @@ public class GameFacadeService { /** * 특정 지역의 게스트 모집글 조회 */ - public GamesAndLocationResponse findGamesWithInAddress(final String addressDepth1, final String addressDepth2) { - final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1, addressDepth2); + public GamesAndLocationResponse findGamesWithInAddress( + final String addressDepth1Name, + final String addressDepth2Name + ) { + final MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); final List games = gameReader.readAllWithInAddress(mainAddress); diff --git a/src/main/java/kr/pickple/back/game/service/GameService.java b/src/main/java/kr/pickple/back/game/service/GameService.java index 4f0508f1..ff0c296f 100644 --- a/src/main/java/kr/pickple/back/game/service/GameService.java +++ b/src/main/java/kr/pickple/back/game/service/GameService.java @@ -15,7 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.chat.domain.ChatRoom; @@ -57,7 +57,7 @@ public class GameService { */ @Transactional public GameIdResponse createGame(final GameCreateRequest gameCreateRequest, final Long loggedInMemberId) { - final MainAddress mainAddress = addressReader.readMainAddressByAddressStrings( + final MainAddress mainAddress = addressReader.readMainAddressFromFullAddress( gameCreateRequest.getMainAddress()); final NewGame newGame = GameRequestMapper.mapToNewGameDomain(gameCreateRequest, mainAddress); final Member host = memberReader.readByMemberId(loggedInMemberId); diff --git a/src/main/java/kr/pickple/back/map/domain/MapPolygon.java b/src/main/java/kr/pickple/back/map/domain/MapPolygon.java index caa66230..0cf58acc 100644 --- a/src/main/java/kr/pickple/back/map/domain/MapPolygon.java +++ b/src/main/java/kr/pickple/back/map/domain/MapPolygon.java @@ -12,8 +12,8 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.validation.constraints.NotNull; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -30,12 +30,12 @@ public class MapPolygon { @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "address_depth1_id") - private AddressDepth1 addressDepth1; + private AddressDepth1Entity addressDepth1; @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "address_depth2_id") - private AddressDepth2 addressDepth2; + private AddressDepth2Entity addressDepth2; @NotNull private BigDecimal latitude; diff --git a/src/main/java/kr/pickple/back/map/service/MapService.java b/src/main/java/kr/pickple/back/map/service/MapService.java index a9f93db0..9c5cc6e2 100644 --- a/src/main/java/kr/pickple/back/map/service/MapService.java +++ b/src/main/java/kr/pickple/back/map/service/MapService.java @@ -4,7 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.map.domain.MapPolygon; import kr.pickple.back.map.repository.MapPolygonRepository; import lombok.RequiredArgsConstructor; @@ -20,8 +20,8 @@ public class MapService { public MapPolygon findMapPolygonByMainAddress(final MainAddress mainAddress) { return mapPolygonRepository.findByAddressDepth1IdAndAddressDepth2Id( - mainAddress.getAddressDepth1().getId(), - mainAddress.getAddressDepth2().getId() + mainAddress.getAddressDepth1Id(), + mainAddress.getAddressDepth2Id() ); } } diff --git a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java index 2b946535..3f5f89a8 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/AuthenticatedMemberResponse.java @@ -1,6 +1,6 @@ package kr.pickple.back.member.dto.response; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.auth.domain.oauth.OauthMember; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.auth.domain.token.AuthTokens; @@ -61,8 +61,8 @@ public static AuthenticatedMemberResponse of( .email(member.getEmail()) .oauthId(member.getOauthId()) .oauthProvider(member.getOauthProvider()) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) + .addressDepth1(mainAddress.getAddressDepth1Name()) + .addressDepth2(mainAddress.getAddressDepth2Name()) .build(); } diff --git a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java index 49198e57..95a487f1 100644 --- a/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java +++ b/src/main/java/kr/pickple/back/member/dto/response/MemberResponse.java @@ -2,8 +2,6 @@ import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; -import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -25,24 +23,4 @@ public class MemberResponse { private String addressDepth1; private String addressDepth2; private List positions; - - //TODO: member -> memberDomain 으로 변환 완료되면 삭제 예정 (김영주) - public static MemberResponse of( - final MemberEntity member, - final List positions, - final MainAddress mainAddress - ) { - return MemberResponse.builder() - .id(member.getId()) - .email(member.getEmail()) - .nickname(member.getNickname()) - .introduction(member.getIntroduction()) - .profileImageUrl(member.getProfileImageUrl()) - .mannerScore(member.getMannerScore()) - .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1(mainAddress.getAddressDepth1().getName()) - .addressDepth2(mainAddress.getAddressDepth2().getName()) - .positions(positions) - .build(); - } } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java index 202a52eb..1b488832 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java @@ -2,14 +2,14 @@ import java.util.List; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.crew.domain.Crew; -import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.domain.Member; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.member.domain.MemberProfile; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -25,8 +25,8 @@ public static MemberEntity mapToMemberEntity(final NewMember newMember, final Ma .status(MemberStatus.ACTIVE) .oauthId(newMember.getOauthId()) .oauthProvider(newMember.getOauthProvider()) - .addressDepth1Id(mainAddress.getAddressDepth1().getId()) - .addressDepth2Id(mainAddress.getAddressDepth2().getId()) + .addressDepth1Id(mainAddress.getAddressDepth1Id()) + .addressDepth2Id(mainAddress.getAddressDepth2Id()) .build(); } @@ -56,8 +56,8 @@ public static MemberProfile mapToMemberProfileDomain( .profileImageUrl(member.getProfileImageUrl()) .mannerScore(member.getMannerScore()) .mannerScoreCount(member.getMannerScoreCount()) - .addressDepth1Name(mainAddress.getAddressDepth1().getName()) - .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1Name()) + .addressDepth2Name(mainAddress.getAddressDepth2Name()) .positions(positions) .joinedCrews(crews) .build(); @@ -76,8 +76,8 @@ public static Member mapToMemberDomain( .profileImageUrl(memberEntity.getProfileImageUrl()) .mannerScore(memberEntity.getMannerScore()) .mannerScoreCount(memberEntity.getMannerScoreCount()) - .addressDepth1Name(mainAddress.getAddressDepth1().getName()) - .addressDepth2Name(mainAddress.getAddressDepth2().getName()) + .addressDepth1Name(mainAddress.getAddressDepth1Name()) + .addressDepth2Name(mainAddress.getAddressDepth2Name()) .positions(positions) .build(); } diff --git a/src/main/java/kr/pickple/back/member/implement/MemberReader.java b/src/main/java/kr/pickple/back/member/implement/MemberReader.java index 16a5cab3..9e8d1658 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberReader.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberReader.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.crew.domain.Crew; import kr.pickple.back.crew.exception.CrewException; @@ -51,7 +51,7 @@ public Optional readByOauthId(final Long oauthId) { public Member readByMemberId(final Long memberId) { final MemberEntity memberEntity = readEntityByMemberId(memberId); - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( memberEntity.getAddressDepth1Id(), memberEntity.getAddressDepth2Id() ); @@ -66,7 +66,7 @@ public Member readByMemberId(final Long memberId) { public MemberProfile readProfileByMemberId(final Long memberId) { final MemberEntity member = readEntityByMemberId(memberId); - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( member.getAddressDepth1Id(), member.getAddressDepth2Id() ); @@ -94,7 +94,7 @@ private List readCrewsByMemberId(final Long memberId) { .stream() .map(this::readCrewEntityByCrewId) .map(crewEntity -> { - final MainAddress mainAddress = addressReader.readMainAddressById( + final MainAddress mainAddress = addressReader.readMainAddressByIds( crewEntity.getAddressDepth1Id(), crewEntity.getAddressDepth2Id() ); diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java index c9252d47..9df053a9 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.implement.TokenManager; import kr.pickple.back.member.repository.entity.MemberEntity; diff --git a/src/main/java/kr/pickple/back/position/domain/Position.java b/src/main/java/kr/pickple/back/position/domain/Position.java index 6f15e34e..40a0c6d9 100644 --- a/src/main/java/kr/pickple/back/position/domain/Position.java +++ b/src/main/java/kr/pickple/back/position/domain/Position.java @@ -3,7 +3,6 @@ import static kr.pickple.back.position.exception.PositionExceptionCode.*; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -12,8 +11,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import kr.pickple.back.game.repository.entity.GamePosition; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.exception.PositionException; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -48,16 +45,4 @@ public static Position fromGamePositions(final String positionAcronym) { throw new PositionException(POSITION_NOT_FOUND, positionAcronym); } - - public static List fromMemberPositions(final List memberPositions) { - return memberPositions.stream() - .map(MemberPositionEntity::getPosition) - .toList(); - } - - public static List fromGamePositions(final List gamePositions) { - return gamePositions.stream() - .map(GamePosition::getPosition) - .toList(); - } } diff --git a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java index 046c3300..39b8002d 100644 --- a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java +++ b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java @@ -7,8 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddress; import kr.pickple.back.address.implement.AddressReader; @SpringBootTest @@ -42,7 +42,7 @@ void findMainAddressByNames_ValidAddressNames_ReturnMainAddressInstance() { MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); //then - assertThat(mainAddress.getAddressDepth1().getName()).isEqualTo(addressDepth1Name); - assertThat(mainAddress.getAddressDepth2().getName()).isEqualTo(addressDepth2Name); + assertThat(mainAddress.getAddressDepth1Name()).isEqualTo(addressDepth1Name); + assertThat(mainAddress.getAddressDepth2Name()).isEqualTo(addressDepth2Name); } } diff --git a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java index f921b831..181cdf29 100644 --- a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java +++ b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java @@ -15,8 +15,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.config.resolver.TokenExtractor; import kr.pickple.back.auth.domain.oauth.OauthMember; @@ -86,8 +86,8 @@ void oauthLogin_ReturnAuthenticated() { // given final String authCode = "authCode"; final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); - final AddressDepth1 addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2 addressDepth2 = AddressFixtures.addressDepth2Build(); + final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); + final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); final AuthTokens loginTokens = AuthFixtures.authTokensBuild(); final Long refreshTokenExpirationTime = 10000L; diff --git a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java index 5c7fc729..dcf242f1 100644 --- a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java @@ -1,7 +1,7 @@ package kr.pickple.back.crew.controller; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; @@ -206,8 +206,8 @@ void deleteCrewMember_CrewLeader_Success() throws Exception { void findCrewsByAddress_Success() throws Exception { //given final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final MemberEntity crewLeader = crew.getLeader(); final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) .get(1) diff --git a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java index fd888502..18b610ea 100644 --- a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java @@ -23,8 +23,8 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.epages.restdocs.apispec.SimpleType; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.crew.IntegrationCrewTest; import kr.pickple.back.crew.repository.entity.CrewEntity; @@ -384,8 +384,8 @@ void deleteCrewMember_ReturnVoid() throws Exception { void findCrewsByAddress_ReturnCrews() throws Exception { //given final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); //when final ResultActions resultActions = mockMvc.perform( diff --git a/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java index 06442312..749bf847 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java @@ -1,20 +1,20 @@ package kr.pickple.back.fixture.domain; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; public class AddressFixtures { - public static AddressDepth1 addressDepth1Build() { - return AddressDepth1.builder() + public static AddressDepth1Entity addressDepth1Build() { + return AddressDepth1Entity.builder() .name("서울시") .build(); } - public static AddressDepth2 addressDepth2Build() { - return AddressDepth2.builder() + public static AddressDepth2Entity addressDepth2Build() { + return AddressDepth2Entity.builder() .name("영등포구") - .addressDepth1(addressDepth1Build()) + .addressDepth1Id(addressDepth1Build()) .build(); } } diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java index d1bd17a6..79375338 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java @@ -6,8 +6,8 @@ import java.util.List; import java.util.stream.IntStream; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; @@ -16,8 +16,8 @@ public class CrewFixtures { public static CrewEntity crewBuild( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, + final AddressDepth1Entity addressDepth1, + final AddressDepth2Entity addressDepth2, final MemberEntity leader ) { return CrewEntity.builder() @@ -48,8 +48,8 @@ public static ChatRoomEntity crewChatRoomBuild() { public static List crewsBuild( final Integer count, - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, + final AddressDepth1Entity addressDepth1, + final AddressDepth2Entity addressDepth2, final MemberEntity leader ) { final List crews = new ArrayList<>(); diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java index 82a8f4b5..6e1ff592 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java @@ -11,8 +11,8 @@ import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.PrecisionModel; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.repository.entity.MemberEntity; @@ -21,8 +21,8 @@ public class GameFixtures { public static GameEntity gameBuild( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2, + final AddressDepth1Entity addressDepth1, + final AddressDepth2Entity addressDepth2, final MemberEntity host ) { final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); diff --git a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java index 10c017c2..e938719a 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java @@ -1,7 +1,7 @@ package kr.pickple.back.fixture.domain; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.domain.MemberStatus; @@ -14,8 +14,8 @@ public class MemberFixtures { public static MemberEntity memberBuild( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final AddressDepth1Entity addressDepth1, + final AddressDepth2Entity addressDepth2 ) { return MemberEntity.builder() .email("pickple1@pickple.kr") @@ -32,8 +32,8 @@ public static MemberEntity memberBuild( public static List membersBuild( final int count, - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 + final AddressDepth1Entity addressDepth1, + final AddressDepth2Entity addressDepth2 ) { final List members = new ArrayList<>(); diff --git a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java deleted file mode 100644 index fedf677f..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/AddressDtoFixtures.java +++ /dev/null @@ -1,31 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import java.util.List; - -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.dto.response.MainAddress; - -public class AddressDtoFixtures { - - public static AllAddressResponse allAddressResponseBuild( - final AddressDepth1 addressDepth1, - final List addressDepth2s - ) { - return AllAddressResponse.builder() - .addressDepth1(addressDepth1.getName()) - .addressDepth2List(addressDepth2s.stream().map(AddressDepth2::getName).toList()) - .build(); - } - - public static MainAddress mainAddressBuild( - final AddressDepth1 addressDepth1, - final AddressDepth2 addressDepth2 - ) { - return MainAddress.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java b/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java index fb511738..1d133669 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java @@ -5,11 +5,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; import kr.pickple.back.address.exception.AddressException; import kr.pickple.back.address.repository.AddressDepth1Repository; import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; @Component public class AddressSetup { @@ -20,13 +20,13 @@ public class AddressSetup { @Autowired private AddressDepth2Repository addressDepth2Repository; - public AddressDepth1 findAddressDepth1(String name) { + public AddressDepth1Entity findAddressDepth1(String name) { return addressDepth1Repository.findByName(name) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, name)); } - public AddressDepth2 findAddressDepth2(String name) { - return addressDepth2Repository.findByNameAndAddressDepth1(name, findAddressDepth1("서울시")) + public AddressDepth2Entity findAddressDepth2(String name) { + return addressDepth2Repository.findByNameAndAddressDepth1Id(name, findAddressDepth1("서울시").getId()) .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, name)); } } diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index 4f8896d6..4900e007 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -7,8 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.crew.repository.entity.CrewEntity; @@ -37,8 +37,8 @@ public class CrewSetup { private AddressSetup addressSetup; public CrewEntity save(final MemberEntity leader) { - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final CrewEntity crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); final ChatRoomEntity savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index 033f527c..08e6d3a4 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -7,8 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.chat.repository.ChatRoomRepository; import kr.pickple.back.fixture.domain.GameFixtures; @@ -33,8 +33,8 @@ public class GameSetup { private AddressSetup addressSetup; public GameEntity save(final MemberEntity host) { - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); final ChatRoom savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java index 8252dc30..fe91d444 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java @@ -1,7 +1,7 @@ package kr.pickple.back.fixture.setup; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.repository.MemberRepository; @@ -21,8 +21,8 @@ public class MemberSetup { private AddressSetup addressSetup; public MemberEntity save() { - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final MemberEntity member = MemberFixtures.memberBuild( addressDepth1, @@ -32,8 +32,8 @@ public MemberEntity save() { } public List save(final int count) { - final AddressDepth1 addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2 addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); + final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); final List members = MemberFixtures.membersBuild(count, addressDepth1, addressDepth2); diff --git a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java index caaf10e7..11d6f1a5 100644 --- a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java +++ b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java @@ -13,8 +13,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.fixture.domain.GameFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.game.repository.entity.GameEntity; @@ -35,10 +35,10 @@ public class GameEntityServiceTest { @DisplayName("게스트 모집을 상세 조회할 수 있다.") void findGameById_ReturnGameResponse() { // given - final AddressDepth1 addressDepth1 = AddressDepth1.builder() + final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() .name("서울시") .build(); - final AddressDepth2 addressDepth2 = AddressDepth2.builder() + final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() .name("영등포구") .addressDepth1(addressDepth1) .build(); diff --git a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java index 02139e89..a8f7028c 100644 --- a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java +++ b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java @@ -9,8 +9,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.fixture.domain.AddressFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.exception.MemberException; @@ -22,8 +22,8 @@ class MemberEntityTest { @DisplayName("회원의 매너스코어를 업데이트 시킬 수 있다.") void updateMannerScore() { // given - final AddressDepth1 addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2 addressDepth2 = AddressFixtures.addressDepth2Build(); + final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); + final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); // when & then MANNER_SCORE_POINT_RANGE.forEach((mannerScorePoint) -> { @@ -39,8 +39,8 @@ void updateMannerScore() { @DisplayName("회원의 매너스코어를 업데이트할 때 매너스코어 포인트가 범위에서 벗어난 경우 예외가 발생한다.") void updateMannerScore_ThrowException(int mannerScorePoint) { // given - final AddressDepth1 addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2 addressDepth2 = AddressFixtures.addressDepth2Build(); + final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); + final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); diff --git a/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java b/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java index c1a8d1b5..1055c4f4 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java +++ b/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java @@ -14,8 +14,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.crew.dto.response.CrewProfileResponse; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.repository.entity.MemberEntity; @@ -84,10 +84,10 @@ void findCreatedCrewsByMemberId_ThrowException() { } private MemberEntity buildMember() { - final AddressDepth1 addressDepth1 = AddressDepth1.builder() + final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() .name("서울시") .build(); - final AddressDepth2 addressDepth2 = AddressDepth2.builder() + final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() .name("영등포구") .addressDepth1(addressDepth1) .build(); diff --git a/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java index 1ddf5589..f75903a2 100644 --- a/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java +++ b/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java @@ -13,9 +13,9 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.transaction.annotation.Transactional; -import kr.pickple.back.address.domain.AddressDepth1; -import kr.pickple.back.address.domain.AddressDepth2; -import kr.pickple.back.address.dto.response.MainAddress; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; +import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.config.property.JwtProperties; import kr.pickple.back.auth.domain.token.AuthTokens; @@ -57,10 +57,10 @@ class MemberEntityServiceTest { void createMember_ReturnAuthenticatedMemberResponse() { // given final MemberCreateRequest memberCreateRequest = MemberDtoFixtures.memberCreateRequestBuild(); - final AddressDepth1 addressDepth1 = AddressDepth1.builder() + final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() .name("서울시") .build(); - final AddressDepth2 addressDepth2 = AddressDepth2.builder() + final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() .name("영등포구") .addressDepth1(addressDepth1) .build(); @@ -104,10 +104,10 @@ void findMemberById_ReturnMemberProfileResponse() { } private MemberEntity buildMember() { - final AddressDepth1 addressDepth1 = AddressDepth1.builder() + final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() .name("서울시") .build(); - final AddressDepth2 addressDepth2 = AddressDepth2.builder() + final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() .name("영등포구") .addressDepth1(addressDepth1) .build(); From 4bc0511babe6a150bb27c73a318148cee93a5858 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sat, 9 Mar 2024 04:02:58 +0900 Subject: [PATCH 091/117] =?UTF-8?q?fix:=20MemberRepository=EC=9D=98=20upda?= =?UTF-8?q?teMannerScore=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EB=A1=9C=EC=A7=81=EC=9D=B4=20=EB=B9=84?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EC=96=B4=EC=84=9C=20JPQL=EB=A1=9C=20?= =?UTF-8?q?=EC=83=88=EB=A1=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/kr/pickple/back/game/implement/GameWriter.java | 6 +++++- .../pickple/back/member/repository/MemberRepository.java | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index 1d18ed14..ceb4442f 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -96,7 +96,11 @@ public void reviewMannerScores( } reviewedMember.updateMannerScore(review.getMannerScore()); - memberRepository.updateMannerScore(reviewedMember.getMannerScore(), reviewedMember.getMemberId()); + memberRepository.updateMannerScore( + reviewedMember.getMemberId(), + reviewedMember.getMannerScore(), + reviewedMember.getMannerScoreCount() + ); }); } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index 991b71d0..faecc77e 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -3,6 +3,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import kr.pickple.back.member.repository.entity.MemberEntity; @@ -12,5 +13,9 @@ public interface MemberRepository extends JpaRepository { Optional findByOauthId(final Long oauthId); - void updateMannerScore(Integer mannerScore, Long memberId); + @Query(""" + update MemberEntity m + set m.mannerScore = :mannerScore, m.mannerScoreCount = :mannerScoreCount + where m.id = :memberId""") + void updateMannerScore(final Long memberId, final Integer mannerScore, final Integer mannerScoreCount); } From 3ec1e6ed2f7d0c8606dcafb2115065267c93fc94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 13 Mar 2024 23:17:13 +0900 Subject: [PATCH 092/117] =?UTF-8?q?refactor:=20member=5Fposition=EC=9D=B4?= =?UTF-8?q?=20=EC=97=AC=EB=9F=AC=20=EA=B0=9C=20=EC=83=9D=EC=84=B1=EB=90=A0?= =?UTF-8?q?=20=EB=95=8C=20bulk=20insert=EC=BF=BC=EB=A6=AC=EA=B0=80=20?= =?UTF-8?q?=EB=82=98=EA=B0=80=EB=8F=84=EB=A1=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/member/implement/MemberMapper.java | 13 ------ .../back/member/implement/MemberWriter.java | 9 ++--- .../MemberPositionJdbcRepository.java | 40 +++++++++++++++++++ 3 files changed, 44 insertions(+), 18 deletions(-) create mode 100644 src/main/java/kr/pickple/back/member/repository/MemberPositionJdbcRepository.java diff --git a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java index 1b488832..918f1fcc 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberMapper.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberMapper.java @@ -9,7 +9,6 @@ import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -30,18 +29,6 @@ public static MemberEntity mapToMemberEntity(final NewMember newMember, final Ma .build(); } - public static List mapToMemberPositionEntities( - final List positions, - final Long memberId - ) { - return positions.stream() - .map(position -> MemberPositionEntity.builder() - .memberId(memberId) - .position(position) - .build() - ).toList(); - } - public static MemberProfile mapToMemberProfileDomain( final MemberEntity member, final MainAddress mainAddress, diff --git a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java index 9df053a9..fe50918f 100644 --- a/src/main/java/kr/pickple/back/member/implement/MemberWriter.java +++ b/src/main/java/kr/pickple/back/member/implement/MemberWriter.java @@ -10,12 +10,12 @@ import kr.pickple.back.address.domain.MainAddress; import kr.pickple.back.address.implement.AddressReader; import kr.pickple.back.auth.implement.TokenManager; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.member.exception.MemberException; +import kr.pickple.back.member.repository.MemberPositionJdbcRepository; import kr.pickple.back.member.repository.MemberPositionRepository; import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.position.domain.Position; import lombok.RequiredArgsConstructor; @@ -28,6 +28,7 @@ public class MemberWriter { private final AddressReader addressReader; private final MemberRepository memberRepository; private final MemberPositionRepository memberPositionRepository; + private final MemberPositionJdbcRepository memberPositionJdbcRepository; public NewMember create(final NewMember newMember) { validateIsDuplicatedMemberInfo(newMember); @@ -59,9 +60,7 @@ private void validateIsDuplicatedMemberInfo(final NewMember newMember) { private void setPositionsToMember(final List positions, final Long memberId) { validateIsDuplicatedPositions(positions); - final List memberPositions = MemberMapper.mapToMemberPositionEntities(positions, memberId); - - memberPositionRepository.saveAll(memberPositions); + memberPositionJdbcRepository.creatMemberPositions(positions, memberId); } private void validateIsDuplicatedPositions(final List positions) { diff --git a/src/main/java/kr/pickple/back/member/repository/MemberPositionJdbcRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberPositionJdbcRepository.java new file mode 100644 index 00000000..d6511d69 --- /dev/null +++ b/src/main/java/kr/pickple/back/member/repository/MemberPositionJdbcRepository.java @@ -0,0 +1,40 @@ +package kr.pickple.back.member.repository; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class MemberPositionJdbcRepository { + + private static final String MEMBER_POSITION_INSERT_SQL = "INSERT INTO member_position (position, member_id) VALUES(?, ?)"; + + private final JdbcTemplate jdbcTemplate; + + public void creatMemberPositions(final List positions, final Long memberId) { + jdbcTemplate.batchUpdate( + MEMBER_POSITION_INSERT_SQL, + new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + Position position = positions.get(i); + ps.setString(1, position.getAcronym()); + ps.setLong(2, memberId); + } + + @Override + public int getBatchSize() { + return positions.size(); + } + } + ); + } +} From 4e51da35cec7475e1e2747850b626dda8ce044ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=92=E1=85=A7=E1=86=AB=E1=84=92?= =?UTF-8?q?=E1=85=A9?= Date: Wed, 13 Mar 2024 23:18:02 +0900 Subject: [PATCH 093/117] =?UTF-8?q?refactor:=20game=5Fposition=EB=93=A4?= =?UTF-8?q?=EC=9D=B4=20=EC=83=9D=EC=84=B1=EB=90=A0=20=EB=95=8C=20bulk=20in?= =?UTF-8?q?sert=EC=BF=BC=EB=A6=AC=EA=B0=80=20=EB=82=98=EA=B0=80=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/implement/GameMapper.java | 10 ----- .../back/game/implement/GameWriter.java | 4 +- .../GamePositionJdbcRepository.java | 43 +++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 src/main/java/kr/pickple/back/game/repository/GamePositionJdbcRepository.java diff --git a/src/main/java/kr/pickple/back/game/implement/GameMapper.java b/src/main/java/kr/pickple/back/game/implement/GameMapper.java index 488441dc..135ff9bc 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMapper.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMapper.java @@ -8,7 +8,6 @@ import kr.pickple.back.game.domain.Game; import kr.pickple.back.game.domain.NewGame; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GamePosition; import kr.pickple.back.member.domain.Member; import kr.pickple.back.position.domain.Position; import lombok.AccessLevel; @@ -68,13 +67,4 @@ public static GameEntity mapNewGameDomainToEntity( .chatRoomId(newGame.getChatRoom().getChatRoomId()) .build(); } - - public static List mapToGamePositionEntities(final List positions, final Long gameId) { - return positions.stream() - .map(position -> GamePosition.builder() - .gameId(gameId) - .position(position) - .build() - ).toList(); - } } diff --git a/src/main/java/kr/pickple/back/game/implement/GameWriter.java b/src/main/java/kr/pickple/back/game/implement/GameWriter.java index ceb4442f..28d3e922 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameWriter.java @@ -18,6 +18,7 @@ import kr.pickple.back.game.dto.request.MannerScoreReview; import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionJdbcRepository; import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; @@ -39,6 +40,7 @@ public class GameWriter { private final GameMemberRepository gameMemberRepository; private final GamePositionRepository gamePositionRepository; private final KakaoAddressSearchClient kakaoAddressSearchClient; + private final GamePositionJdbcRepository gamePositionJdbcRepository; public Game create(final NewGame newGame) { final Point point = kakaoAddressSearchClient.fetchAddress(newGame.getMainAddress()); @@ -64,7 +66,7 @@ public Game create(final NewGame newGame) { private void setPositionsToGame(final List positions, final Long gameId) { validateIsDuplicatedPositions(positions); - gamePositionRepository.saveAll(GameMapper.mapToGamePositionEntities(positions, gameId)); + gamePositionJdbcRepository.creatGamePositions(positions, gameId); } private void validateIsDuplicatedPositions(final List positions) { diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionJdbcRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionJdbcRepository.java new file mode 100644 index 00000000..0befbbb5 --- /dev/null +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionJdbcRepository.java @@ -0,0 +1,43 @@ +package kr.pickple.back.game.repository; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; + +import org.springframework.jdbc.core.BatchPreparedStatementSetter; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import kr.pickple.back.position.domain.Position; +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class GamePositionJdbcRepository { + + private static final String GAME_POSITION_INSERT_SQL = "INSERT INTO game_position (position, game_id) VALUES(?, ?)"; + + private final JdbcTemplate jdbcTemplate; + + public void creatGamePositions(final List positions, final Long gameId) { + jdbcTemplate.batchUpdate( + GAME_POSITION_INSERT_SQL, + new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + Position position = positions.get(i); + ps.setString(1, position.getAcronym()); + ps.setLong(2, gameId); + } + + @Override + public int getBatchSize() { + return positions.size(); + } + } + ); + } +} + + + From be64834babd314aa1bfe7cdf9bbf4b2e14041996 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 20 Mar 2024 15:05:02 +0900 Subject: [PATCH 094/117] =?UTF-8?q?refactor:=20=EA=B0=81=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=9D=98=20entity=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20Table=20=EC=9D=B4=EB=A6=84=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/repository/entity/AddressDepth1Entity.java | 2 ++ .../back/address/repository/entity/AddressDepth2Entity.java | 2 ++ .../back/chat/repository/entity/ChatMessageEntity.java | 2 ++ .../pickple/back/chat/repository/entity/ChatRoomEntity.java | 2 ++ .../back/chat/repository/entity/ChatRoomMemberEntity.java | 2 +- .../java/kr/pickple/back/game/implement/GameReader.java | 4 ++-- .../back/game/repository/GamePositionRepository.java | 6 +++--- .../kr/pickple/back/game/repository/entity/GameEntity.java | 2 ++ .../back/game/repository/entity/GameMemberEntity.java | 2 ++ .../entity/{GamePosition.java => GamePositionEntity.java} | 6 ++++-- .../pickple/back/member/repository/entity/MemberEntity.java | 2 ++ .../back/member/repository/entity/MemberPositionEntity.java | 2 ++ 12 files changed, 26 insertions(+), 8 deletions(-) rename src/main/java/kr/pickple/back/game/repository/entity/{GamePosition.java => GamePositionEntity.java} (83%) diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java index c650f949..3f6ae404 100644 --- a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java @@ -5,6 +5,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import lombok.AccessLevel; @@ -14,6 +15,7 @@ @Entity @Getter +@Table(name = "address_depth1") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class AddressDepth1Entity extends BaseEntity implements AddressEntity { diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java index 34d25c26..e4f9900c 100644 --- a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java @@ -5,6 +5,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import lombok.AccessLevel; @@ -14,6 +15,7 @@ @Entity @Getter +@Table(name = "address_depth2") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class AddressDepth2Entity extends BaseEntity implements AddressEntity { diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java index 956b6344..28b771a4 100644 --- a/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatMessageEntity.java @@ -6,6 +6,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.util.MessageTypeAttributeConverter; @@ -17,6 +18,7 @@ @Getter @Entity +@Table(name = "chat_message") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatMessageEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java index 314d0f1b..6f6adda5 100644 --- a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomEntity.java @@ -6,6 +6,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.chat.domain.RoomType; import kr.pickple.back.chat.util.RoomTypeAttributeConverter; @@ -17,6 +18,7 @@ @Getter @Entity +@Table(name = "chat_room") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatRoomEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java index 7070b118..7aefd90a 100644 --- a/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java +++ b/src/main/java/kr/pickple/back/chat/repository/entity/ChatRoomMemberEntity.java @@ -19,7 +19,7 @@ @Entity @Getter -@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"member_id", "chat_room_id"})) +@Table(name = "chat_room_member", uniqueConstraints = @UniqueConstraint(columnNames = {"member_id", "chat_room_id"})) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(of = {"memberId", "chatRoomId"}, callSuper = false) public class ChatRoomMemberEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/game/implement/GameReader.java b/src/main/java/kr/pickple/back/game/implement/GameReader.java index 6b2bcf63..7b5f431b 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameReader.java @@ -27,7 +27,7 @@ import kr.pickple.back.game.repository.GamePositionRepository; import kr.pickple.back.game.repository.GameRepository; import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.game.repository.entity.GamePositionEntity; import kr.pickple.back.member.domain.Member; import kr.pickple.back.member.implement.MemberReader; import kr.pickple.back.position.domain.Position; @@ -156,7 +156,7 @@ public List readAllWithInDistance( private List readPositionsByGameId(final Long gameId) { return gamePositionRepository.findAllByGameId(gameId) .stream() - .map(GamePosition::getPosition) + .map(GamePositionEntity::getPosition) .toList(); } } diff --git a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java index 8c32456d..0d949559 100644 --- a/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GamePositionRepository.java @@ -4,10 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository; -import kr.pickple.back.game.repository.entity.GamePosition; +import kr.pickple.back.game.repository.entity.GamePositionEntity; -public interface GamePositionRepository extends JpaRepository { +public interface GamePositionRepository extends JpaRepository { - List findAllByGameId(final Long gameId); + List findAllByGameId(final Long gameId); } diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java index decf17d5..0968c5f3 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java @@ -14,6 +14,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.game.domain.GameStatus; @@ -25,6 +26,7 @@ @Entity @Getter +@Table(name = "game") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class GameEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java index 534f9a0a..f6df8b80 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameMemberEntity.java @@ -9,6 +9,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.common.domain.RegistrationStatus; @@ -19,6 +20,7 @@ import lombok.NoArgsConstructor; @Entity +@Table(name = "game_member") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class GameMemberEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java b/src/main/java/kr/pickple/back/game/repository/entity/GamePositionEntity.java similarity index 83% rename from src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java rename to src/main/java/kr/pickple/back/game/repository/entity/GamePositionEntity.java index e4a11489..e556ebc5 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GamePosition.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GamePositionEntity.java @@ -6,6 +6,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.position.domain.Position; @@ -16,8 +17,9 @@ import lombok.NoArgsConstructor; @Entity +@Table(name = "game_position") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class GamePosition extends BaseEntity { +public class GamePositionEntity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -33,7 +35,7 @@ public class GamePosition extends BaseEntity { private Long gameId; @Builder - private GamePosition(final Position position, final Long gameId) { + private GamePositionEntity(final Position position, final Long gameId) { this.position = position; this.gameId = gameId; } diff --git a/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java index dc6d6128..3bc82e78 100644 --- a/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java +++ b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java @@ -13,6 +13,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.common.domain.BaseEntity; @@ -27,6 +28,7 @@ @Entity @Getter +@Table(name = "member") @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(of = "id", callSuper = false) public class MemberEntity extends BaseEntity { diff --git a/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java b/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java index c5684ebe..6d18f1c8 100644 --- a/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java +++ b/src/main/java/kr/pickple/back/member/repository/entity/MemberPositionEntity.java @@ -6,6 +6,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; import kr.pickple.back.common.domain.BaseEntity; import kr.pickple.back.position.domain.Position; @@ -17,6 +18,7 @@ @Entity @Getter +@Table(name = "member_position") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class MemberPositionEntity extends BaseEntity { From 67e030e1d801a1c4d56d29af9e4a24520963e838 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 15:21:46 +0900 Subject: [PATCH 095/117] =?UTF-8?q?refactor:=20Entity=EC=97=90=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EC=BB=AC=EB=9F=BC=EB=AA=85=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/repository/entity/AddressDepth2Entity.java | 1 + .../java/kr/pickple/back/crew/repository/entity/CrewEntity.java | 2 ++ .../java/kr/pickple/back/game/repository/entity/GameEntity.java | 2 ++ .../kr/pickple/back/member/repository/entity/MemberEntity.java | 2 ++ 4 files changed, 7 insertions(+) diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java index e4f9900c..a4d70dc0 100644 --- a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java @@ -28,6 +28,7 @@ public class AddressDepth2Entity extends BaseEntity implements AddressEntity { private String name; @NotNull + @Column(name = "address_depth1_id") private Long addressDepth1Id; @Builder diff --git a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java index 8f7d57a8..de0375e3 100644 --- a/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java +++ b/src/main/java/kr/pickple/back/crew/repository/entity/CrewEntity.java @@ -64,9 +64,11 @@ public class CrewEntity extends BaseEntity { private Long leaderId; @NotNull + @Column(name = "address_depth1_id") private Long addressDepth1Id; @NotNull + @Column(name = "address_depth2_id") private Long addressDepth2Id; private Long chatRoomId; diff --git a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java index 0968c5f3..aacd86c6 100644 --- a/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java +++ b/src/main/java/kr/pickple/back/game/repository/entity/GameEntity.java @@ -82,9 +82,11 @@ public class GameEntity extends BaseEntity { private Long hostId; @NotNull + @Column(name = "address_depth1_id") private Long addressDepth1Id; @NotNull + @Column(name = "address_depth2_id") private Long addressDepth2Id; private Long chatRoomId; diff --git a/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java index 3bc82e78..98283b41 100644 --- a/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java +++ b/src/main/java/kr/pickple/back/member/repository/entity/MemberEntity.java @@ -74,9 +74,11 @@ public class MemberEntity extends BaseEntity { private OauthProvider oauthProvider; @NotNull + @Column(name = "address_depth1_id") private Long addressDepth1Id; @NotNull + @Column(name = "address_depth2_id") private Long addressDepth2Id; @Builder From 3864c01c652cf53ebfc62738887192c50407455c Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 20 Mar 2024 19:16:05 +0900 Subject: [PATCH 096/117] =?UTF-8?q?refactor:=20update=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EC=97=90=20@Modifying=20=EC=95=A0=EB=84=88=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/chat/implement/ChatWriter.java | 20 ++++++++++++++----- .../repository/ChatRoomMemberRepository.java | 2 ++ .../chat/repository/ChatRoomRepository.java | 2 ++ .../kr/pickple/back/crew/domain/Crew.java | 7 ++++--- .../back/crew/implement/CrewMapper.java | 1 + .../back/crew/implement/CrewWriter.java | 9 ++++++--- .../crew/repository/CrewMemberRepository.java | 2 ++ .../back/crew/repository/CrewRepository.java | 2 ++ .../back/crew/service/CrewMemberService.java | 5 ++++- .../game/repository/GameMemberRepository.java | 1 + 10 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java index b834460c..c48d40f6 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatWriter.java @@ -1,10 +1,17 @@ package kr.pickple.back.chat.implement; -import static java.lang.Boolean.*; -import static kr.pickple.back.chat.domain.MessageType.*; -import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; +import static kr.pickple.back.chat.domain.MessageType.ENTER; +import static kr.pickple.back.chat.domain.MessageType.LEAVE; +import static kr.pickple.back.chat.domain.RoomType.CREW; +import static kr.pickple.back.chat.domain.RoomType.GAME; +import static kr.pickple.back.chat.domain.RoomType.PERSONAL; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_CREW_CHATROOM_NOT_ALLOWED_TO_LEAVE; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_GAME_CHATROOM_NOT_ALLOWED_TO_LEAVE; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_MEMBER_IS_ALREADY_IN_ROOM; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_MEMBER_IS_NOT_IN_ROOM; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; import java.time.LocalDateTime; import java.util.Optional; @@ -37,6 +44,8 @@ @RequiredArgsConstructor public class ChatWriter { + private static final Integer PERSONAL_ROOM_MAX_MEMBER_COUNT = 2; + private final CrewRepository crewRepository; private final CrewMemberRepository crewMemberRepository; private final GameRepository gameRepository; @@ -48,6 +57,7 @@ public ChatRoom createNewPersonalRoom(final String name) { final ChatRoomEntity chatRoomEntity = ChatRoomEntity.builder() .name(name) .type(PERSONAL) + .maxMemberCount(PERSONAL_ROOM_MAX_MEMBER_COUNT) .build(); final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java index 02f8d9e2..7eaa640c 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomMemberRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; @@ -23,6 +24,7 @@ public interface ChatRoomMemberRepository extends JpaRepository findByChatRoomIdAndMemberIdNot(final Long chatRoomId, final Long memberId); + @Modifying(clearAutomatically = true) @Query(""" update ChatRoomMemberEntity crm set crm.active = :activeStatus diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java index e527784e..a898a8b5 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatRoomRepository.java @@ -1,12 +1,14 @@ package kr.pickple.back.chat.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.chat.repository.entity.ChatRoomEntity; public interface ChatRoomRepository extends JpaRepository { + @Modifying(clearAutomatically = true) @Query("update ChatRoomEntity cr set cr.memberCount = :memberCount where cr.id = :chatRoomId") void updateMemberCount(final Long chatRoomId, final Integer memberCount); } diff --git a/src/main/java/kr/pickple/back/crew/domain/Crew.java b/src/main/java/kr/pickple/back/crew/domain/Crew.java index 06cc0569..8b4d9842 100644 --- a/src/main/java/kr/pickple/back/crew/domain/Crew.java +++ b/src/main/java/kr/pickple/back/crew/domain/Crew.java @@ -1,7 +1,8 @@ package kr.pickple.back.crew.domain; -import static kr.pickple.back.crew.domain.CrewStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.crew.domain.CrewStatus.CLOSED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_CAPACITY_LIMIT_REACHED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_STATUS_IS_CLOSED; import kr.pickple.back.chat.domain.ChatRoom; import kr.pickple.back.crew.exception.CrewException; @@ -23,7 +24,7 @@ public class Crew { private String content; private Integer memberCount; private Integer maxMemberCount; - private CrewStatus status = OPEN; + private CrewStatus status; private Member leader; private String addressDepth1Name; private String addressDepth2Name; diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java index 7833572a..9775ddb9 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewMapper.java @@ -41,6 +41,7 @@ public static Crew mapCrewEntityToDomain( .content(crewEntity.getContent()) .memberCount(crewEntity.getMemberCount()) .maxMemberCount(crewEntity.getMaxMemberCount()) + .status(crewEntity.getStatus()) .leader(leader) .addressDepth1Name(mainAddress.getAddressDepth1Name()) .addressDepth2Name(mainAddress.getAddressDepth2Name()) diff --git a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java index 1a76f8ee..0e54eac4 100644 --- a/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java +++ b/src/main/java/kr/pickple/back/crew/implement/CrewWriter.java @@ -1,7 +1,9 @@ package kr.pickple.back.crew.implement; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_EXISTED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_MEMBER_ALREADY_EXISTED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_MEMBER_STATUS_IS_NOT_WAITING; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -73,8 +75,9 @@ public CrewMember register(final Member member, final Crew crew) { public void updateMemberRegistrationStatus(final CrewMember crewMember, final RegistrationStatus status) { crewMember.updateRegistrationStatus(status); crewMemberRepository.updateRegistrationStatus(crewMember.getCrewMemberId(), status); + } - final Crew crew = crewMember.getCrew(); + public void increaseMemberCount(final Crew crew) { crew.increaseMemberCount(); crewRepository.updateMemberCountAndStatus(crew.getCrewId(), crew.getMemberCount(), crew.getStatus()); } diff --git a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java index 6f917b42..b9ae0f35 100644 --- a/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java +++ b/src/main/java/kr/pickple/back/crew/repository/CrewMemberRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.common.domain.RegistrationStatus; @@ -21,6 +22,7 @@ public interface CrewMemberRepository extends JpaRepository findByAddressDepth1IdAndAddressDepth2Id( Integer countByLeaderId(final Long leaderId); + @Modifying(clearAutomatically = true) @Query("update CrewEntity c set c.memberCount = :memberCount, c.status = :status where c.id = :crewId") void updateMemberCountAndStatus(final Long crewId, final Integer memberCount, final CrewStatus status); diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index 05e8b5f7..efdb9023 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,6 +1,8 @@ package kr.pickple.back.crew.service; -import static kr.pickple.back.crew.exception.CrewExceptionCode.*; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_LEADER_CANNOT_BE_DELETED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_MEMBER_NOT_ALLOWED; import java.util.List; @@ -92,6 +94,7 @@ public void updateCrewMemberRegistrationStatus( } crewWriter.updateMemberRegistrationStatus(crewMember, newRegistrationStatus); + crewWriter.increaseMemberCount(crew); chatWriter.enterRoom(crewMember.getMember(), chatReader.readRoomByCrewId(crewId)); eventPublisher.publishEvent(CrewMemberJoinedEvent.builder() diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index 0475c4d4..f15624e5 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.common.domain.RegistrationStatus; From 85bbd8d36a904f19c9dab461ad65ad948b06351d Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 20 Mar 2024 19:57:02 +0900 Subject: [PATCH 097/117] =?UTF-8?q?fix:=20=ED=8A=B9=EC=A0=95=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=EC=9D=98=20=EB=AA=A8=EB=93=A0=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=8B=A4=EB=A5=B8=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EB=B0=A9=EC=9D=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=8F=84=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/chat/implement/ChatReader.java | 15 +++++++++++---- .../chat/repository/ChatMessageRepository.java | 6 ++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java index 4b51364f..88a5b08e 100644 --- a/src/main/java/kr/pickple/back/chat/implement/ChatReader.java +++ b/src/main/java/kr/pickple/back/chat/implement/ChatReader.java @@ -1,7 +1,9 @@ package kr.pickple.back.chat.implement; -import static kr.pickple.back.chat.domain.RoomType.*; -import static kr.pickple.back.chat.exception.ChatExceptionCode.*; +import static kr.pickple.back.chat.domain.RoomType.PERSONAL; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_MEMBER_IS_NOT_IN_ROOM; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_RECEIVER_NOT_FOUND; +import static kr.pickple.back.chat.exception.ChatExceptionCode.CHAT_ROOM_NOT_FOUND; import java.time.LocalDateTime; import java.util.List; @@ -110,9 +112,14 @@ public List readMessagesAfterEntrance(final Long memberId, final Lo throw new ChatException(CHAT_MEMBER_IS_NOT_IN_ROOM, chatRoomId, memberId); } - final LocalDateTime entranceDatetime = chatMessageRepository.findLastEntranceDatetimeByMemberId(memberId); + final LocalDateTime entranceDatetime = chatMessageRepository.findChatRoomLastEntranceMessageCreatedAt( + memberId, + chatRoomId + ); final List chatMessageEntities = chatMessageRepository.findAllByChatRoomIdAndCreatedAtGreaterThanEqual( - chatRoomId, entranceDatetime); + chatRoomId, + entranceDatetime + ); return chatMessageEntities.stream() .map(chatMessageEntity -> ChatMapper.mapChatMessageEntityToDomain( diff --git a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java index 886c77f3..f51b5c8b 100644 --- a/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java +++ b/src/main/java/kr/pickple/back/chat/repository/ChatMessageRepository.java @@ -20,9 +20,11 @@ List findAllByChatRoomIdAndCreatedAtGreaterThanEqual( @Query(""" select cm.createdAt from ChatMessageEntity cm - where cm.senderId= :memberId and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER + where cm.senderId= :memberId + and cm.chatRoomId = :chatRoomId + and cm.type = kr.pickple.back.chat.domain.MessageType.ENTER order by cm.createdAt desc limit 1 """) - LocalDateTime findLastEntranceDatetimeByMemberId(final Long memberId); + LocalDateTime findChatRoomLastEntranceMessageCreatedAt(final Long memberId, final Long chatRoomId); } From 51f7d4a70df13f5837d64eaf893102e848a7c91f Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 20:16:18 +0900 Subject: [PATCH 098/117] =?UTF-8?q?refactor:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/controller/GameController.java | 2 +- .../back/game/implement/GameMemberReader.java | 13 ++++++++++++- .../back/game/implement/GameMemberWriter.java | 2 +- .../back/game/service/GameMemberService.java | 13 +++---------- .../game/service/GameReviewMannerScoresService.java | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/kr/pickple/back/game/controller/GameController.java b/src/main/java/kr/pickple/back/game/controller/GameController.java index 3fcdd665..2bc81928 100644 --- a/src/main/java/kr/pickple/back/game/controller/GameController.java +++ b/src/main/java/kr/pickple/back/game/controller/GameController.java @@ -88,7 +88,7 @@ public ResponseEntity findAllGameMembersByStatus( @RequestParam final RegistrationStatus status ) { return ResponseEntity.status(OK) - .body(gameMemberService.findAllGameMembersByStatus(loggedInMemberId, gameId, status)); + .body(gameMemberService.findAllGameMembersByStatus(gameId, status)); } @PatchMapping("/{gameId}/members/{memberId}") diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java index 9715d936..296bbfe2 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberReader.java @@ -27,7 +27,7 @@ public class GameMemberReader { private final GameReader gameReader; private final GameMemberRepository gameMemberRepository; - public GameMember readByMemberIdAndGameId(final Long memberId, final Long gameId) { + public GameMember readConfirmedStatusByMemberIdAndGameId(final Long memberId, final Long gameId) { final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameIdAndStatus( memberId, gameId, @@ -35,6 +35,17 @@ public GameMember readByMemberIdAndGameId(final Long memberId, final Long gameId ) .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + return getGameMember(gameMemberEntity); + } + + public GameMember readByMemberIdAndGameId(final Long memberId, final Long gameId) { + final GameMemberEntity gameMemberEntity = gameMemberRepository.findByMemberIdAndGameId(memberId, gameId) + .orElseThrow(() -> new GameException(GAME_MEMBER_NOT_FOUND, gameId, memberId)); + + return getGameMember(gameMemberEntity); + } + + private GameMember getGameMember(final GameMemberEntity gameMemberEntity) { final Member member = memberReader.readByMemberId(gameMemberEntity.getMemberId()); final Game game = gameReader.read(gameMemberEntity.getGameId()); diff --git a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java index 50819868..a7dada7a 100644 --- a/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java +++ b/src/main/java/kr/pickple/back/game/implement/GameMemberWriter.java @@ -58,7 +58,7 @@ public void updateMemberRegistrationStatus(final GameMember gameMember, final Re } public void updateReviewDone(final Long memberId, final Long gameId) { - final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); + final GameMember gameMember = gameMemberReader.readConfirmedStatusByMemberIdAndGameId(memberId, gameId); gameMemberRepository.updateReviewDone(gameMember.getGameMemberId(), true); } diff --git a/src/main/java/kr/pickple/back/game/service/GameMemberService.java b/src/main/java/kr/pickple/back/game/service/GameMemberService.java index 14d26e2c..e2e18d31 100644 --- a/src/main/java/kr/pickple/back/game/service/GameMemberService.java +++ b/src/main/java/kr/pickple/back/game/service/GameMemberService.java @@ -62,17 +62,10 @@ public void registerGameMember(final Long gameId, final Long loggedInMemberId) { * 게스트 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회 */ public GameResponse findAllGameMembersByStatus( - final Long loggedInMemberId, final Long gameId, final RegistrationStatus status ) { - final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); - final Game game = gameMember.getGame(); - final Member member = gameMember.getMember(); - - if (!game.isHost(member.getMemberId()) && status == WAITING) { - throw new GameException(GAME_MEMBER_IS_NOT_HOST, loggedInMemberId); - } + final Game game = gameReader.read(gameId); final List members = gameMemberReader.readMembersByGameIdAndStatus(gameId, status); @@ -89,7 +82,7 @@ public void updateGameMemberRegistrationStatus( final Long memberId, final RegistrationStatus newRegistrationStatus ) { - final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); final Game game = gameMember.getGame(); if (!game.isHost(loggedInMemberId)) { @@ -187,7 +180,7 @@ public GameMemberRegistrationStatusResponse findRegistrationStatusForGame( final Long memberId, final Long gameId ) { - final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(memberId, gameId); + final GameMember gameMember = gameMemberReader.readConfirmedStatusByMemberIdAndGameId(memberId, gameId); return GameResponseMapper.mapToGameMemberRegistrationStatusResponseDto( gameMember.getStatus(), diff --git a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java index 42abbb40..a08a9b9c 100644 --- a/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java +++ b/src/main/java/kr/pickple/back/game/service/GameReviewMannerScoresService.java @@ -35,7 +35,7 @@ public void reviewMannerScores( final Long gameId, final List mannerScoreReviews ) { - final GameMember gameMember = gameMemberReader.readByMemberIdAndGameId(loggedInMemberId, gameId); + final GameMember gameMember = gameMemberReader.readConfirmedStatusByMemberIdAndGameId(loggedInMemberId, gameId); if (gameMember.isReviewDone()) { throw new GameException(GAME_MEMBER_NOT_ALLOWED_TO_REVIEW_AGAIN, loggedInMemberId); From 5a02baa9c423818db3c3eae75c6aaca1717a491a Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 20:16:33 +0900 Subject: [PATCH 099/117] =?UTF-8?q?refactor:=20JPQL=20Modifying=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/game/repository/GameMemberRepository.java | 2 ++ .../kr/pickple/back/member/repository/MemberRepository.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java index f15624e5..caf7a1b4 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameMemberRepository.java @@ -26,9 +26,11 @@ Optional findByMemberIdAndGameIdAndStatus( Boolean existsByGameIdAndMemberId(final Long gameId, final Long memberId); + @Modifying(clearAutomatically = true) @Query("update GameMemberEntity gm set gm.status = :status where gm.id = :gameMemberId") void updateRegistrationStatus(final Long gameMemberId, final RegistrationStatus status); + @Modifying(clearAutomatically = true) @Query("update GameMemberEntity gm set gm.isReview = :isReview where gm.id = :gameMemberId") void updateReviewDone(Long gameMemberId, Boolean isReview); } diff --git a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java index faecc77e..9c7dd040 100644 --- a/src/main/java/kr/pickple/back/member/repository/MemberRepository.java +++ b/src/main/java/kr/pickple/back/member/repository/MemberRepository.java @@ -3,6 +3,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.member.repository.entity.MemberEntity; @@ -13,6 +14,7 @@ public interface MemberRepository extends JpaRepository { Optional findByOauthId(final Long oauthId); + @Modifying(clearAutomatically = true) @Query(""" update MemberEntity m set m.mannerScore = :mannerScore, m.mannerScoreCount = :mannerScoreCount From bae142bd46c207e21af5be808095ae28eedf2cd9 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 20:16:42 +0900 Subject: [PATCH 100/117] =?UTF-8?q?refactor:=20caffeineCache=20keyName?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/kr/pickple/back/map/service/MapService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/kr/pickple/back/map/service/MapService.java b/src/main/java/kr/pickple/back/map/service/MapService.java index 9c5cc6e2..2ca804b8 100644 --- a/src/main/java/kr/pickple/back/map/service/MapService.java +++ b/src/main/java/kr/pickple/back/map/service/MapService.java @@ -16,7 +16,7 @@ public class MapService { private final MapPolygonRepository mapPolygonRepository; @Transactional(readOnly = true) - @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddress.addressDepth2.name") + @Cacheable(cacheManager = "caffeineCacheManager", cacheNames = "polygon", key = "#mainAddress.addressDepth2Id") public MapPolygon findMapPolygonByMainAddress(final MainAddress mainAddress) { return mapPolygonRepository.findByAddressDepth1IdAndAddressDepth2Id( From 3a05546c38ef0c32078049539067de5117e4c34e Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 20:16:52 +0900 Subject: [PATCH 101/117] =?UTF-8?q?refactor:=20http=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EB=82=B4=EC=9A=A9=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/http/game/game.http | 36 ++++++++++++++------------------ src/main/http/member/member.http | 28 ++++++++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/main/http/game/game.http b/src/main/http/game/game.http index 0cf524a6..b90386ee 100644 --- a/src/main/http/game/game.http +++ b/src/main/http/game/game.http @@ -1,15 +1,15 @@ ### 게스트 모집하기 -POST http://localhost:8080/gameEntities +POST http://localhost:8080/games Content-Type: application/json Authorization: { "content": "재밌는 농구 경기 해요~! 다 초보입니다", - "playDate": "2023-02-01", - "playStartTime": "11:30", + "playDate": "2024-03-20", + "playStartTime": "12:30", "playTimeMinutes": 90, - "mainAddress": "서울 영등포구 도림동 254", - "detailAddress": "영등포 다목적 체육관 2층 201호", + "mainAddress": "서울 구로구 새말로 19", + "detailAddress": "구로역 옆 농구장", "cost": 100, "maxMemberCount": "5", "positions": [ @@ -19,15 +19,15 @@ Authorization: } ### 게스트 모집 상세 조회 -GET http://localhost:8080/gameEntities/1 +GET http://localhost:8080/games/3 ### 게스트 모집 참여 신청 -POST http://localhost:8080/gameEntities/38/members +POST http://localhost:8080/games/4/members Content-Type: application/json Authorization: ### 게스트 모집 참여 신청 수락 -PATCH http://localhost:8080/gameEntities/2/members/3 +PATCH http://localhost:8080/games/3/members/2 Content-Type: application/json Authorization: @@ -36,40 +36,36 @@ Authorization: } ### 게스트 모집 참여 신청 거절/취소 -DELETE http://localhost:8080/gameEntities/2/members/3 +DELETE http://localhost:8080/games/4/members/1 Authorization: ### 게스트 모집에 참여 신청된 사용자 정보 목록 조회 -GET http://localhost:8080/gameEntities/2/members?status=대기 +GET http://localhost:8080/games/3/members?status=대기 Authorization: ### 게스트 모집에 확정된 사용자 정보 목록 조회 -GET http://localhost:8080/gameEntities/2/members?status=확정 +GET http://localhost:8080/games/2/members?status=확정 Authorization: ### 다른 사용자(호스트, 게스트) 매너 스코어 리뷰 -PATCH http://localhost:8080/gameEntities/1/members/manner-scores +PATCH http://localhost:8080/games/3/members/manner-scores Content-Type: application/json Authorization: { "mannerScoreReviews": [ - { - "memberId": 1, - "mannerScore": 1 - }, { "memberId": 2, - "mannerScore": -1 + "mannerScore": 1 } ] } ### 조건별 게스트 모집글 조회(장소) -GET http://localhost:8080/gameEntities?category=location&value=서울시+영등포구&page=0&size=3 +GET http://localhost:8080/games?category=location&value=서울시+구로구&page=0&size=3 ### 위도, 경도, 거리를 통해 해당하는 게스트 모집글 조회 -GET http://localhost:8080/gameEntities/by-location?latitude=37.5066680941127&longitude=126.897412723839&distance=1000 +GET http://localhost:8080/games/by-location?latitude=37.5066680941127&longitude=126.897412723839&distance=1500 ### 사용자의 주 활동지역에 해당하는 게스트 모집글 조회 -GET http://localhost:8080/gameEntities/by-address?addressDepth1=서울시&addressDepth2=영등포구 +GET http://localhost:8080/games/by-address?addressDepth1=서울시&addressDepth2=구로구 diff --git a/src/main/http/member/member.http b/src/main/http/member/member.http index 502ca66d..1a8986c2 100644 --- a/src/main/http/member/member.http +++ b/src/main/http/member/member.http @@ -4,15 +4,15 @@ Content-Type: application/json Authorization: { - "email": "changhyeon.h@kakao.com", - "nickname": "창현", + "email": "test2@test.com", + "nickname": "테스트2", "profileImageUrl": "http://k.kakaocdn.net/dn/dpk9l1/btqmGhA2lKL/Oz0wDuJn1YV2DIn92f6DVK/img_640x640.jpg", "positions": [ - "SG" + "C","PG" ], "addressDepth1": "서울시", - "addressDepth2": "영등포구", - "oauthId": 32014123, + "addressDepth2": "구로구", + "oauthId": 32014120, "oauthProvider": "KAKAO" } @@ -20,7 +20,7 @@ Authorization: GET http://localhost:8080/members/1 ### 사용자가 가입한 크루 목록 -GET http://localhost:8080/members/1/crews?status=확정 +GET http://localhost:8080/members/3/crews?status=확정 Authorization: ### 사용자가 만든 크루 목록 조회 @@ -28,18 +28,26 @@ GET http://localhost:8080/members/1/created-crews Authorization: ### 사용자의 참여 확정 게스트 모집글 목록 조회 -GET http://localhost:8080/members/1/gameEntities?status=확정 +GET http://localhost:8080/members/2/games?status=대기 Authorization: ### 사용자가 만든 게스트 모집글 목록 조회 -GET http://localhost:8080/members/1/created-gameEntities +GET http://localhost:8080/members/2/created-games Authorization: ### 사용자의 게스트 모집 참여 여부 조회 -GET http://localhost:8080/members/5/gameEntities/1/registration-status +GET http://localhost:8080/members/2/games/4/registration-status Authorization: ### 사용자의 크루 가입 여부 조회 GET http://localhost:8080/members/1/crews/2/registration-status -Authorization \ No newline at end of file +Authorization: + +### AccessToken 재발급 +POST http://localhost:8080/auth/refresh +Authorization: + +### AccessToken 재발급 +DELETE http://localhost:8080/auth/logout +Authorization: From d9e98831d81c0177105eefce81c7e276f65e88ef Mon Sep 17 00:00:00 2001 From: changhyeon Date: Wed, 20 Mar 2024 20:42:02 +0900 Subject: [PATCH 102/117] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/pickple/back/crew/service/CrewMemberService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java index efdb9023..d60be4bc 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewMemberService.java @@ -1,8 +1,6 @@ package kr.pickple.back.crew.service; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_IS_NOT_LEADER; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_LEADER_CANNOT_BE_DELETED; -import static kr.pickple.back.crew.exception.CrewExceptionCode.CREW_MEMBER_NOT_ALLOWED; +import static kr.pickple.back.crew.exception.CrewExceptionCode.*; import java.util.List; @@ -169,7 +167,7 @@ public CrewMemberRegistrationStatusResponse findRegistrationStatusForCrew( final Long memberId, final Long crewId ) { - final CrewMember crewMember = crewReader.readCrewMember(crewId, memberId); + final CrewMember crewMember = crewReader.readCrewMember(memberId, crewId); return CrewResponseMapper.mapToCrewMemberRegistrationStatusResponse(crewMember.getStatus()); } From 739121693630d2ab6c173562ed0646a8e9e4dcc2 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 3 Apr 2024 14:09:53 +0900 Subject: [PATCH 103/117] =?UTF-8?q?test:=20Service=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B0=8F=20Test=20Fixture=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/service/AddressServiceTest.java | 48 ------ .../back/alarm/IntegrationAlarmTest.java | 28 ---- .../alarm/controller/AlarmControllerTest.java | 74 --------- .../CrewEntityAlarmControllerTest.java | 56 ------- .../GameEntityAlarmControllerTest.java | 57 ------- .../back/alarm/docs/AlarmDocumentTest.java | 144 ------------------ .../docs/CrewEntityAlarmDocumentTest.java | 83 ---------- .../docs/GameEntityAlarmDocumentTest.java | 82 ---------- .../back/fixture/domain/AddressFixtures.java | 20 --- .../back/fixture/domain/AuthFixtures.java | 36 ----- .../fixture/domain/CrewAlarmFixtures.java | 18 --- .../back/fixture/domain/CrewFixtures.java | 74 --------- .../fixture/domain/GameAlarmFixtures.java | 18 --- .../back/fixture/domain/GameFixtures.java | 55 ------- .../back/fixture/domain/MemberFixtures.java | 58 ------- .../back/fixture/dto/AuthDtoFixtures.java | 10 -- .../back/fixture/dto/ChatDtoFixtures.java | 12 -- .../back/fixture/dto/CrewDtoFixtures.java | 26 ---- .../back/fixture/dto/GameDtoFixtures.java | 51 ------- .../back/fixture/dto/MemberDtoFixtures.java | 50 ------ .../back/fixture/setup/AddressSetup.java | 32 ---- .../pickple/back/fixture/setup/CrewSetup.java | 79 ---------- .../pickple/back/fixture/setup/GameSetup.java | 76 --------- .../back/fixture/setup/MemberSetup.java | 44 ------ .../game/service/GameEntityServiceTest.java | 58 ------- .../MemberEntityCrewServiceTestEntity.java | 97 ------------ .../service/MemberEntityServiceTest.java | 117 -------------- .../position/service/PositionServiceTest.java | 52 ------- 28 files changed, 1555 deletions(-) delete mode 100644 src/test/java/kr/pickple/back/address/service/AddressServiceTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/IntegrationAlarmTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java delete mode 100644 src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/AuthFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/AuthDtoFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java delete mode 100644 src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java delete mode 100644 src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java delete mode 100644 src/test/java/kr/pickple/back/fixture/setup/GameSetup.java delete mode 100644 src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java delete mode 100644 src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java delete mode 100644 src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java delete mode 100644 src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java delete mode 100644 src/test/java/kr/pickple/back/position/service/PositionServiceTest.java diff --git a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java b/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java deleted file mode 100644 index 39b8002d..00000000 --- a/src/test/java/kr/pickple/back/address/service/AddressServiceTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package kr.pickple.back.address.service; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import kr.pickple.back.address.domain.MainAddress; -import kr.pickple.back.address.dto.response.AllAddressResponse; -import kr.pickple.back.address.implement.AddressReader; - -@SpringBootTest -class AddressServiceTest { - - @Autowired - private AddressService addressService; - - @Autowired - private AddressReader addressReader; - - @Test - @DisplayName("지역 목록 조회 시, 전체 도, 시, 구 정보를 반환한다.") - void findAllAddress_ReturnAllAddressNames() { - //when - AllAddressResponse allAddressResponse = addressService.findAllAddress(); - - //then - assertThat(allAddressResponse.getAddressDepth1()).isNotNull(); - assertThat(allAddressResponse.getAddressDepth2List()).isNotEmpty(); - } - - @Test - @DisplayName("주 활동 지역 조회 시, 올바른 주소1, 주소2 이름을 넣었을 때, 각각의 주소 객체를 반환한다.") - void findMainAddressByNames_ValidAddressNames_ReturnMainAddressInstance() { - //given - String addressDepth1Name = "서울시"; - String addressDepth2Name = "강남구"; - - //when - MainAddress mainAddress = addressReader.readMainAddressByNames(addressDepth1Name, addressDepth2Name); - - //then - assertThat(mainAddress.getAddressDepth1Name()).isEqualTo(addressDepth1Name); - assertThat(mainAddress.getAddressDepth2Name()).isEqualTo(addressDepth2Name); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/IntegrationAlarmTest.java b/src/test/java/kr/pickple/back/alarm/IntegrationAlarmTest.java deleted file mode 100644 index e020f767..00000000 --- a/src/test/java/kr/pickple/back/alarm/IntegrationAlarmTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package kr.pickple.back.alarm; - -import com.fasterxml.jackson.databind.ObjectMapper; -import kr.pickple.back.auth.domain.token.JwtProvider; -import kr.pickple.back.fixture.setup.MemberSetup; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; - -@SpringBootTest -@AutoConfigureMockMvc -@AutoConfigureRestDocs -public abstract class IntegrationAlarmTest { - - @Autowired - protected MockMvc mockMvc; - - @Autowired - protected JwtProvider jwtProvider; - - @Autowired - protected MemberSetup memberSetup; - - @Autowired - protected ObjectMapper objectMapper; -} diff --git a/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java deleted file mode 100644 index d94b6c19..00000000 --- a/src/test/java/kr/pickple/back/alarm/controller/AlarmControllerTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package kr.pickple.back.alarm.controller; - -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.member.repository.entity.MemberEntity; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; -import org.springframework.transaction.annotation.Transactional; - -import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@Transactional -public class AlarmControllerTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/alarms"; - - @Test - @DisplayName("사용자는 재접속 시 읽지 않은 알람이 있는지 알 수 있다.") - void findUnreadAlarm_Success() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when & then - mockMvc.perform(get(BASE_URL + "/unread") - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andExpect(content().contentType(APPLICATION_JSON)) - .andExpect(jsonPath("$.unread").exists()) - .andDo(print()); - } - - @Test - @DisplayName("사용자는 해당 사용자에게 온 모든 알람 목록을 조회할 수 있다.") - void findAllAlarms_Success() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when & then - mockMvc.perform(get(BASE_URL) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .param("size", "6")) - .andExpect(status().isOk()) - .andExpect(content().contentType(APPLICATION_JSON)) - .andExpect(jsonPath("$.alarmResponse").exists()) - .andExpect(jsonPath("$.hasNext").exists()) - .andDo(print()); - } - - @Test - @DisplayName("사용자는 해당 사용자에게 온 모든 알람을 모두 삭제할 수 있다.") - void deleteAllAlarms_Success() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when & then - mockMvc.perform(delete(BASE_URL) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNoContent()) - .andDo(print()); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java deleted file mode 100644 index 89eecb08..00000000 --- a/src/test/java/kr/pickple/back/alarm/controller/CrewEntityAlarmControllerTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package kr.pickple.back.alarm.controller; - -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.alarm.domain.CrewAlarm; -import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; -import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.fixture.domain.CrewAlarmFixtures; -import kr.pickple.back.fixture.setup.CrewSetup; -import kr.pickple.back.member.repository.entity.MemberEntity; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Transactional -public class CrewEntityAlarmControllerTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/crew-alarms"; - - @Autowired - protected CrewSetup crewSetup; - - @Autowired - private CrewAlarmRepository crewAlarmRepository; - - @Test - @DisplayName("사용자는 보내진 크루 알람에 대하여 읽음 처리를 할 수 있다.") - void updateCrewAlarmStatus_Success() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); - final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); - final CrewAlarmUpdateStatusRequest request = CrewAlarmUpdateStatusRequest.from(true); - - //when - final ResultActions resultActions = mockMvc.perform(patch(BASE_URL + "/" + crewAlarm.getId()) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - //then - resultActions - .andExpect(status().isNoContent()); - final CrewAlarm updatedCrewAlarm = crewAlarmRepository.findById(crewAlarm.getId()).get(); - assertTrue(updatedCrewAlarm.getIsRead()); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java b/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java deleted file mode 100644 index c71753f2..00000000 --- a/src/test/java/kr/pickple/back/alarm/controller/GameEntityAlarmControllerTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package kr.pickple.back.alarm.controller; - -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.alarm.domain.GameAlarm; -import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; -import kr.pickple.back.alarm.repository.GameAlarmRepository; -import kr.pickple.back.fixture.domain.GameAlarmFixtures; -import kr.pickple.back.fixture.setup.GameSetup; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Transactional -public class GameEntityAlarmControllerTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/game-alarms"; - - @Autowired - protected GameSetup gameSetup; - - @Autowired - private GameAlarmRepository gameAlarmRepository; - - @Test - @DisplayName("사용자는 보내진 게임 알람에 대하여 읽음 처리를 할 수 있다.") - void updateGameAlarmStatus_Success() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); - final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); - final GameAlarmUpdateStatusRequest request = GameAlarmUpdateStatusRequest.from(true); - - //when - final ResultActions resultActions = mockMvc.perform(patch(BASE_URL + "/" + gameAlarm.getId()) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - //then - resultActions - .andExpect(status().isNoContent()); - final GameAlarm updatedGameAlarm = gameAlarmRepository.findById(gameAlarm.getId()).get(); - assertTrue(updatedGameAlarm.getIsRead()); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java deleted file mode 100644 index cd2a14b0..00000000 --- a/src/test/java/kr/pickple/back/alarm/docs/AlarmDocumentTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package kr.pickple.back.alarm.docs; - -import com.epages.restdocs.apispec.ResourceSnippetParameters; -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static org.springframework.http.MediaType.APPLICATION_JSON; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -@Transactional -public class AlarmDocumentTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/alarms"; - - @Test - @DisplayName("사용자의 재접속 시 읽지 않은 알람이 있는지 확인") - void findUnreadAlarm_ReturnAlarmExistStatusResponse() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/unread") - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)); - - //then - resultActions - .andExpect(status().isOk()) - .andExpect(content().contentType(APPLICATION_JSON)) - .andExpect(jsonPath("$.unread").exists()) - .andDo(document("find-unread-alarm", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("Alarm") - .summary("사용자의 재접속 시 읽지 않은 알람이 있는지 확인") - .description("사용자의 재접속 시 읽지 않은 알람이 있는지 확인한다.") - .responseFields( - fieldWithPath("unread").type(JsonFieldType.BOOLEAN) - .description("읽지 않은 알람 존재 여부") - ) - .requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer 토큰") - ) - .build() - ) - )); - } - - @Test - @DisplayName("해당 사용자에게 온 모든 알람 목록을 조회") - void findAllAlarms_ReturnAlarmResponse() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .param("size", "6")); - - //then - resultActions - .andExpect(status().isOk()) - .andExpect(content().contentType(APPLICATION_JSON)) - .andExpect(jsonPath("$.alarmResponse").exists()) - .andExpect(jsonPath("$.hasNext").exists()) - .andDo(document("find-all-alarms", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("Alarm") - .summary("해당 사용자에게 온 모든 알람 목록을 조회") - .description("해당 사용자에게 온 모든 알람 목록을 조회한다.") - .responseFields( - fieldWithPath("alarmResponse").type(JsonFieldType.ARRAY) - .description("알람 응답 목록"), - fieldWithPath("hasNext").type(JsonFieldType.BOOLEAN) - .description("다음 페이지 존재 여부"), - fieldWithPath("cursorId").type(JsonFieldType.NUMBER).optional() - .description("커서 ID. null일 경우 다음 페이지 없음") - ) - .queryParameters( - parameterWithName("size").description("페이지 크기").optional() - ) - .requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer 토큰") - ) - .build() - ) - )); - } - - @Test - @DisplayName("해당 사용자에게 온 모든 알람을 모두 삭제") - void deleteAllAlarms_ReturnVoid() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final HttpHeaders headers = new HttpHeaders(); - headers.setBearerAuth(accessToken); - - //when - final ResultActions resultActions = mockMvc.perform(delete(BASE_URL) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)); - - //then - resultActions - .andExpect(status().isNoContent()) - .andDo(document("delete-all-alarms", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("Alarm") - .summary("해당 사용자에게 온 모든 알람을 모두 삭제") - .description("해당 사용자에게 온 모든 알람을 모두 삭제한다.") - .requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer 토큰") - ) - .build() - ) - )); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java deleted file mode 100644 index 6f80e864..00000000 --- a/src/test/java/kr/pickple/back/alarm/docs/CrewEntityAlarmDocumentTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package kr.pickple.back.alarm.docs; - -import com.epages.restdocs.apispec.ResourceSnippetParameters; -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.alarm.domain.CrewAlarm; -import kr.pickple.back.alarm.dto.request.CrewAlarmUpdateStatusRequest; -import kr.pickple.back.alarm.repository.CrewAlarmRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.fixture.domain.CrewAlarmFixtures; -import kr.pickple.back.fixture.setup.CrewSetup; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; - -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; -import static com.epages.restdocs.apispec.ResourceDocumentation.resource; -import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Transactional -public class CrewEntityAlarmDocumentTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/crew-alarms"; - - @Autowired - protected CrewSetup crewSetup; - - @Autowired - private CrewAlarmRepository crewAlarmRepository; - - @Test - @DisplayName("사용자의 크루 알람에 대하여 읽음 여부 수정") - void updateCrewAlarmStatus_ReturnVoid() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(1); - final CrewAlarm crewAlarm = crewAlarmRepository.save(CrewAlarmFixtures.crewAlarmBuild(member, crew)); - final CrewAlarmUpdateStatusRequest request = CrewAlarmUpdateStatusRequest.from(true); - - //when - final ResultActions resultActions = mockMvc.perform(patch(BASE_URL + "/{crewAlarmId}", crewAlarm.getId()) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - //then - resultActions - .andExpect(status().isNoContent()) - .andDo(document("update-crew-alarm-status", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("crew Alarm") - .summary("사용자의 크루 알람에 대하여 읽음 여부 수정") - .description("사용자가 보낸 크루 알람의 읽음 상태를 변경한다.") - .requestFields( - fieldWithPath("isRead").type(JsonFieldType.BOOLEAN) - .description("읽음 상태") - ) - .pathParameters( - parameterWithName("crewAlarmId").description("크루 알람 ID") - ) - .requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer 토큰") - ) - .build() - ) - )); - } -} diff --git a/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java b/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java deleted file mode 100644 index e41aed11..00000000 --- a/src/test/java/kr/pickple/back/alarm/docs/GameEntityAlarmDocumentTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package kr.pickple.back.alarm.docs; - -import com.epages.restdocs.apispec.ResourceSnippetParameters; - -import kr.pickple.back.alarm.IntegrationAlarmTest; -import kr.pickple.back.alarm.domain.GameAlarm; -import kr.pickple.back.alarm.dto.request.GameAlarmUpdateStatusRequest; -import kr.pickple.back.alarm.repository.GameAlarmRepository; -import kr.pickple.back.fixture.domain.GameAlarmFixtures; -import kr.pickple.back.fixture.setup.GameSetup; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.restdocs.payload.JsonFieldType; -import org.springframework.test.web.servlet.ResultActions; - -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; -import static com.epages.restdocs.apispec.ResourceDocumentation.resource; -import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -public class GameEntityAlarmDocumentTest extends IntegrationAlarmTest { - - private static final String BASE_URL = "/game-alarms"; - - @Autowired - protected GameSetup gameSetup; - - @Autowired - private GameAlarmRepository gameAlarmRepository; - - @Test - @DisplayName("사용자의 게임 알람에 대하여 읽음 여부 수정") - void updateGameAlarmStatus_ReturnVoid() throws Exception { - //given - final MemberEntity member = memberSetup.save(); - final String accessToken = jwtProvider.createLoginToken(member.getId().toString()).getAccessToken(); - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(1); - final GameAlarm gameAlarm = gameAlarmRepository.save(GameAlarmFixtures.gameAlarmBuild(member, gameEntity)); - final GameAlarmUpdateStatusRequest request = GameAlarmUpdateStatusRequest.from(true); - - //when - final ResultActions resultActions = mockMvc.perform(patch(BASE_URL + "/{gameAlarmId}", gameAlarm.getId()) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))); - - //then - resultActions - .andExpect(status().isNoContent()) - .andDo(document("update-game-alarm-status", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("Game Alarm") - .summary("사용자의 게임 알람에 대하여 읽음 여부 수정") - .description("사용자가 보낸 게임 알람의 읽음 상태를 변경한다.") - .requestFields( - fieldWithPath("isRead").type(JsonFieldType.BOOLEAN) - .description("읽음 상태") - ) - .pathParameters( - parameterWithName("gameAlarmId").description("게임 알람 ID") - ) - .requestHeaders( - headerWithName(HttpHeaders.AUTHORIZATION).description("Bearer 토큰") - ) - .build() - ) - )); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java deleted file mode 100644 index 749bf847..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/AddressFixtures.java +++ /dev/null @@ -1,20 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; - -public class AddressFixtures { - - public static AddressDepth1Entity addressDepth1Build() { - return AddressDepth1Entity.builder() - .name("서울시") - .build(); - } - - public static AddressDepth2Entity addressDepth2Build() { - return AddressDepth2Entity.builder() - .name("영등포구") - .addressDepth1Id(addressDepth1Build()) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/AuthFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/AuthFixtures.java deleted file mode 100644 index f1c561eb..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/AuthFixtures.java +++ /dev/null @@ -1,36 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import java.time.LocalDateTime; - -import kr.pickple.back.auth.domain.oauth.OauthMember; -import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.auth.domain.token.RefreshToken; - -public class AuthFixtures { - - public static OauthMember oauthMemberBuild() { - return OauthMember.builder() - .oauthId(1L) - .oauthProvider(OauthProvider.KAKAO) - .email("pickple@pickple.kr") - .profileImageUrl("https://amazon.com/pickple/1") - .nickname("pickple") - .build(); - } - - public static AuthTokens authTokensBuild() { - return AuthTokens.builder() - .accessToken("accessToken") - .refreshToken("refreshToken") - .build(); - } - - public static RefreshToken refreshTokenBuild() { - return RefreshToken.builder() - .token("refreshToken") - .memberId(1L) - .createdAt(LocalDateTime.now()) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java deleted file mode 100644 index ed43d572..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewAlarmFixtures.java +++ /dev/null @@ -1,18 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import kr.pickple.back.alarm.domain.CrewAlarm; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import static kr.pickple.back.alarm.domain.CrewAlarmType.CREW_LEADER_WAITING; - -public class CrewAlarmFixtures { - - public static CrewAlarm crewAlarmBuild(final MemberEntity member,final CrewEntity crew) { - return CrewAlarm.builder() - .crew(crew) - .member(member) - .crewAlarmType(CREW_LEADER_WAITING) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java deleted file mode 100644 index 79375338..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/CrewFixtures.java +++ /dev/null @@ -1,74 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import static kr.pickple.back.chat.domain.RoomType.*; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -public class CrewFixtures { - - public static CrewEntity crewBuild( - final AddressDepth1Entity addressDepth1, - final AddressDepth2Entity addressDepth2, - final MemberEntity leader - ) { - return CrewEntity.builder() - .name("백둥크루1") - .content("안녕하세요 백둥크루1 입니다.") - .profileImageUrl("https://amazon.profileimage/1") - .backgroundImageUrl("https://amazon.backgroundimage/1") - .maxMemberCount(15) - .leader(leader) - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); - } - - public static CrewMemberEntity crewMemberBuild(final MemberEntity member, final CrewEntity crew) { - return CrewMemberEntity.builder() - .member(member) - .crew(crew) - .build(); - } - - public static ChatRoomEntity crewChatRoomBuild() { - return ChatRoomEntity.builder() - .name("백둥크루1") - .type(CREW) - .build(); - } - - public static List crewsBuild( - final Integer count, - final AddressDepth1Entity addressDepth1, - final AddressDepth2Entity addressDepth2, - final MemberEntity leader - ) { - final List crews = new ArrayList<>(); - - IntStream.range(0, count).forEach(i -> { - crews.add( - CrewEntity.builder() - .name(String.format("백둥크루%d", i)) - .content(String.format("안녕하세요 백둥크루%d 입니다.", i)) - .profileImageUrl(String.format("https://amazon.profileimage/%d", i)) - .backgroundImageUrl(String.format("https://amazon.backgroundimage/%d", i)) - .maxMemberCount(15) - .leader(leader) - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build() - ); - }); - - return crews; - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java deleted file mode 100644 index c62f4078..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/GameAlarmFixtures.java +++ /dev/null @@ -1,18 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import kr.pickple.back.alarm.domain.GameAlarm; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -import static kr.pickple.back.alarm.domain.GameAlarmType.HOST_WAITING; - -public class GameAlarmFixtures { - - public static GameAlarm gameAlarmBuild(final MemberEntity member, final GameEntity gameEntity) { - return GameAlarm.builder() - .game(gameEntity) - .member(member) - .gameAlarmType(HOST_WAITING) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java deleted file mode 100644 index 6e1ff592..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/GameFixtures.java +++ /dev/null @@ -1,55 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import static kr.pickple.back.chat.domain.RoomType.*; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.List; - -import org.locationtech.jts.geom.Coordinate; -import org.locationtech.jts.geom.GeometryFactory; -import org.locationtech.jts.geom.Point; -import org.locationtech.jts.geom.PrecisionModel; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.position.domain.Position; - -public class GameFixtures { - - public static GameEntity gameBuild( - final AddressDepth1Entity addressDepth1, - final AddressDepth2Entity addressDepth2, - final MemberEntity host - ) { - final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); - final Point point = geometryFactory.createPoint(new Coordinate(37.125, 126.75)); - - return GameEntity.builder() - .content("하이하이 즐겜 한 판해요") - .playDate(LocalDate.now().minusDays(1)) - .playStartTime(LocalTime.of(11, 30)) - .playEndTime(LocalTime.of(13, 0)) - .playTimeMinutes(90) - .mainAddress("서울 영등포구 도림동 254") - .detailAddress("영등포 다목적 체육관 2층 201호") - .cost(100) - .maxMemberCount(5) - .point(point) - .host(host) - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .positions(List.of(Position.CENTER, Position.POINT_GUARD)) - .build(); - } - - public static ChatRoomEntity gameChatRoomBuild() { - return ChatRoomEntity.builder() - .name("11.10 영등포구") - .type(GAME) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java deleted file mode 100644 index e938719a..00000000 --- a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java +++ /dev/null @@ -1,58 +0,0 @@ -package kr.pickple.back.fixture.domain; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.domain.MemberStatus; -import kr.pickple.back.position.domain.Position; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.IntStream; - -public class MemberFixtures { - - public static MemberEntity memberBuild( - final AddressDepth1Entity addressDepth1, - final AddressDepth2Entity addressDepth2 - ) { - return MemberEntity.builder() - .email("pickple1@pickple.kr") - .nickname("pickple1") - .profileImageUrl("https://amazon.image") - .status(MemberStatus.ACTIVE) - .oauthId(1L) - .oauthProvider(OauthProvider.KAKAO) - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .positions(List.of(Position.CENTER, Position.POINT_GUARD)) - .build(); - } - - public static List membersBuild( - final int count, - final AddressDepth1Entity addressDepth1, - final AddressDepth2Entity addressDepth2 - ) { - final List members = new ArrayList<>(); - - IntStream.range(0, count).forEach(i -> { - members.add( - MemberEntity.builder() - .email(String.format("pickple%d@pickple.kr", i)) - .nickname(String.format("pickple%d", i)) - .profileImageUrl("https://amazon.image") - .status(MemberStatus.ACTIVE) - .oauthId((long)i) - .oauthProvider(OauthProvider.KAKAO) - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .positions(List.of(Position.CENTER, Position.POINT_GUARD)) - .build() - ); - }); - - return members; - } -} diff --git a/src/test/java/kr/pickple/back/fixture/dto/AuthDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/AuthDtoFixtures.java deleted file mode 100644 index 10d0fc8c..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/AuthDtoFixtures.java +++ /dev/null @@ -1,10 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import kr.pickple.back.auth.dto.response.AccessTokenResponse; - -public class AuthDtoFixtures { - - public static AccessTokenResponse accessTokenResponseBuild() { - return AccessTokenResponse.of("accessToken"); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java deleted file mode 100644 index 3699e771..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java +++ /dev/null @@ -1,12 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; - -public class ChatDtoFixtures { - - public static PersonalChatRoomCreateRequest personalChatRoomCreateRequestBuild(final Long receiverId) { - return PersonalChatRoomCreateRequest.builder() - .receiverId(receiverId) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java deleted file mode 100644 index 554f024d..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java +++ /dev/null @@ -1,26 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.crew.dto.request.CrewCreateRequest; -import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; - -public class CrewDtoFixtures { - - public static CrewCreateRequest crewCreateRequestBuild() { - return CrewCreateRequest.builder() - .name("백둥크루") - .content("안녕하세요. 백둥크루 입니다~!") - .maxMemberCount(15) - .addressDepth1("서울시") - .addressDepth2("영등포구") - .build(); - } - - public static CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest( - final RegistrationStatus status - ) { - return CrewMemberUpdateStatusRequest.builder() - .status(status) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java deleted file mode 100644 index 373759b2..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java +++ /dev/null @@ -1,51 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import java.time.LocalDate; -import java.time.LocalTime; -import java.util.List; - -import kr.pickple.back.common.domain.RegistrationStatus; -import kr.pickple.back.game.dto.request.GameCreateRequest; -import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; -import kr.pickple.back.game.dto.request.MannerScoreReview; -import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.position.domain.Position; - -public class GameDtoFixtures { - - public static GameCreateRequest gameCreateRequestBuild() { - return GameCreateRequest.builder() - .content("재밌는 농구 경기 해요~! 다 초보입니다") - .playDate(LocalDate.of(2023, 2, 1)) - .playStartTime(LocalTime.of(11, 30)) - .playTimeMinutes(90) - .mainAddress("서울 영등포구 도림동 254") - .detailAddress("영등포 다목적 체육관 2층 201호") - .cost(100) - .maxMemberCount(5) - .positions(List.of(Position.CENTER, Position.POINT_GUARD)) - .build(); - } - - public static GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequestBuild( - final RegistrationStatus status - ) { - return GameMemberRegistrationStatusUpdateRequest.builder() - .status(status) - .build(); - } - - public static MannerScoreReviewsRequest mannerScoreReviewsRequestBuild(final List members) { - final List mannerScoreReviews = members.stream() - .map(member -> MannerScoreReview.builder() - .memberId(member.getId()) - .mannerScore(1) - .build()) - .toList(); - - return MannerScoreReviewsRequest.builder() - .mannerScoreReviews(mannerScoreReviews) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java deleted file mode 100644 index ee2f3c9e..00000000 --- a/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java +++ /dev/null @@ -1,50 +0,0 @@ -package kr.pickple.back.fixture.dto; - -import java.util.List; - -import kr.pickple.back.auth.domain.oauth.OauthProvider; -import kr.pickple.back.member.dto.request.MemberCreateRequest; -import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.position.domain.Position; - -public class MemberDtoFixtures { - - public static MemberCreateRequest memberCreateRequestBuild() { - return MemberCreateRequest.builder() - .nickname("백둥") - .profileImageUrl("https://amazon.image/1") - .email("pickple@pickple.kr") - .positions(List.of(Position.CENTER, Position.POINT_GUARD)) - .oauthId(999999L) - .oauthProvider(OauthProvider.KAKAO) - .addressDepth1("서울시") - .addressDepth2("영등포구") - .build(); - } - - public static AuthenticatedMemberResponse authenticatedMemberResponseLoginBuild() { - return AuthenticatedMemberResponse.builder() - .accessToken("accessToken") - .refreshToken("refreshToken") - .id(1L) - .nickname("강백둥") - .profileImageUrl("https://amazon.image/1") - .email("pickple1@pickple.kr") - .oauthId(1L) - .oauthProvider(OauthProvider.KAKAO) - .addressDepth1("서울시") - .addressDepth2("영등포구") - .build(); - } - - public static AuthenticatedMemberResponse authenticatedMemberResponseRegistrationBuild() { - return AuthenticatedMemberResponse.builder() - .accessToken("accessToken") - .nickname("강백둥") - .profileImageUrl("https://amazon.image/1") - .email("pickple1@pickple.kr") - .oauthId(1L) - .oauthProvider(OauthProvider.KAKAO) - .build(); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java b/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java deleted file mode 100644 index 1d133669..00000000 --- a/src/test/java/kr/pickple/back/fixture/setup/AddressSetup.java +++ /dev/null @@ -1,32 +0,0 @@ -package kr.pickple.back.fixture.setup; - -import static kr.pickple.back.address.exception.AddressExceptionCode.*; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import kr.pickple.back.address.exception.AddressException; -import kr.pickple.back.address.repository.AddressDepth1Repository; -import kr.pickple.back.address.repository.AddressDepth2Repository; -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; - -@Component -public class AddressSetup { - - @Autowired - private AddressDepth1Repository addressDepth1Repository; - - @Autowired - private AddressDepth2Repository addressDepth2Repository; - - public AddressDepth1Entity findAddressDepth1(String name) { - return addressDepth1Repository.findByName(name) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, name)); - } - - public AddressDepth2Entity findAddressDepth2(String name) { - return addressDepth2Repository.findByNameAndAddressDepth1Id(name, findAddressDepth1("서울시").getId()) - .orElseThrow(() -> new AddressException(ADDRESS_NOT_FOUND, name)); - } -} diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java deleted file mode 100644 index 4900e007..00000000 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ /dev/null @@ -1,79 +0,0 @@ -package kr.pickple.back.fixture.setup; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.crew.repository.CrewRepository; -import kr.pickple.back.fixture.domain.CrewFixtures; -import kr.pickple.back.member.repository.entity.MemberEntity; - -@Component -public class CrewSetup { - - @Autowired - private CrewRepository crewRepository; - - @Autowired - private CrewMemberRepository crewMemberRepository; - - @Autowired - private ChatRoomRepository chatRoomRepository; - - @Autowired - private MemberSetup memberSetup; - - @Autowired - private AddressSetup addressSetup; - - public CrewEntity save(final MemberEntity leader) { - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - - final CrewEntity crew = CrewFixtures.crewBuild(addressDepth1, addressDepth2, leader); - final ChatRoomEntity savedChatRoom = chatRoomRepository.save(CrewFixtures.crewChatRoomBuild()); - - final CrewMemberEntity crewLeader = CrewFixtures.crewMemberBuild(leader, crew); - crewLeader.confirmRegistration(); - leader.addMemberCrew(crewLeader); - - savedChatRoom.updateMaxMemberCount(crew.getMaxMemberCount()); - crew.makeNewCrewChatRoom(savedChatRoom); - - final CrewEntity savedCrew = crewRepository.save(crew); - crewMemberRepository.save(crewLeader); - - return savedCrew; - } - - public CrewEntity saveWithWaitingMembers(final Integer memberCount) { - final List members = memberSetup.save(memberCount); - final CrewEntity crew = save(members.get(0)); - - members.subList(1, members.size()) - .stream() - .map(member -> CrewFixtures.crewMemberBuild(member, crew)) - .forEach(crewMemberRepository::save); - - return crew; - } - - public CrewEntity saveWithConfirmedMembers(final Integer memberCount) { - final CrewEntity crew = saveWithWaitingMembers(memberCount); - - crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .forEach(waitingCrewMember -> waitingCrewMember.updateStatus(CONFIRMED)); - - return crew; - } -} diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java deleted file mode 100644 index 08e6d3a4..00000000 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ /dev/null @@ -1,76 +0,0 @@ -package kr.pickple.back.fixture.setup; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.chat.domain.ChatRoom; -import kr.pickple.back.chat.repository.ChatRoomRepository; -import kr.pickple.back.fixture.domain.GameFixtures; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; -import kr.pickple.back.member.repository.entity.MemberEntity; - -@Component -public class GameSetup { - - @Autowired - private GameRepository gameRepository; - - @Autowired - private ChatRoomRepository chatRoomRepository; - - @Autowired - private MemberSetup memberSetup; - - @Autowired - private AddressSetup addressSetup; - - public GameEntity save(final MemberEntity host) { - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - - final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); - final ChatRoom savedChatRoom = chatRoomRepository.save(GameFixtures.gameChatRoomBuild()); - - gameEntity.addGameMember(host); - savedChatRoom.updateMaxMemberCount(gameEntity.getMaxMemberCount()); - gameEntity.makeNewGameChatRoom(savedChatRoom); - - final GameMemberEntity gameHost = gameEntity.getGameMembers().get(0); - host.addMemberGame(gameHost); - gameHost.updateStatus(CONFIRMED); - - return gameRepository.save(gameEntity); - } - - public GameEntity saveWithWaitingMembers(final Integer memberCount) { - final List members = memberSetup.save(memberCount); - final GameEntity gameEntity = save(members.get(0)); - final List guests = members.subList(1, members.size()); - - guests.forEach(gameEntity::addGameMember); - - return gameEntity; - } - - public GameEntity saveWithConfirmedMembers(final Integer memberCount) { - final GameEntity gameEntity = saveWithWaitingMembers(memberCount); - final MemberEntity host = gameEntity.getHost(); - final List gameMemberEntities = gameEntity.getGameMembers(); - - gameMemberEntities.forEach(gameMember -> { - if (!host.equals(gameMember.getMember())) { - gameMember.updateStatus(CONFIRMED); - } - }); - - return gameEntity; - } -} diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java deleted file mode 100644 index fe91d444..00000000 --- a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java +++ /dev/null @@ -1,44 +0,0 @@ -package kr.pickple.back.fixture.setup; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.repository.MemberRepository; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class MemberSetup { - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private AddressSetup addressSetup; - - public MemberEntity save() { - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - - final MemberEntity member = MemberFixtures.memberBuild( - addressDepth1, - addressDepth2 - ); - return memberRepository.save(member); - } - - public List save(final int count) { - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - - final List members = MemberFixtures.membersBuild(count, addressDepth1, addressDepth2); - - return members.stream() - .map(memberRepository::save) - .toList(); - } -} diff --git a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java b/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java deleted file mode 100644 index 11d6f1a5..00000000 --- a/src/test/java/kr/pickple/back/game/service/GameEntityServiceTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package kr.pickple.back.game.service; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.BDDMockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.fixture.domain.GameFixtures; -import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.dto.response.GameResponse; -import kr.pickple.back.game.repository.GameRepository; -import kr.pickple.back.member.repository.entity.MemberEntity; - -@ExtendWith(MockitoExtension.class) -public class GameEntityServiceTest { - - @InjectMocks - private GameService gameService; - - @Mock - private GameRepository gameRepository; - - @Test - @DisplayName("게스트 모집을 상세 조회할 수 있다.") - void findGameById_ReturnGameResponse() { - // given - final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() - .name("서울시") - .build(); - final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() - .name("영등포구") - .addressDepth1(addressDepth1) - .build(); - - final MemberEntity host = MemberFixtures.memberBuild(addressDepth1, addressDepth2); - - final GameEntity gameEntity = GameFixtures.gameBuild(addressDepth1, addressDepth2, host); - - given(gameRepository.findById(anyLong())).willReturn(Optional.ofNullable(gameEntity)); - - // when - final GameResponse gameResponse = gameService.findGameById(1L); - - // then - assertThat(gameResponse).isNotNull(); - } -} diff --git a/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java b/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java deleted file mode 100644 index 1055c4f4..00000000 --- a/src/test/java/kr/pickple/back/member/service/MemberEntityCrewServiceTestEntity.java +++ /dev/null @@ -1,97 +0,0 @@ -package kr.pickple.back.member.service; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.member.exception.MemberExceptionCode.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.BDDMockito.*; - -import java.util.List; -import java.util.Optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.crew.dto.response.CrewProfileResponse; -import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.MemberRepository; - -public class MemberEntityCrewServiceTestEntity { - - @InjectMocks - private MemberCrewService memberCrewService; - - @Mock - private MemberRepository memberRepository; - - @Test - @DisplayName("회원이 가입한 크루 목록을 조회할 수 있다.") - void findAllCrewsByMemberId_ReturnCrewProfileResponses() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 1L; - final MemberEntity member = buildMember(); - given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); - - // when - final List crewProfileResponses = memberCrewService.findAllCrewsByMemberId(memberId, - loggedInMemberId, CONFIRMED); - - // then - assertThat(crewProfileResponses).isNotNull(); - } - - @Test - @DisplayName("회원이 만든 크루 목록을 조회할 수 있다.") - void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 1L; - final MemberEntity member = buildMember(); - - given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); - - // when - final List crewProfileResponses = memberCrewService.findCreatedCrewsByMemberId( - loggedInMemberId, - memberId - ); - - // then - assertThat(crewProfileResponses).isNotNull(); - } - - @Test - @DisplayName("회원이 만든 크루 목록을 조회할 때 본인이 만든 크루가 아닌 경우 예외가 발생한다.") - void findCreatedCrewsByMemberId_ThrowException() { - // given - final Long memberId = 1L; - final Long loggedInMemberId = 2L; - final MemberEntity member = buildMember(); - - // when && then - assertThatThrownBy(() -> memberCrewService.findCreatedCrewsByMemberId( - loggedInMemberId, - memberId - )).isInstanceOf(MemberException.class) - .hasMessage(MEMBER_MISMATCH.getMessage()); - } - - private MemberEntity buildMember() { - final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() - .name("서울시") - .build(); - final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() - .name("영등포구") - .addressDepth1(addressDepth1) - .build(); - - return MemberFixtures.memberBuild(addressDepth1, addressDepth2); - } -} diff --git a/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java b/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java deleted file mode 100644 index f75903a2..00000000 --- a/src/test/java/kr/pickple/back/member/service/MemberEntityServiceTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package kr.pickple.back.member.service; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.BDDMockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.transaction.annotation.Transactional; - -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.address.domain.MainAddress; -import kr.pickple.back.address.implement.AddressReader; -import kr.pickple.back.auth.config.property.JwtProperties; -import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.auth.domain.token.JwtProvider; -import kr.pickple.back.auth.domain.token.RefreshToken; -import kr.pickple.back.auth.repository.RedisRepository; -import kr.pickple.back.fixture.domain.MemberFixtures; -import kr.pickple.back.fixture.dto.MemberDtoFixtures; -import kr.pickple.back.member.repository.entity.MemberEntity; -import kr.pickple.back.member.dto.request.MemberCreateRequest; -import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; -import kr.pickple.back.member.dto.response.MemberProfileResponse; -import kr.pickple.back.member.repository.MemberRepository; - -@ExtendWith(MockitoExtension.class) -class MemberEntityServiceTest { - - @InjectMocks - private MemberService memberService; - - @Mock - private MemberRepository memberRepository; - - @Mock - private JwtProvider jwtProvider; - - @Mock - private AddressReader addressReader; - - @Mock - private JwtProperties jwtProperties; - - @Mock - private RedisRepository redisRepository; - - @Test - @Transactional - @DisplayName("회원을 생성할 수 있다.") - void createMember_ReturnAuthenticatedMemberResponse() { - // given - final MemberCreateRequest memberCreateRequest = MemberDtoFixtures.memberCreateRequestBuild(); - final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() - .name("서울시") - .build(); - final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() - .name("영등포구") - .addressDepth1(addressDepth1) - .build(); - final MainAddress mainAddress = MainAddress.builder() - .addressDepth1(addressDepth1) - .addressDepth2(addressDepth2) - .build(); - final AuthTokens authTokens = AuthTokens.builder() - .accessToken("accessToken") - .refreshToken("refreshToken") - .build(); - - final MemberEntity member = memberCreateRequest.toEntity(mainAddress); - - given(addressReader.readMainAddressByNames(anyString(), anyString())).willReturn(mainAddress); - given(memberRepository.save(any(MemberEntity.class))).willReturn(member); - given(jwtProvider.createLoginToken(anyString())).willReturn(authTokens); - given(jwtProperties.getRefreshTokenExpirationTime()).willReturn(1000L); - - // when - final AuthenticatedMemberResponse authenticatedMemberResponse = memberService.createMember(memberCreateRequest); - - // then - verify(redisRepository).saveHash(anyString(), anyString(), any(RefreshToken.class), anyLong()); - assertThat(authenticatedMemberResponse).isNotNull(); - } - - @Test - @DisplayName("회원을 조회할 수 있다.") - void findMemberById_ReturnMemberProfileResponse() { - // given - final Long memberId = 1L; - final MemberEntity member = buildMember(); - given(memberRepository.findById(anyLong())).willReturn(Optional.ofNullable(member)); - - // when - final MemberProfileResponse memberProfileResponse = memberService.findMemberProfileById(memberId); - - // then - assertThat(memberProfileResponse).isNotNull(); - } - - private MemberEntity buildMember() { - final AddressDepth1Entity addressDepth1 = AddressDepth1Entity.builder() - .name("서울시") - .build(); - final AddressDepth2Entity addressDepth2 = AddressDepth2Entity.builder() - .name("영등포구") - .addressDepth1(addressDepth1) - .build(); - - return MemberFixtures.memberBuild(addressDepth1, addressDepth2); - } -} diff --git a/src/test/java/kr/pickple/back/position/service/PositionServiceTest.java b/src/test/java/kr/pickple/back/position/service/PositionServiceTest.java deleted file mode 100644 index 62bad2af..00000000 --- a/src/test/java/kr/pickple/back/position/service/PositionServiceTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package kr.pickple.back.position.service; - -import static org.assertj.core.api.Assertions.*; - -import java.util.List; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import kr.pickple.back.position.domain.Position; -import kr.pickple.back.position.dto.PositionResponse; - -@SpringBootTest -class PositionServiceTest { - - @Autowired - private PositionService positionService; - - @Test - @DisplayName("포지션 정보 조회 시, 전체 포지션 정보를 반환한다.") - void findAllPositions_Success() { - //when - List Positions = positionService.findAllPositions(); - - //then - assertThat(Positions.get(0).getName()).isEqualTo(Position.CENTER.getName()); - assertThat(Positions.get(0).getAcronym()).isEqualTo(Position.CENTER.getAcronym()); - assertThat(Positions.get(0).getDescription()).isEqualTo(Position.CENTER.getDescription()); - - assertThat(Positions.get(1).getName()).isEqualTo(Position.POWER_FORWARD.getName()); - assertThat(Positions.get(1).getAcronym()).isEqualTo(Position.POWER_FORWARD.getAcronym()); - assertThat(Positions.get(1).getDescription()).isEqualTo(Position.POWER_FORWARD.getDescription()); - - assertThat(Positions.get(2).getName()).isEqualTo(Position.SMALL_FORWARD.getName()); - assertThat(Positions.get(2).getAcronym()).isEqualTo(Position.SMALL_FORWARD.getAcronym()); - assertThat(Positions.get(2).getDescription()).isEqualTo(Position.SMALL_FORWARD.getDescription()); - - assertThat(Positions.get(3).getName()).isEqualTo(Position.POINT_GUARD.getName()); - assertThat(Positions.get(3).getAcronym()).isEqualTo(Position.POINT_GUARD.getAcronym()); - assertThat(Positions.get(3).getDescription()).isEqualTo(Position.POINT_GUARD.getDescription()); - - assertThat(Positions.get(4).getName()).isEqualTo(Position.SHOOTING_GUARD.getName()); - assertThat(Positions.get(4).getAcronym()).isEqualTo(Position.SHOOTING_GUARD.getAcronym()); - assertThat(Positions.get(4).getDescription()).isEqualTo(Position.SHOOTING_GUARD.getDescription()); - - assertThat(Positions.get(5).getName()).isEqualTo(Position.EMPTY.getName()); - assertThat(Positions.get(5).getAcronym()).isEqualTo(Position.EMPTY.getAcronym()); - assertThat(Positions.get(5).getDescription()).isEqualTo(Position.EMPTY.getDescription()); - } -} \ No newline at end of file From 11186f49efff9f1d98ad3963f45105227689a3f4 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 3 Apr 2024 16:43:38 +0900 Subject: [PATCH 104/117] =?UTF-8?q?test:=20AddressDocumentTest=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EC=9D=B8=EB=8D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../address/docs/AddressDocumentTest.java | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/src/test/java/kr/pickple/back/address/docs/AddressDocumentTest.java b/src/test/java/kr/pickple/back/address/docs/AddressDocumentTest.java index eb23d747..66117aff 100644 --- a/src/test/java/kr/pickple/back/address/docs/AddressDocumentTest.java +++ b/src/test/java/kr/pickple/back/address/docs/AddressDocumentTest.java @@ -1,12 +1,14 @@ package kr.pickple.back.address.docs; -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.epages.restdocs.apispec.Schema.schema; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,46 +18,42 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.restdocs.payload.JsonFieldType; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.transaction.annotation.Transactional; import com.epages.restdocs.apispec.ResourceSnippetParameters; -@Transactional @SpringBootTest @AutoConfigureMockMvc @AutoConfigureRestDocs class AddressDocumentTest { @Autowired - protected MockMvc mockMvc; + private MockMvc mockMvc; @Test @DisplayName("지역 목록 조회") void findAllAddress_ReturnAllAddressResponse() throws Exception { - // when - final ResultActions resultActions = mockMvc.perform(get("/address")) - .andExpect(status().isOk()); - - // then - resultActions.andDo(document("find-all-address", - preprocessRequest(prettyPrint()), - preprocessResponse(prettyPrint()), - resource( - ResourceSnippetParameters.builder() - .tag("Address") - .summary("지역 목록 조회") - .description("전체 지역 목록을 조회한다.") - .responseSchema(schema("AllAddressResponse")) - .responseFields( - fieldWithPath("addressDepth1").type(JsonFieldType.STRING) - .description("주소1(도, 시)"), - fieldWithPath("addressDepth2List").type(JsonFieldType.ARRAY) - .description("주소1에 속한 주소2(구) 목록") - ) - .build() + mockMvc.perform(get("/address")) + .andExpect(status().isOk()) + .andDo(document("find-all-address", + preprocessRequest(prettyPrint()), + preprocessResponse(prettyPrint()), + resource( + ResourceSnippetParameters.builder() + .tag("Address") + .summary("지역 목록 조회") + .description("전체 지역 목록을 조회한다.") + .responseSchema(schema("AllAddressResponse")) + .responseFields( + fieldWithPath("addressDepth1") + .type(JsonFieldType.STRING) + .description("주소1(도, 시)"), + fieldWithPath("addressDepth2List"). + type(JsonFieldType.ARRAY) + .description("주소1에 속한 주소2(구) 목록") + ) + .build() + ) ) - ) - ); + ); } } From 0c898d2284b7fc5fbb4b866c5dfd8b8e92490f5a Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 3 Apr 2024 16:43:55 +0900 Subject: [PATCH 105/117] =?UTF-8?q?test:=20AddressControllerTest=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AddressControllerTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java diff --git a/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java b/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java new file mode 100644 index 00000000..5e7e767d --- /dev/null +++ b/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java @@ -0,0 +1,45 @@ +package kr.pickple.back.address.controller; + +import static org.hamcrest.Matchers.is; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import kr.pickple.back.address.domain.AllAddress; +import kr.pickple.back.address.implement.AddressReader; + +@SpringBootTest +@AutoConfigureMockMvc +@AutoConfigureRestDocs +class AddressControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private AddressReader addressReader; + + @Test + @DisplayName("모든 지역 목록을 조회한다.") + void findAllAddress_ReturnAllAddressResponse() throws Exception { + final AllAddress expected = addressReader.readAllAddress(); + + mockMvc.perform(get("/address")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.addressDepth1").value(expected.getAddressDepth1Name())) + .andExpect(jsonPath("$.addressDepth2List").value(is(expected.getAddressDepth2Names()))) + .andDo(print()); + } +} From 571f1be9182d69e4af95eacedd4374fc5b436e78 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 3 Apr 2024 16:54:20 +0900 Subject: [PATCH 106/117] =?UTF-8?q?test:=20AddressParserTest=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/address/util/AddressParser.java | 4 +++ .../back/address/util/AddressParserTest.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/test/java/kr/pickple/back/address/util/AddressParserTest.java diff --git a/src/main/java/kr/pickple/back/address/util/AddressParser.java b/src/main/java/kr/pickple/back/address/util/AddressParser.java index 958c5c19..1143fa31 100644 --- a/src/main/java/kr/pickple/back/address/util/AddressParser.java +++ b/src/main/java/kr/pickple/back/address/util/AddressParser.java @@ -3,6 +3,10 @@ import java.util.Arrays; import java.util.List; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) public final class AddressParser { public static final int ADDRESS_DEPTH_SIZE = 2; diff --git a/src/test/java/kr/pickple/back/address/util/AddressParserTest.java b/src/test/java/kr/pickple/back/address/util/AddressParserTest.java new file mode 100644 index 00000000..135f60a1 --- /dev/null +++ b/src/test/java/kr/pickple/back/address/util/AddressParserTest.java @@ -0,0 +1,26 @@ +package kr.pickple.back.address.util; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class AddressParserTest { + + @ParameterizedTest + @CsvSource(value = { + "서울시 강남구 논현동 1,서울시,강남구", + "서울 송파구 석촌동 2,서울시,송파구", + "경기도 성남시 수정구 단대동 3,경기도,성남시" + }) + @DisplayName("전체 주소를 주소1과 주소2로 나눈다.") + void splitToAddressDepth1And2_ReturnAddressDepth1And2List( + final String mainAddressName, + final String addressDepth1Name, + final String addressDepth2Name + ) { + assertThat(AddressParser.splitToAddressDepth1And2(mainAddressName)) + .containsExactly(addressDepth1Name, addressDepth2Name); + } +} From 44925097293ad41c99d3a7a99c7844e89baca538 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 3 Apr 2024 18:52:37 +0900 Subject: [PATCH 107/117] =?UTF-8?q?test:=20AddressReaderTest=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickple/back/address/domain/Address.java | 2 + .../back/address/domain/AllAddress.java | 2 + .../back/address/domain/MainAddress.java | 2 + .../entity/AddressDepth1Entity.java | 3 +- .../entity/AddressDepth2Entity.java | 3 +- .../controller/AddressControllerTest.java | 6 +- .../address/implement/AddressReaderTest.java | 167 ++++++++++++++++++ 7 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 src/test/java/kr/pickple/back/address/implement/AddressReaderTest.java diff --git a/src/main/java/kr/pickple/back/address/domain/Address.java b/src/main/java/kr/pickple/back/address/domain/Address.java index b7a18d3f..26e5b5c4 100644 --- a/src/main/java/kr/pickple/back/address/domain/Address.java +++ b/src/main/java/kr/pickple/back/address/domain/Address.java @@ -3,11 +3,13 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) +@EqualsAndHashCode public class Address { private Long id; diff --git a/src/main/java/kr/pickple/back/address/domain/AllAddress.java b/src/main/java/kr/pickple/back/address/domain/AllAddress.java index a8c2533a..6d434b58 100644 --- a/src/main/java/kr/pickple/back/address/domain/AllAddress.java +++ b/src/main/java/kr/pickple/back/address/domain/AllAddress.java @@ -5,11 +5,13 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; import lombok.Getter; @Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) +@EqualsAndHashCode public class AllAddress { private String addressDepth1Name; diff --git a/src/main/java/kr/pickple/back/address/domain/MainAddress.java b/src/main/java/kr/pickple/back/address/domain/MainAddress.java index b85f15f7..846078f6 100644 --- a/src/main/java/kr/pickple/back/address/domain/MainAddress.java +++ b/src/main/java/kr/pickple/back/address/domain/MainAddress.java @@ -3,9 +3,11 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.EqualsAndHashCode; @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) +@EqualsAndHashCode public class MainAddress { private Address addressDepth1; diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java index 3f6ae404..588a4afa 100644 --- a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth1Entity.java @@ -28,7 +28,8 @@ public class AddressDepth1Entity extends BaseEntity implements AddressEntity { private String name; @Builder - private AddressDepth1Entity(final String name) { + private AddressDepth1Entity(final Long id, final String name) { + this.id = id; this.name = name; } } diff --git a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java index a4d70dc0..00ec53cd 100644 --- a/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java +++ b/src/main/java/kr/pickple/back/address/repository/entity/AddressDepth2Entity.java @@ -32,7 +32,8 @@ public class AddressDepth2Entity extends BaseEntity implements AddressEntity { private Long addressDepth1Id; @Builder - private AddressDepth2Entity(final String name, final Long addressDepth1Id) { + private AddressDepth2Entity(final Long id, final String name, final Long addressDepth1Id) { + this.id = id; this.name = name; this.addressDepth1Id = addressDepth1Id; } diff --git a/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java b/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java index 5e7e767d..e391e180 100644 --- a/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java +++ b/src/test/java/kr/pickple/back/address/controller/AddressControllerTest.java @@ -33,13 +33,13 @@ class AddressControllerTest { @Test @DisplayName("모든 지역 목록을 조회한다.") void findAllAddress_ReturnAllAddressResponse() throws Exception { - final AllAddress expected = addressReader.readAllAddress(); + final AllAddress expectedAllAddress = addressReader.readAllAddress(); mockMvc.perform(get("/address")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("$.addressDepth1").value(expected.getAddressDepth1Name())) - .andExpect(jsonPath("$.addressDepth2List").value(is(expected.getAddressDepth2Names()))) + .andExpect(jsonPath("$.addressDepth1").value(expectedAllAddress.getAddressDepth1Name())) + .andExpect(jsonPath("$.addressDepth2List").value(is(expectedAllAddress.getAddressDepth2Names()))) .andDo(print()); } } diff --git a/src/test/java/kr/pickple/back/address/implement/AddressReaderTest.java b/src/test/java/kr/pickple/back/address/implement/AddressReaderTest.java new file mode 100644 index 00000000..1bc5afb2 --- /dev/null +++ b/src/test/java/kr/pickple/back/address/implement/AddressReaderTest.java @@ -0,0 +1,167 @@ +package kr.pickple.back.address.implement; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.BDDMockito.given; + +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import kr.pickple.back.address.domain.Address; +import kr.pickple.back.address.domain.AllAddress; +import kr.pickple.back.address.domain.MainAddress; +import kr.pickple.back.address.exception.AddressException; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; + +@ExtendWith(MockitoExtension.class) +class AddressReaderTest { + + @Mock + private AddressDepth1Repository addressDepth1Repository; + + @Mock + private AddressDepth2Repository addressDepth2Repository; + + @InjectMocks + private AddressReader addressReader; + + @Test + @DisplayName("모든 지역 목록을 조회한다.") + void readAllAddress_ReturnAllAddress() { + given(addressDepth1Repository.findAll()) + .willReturn(List.of(addressDepth1Entity())); + given(addressDepth2Repository.findAllByAddressDepth1Id(anyLong())) + .willReturn(List.of(addressDepth2Entity())); + + final AllAddress expectedAllAddress = AllAddress.builder() + .addressDepth1Name("서울시") + .addressDepth2Names(List.of("강남구")) + .build(); + + assertThat(addressReader.readAllAddress()) + .isEqualTo(expectedAllAddress); + } + + @Test + @DisplayName("주소1과 주소2의 ID를 통해 주 활동 지역을 조회한다.") + void readMainAddressByIds_ReturnMainAddress() { + given(addressDepth1Repository.findById(anyLong())) + .willReturn(Optional.of(addressDepth1Entity())); + given(addressDepth2Repository.findById(anyLong())) + .willReturn(Optional.of(addressDepth2Entity())); + + assertThat(addressReader.readMainAddressByIds(1L, 1L)) + .isEqualTo(expectedMainAddress()); + } + + @Test + @DisplayName("주소1의 ID에 해당하는 주소가 없는 경우 예외를 던진다.") + void readMainAddressByIds_NotExistAddressDepth1_Exception() { + given(addressDepth1Repository.findById(anyLong())) + .willReturn(Optional.empty()); + + assertThatThrownBy(() -> addressReader.readMainAddressByIds(2L, 1L)) + .isInstanceOf(AddressException.class); + } + + @Test + @DisplayName("주소2의 ID에 해당하는 주소가 없는 경우 예외를 던진다.") + void readMainAddressByIds_NotExistAddressDepth2_Exception() { + given(addressDepth1Repository.findById(anyLong())) + .willReturn(Optional.of(addressDepth1Entity())); + given(addressDepth2Repository.findById(anyLong())) + .willReturn(Optional.empty()); + + assertThatThrownBy(() -> addressReader.readMainAddressByIds(1L, 2L)) + .isInstanceOf(AddressException.class); + } + + @Test + @DisplayName("주소1과 주소2의 이름을 통해 주 활동 지역을 조회한다.") + void readMainAddressByNames_ReturnMainAddress() { + given(addressDepth1Repository.findByName(anyString())) + .willReturn(Optional.of(addressDepth1Entity())); + given(addressDepth2Repository.findByNameAndAddressDepth1Id(anyString(), anyLong())) + .willReturn(Optional.of(addressDepth2Entity())); + + assertThat(addressReader.readMainAddressByNames("서울시", "강남구")) + .isEqualTo(expectedMainAddress()); + } + + @Test + @DisplayName("주소1의 이름에 해당하는 주소가 없는 경우 예외를 던진다.") + void readMainAddressByNames_NotExistAddressDepth1_Exception() { + given(addressDepth1Repository.findByName(anyString())) + .willReturn(Optional.empty()); + + assertThatThrownBy(() -> addressReader.readMainAddressByNames("뉴욕시", "강남구")) + .isInstanceOf(AddressException.class); + } + + @Test + @DisplayName("주소2의 이름에 해당하는 주소가 없는 경우 예외를 던진다.") + void readMainAddressByNames_NotExistAddressDepth2_Exception() { + given(addressDepth1Repository.findByName(anyString())) + .willReturn(Optional.of(addressDepth1Entity())); + given(addressDepth2Repository.findByNameAndAddressDepth1Id(anyString(), anyLong())) + .willReturn(Optional.empty()); + + assertThatThrownBy(() -> addressReader.readMainAddressByNames("서울시", "뉴욕구")) + .isInstanceOf(AddressException.class); + } + + @Test + @DisplayName("주소를 주소1과 주소2로 나누고 이를 통해 주 활동 지역을 조회한다.") + void readMainAddressFromFullAddress_ReturnMainAddress() { + given(addressDepth1Repository.findByName(anyString())) + .willReturn(Optional.of(addressDepth1Entity())); + given(addressDepth2Repository.findByNameAndAddressDepth1Id(anyString(), anyLong())) + .willReturn(Optional.of(addressDepth2Entity())); + + assertThat(addressReader.readMainAddressFromFullAddress("서울시 강남구 논현동 1")) + .isEqualTo(expectedMainAddress()); + } + + private AddressDepth1Entity addressDepth1Entity() { + return AddressDepth1Entity.builder() + .id(1L) + .name("서울시") + .build(); + } + + private AddressDepth2Entity addressDepth2Entity() { + return AddressDepth2Entity.builder() + .id(1L) + .name("강남구") + .addressDepth1Id(1L) + .build(); + } + + private MainAddress expectedMainAddress() { + final Address addressDepth1 = Address.builder() + .id(1L) + .name("서울시") + .build(); + final Address addressDepth2 = Address.builder() + .id(1L) + .name("강남구") + .build(); + + return MainAddress.builder() + .addressDepth1(addressDepth1) + .addressDepth2(addressDepth2) + .build(); + } +} From 0137db8edee333f079a551f420b24551c5a07379 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 15:47:36 +0900 Subject: [PATCH 108/117] =?UTF-8?q?test:=20Game=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Fixture=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/game/GameEntityFixtures.java | 36 ++++++++++ .../entity/game/GameMemberEntityFixtures.java | 22 ++++++ .../game/GamePositionEntityFixtures.java | 14 ++++ .../pickple/back/fixture/setup/GameSetup.java | 71 +++++++++++++++++++ 4 files changed, 143 insertions(+) create mode 100644 src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/setup/GameSetup.java diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java new file mode 100644 index 00000000..56bb9d9c --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java @@ -0,0 +1,36 @@ +package kr.pickple.back.fixture.entity.game; + +import java.time.LocalDate; +import java.time.LocalTime; + +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.PrecisionModel; + +import kr.pickple.back.game.repository.entity.GameEntity; + +public class GameEntityFixtures { + + public static GameEntity gameEntityBuild(final Long memberId, final Long chatRoomId) { + final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); + final Point point = geometryFactory.createPoint(new Coordinate(37.125, 126.75)); + + return GameEntity.builder() + .content("하이하이 즐겜 한 판해요") + .playDate(LocalDate.now().minusDays(1)) + .playStartTime(LocalTime.of(11, 30)) + .playEndTime(LocalTime.of(13, 0)) + .playTimeMinutes(90) + .mainAddress("서울 영등포구 도림동 254") + .detailAddress("영등포 다목적 체육관 2층 201호") + .cost(100) + .maxMemberCount(5) + .point(point) + .hostId(memberId) + .addressDepth1Id(1L) // 서울시 + .addressDepth2Id(1L) // 강남구 + .chatRoomId(chatRoomId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java new file mode 100644 index 00000000..ab168422 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java @@ -0,0 +1,22 @@ +package kr.pickple.back.fixture.entity.game; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.repository.entity.GameMemberEntity; + +public class GameMemberEntityFixtures { + + public static GameMemberEntity gameMemberEntityBuild() { + return GameMemberEntity.builder() + .memberId(1L) + .gameId(1L) + .build(); + } + + public static GameMemberEntity gameMemberEntityStatusConfirmedBuild(final Long memberId, final Long gameId) { + return GameMemberEntity.builder() + .memberId(memberId) + .gameId(gameId) + .status(RegistrationStatus.CONFIRMED) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java new file mode 100644 index 00000000..42791c81 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java @@ -0,0 +1,14 @@ +package kr.pickple.back.fixture.entity.game; + +import kr.pickple.back.game.repository.entity.GamePositionEntity; +import kr.pickple.back.position.domain.Position; + +public class GamePositionEntityFixtures { + + public static GamePositionEntity gamePositionEntityBuild(final Long gameId) { + return GamePositionEntity.builder() + .position(Position.CENTER) + .gameId(gameId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java new file mode 100644 index 00000000..f2f77305 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -0,0 +1,71 @@ +package kr.pickple.back.fixture.setup; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import kr.pickple.back.chat.repository.ChatMessageRepository; +import kr.pickple.back.chat.repository.ChatRoomMemberRepository; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; +import kr.pickple.back.fixture.entity.chat.ChatMessageEntityFixtures; +import kr.pickple.back.fixture.entity.chat.ChatRoomEntityFixtures; +import kr.pickple.back.fixture.entity.chat.ChatRoomMemberEntityFixtures; +import kr.pickple.back.fixture.entity.game.GameEntityFixtures; +import kr.pickple.back.fixture.entity.game.GameMemberEntityFixtures; +import kr.pickple.back.fixture.entity.game.GamePositionEntityFixtures; +import kr.pickple.back.game.repository.GameMemberRepository; +import kr.pickple.back.game.repository.GamePositionRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.game.repository.entity.GamePositionEntity; + +@Component +public class GameSetup { + + @Autowired + private GameRepository gameRepository; + + @Autowired + private GameMemberRepository gameMemberRepository; + + @Autowired + private GamePositionRepository gamePositionRepository; + + @Autowired + private ChatRoomRepository chatRoomRepository; + + @Autowired + private ChatRoomMemberRepository chatRoomMemberRepository; + + @Autowired + private ChatMessageRepository chatMessageRepository; + + public GameEntity save(final Long memberId) { + final ChatRoomEntity chatRoomEntity = ChatRoomEntityFixtures.gameChatRoomEntityBuild(); + final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + + final GameEntity gameEntity = GameEntityFixtures.gameEntityBuild(memberId, savedChatRoomEntity.getId()); + final GameEntity savedGameEntity = gameRepository.save(gameEntity); + + final GameMemberEntity gameMemberEntity = GameMemberEntityFixtures.gameMemberEntityStatusConfirmedBuild( + memberId, savedGameEntity.getId()); + gameMemberRepository.save(gameMemberEntity); + + final GamePositionEntity gamePositionEntity = GamePositionEntityFixtures.gamePositionEntityBuild( + savedGameEntity.getId()); + gamePositionRepository.save(gamePositionEntity); + + final ChatRoomMemberEntity chatRoomMemberEntity = ChatRoomMemberEntityFixtures.chatRoomMemberEntityBuild( + memberId, savedChatRoomEntity.getId()); + chatRoomMemberRepository.save(chatRoomMemberEntity); + + final ChatMessageEntity chatMessageEntity = ChatMessageEntityFixtures.chatMessageEntityBuild(memberId, + savedChatRoomEntity.getId()); + chatMessageRepository.save(chatMessageEntity); + + return savedGameEntity; + } +} From 4f823fa1b27defc351c3ef6d37113e139a4611a9 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 15:47:46 +0900 Subject: [PATCH 109/117] =?UTF-8?q?test:=20Crew=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Fixture=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/crew/CrewEntityFixtures.java | 20 ++++++ .../entity/crew/CrewMemberFixtures.java | 22 +++++++ .../pickple/back/fixture/setup/CrewSetup.java | 61 +++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java new file mode 100644 index 00000000..de7ef6c3 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java @@ -0,0 +1,20 @@ +package kr.pickple.back.fixture.entity.crew; + +import kr.pickple.back.crew.repository.entity.CrewEntity; + +public class CrewEntityFixtures { + + public static CrewEntity crewEntityBuild(final Long leaderId, final Long chatRoomId) { + return CrewEntity.builder() + .name("백둥크루1") + .content("안녕하세요 백둥크루1 입니다.") + .profileImageUrl("https://amazon.profileimage/1") + .backgroundImageUrl("https://amazon.backgroundimage/1") + .maxMemberCount(15) + .leaderId(leaderId) + .addressDepth1Id(1L) // 서울시 + .addressDepth2Id(1L) // 강남구 + .chatRoomId(chatRoomId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java new file mode 100644 index 00000000..bd3f266b --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java @@ -0,0 +1,22 @@ +package kr.pickple.back.fixture.entity.crew; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; + +public class CrewMemberFixtures { + + public static CrewMemberEntity crewMemberEntityBuild() { + return CrewMemberEntity.builder() + .memberId(1L) + .crewId(1L) + .build(); + } + + public static CrewMemberEntity crewMemberEntityStatusConfirmedBuild(final Long memberId, final Long crewId) { + return CrewMemberEntity.builder() + .memberId(memberId) + .crewId(crewId) + .status(RegistrationStatus.CONFIRMED) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java new file mode 100644 index 00000000..67437613 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -0,0 +1,61 @@ +package kr.pickple.back.fixture.setup; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import kr.pickple.back.chat.repository.ChatMessageRepository; +import kr.pickple.back.chat.repository.ChatRoomMemberRepository; +import kr.pickple.back.chat.repository.ChatRoomRepository; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; +import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.crew.repository.entity.CrewMemberEntity; +import kr.pickple.back.fixture.entity.chat.ChatMessageEntityFixtures; +import kr.pickple.back.fixture.entity.chat.ChatRoomEntityFixtures; +import kr.pickple.back.fixture.entity.chat.ChatRoomMemberEntityFixtures; +import kr.pickple.back.fixture.entity.crew.CrewEntityFixtures; +import kr.pickple.back.fixture.entity.crew.CrewMemberFixtures; + +@Component +public class CrewSetup { + + @Autowired + private CrewRepository crewRepository; + + @Autowired + private CrewMemberRepository crewMemberRepository; + + @Autowired + private ChatRoomRepository chatRoomRepository; + + @Autowired + private ChatRoomMemberRepository chatRoomMemberRepository; + + @Autowired + private ChatMessageRepository chatMessageRepository; + + public CrewEntity save(final Long memberId) { + final ChatRoomEntity chatRoomEntity = ChatRoomEntityFixtures.gameChatRoomEntityBuild(); + final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); + + final CrewEntity crewEntity = CrewEntityFixtures.crewEntityBuild(memberId, savedChatRoomEntity.getId()); + final CrewEntity savedCrewEntity = crewRepository.save(crewEntity); + + final CrewMemberEntity crewMemberEntity = CrewMemberFixtures.crewMemberEntityStatusConfirmedBuild( + memberId, savedCrewEntity.getId()); + crewMemberRepository.save(crewMemberEntity); + + final ChatRoomMemberEntity chatRoomMemberEntity = ChatRoomMemberEntityFixtures.chatRoomMemberEntityBuild( + memberId, savedChatRoomEntity.getId()); + chatRoomMemberRepository.save(chatRoomMemberEntity); + + final ChatMessageEntity chatMessageEntity = ChatMessageEntityFixtures.chatMessageEntityBuild(memberId, + savedChatRoomEntity.getId()); + chatMessageRepository.save(chatMessageEntity); + + return savedCrewEntity; + } +} From 8e7eecefd2d43155b1f0ae70366746d6e5d9147d Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 15:47:54 +0900 Subject: [PATCH 110/117] =?UTF-8?q?test:=20Chat=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Fixture=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/ChatMessageEntityFixtures.java | 16 +++++++++++++ .../entity/chat/ChatRoomEntityFixtures.java | 24 +++++++++++++++++++ .../chat/ChatRoomMemberEntityFixtures.java | 13 ++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java new file mode 100644 index 00000000..e3ef2488 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java @@ -0,0 +1,16 @@ +package kr.pickple.back.fixture.entity.chat; + +import kr.pickple.back.chat.domain.MessageType; +import kr.pickple.back.chat.repository.entity.ChatMessageEntity; + +public class ChatMessageEntityFixtures { + + public static ChatMessageEntity chatMessageEntityBuild(final Long senderId, final Long chatRoomId) { + return ChatMessageEntity.builder() + .type(MessageType.ENTER) + .content("pickple1님이 채팅방에 입장하셨습니다.") + .senderId(senderId) + .chatRoomId(chatRoomId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java new file mode 100644 index 00000000..f0dda612 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java @@ -0,0 +1,24 @@ +package kr.pickple.back.fixture.entity.chat; + +import static kr.pickple.back.chat.domain.RoomType.*; + +import kr.pickple.back.chat.repository.entity.ChatRoomEntity; + +public class ChatRoomEntityFixtures { + + public static ChatRoomEntity crewChatRoomEntityBuild() { + return ChatRoomEntity.builder() + .name("백둥크루1") + .type(CREW) + .maxMemberCount(10) + .build(); + } + + public static ChatRoomEntity gameChatRoomEntityBuild() { + return ChatRoomEntity.builder() + .name("11.10 영등포구") + .type(GAME) + .maxMemberCount(10) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java new file mode 100644 index 00000000..3b4e9cce --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java @@ -0,0 +1,13 @@ +package kr.pickple.back.fixture.entity.chat; + +import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; + +public class ChatRoomMemberEntityFixtures { + + public static ChatRoomMemberEntity chatRoomMemberEntityBuild(final Long memberId, final Long chatRoomId) { + return ChatRoomMemberEntity.builder() + .memberId(memberId) + .chatRoomId(chatRoomId) + .build(); + } +} From c01d220832bc3d4e5f9b3c3b57c90ca6d05b0adb Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 15:48:14 +0900 Subject: [PATCH 111/117] =?UTF-8?q?test:=20Member=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20Fixture=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/fixture/domain/MemberFixtures.java | 46 +++++++++++++++++ .../back/fixture/dto/MemberDtoFixtures.java | 50 +++++++++++++++++++ .../entity/member/MemberEntityFixtures.java | 21 ++++++++ .../member/MemberPositionEntityFixtures.java | 14 ++++++ .../back/fixture/setup/MemberSetup.java | 32 ++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java create mode 100644 src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java diff --git a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java new file mode 100644 index 00000000..358ec4b6 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java @@ -0,0 +1,46 @@ +package kr.pickple.back.fixture.domain; + +import java.util.List; + +import kr.pickple.back.auth.domain.oauth.OauthProvider; +import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.member.domain.Member; +import kr.pickple.back.member.domain.NewMember; +import kr.pickple.back.position.domain.Position; + +public class MemberFixtures { + + public static Member memberBuild() { + return Member.builder() + .memberId(1L) + .email("pickple1@pickple.kr") + .nickname("pickple1") + .introduction("안녕하세요, 강백호입니다.") + .profileImageUrl("https://amazon.image") + .mannerScore(0) + .mannerScoreCount(0) + .addressDepth1Name("서울시") + .addressDepth2Name("강남구") + .positions(List.of(Position.CENTER, Position.SHOOTING_GUARD)) + .build(); + } + + public static NewMember newMemberBuild() { + final AuthTokens authTokens = AuthTokens.builder() + .accessToken("accessToken") + .refreshToken("refreshToken") + .build(); + + return NewMember.builder() + .authTokens(authTokens) + .nickname("pickple1") + .profileImageUrl("https://amazon.image") + .email("pickple1@pickple.kr") + .positions(List.of(Position.CENTER, Position.SHOOTING_GUARD)) + .oauthId(12345678L) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1Name("서울시") + .addressDepth2Name("강남구") + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java new file mode 100644 index 00000000..ee2f3c9e --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java @@ -0,0 +1,50 @@ +package kr.pickple.back.fixture.dto; + +import java.util.List; + +import kr.pickple.back.auth.domain.oauth.OauthProvider; +import kr.pickple.back.member.dto.request.MemberCreateRequest; +import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; +import kr.pickple.back.position.domain.Position; + +public class MemberDtoFixtures { + + public static MemberCreateRequest memberCreateRequestBuild() { + return MemberCreateRequest.builder() + .nickname("백둥") + .profileImageUrl("https://amazon.image/1") + .email("pickple@pickple.kr") + .positions(List.of(Position.CENTER, Position.POINT_GUARD)) + .oauthId(999999L) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1("서울시") + .addressDepth2("영등포구") + .build(); + } + + public static AuthenticatedMemberResponse authenticatedMemberResponseLoginBuild() { + return AuthenticatedMemberResponse.builder() + .accessToken("accessToken") + .refreshToken("refreshToken") + .id(1L) + .nickname("강백둥") + .profileImageUrl("https://amazon.image/1") + .email("pickple1@pickple.kr") + .oauthId(1L) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1("서울시") + .addressDepth2("영등포구") + .build(); + } + + public static AuthenticatedMemberResponse authenticatedMemberResponseRegistrationBuild() { + return AuthenticatedMemberResponse.builder() + .accessToken("accessToken") + .nickname("강백둥") + .profileImageUrl("https://amazon.image/1") + .email("pickple1@pickple.kr") + .oauthId(1L) + .oauthProvider(OauthProvider.KAKAO) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java new file mode 100644 index 00000000..2a0eefba --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java @@ -0,0 +1,21 @@ +package kr.pickple.back.fixture.entity.member; + +import kr.pickple.back.auth.domain.oauth.OauthProvider; +import kr.pickple.back.member.domain.MemberStatus; +import kr.pickple.back.member.repository.entity.MemberEntity; + +public class MemberEntityFixtures { + + public static MemberEntity memberEntityBuild() { + return MemberEntity.builder() + .email("pickple1@pickple.kr") + .nickname("pickple1") + .profileImageUrl("https://amazon.image") + .status(MemberStatus.ACTIVE) + .oauthId(1L) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1Id(1L) // 서울시 + .addressDepth2Id(1L) // 강남구 + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java new file mode 100644 index 00000000..b59ab7fe --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java @@ -0,0 +1,14 @@ +package kr.pickple.back.fixture.entity.member; + +import kr.pickple.back.member.repository.entity.MemberPositionEntity; +import kr.pickple.back.position.domain.Position; + +public class MemberPositionEntityFixtures { + + public static MemberPositionEntity memberPositionEntityBuild(final Long memberId) { + return MemberPositionEntity.builder() + .position(Position.CENTER) + .memberId(memberId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java new file mode 100644 index 00000000..773d9530 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java @@ -0,0 +1,32 @@ +package kr.pickple.back.fixture.setup; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import kr.pickple.back.fixture.entity.member.MemberEntityFixtures; +import kr.pickple.back.fixture.entity.member.MemberPositionEntityFixtures; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.MemberRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; + +@Component +public class MemberSetup { + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private MemberPositionRepository memberPositionRepository; + + public MemberEntity save() { + final MemberEntity member = MemberEntityFixtures.memberEntityBuild(); + final MemberEntity savedMemberEntity = memberRepository.save(member); + + final MemberPositionEntity memberPositionEntity = MemberPositionEntityFixtures.memberPositionEntityBuild( + member.getId()); + memberPositionRepository.save(memberPositionEntity); + + return savedMemberEntity; + } +} From 14f0a8e1b51beeeeb05294ddf42ea3510734f322 Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 15:48:42 +0900 Subject: [PATCH 112/117] =?UTF-8?q?test:=20Member=20Controller,=20Document?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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 --- .../back/member/IntegrationMemberTest.java | 20 ++- .../MemberEntityControllerTest.java | 149 +++++++++++------- .../member/docs/MemberEntityDocumentTest.java | 30 ++-- .../back/member/domain/MemberEntityTest.java | 38 +++-- 4 files changed, 151 insertions(+), 86 deletions(-) diff --git a/src/test/java/kr/pickple/back/member/IntegrationMemberTest.java b/src/test/java/kr/pickple/back/member/IntegrationMemberTest.java index 6124f914..670069e7 100644 --- a/src/test/java/kr/pickple/back/member/IntegrationMemberTest.java +++ b/src/test/java/kr/pickple/back/member/IntegrationMemberTest.java @@ -8,10 +8,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; import kr.pickple.back.auth.domain.token.JwtProvider; import kr.pickple.back.fixture.setup.CrewSetup; import kr.pickple.back.fixture.setup.GameSetup; import kr.pickple.back.fixture.setup.MemberSetup; +import kr.pickple.back.game.repository.GamePositionRepository; +import kr.pickple.back.member.repository.MemberPositionRepository; @SpringBootTest @AutoConfigureRestDocs @@ -21,6 +25,12 @@ public abstract class IntegrationMemberTest { @Autowired protected MockMvc mockMvc; + @Autowired + protected ObjectMapper objectMapper; + + @Autowired + protected JwtProvider jwtProvider; + @Autowired protected MemberSetup memberSetup; @@ -31,8 +41,14 @@ public abstract class IntegrationMemberTest { protected GameSetup gameSetup; @Autowired - protected ObjectMapper objectMapper; + protected AddressDepth1Repository addressDepth1Repository; @Autowired - protected JwtProvider jwtProvider; + protected AddressDepth2Repository addressDepth2Repository; + + @Autowired + protected GamePositionRepository gamePositionRepository; + + @Autowired + protected MemberPositionRepository memberPositionRepository; } diff --git a/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java b/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java index f31b0509..e43a8af5 100644 --- a/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java @@ -4,18 +4,21 @@ import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import java.util.List; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.IntegrationMemberTest; -import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.request.MemberCreateRequest; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.position.domain.Position; @Transactional class MemberEntityControllerTest extends IntegrationMemberTest { @@ -23,10 +26,20 @@ class MemberEntityControllerTest extends IntegrationMemberTest { private static final String BASE_URL = "/members"; @Test - @DisplayName("회원을 생성할 수 있다.") + @DisplayName("사용자가 회원가입을 한다.") void createMemberById_ReturnAuthenticatedMemberResponse() throws Exception { // given - final MemberCreateRequest memberCreateRequest = MemberDtoFixtures.memberCreateRequestBuild(); + final MemberCreateRequest memberCreateRequest = MemberCreateRequest.builder() + .nickname("강백호") + .profileImageUrl("https://pickple.com/image") + .email("kangbaekho@pickple.com") + .positions(List.of(Position.CENTER, Position.POINT_GUARD)) + .oauthId(12345678L) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1("서울시") + .addressDepth2("구로구") + .build(); + final String requestBody = objectMapper.writeValueAsString(memberCreateRequest); final String subject = memberCreateRequest.getOauthProvider().toString() + memberCreateRequest.getOauthId(); @@ -58,29 +71,39 @@ void createMemberById_ReturnAuthenticatedMemberResponse() throws Exception { } @Test - @DisplayName("회원 프로필을 조회할 수 있다.") + @DisplayName("사용자의 프로필을 조회한다.") void findMemberById_ReturnMemberProfileResponse() throws Exception { // given - final MemberEntity savedMember = memberSetup.save(); - final CrewEntity savedCrew = crewSetup.save(savedMember); + final MemberEntity member = memberSetup.save(); + final CrewEntity savedCrew = crewSetup.save(member.getId()); + final String memberAddressDepth1Name = addressDepth1Repository.findById(member.getAddressDepth1Id()) + .get() + .getName(); + final String memberAddressDepth2Name = addressDepth2Repository.findById(member.getAddressDepth2Id()) + .get() + .getName(); + + final String memberPositionName = memberPositionRepository.findAllByMemberId(member.getId()) + .get(0) + .getPosition() + .getAcronym(); // when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{members}", savedMember.getId())); + final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{members}", member.getId())); // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(savedMember.getId())) - .andExpect(jsonPath("email").value(savedMember.getEmail())) - .andExpect(jsonPath("nickname").value(savedMember.getNickname())) - .andExpect(jsonPath("introduction").value(savedMember.getIntroduction())) - .andExpect(jsonPath("profileImageUrl").value(savedMember.getProfileImageUrl())) - .andExpect(jsonPath("mannerScore").value(savedMember.getMannerScore())) - .andExpect(jsonPath("mannerScoreCount").value(savedMember.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(savedMember.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(savedMember.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(savedMember.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(savedMember.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("id").value(member.getId())) + .andExpect(jsonPath("email").value(member.getEmail())) + .andExpect(jsonPath("nickname").value(member.getNickname())) + // .andExpect(jsonPath("introduction").value(member.getIntroduction)) 머지 후 수정 예정 + .andExpect(jsonPath("profileImageUrl").value(member.getProfileImageUrl())) + .andExpect(jsonPath("mannerScore").value(member.getMannerScore())) + .andExpect(jsonPath("mannerScoreCount").value(member.getMannerScoreCount())) + .andExpect(jsonPath("addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("addressDepth2").value(memberAddressDepth2Name)) + .andExpect(jsonPath("positions[0]").value(memberPositionName)) .andExpect(jsonPath("crews[0].id").value(savedCrew.getId())) .andExpect(jsonPath("crews[0].name").value(savedCrew.getName())) .andExpect(jsonPath("crews[0].content").value(savedCrew.getContent())) @@ -91,29 +114,37 @@ void findMemberById_ReturnMemberProfileResponse() throws Exception { .andExpect(jsonPath("crews[0].status").value(savedCrew.getStatus().getDescription())) .andExpect(jsonPath("crews[0].likeCount").value(savedCrew.getLikeCount())) .andExpect(jsonPath("crews[0].competitionPoint").value(savedCrew.getCompetitionPoint())) - .andExpect(jsonPath("crews[0].leader.id").value(savedMember.getId())) - .andExpect(jsonPath("crews[0].leader.nickname").value(savedMember.getNickname())) - .andExpect(jsonPath("crews[0].leader.email").value(savedMember.getEmail())) - .andExpect(jsonPath("crews[0].leader.introduction").value(savedMember.getIntroduction())) - .andExpect(jsonPath("crews[0].leader.profileImageUrl").value(savedMember.getProfileImageUrl())) - .andExpect(jsonPath("crews[0].leader.mannerScore").value(savedMember.getMannerScore())) - .andExpect(jsonPath("crews[0].leader.mannerScoreCount").value(savedMember.getMannerScoreCount())) - .andExpect(jsonPath("crews[0].leader.addressDepth1").value(savedMember.getAddressDepth1().getName())) - .andExpect(jsonPath("crews[0].leader.addressDepth2").value(savedMember.getAddressDepth2().getName())) - .andExpect( - jsonPath("crews[0].leader.positions[0]").value(savedMember.getPositions().get(0).getAcronym())) - .andExpect( - jsonPath("crews[0].leader.positions[1]").value(savedMember.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("crews[0].addressDepth1").value(savedCrew.getAddressDepth1().getName())) - .andExpect(jsonPath("crews[0].addressDepth2").value(savedCrew.getAddressDepth2().getName())); + .andExpect(jsonPath("crews[0].leader.id").value(member.getId())) + .andExpect(jsonPath("crews[0].leader.nickname").value(member.getNickname())) + .andExpect(jsonPath("crews[0].leader.email").value(member.getEmail())) + .andExpect(jsonPath("crews[0].leader.introduction").value(member.getIntroduction())) + .andExpect(jsonPath("crews[0].leader.profileImageUrl").value(member.getProfileImageUrl())) + .andExpect(jsonPath("crews[0].leader.mannerScore").value(member.getMannerScore())) + .andExpect(jsonPath("crews[0].leader.mannerScoreCount").value(member.getMannerScoreCount())) + .andExpect(jsonPath("crews[0].leader.addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("crews[0].leader.addressDepth2").value(memberAddressDepth2Name)) + .andExpect(jsonPath("crews[0].leader.positions[0]").value(memberPositionName)) + .andExpect(jsonPath("crews[0].addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("crews[0].addressDepth2").value(memberAddressDepth2Name)); } @Test - @DisplayName("회원이 가입한 크루 목록을 조회할 수 있다.") + @DisplayName("사용자가 가입한 크루 목록을 조회한다.") void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final MemberEntity member = memberSetup.save(); - final CrewEntity crew = crewSetup.save(member); + final CrewEntity crew = crewSetup.save(member.getId()); + final String memberAddressDepth1Name = addressDepth1Repository.findById(member.getAddressDepth1Id()) + .get() + .getName(); + final String memberAddressDepth2Name = addressDepth2Repository.findById(member.getAddressDepth2Id()) + .get() + .getName(); + + final String memberPositionName = memberPositionRepository.findAllByMemberId(member.getId()) + .get(0) + .getPosition() + .getAcronym(); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -143,12 +174,11 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { .andExpect(jsonPath("[0].leader.profileImageUrl").value(member.getProfileImageUrl())) .andExpect(jsonPath("[0].leader.mannerScore").value(member.getMannerScore())) .andExpect(jsonPath("[0].leader.mannerScoreCount").value(member.getMannerScoreCount())) - .andExpect(jsonPath("[0].leader.addressDepth1").value(member.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].leader.addressDepth2").value(member.getAddressDepth2().getName())) - .andExpect(jsonPath("[0].leader.positions[0]").value(member.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("[0].leader.positions[1]").value(member.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("[0].addressDepth1").value(crew.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].addressDepth2").value(crew.getAddressDepth2().getName())) + .andExpect(jsonPath("[0].leader.addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].leader.addressDepth2").value(memberAddressDepth2Name)) + .andExpect(jsonPath("[0].leader.positions[0]").value(memberPositionName)) + .andExpect(jsonPath("[0].addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].addressDepth2").value(memberAddressDepth2Name)) .andExpect(jsonPath("[0].members[0].id").value(member.getId())) .andExpect(jsonPath("[0].members[0].nickname").value(member.getNickname())) .andExpect(jsonPath("[0].members[0].email").value(member.getEmail())) @@ -156,16 +186,28 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { .andExpect(jsonPath("[0].members[0].profileImageUrl").value(member.getProfileImageUrl())) .andExpect(jsonPath("[0].members[0].mannerScore").value(member.getMannerScore())) .andExpect(jsonPath("[0].members[0].mannerScoreCount").value(member.getMannerScoreCount())) - .andExpect(jsonPath("[0].members[0].addressDepth1").value(member.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].members[0].addressDepth2").value(member.getAddressDepth2().getName())); + .andExpect(jsonPath("[0].members[0].addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].members[0].addressDepth2").value(memberAddressDepth2Name)); } @Test - @DisplayName("회원이 만든 크루 목록을 조회할 수 있다.") + @DisplayName("사용자가 만든 크루 목록을 조회한다.") void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final MemberEntity member = memberSetup.save(); - final CrewEntity crew = crewSetup.save(member); + final CrewEntity crew = crewSetup.save(member.getId()); + final String memberAddressDepth1Name = addressDepth1Repository.findById(member.getAddressDepth1Id()) + .get() + .getName(); + final String memberAddressDepth2Name = addressDepth2Repository.findById(member.getAddressDepth2Id()) + .get() + .getName(); + + System.out.println(member.getId()); + final String memberPositionName = memberPositionRepository.findAllByMemberId(member.getId()) + .get(0) + .getPosition() + .getAcronym(); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -194,12 +236,11 @@ void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { .andExpect(jsonPath("[0].leader.profileImageUrl").value(member.getProfileImageUrl())) .andExpect(jsonPath("[0].leader.mannerScore").value(member.getMannerScore())) .andExpect(jsonPath("[0].leader.mannerScoreCount").value(member.getMannerScoreCount())) - .andExpect(jsonPath("[0].leader.addressDepth1").value(member.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].leader.addressDepth2").value(member.getAddressDepth2().getName())) - .andExpect(jsonPath("[0].leader.positions[0]").value(member.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("[0].leader.positions[1]").value(member.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("[0].addressDepth1").value(crew.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].addressDepth2").value(crew.getAddressDepth2().getName())) + .andExpect(jsonPath("[0].leader.addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].leader.addressDepth2").value(memberAddressDepth2Name)) + .andExpect(jsonPath("[0].leader.positions[0]").value(memberPositionName)) + .andExpect(jsonPath("[0].addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].addressDepth2").value(memberAddressDepth2Name)) .andExpect(jsonPath("[0].members[0].id").value(member.getId())) .andExpect(jsonPath("[0].members[0].nickname").value(member.getNickname())) .andExpect(jsonPath("[0].members[0].email").value(member.getEmail())) @@ -207,7 +248,7 @@ void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { .andExpect(jsonPath("[0].members[0].profileImageUrl").value(member.getProfileImageUrl())) .andExpect(jsonPath("[0].members[0].mannerScore").value(member.getMannerScore())) .andExpect(jsonPath("[0].members[0].mannerScoreCount").value(member.getMannerScoreCount())) - .andExpect(jsonPath("[0].members[0].addressDepth1").value(member.getAddressDepth1().getName())) - .andExpect(jsonPath("[0].members[0].addressDepth2").value(member.getAddressDepth2().getName())); + .andExpect(jsonPath("[0].members[0].addressDepth1").value(memberAddressDepth1Name)) + .andExpect(jsonPath("[0].members[0].addressDepth2").value(memberAddressDepth2Name)); } } diff --git a/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java b/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java index 9fdebf78..ab1905ad 100644 --- a/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java @@ -23,14 +23,14 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.MemberDtoFixtures; import kr.pickple.back.member.IntegrationMemberTest; -import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.request.MemberCreateRequest; +import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional class MemberEntityDocumentTest extends IntegrationMemberTest { @Test - @DisplayName("회원 생성") + @DisplayName("사용자 회원가입") void createMember_ReturnAuthenticatedMemberResponse() throws Exception { // given final MemberCreateRequest memberCreateRequest = MemberDtoFixtures.memberCreateRequestBuild(); @@ -102,11 +102,11 @@ void createMember_ReturnAuthenticatedMemberResponse() throws Exception { } @Test - @DisplayName("회원 프로필 조회") + @DisplayName("사용자 프로필 조회") void findMemberById_ReturnMemberProfileResponse() throws Exception { // given final MemberEntity member = memberSetup.save(); - crewSetup.save(member); + crewSetup.save(member.getId()); // when final ResultActions resultActions = mockMvc.perform(get("/members/{memberId}", member.getId())) @@ -191,11 +191,11 @@ void findMemberById_ReturnMemberProfileResponse() throws Exception { } @Test - @DisplayName("회원이 가입한 크루 목록 조회") + @DisplayName("사용자가 가입한 크루 목록 조회") void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final MemberEntity member = memberSetup.save(); - crewSetup.save(member); + crewSetup.save(member.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -295,11 +295,11 @@ void findAllCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { } @Test - @DisplayName("회원이 만든 크루 목록 조회") + @DisplayName("사용자가 만든 크루 목록 조회") void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { // given final MemberEntity member = memberSetup.save(); - crewSetup.save(member); + crewSetup.save(member.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(member.getId())); @@ -395,11 +395,11 @@ void findCreatedCrewsByMemberId_ReturnCrewProfileResponses() throws Exception { } @Test - @DisplayName("회원이 참여 확정된 게스트 모집글 목록 조회") + @DisplayName("사용자의 참여 확정 게스트 모집글 목록 조회") void findAllMemberGames_ReturnGameResponses() throws Exception { // given final MemberEntity host = memberSetup.save(); - gameSetup.save(host); + gameSetup.save(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(host.getId())); @@ -448,7 +448,8 @@ void findAllMemberGames_ReturnGameResponses() throws Exception { fieldWithPath("[].latitude").type(JsonFieldType.VARIES).description("위도"), fieldWithPath("[].longitude").type(JsonFieldType.VARIES).description("경도"), fieldWithPath("[].status").type(JsonFieldType.STRING).description("게스트 모집 상태"), - fieldWithPath("[].isReviewDone").type(JsonFieldType.BOOLEAN).description("리뷰 완료 여부"), + fieldWithPath("[].isReviewDone").type(JsonFieldType.BOOLEAN) + .description("리뷰 완료 여부"), fieldWithPath("[].viewCount").type(JsonFieldType.NUMBER).description("조회 수"), fieldWithPath("[].cost").type(JsonFieldType.NUMBER).description("비용"), fieldWithPath("[].memberCount").type(JsonFieldType.NUMBER).description("인원 수"), @@ -510,11 +511,11 @@ void findAllMemberGames_ReturnGameResponses() throws Exception { } @Test - @DisplayName("회원이 만든 게스트 모집글 목록 조회") + @DisplayName("사용자가 만든 게스트 모집글 목록 조회") void findAllCreatedGames_ReturnGameResponses() throws Exception { // given final MemberEntity host = memberSetup.save(); - gameSetup.save(host); + gameSetup.save(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(host.getId())); @@ -559,7 +560,8 @@ void findAllCreatedGames_ReturnGameResponses() throws Exception { fieldWithPath("[].latitude").type(JsonFieldType.VARIES).description("위도"), fieldWithPath("[].longitude").type(JsonFieldType.VARIES).description("경도"), fieldWithPath("[].status").type(JsonFieldType.STRING).description("게스트 모집 상태"), - fieldWithPath("[].isReviewDone").type(JsonFieldType.BOOLEAN).description("리뷰 완료 여부"), + fieldWithPath("[].isReviewDone").type(JsonFieldType.BOOLEAN) + .description("리뷰 완료 여부"), fieldWithPath("[].viewCount").type(JsonFieldType.NUMBER).description("조회 수"), fieldWithPath("[].cost").type(JsonFieldType.NUMBER).description("비용"), fieldWithPath("[].memberCount").type(JsonFieldType.NUMBER).description("인원 수"), diff --git a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java index a8f7028c..93675ce5 100644 --- a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java +++ b/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java @@ -1,7 +1,7 @@ package kr.pickple.back.member.domain; -import static kr.pickple.back.member.repository.entity.MemberEntity.*; import static kr.pickple.back.member.exception.MemberExceptionCode.*; +import static kr.pickple.back.member.repository.entity.MemberEntity.*; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.DisplayName; @@ -9,40 +9,46 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.fixture.domain.AddressFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.exception.MemberException; -import kr.pickple.back.member.repository.entity.MemberEntity; class MemberEntityTest { @Test - @DisplayName("회원의 매너스코어를 업데이트 시킬 수 있다.") - void updateMannerScore() { + @DisplayName("멤버의 ID가 동일한지 확인한다.") + void checkMemberIdSame() { // given - final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); + final Long memberId = 1L; + final Member member = MemberFixtures.memberBuild(); - // when & then + // when + boolean isMemberIdMatched = member.isIdMatched(memberId); + + // then + assertThat(isMemberIdMatched).isTrue(); + } + + @Test + @DisplayName("멤버의 매너 점수를 업데이트한다.") + void updateMannerScore() { MANNER_SCORE_POINT_RANGE.forEach((mannerScorePoint) -> { - final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + // given + final Member member = MemberFixtures.memberBuild(); + + // when member.updateMannerScore(mannerScorePoint); + // then assertThat(member.getMannerScore()).isEqualTo(mannerScorePoint); }); } @ParameterizedTest @ValueSource(ints = {-300, -2, 10, 10000}) - @DisplayName("회원의 매너스코어를 업데이트할 때 매너스코어 포인트가 범위에서 벗어난 경우 예외가 발생한다.") + @DisplayName("상대방이 준 매너 점수가 매너 점수 범위에 포함되지 않을 때 예외를 발생시킨다.") void updateMannerScore_ThrowException(int mannerScorePoint) { // given - final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); - - final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + final Member member = MemberFixtures.memberBuild(); // when & then assertThatThrownBy(() -> member.updateMannerScore(mannerScorePoint)) From cc1cfdd9d1cdf72c2ef4d42ccb8f2ce0c88c261e Mon Sep 17 00:00:00 2001 From: changhyeon Date: Tue, 9 Apr 2024 16:00:08 +0900 Subject: [PATCH 113/117] =?UTF-8?q?test:=20Fixture=20=EC=9D=BC=EB=B6=80=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 --- ...wMemberFixtures.java => CrewMemberEntityFixtures.java} | 8 ++++---- .../fixture/entity/game/GameMemberEntityFixtures.java | 6 +++--- .../java/kr/pickple/back/fixture/setup/CrewSetup.java | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/test/java/kr/pickple/back/fixture/entity/crew/{CrewMemberFixtures.java => CrewMemberEntityFixtures.java} (72%) diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java similarity index 72% rename from src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java rename to src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java index bd3f266b..6c2db3fc 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java @@ -3,12 +3,12 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -public class CrewMemberFixtures { +public class CrewMemberEntityFixtures { - public static CrewMemberEntity crewMemberEntityBuild() { + public static CrewMemberEntity crewMemberEntityBuild(final Long memberId, final Long crewId) { return CrewMemberEntity.builder() - .memberId(1L) - .crewId(1L) + .memberId(memberId) + .crewId(crewId) .build(); } diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java index ab168422..6211cd9f 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java @@ -5,10 +5,10 @@ public class GameMemberEntityFixtures { - public static GameMemberEntity gameMemberEntityBuild() { + public static GameMemberEntity gameMemberEntityBuild(final Long memberId, final Long gameId) { return GameMemberEntity.builder() - .memberId(1L) - .gameId(1L) + .memberId(memberId) + .gameId(gameId) .build(); } diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index 67437613..bfd30a89 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -17,7 +17,7 @@ import kr.pickple.back.fixture.entity.chat.ChatRoomEntityFixtures; import kr.pickple.back.fixture.entity.chat.ChatRoomMemberEntityFixtures; import kr.pickple.back.fixture.entity.crew.CrewEntityFixtures; -import kr.pickple.back.fixture.entity.crew.CrewMemberFixtures; +import kr.pickple.back.fixture.entity.crew.CrewMemberEntityFixtures; @Component public class CrewSetup { @@ -44,7 +44,7 @@ public CrewEntity save(final Long memberId) { final CrewEntity crewEntity = CrewEntityFixtures.crewEntityBuild(memberId, savedChatRoomEntity.getId()); final CrewEntity savedCrewEntity = crewRepository.save(crewEntity); - final CrewMemberEntity crewMemberEntity = CrewMemberFixtures.crewMemberEntityStatusConfirmedBuild( + final CrewMemberEntity crewMemberEntity = CrewMemberEntityFixtures.crewMemberEntityStatusConfirmedBuild( memberId, savedCrewEntity.getId()); crewMemberRepository.save(crewMemberEntity); From c5b692be31d82639cf483ec3a04cc3fea84fe603 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 22 Apr 2024 18:28:32 +0900 Subject: [PATCH 114/117] =?UTF-8?q?test:=20fixture=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=81=EC=86=8D=20=EB=B6=88=EA=B0=80=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20final=20=ED=82=A4=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=EC=82=BD=EC=9E=85=20=EB=B0=8F=20private=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/kr/pickple/back/chat/IntegrationChatTest.java | 2 -- .../java/kr/pickple/back/fixture/domain/MemberFixtures.java | 5 ++++- .../java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java | 5 ++++- .../back/fixture/entity/chat/ChatMessageEntityFixtures.java | 5 ++++- .../back/fixture/entity/chat/ChatRoomEntityFixtures.java | 5 ++++- .../fixture/entity/chat/ChatRoomMemberEntityFixtures.java | 5 ++++- .../pickple/back/fixture/entity/crew/CrewEntityFixtures.java | 5 ++++- .../back/fixture/entity/crew/CrewMemberEntityFixtures.java | 5 ++++- .../pickple/back/fixture/entity/game/GameEntityFixtures.java | 5 ++++- .../back/fixture/entity/game/GameMemberEntityFixtures.java | 5 ++++- .../back/fixture/entity/game/GamePositionEntityFixtures.java | 5 ++++- .../fixture/entity/member/MemberPositionEntityFixtures.java | 5 ++++- 12 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/test/java/kr/pickple/back/chat/IntegrationChatTest.java b/src/test/java/kr/pickple/back/chat/IntegrationChatTest.java index 5688d0ce..621d7115 100644 --- a/src/test/java/kr/pickple/back/chat/IntegrationChatTest.java +++ b/src/test/java/kr/pickple/back/chat/IntegrationChatTest.java @@ -4,13 +4,11 @@ import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; import com.fasterxml.jackson.databind.ObjectMapper; import kr.pickple.back.auth.domain.token.JwtProvider; -import kr.pickple.back.auth.service.OauthService; import kr.pickple.back.chat.service.ChatRoomService; import kr.pickple.back.fixture.setup.MemberSetup; diff --git a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java index 358ec4b6..8510ce31 100644 --- a/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/domain/MemberFixtures.java @@ -8,7 +8,10 @@ import kr.pickple.back.member.domain.NewMember; import kr.pickple.back.position.domain.Position; -public class MemberFixtures { +public final class MemberFixtures { + + private MemberFixtures() { + } public static Member memberBuild() { return Member.builder() diff --git a/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java index ee2f3c9e..4ba03a16 100644 --- a/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/dto/MemberDtoFixtures.java @@ -7,7 +7,10 @@ import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; import kr.pickple.back.position.domain.Position; -public class MemberDtoFixtures { +public final class MemberDtoFixtures { + + private MemberDtoFixtures() { + } public static MemberCreateRequest memberCreateRequestBuild() { return MemberCreateRequest.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java index e3ef2488..da68696b 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatMessageEntityFixtures.java @@ -3,7 +3,10 @@ import kr.pickple.back.chat.domain.MessageType; import kr.pickple.back.chat.repository.entity.ChatMessageEntity; -public class ChatMessageEntityFixtures { +public final class ChatMessageEntityFixtures { + + private ChatMessageEntityFixtures() { + } public static ChatMessageEntity chatMessageEntityBuild(final Long senderId, final Long chatRoomId) { return ChatMessageEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java index f0dda612..9e9a1221 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomEntityFixtures.java @@ -4,7 +4,10 @@ import kr.pickple.back.chat.repository.entity.ChatRoomEntity; -public class ChatRoomEntityFixtures { +public final class ChatRoomEntityFixtures { + + private ChatRoomEntityFixtures() { + } public static ChatRoomEntity crewChatRoomEntityBuild() { return ChatRoomEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java index 3b4e9cce..0812aa0d 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/chat/ChatRoomMemberEntityFixtures.java @@ -2,7 +2,10 @@ import kr.pickple.back.chat.repository.entity.ChatRoomMemberEntity; -public class ChatRoomMemberEntityFixtures { +public final class ChatRoomMemberEntityFixtures { + + private ChatRoomMemberEntityFixtures() { + } public static ChatRoomMemberEntity chatRoomMemberEntityBuild(final Long memberId, final Long chatRoomId) { return ChatRoomMemberEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java index de7ef6c3..a25c0f87 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewEntityFixtures.java @@ -2,7 +2,10 @@ import kr.pickple.back.crew.repository.entity.CrewEntity; -public class CrewEntityFixtures { +public final class CrewEntityFixtures { + + private CrewEntityFixtures() { + } public static CrewEntity crewEntityBuild(final Long leaderId, final Long chatRoomId) { return CrewEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java index 6c2db3fc..3765c4ba 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java @@ -3,7 +3,10 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.crew.repository.entity.CrewMemberEntity; -public class CrewMemberEntityFixtures { +public final class CrewMemberEntityFixtures { + + private CrewMemberEntityFixtures() { + } public static CrewMemberEntity crewMemberEntityBuild(final Long memberId, final Long crewId) { return CrewMemberEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java index 56bb9d9c..4dcb8030 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameEntityFixtures.java @@ -10,7 +10,10 @@ import kr.pickple.back.game.repository.entity.GameEntity; -public class GameEntityFixtures { +public final class GameEntityFixtures { + + private GameEntityFixtures() { + } public static GameEntity gameEntityBuild(final Long memberId, final Long chatRoomId) { final GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326); diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java index 6211cd9f..67195e95 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java @@ -3,7 +3,10 @@ import kr.pickple.back.common.domain.RegistrationStatus; import kr.pickple.back.game.repository.entity.GameMemberEntity; -public class GameMemberEntityFixtures { +public final class GameMemberEntityFixtures { + + private GameMemberEntityFixtures() { + } public static GameMemberEntity gameMemberEntityBuild(final Long memberId, final Long gameId) { return GameMemberEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java index 42791c81..a392fbb4 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GamePositionEntityFixtures.java @@ -3,7 +3,10 @@ import kr.pickple.back.game.repository.entity.GamePositionEntity; import kr.pickple.back.position.domain.Position; -public class GamePositionEntityFixtures { +public final class GamePositionEntityFixtures { + + private GamePositionEntityFixtures() { + } public static GamePositionEntity gamePositionEntityBuild(final Long gameId) { return GamePositionEntity.builder() diff --git a/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java index b59ab7fe..432c8731 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/member/MemberPositionEntityFixtures.java @@ -3,7 +3,10 @@ import kr.pickple.back.member.repository.entity.MemberPositionEntity; import kr.pickple.back.position.domain.Position; -public class MemberPositionEntityFixtures { +public final class MemberPositionEntityFixtures { + + private MemberPositionEntityFixtures() { + } public static MemberPositionEntity memberPositionEntityBuild(final Long memberId) { return MemberPositionEntity.builder() From 8be7766bf60859a7839982f6fb9cc4cd608c234b Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Mon, 22 Apr 2024 18:28:52 +0900 Subject: [PATCH 115/117] =?UTF-8?q?test:=20chat=20document=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A0=95=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Test.java => ChatMessageDocumentTest.java} | 39 +++++++------ ...entTest.java => ChatRoomDocumentTest.java} | 58 +++++++++---------- .../back/fixture/dto/ChatDtoFixtures.java | 15 +++++ .../entity/member/MemberEntityFixtures.java | 25 +++++++- .../back/fixture/setup/MemberSetup.java | 21 ++++++- 5 files changed, 103 insertions(+), 55 deletions(-) rename src/test/java/kr/pickple/back/chat/docs/{ChatMessageEntityDocumentTest.java => ChatMessageDocumentTest.java} (83%) rename src/test/java/kr/pickple/back/chat/docs/{ChatRoomEntityDocumentTest.java => ChatRoomDocumentTest.java} (91%) create mode 100644 src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java similarity index 83% rename from src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java rename to src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java index 43ebdc55..caf68983 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatMessageEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java @@ -1,13 +1,17 @@ package kr.pickple.back.chat.docs; -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.*; -import static org.springframework.http.HttpHeaders.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; +import static com.epages.restdocs.apispec.ResourceDocumentation.headerWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.parameterWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.epages.restdocs.apispec.Schema.schema; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; @@ -22,13 +26,11 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.chat.IntegrationChatTest; -import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; import kr.pickple.back.chat.dto.response.ChatRoomDetailResponse; -import kr.pickple.back.fixture.dto.ChatDtoFixtures; import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -class ChatMessageEntityDocumentTest extends IntegrationChatTest { +class ChatMessageDocumentTest extends IntegrationChatTest { private static final String BASE_URL = "/messages"; @@ -36,15 +38,14 @@ class ChatMessageEntityDocumentTest extends IntegrationChatTest { @DisplayName("특정 채팅방의 모든 메시지 목록 조회") void findAllMessagesInRoom_ReturnChatMessageResponses() throws Exception { // given - final List members = memberSetup.save(2); - final MemberEntity sender = members.get(0); - final MemberEntity receiver = members.get(1); - - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( - receiver.getId()); - final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom(sender.getId(), - personalChatRoomCreateRequest.getReceiverId()); + final List memberEntities = memberSetup.save(2); + final MemberEntity sender = memberEntities.get(0); + final MemberEntity receiver = memberEntities.get(1); + final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom( + sender.getId(), + receiver.getId() + ); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); // when diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java similarity index 91% rename from src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java rename to src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java index 890f4210..e10ce165 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatRoomEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java @@ -1,14 +1,19 @@ package kr.pickple.back.chat.docs; -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.*; -import static kr.pickple.back.chat.domain.RoomType.*; -import static org.springframework.http.HttpHeaders.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; +import static com.epages.restdocs.apispec.ResourceDocumentation.headerWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.parameterWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.epages.restdocs.apispec.Schema.schema; +import static kr.pickple.back.chat.domain.RoomType.PERSONAL; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; @@ -30,7 +35,7 @@ import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -class ChatRoomEntityDocumentTest extends IntegrationChatTest { +class ChatRoomDocumentTest extends IntegrationChatTest { private static final String BASE_URL = "/rooms"; @@ -38,14 +43,13 @@ class ChatRoomEntityDocumentTest extends IntegrationChatTest { @DisplayName("새 1:1 채팅방 생성") void createPersonalRoom_ReturnChatRoomDetailResponse() throws Exception { // given - final List members = memberSetup.save(2); - final MemberEntity sender = members.get(0); - final MemberEntity receiver = members.get(1); + final List memberEntities = memberSetup.save(2); + final MemberEntity sender = memberEntities.get(0); + final MemberEntity receiver = memberEntities.get(1); + chatRoomService.createPersonalRoom(sender.getId(), receiver.getId()); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( receiver.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest.getReceiverId()); - final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); final String requestBody = objectMapper.writeValueAsString(personalChatRoomCreateRequest); @@ -120,10 +124,7 @@ void findActivePersonalChatRoomWithReceiver_ReturnPersonalChatRoomExistedRespons final List members = memberSetup.save(2); final MemberEntity sender = members.get(0); final MemberEntity receiver = members.get(1); - - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( - receiver.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest.getReceiverId()); + chatRoomService.createPersonalRoom(sender.getId(), receiver.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); @@ -172,14 +173,8 @@ void findAllActiveChatRoomsByType_ReturnChatRoomResponses() throws Exception { final MemberEntity sender = members.get(0); final MemberEntity receiver1 = members.get(1); final MemberEntity receiver2 = members.get(2); - - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest1 = ChatDtoFixtures.personalChatRoomCreateRequestBuild( - receiver1.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest1.getReceiverId()); - - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest2 = ChatDtoFixtures.personalChatRoomCreateRequestBuild( - receiver2.getId()); - chatRoomService.createPersonalRoom(sender.getId(), personalChatRoomCreateRequest2.getReceiverId()); + chatRoomService.createPersonalRoom(sender.getId(), receiver1.getId()); + chatRoomService.createPersonalRoom(sender.getId(), receiver2.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); @@ -245,11 +240,10 @@ void findChatRoomById_ReturnChatRoomDetailResponse() throws Exception { final MemberEntity sender = members.get(0); final MemberEntity receiver = members.get(1); - final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( - receiver.getId()); - final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom(sender.getId(), - personalChatRoomCreateRequest.getReceiverId()); - + final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom( + sender.getId(), + receiver.getId() + ); final AuthTokens authTokens = jwtProvider.createLoginToken(String.valueOf(sender.getId())); // when diff --git a/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java new file mode 100644 index 00000000..18b83e39 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/dto/ChatDtoFixtures.java @@ -0,0 +1,15 @@ +package kr.pickple.back.fixture.dto; + +import kr.pickple.back.chat.dto.request.PersonalChatRoomCreateRequest; + +public final class ChatDtoFixtures { + + private ChatDtoFixtures() { + } + + public static PersonalChatRoomCreateRequest personalChatRoomCreateRequestBuild(final Long receiverId) { + return PersonalChatRoomCreateRequest.builder() + .receiverId(receiverId) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java index 2a0eefba..70101a26 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/member/MemberEntityFixtures.java @@ -1,10 +1,18 @@ package kr.pickple.back.fixture.entity.member; +import static java.text.MessageFormat.format; + +import java.util.List; +import java.util.stream.IntStream; + import kr.pickple.back.auth.domain.oauth.OauthProvider; import kr.pickple.back.member.domain.MemberStatus; import kr.pickple.back.member.repository.entity.MemberEntity; -public class MemberEntityFixtures { +public final class MemberEntityFixtures { + + private MemberEntityFixtures() { + } public static MemberEntity memberEntityBuild() { return MemberEntity.builder() @@ -18,4 +26,19 @@ public static MemberEntity memberEntityBuild() { .addressDepth2Id(1L) // 강남구 .build(); } + + public static List memberEntitiesBuild(final int count) { + return IntStream.rangeClosed(1, count) + .mapToObj(i -> MemberEntity.builder() + .email(format("pickple{0}@pickple.kr", i)) + .nickname(format("pickple{0}", i)) + .profileImageUrl(format("https://amazon{0}.image", i)) + .status(MemberStatus.ACTIVE) + .oauthId((long)i) + .oauthProvider(OauthProvider.KAKAO) + .addressDepth1Id(1L) // 서울시 + .addressDepth2Id(1L) // 강남구 + .build()) + .toList(); + } } diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java index 773d9530..c4f4288a 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java @@ -1,5 +1,7 @@ package kr.pickple.back.fixture.setup; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -20,13 +22,26 @@ public class MemberSetup { private MemberPositionRepository memberPositionRepository; public MemberEntity save() { - final MemberEntity member = MemberEntityFixtures.memberEntityBuild(); - final MemberEntity savedMemberEntity = memberRepository.save(member); + final MemberEntity memberEntity = MemberEntityFixtures.memberEntityBuild(); + final MemberEntity savedMemberEntity = memberRepository.save(memberEntity); final MemberPositionEntity memberPositionEntity = MemberPositionEntityFixtures.memberPositionEntityBuild( - member.getId()); + savedMemberEntity.getId()); memberPositionRepository.save(memberPositionEntity); return savedMemberEntity; } + + public List save(final int count) { + final List savedMemberEntities = MemberEntityFixtures.memberEntitiesBuild(count) + .stream() + .map(memberRepository::save) + .toList(); + + savedMemberEntities.forEach(savedMemberEntity -> memberPositionRepository.save( + MemberPositionEntityFixtures.memberPositionEntityBuild(savedMemberEntity.getId()) + )); + + return savedMemberEntities; + } } From 3d1ce2ddfd66d01347fc6042383434edaf236bf5 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Tue, 23 Apr 2024 13:29:08 +0900 Subject: [PATCH 116/117] =?UTF-8?q?test:=20crew=20document,=20controller?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A0=95=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/crew/service/CrewService.java | 6 +- src/main/resources/static/docs/pickple.json | 220 +++++-------- .../back/auth/service/AuthServiceTest.java | 308 +++++++++--------- .../chat/docs/ChatMessageDocumentTest.java | 6 +- .../back/chat/docs/ChatRoomDocumentTest.java | 6 +- ...ollerTest.java => CrewControllerTest.java} | 231 +++++++------ ...ocumentTest.java => CrewDocumentTest.java} | 101 +++--- .../back/fixture/dto/CrewDtoFixtures.java | 16 + .../entity/crew/CrewMemberEntityFixtures.java | 8 + .../pickple/back/fixture/setup/CrewSetup.java | 21 ++ .../pickple/back/fixture/setup/GameSetup.java | 2 + .../back/fixture/setup/MemberSetup.java | 3 + ...lerTest.java => MemberControllerTest.java} | 2 +- ...umentTest.java => MemberDocumentTest.java} | 2 +- ...{MemberEntityTest.java => MemberTest.java} | 2 +- 15 files changed, 492 insertions(+), 442 deletions(-) rename src/test/java/kr/pickple/back/crew/controller/{CrewEntityControllerTest.java => CrewControllerTest.java} (58%) rename src/test/java/kr/pickple/back/crew/docs/{CrewEntityDocumentTest.java => CrewDocumentTest.java} (92%) create mode 100644 src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java rename src/test/java/kr/pickple/back/member/controller/{MemberEntityControllerTest.java => MemberControllerTest.java} (99%) rename src/test/java/kr/pickple/back/member/docs/{MemberEntityDocumentTest.java => MemberDocumentTest.java} (99%) rename src/test/java/kr/pickple/back/member/domain/{MemberEntityTest.java => MemberTest.java} (98%) diff --git a/src/main/java/kr/pickple/back/crew/service/CrewService.java b/src/main/java/kr/pickple/back/crew/service/CrewService.java index 99a71b24..8a0e109e 100644 --- a/src/main/java/kr/pickple/back/crew/service/CrewService.java +++ b/src/main/java/kr/pickple/back/crew/service/CrewService.java @@ -99,11 +99,11 @@ public CrewProfileResponse findCrewById(final Long crewId) { * 사용자 근처 크루 목록 조회 */ public List findNearCrewsByAddress( - final String addressDepth1Name, - final String addressDepth2Name, + final String addressDepth1, + final String addressDepth2, final Pageable pageable ) { - return crewReader.readNearCrewsByAddress(addressDepth1Name, addressDepth2Name, pageable) + return crewReader.readNearCrewsByAddress(addressDepth1, addressDepth2, pageable) .stream() .map(crew -> { final List members = crewReader.readAllMembersInStatus(crew.getCrewId(), CONFIRMED); diff --git a/src/main/resources/static/docs/pickple.json b/src/main/resources/static/docs/pickple.json index ca499dd5..e01da9f8 100644 --- a/src/main/resources/static/docs/pickple.json +++ b/src/main/resources/static/docs/pickple.json @@ -57,7 +57,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMCIsImlhdCI6MTcwMTU2Njg1NSwiZXhwIjoxNzAxNTY4MDg1fQ.dky4FMADbBUY2M8dcmUrTxw9koP-dbauIrX6mtmxTRh0h0Mwci2inbMU-XQrgxMX_Jq8tzRen4FINU0AYqhYfg" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzMiIsImlhdCI6MTcwNjYyNDkyMCwiZXhwIjoxNzA2NjI2MTUwfQ.8oI1Kjk68djjJ5ORIyWsvRejnXROyEGE-NlfNgOq8r2tbCyLhZr2m7OQs4JXqXEmsLTQWppLwKMr6AalTSXEMA" } ], "responses" : { "200" : { @@ -93,7 +93,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5IiwiaWF0IjoxNzAxNTY2ODU1LCJleHAiOjE3MDE1NjgwODV9.P4XUGWSRDKqGUJMu73bgn7KfMLR56eO0UH898FVVy8aNa89LMLeY1uZeXVtPCqYz0O41A48qAX2acSZGzDzViA" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzMSIsImlhdCI6MTcwNjYyNDkyMCwiZXhwIjoxNzA2NjI2MTUwfQ.H2nKWoEMpzhUVLQ6F9IYy5QQfasm420xStZ57fD3fGci5sn2G_zdQis1DjBQynn6gAOX_bp4yRyDgFRSsFnpIw" } ], "responses" : { "204" : { @@ -119,7 +119,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4IiwiaWF0IjoxNzAxNTY2ODU1LCJleHAiOjE3MDE1NjgwODV9.QNPjx4UHYNeiVj0MSIEWarNt-aTFe_Lr9seUYNrd1x3K66PwRQqTU4Fo0aKIZtXqimFhkGwdaxx220fg7naLOA" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzMCIsImlhdCI6MTcwNjYyNDkyMCwiZXhwIjoxNzA2NjI2MTUwfQ.jSy7Gs1psIghSM7vRLK5GUAHdQFKueHCk1v8Mz5M-3HXVchWI8p82P-3vqNU3Ns7zWezPG7CSLyK16_dkCnZrg" } ], "responses" : { "200" : { @@ -157,7 +157,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxNTY2ODYwLCJleHAiOjE3MDE1NjgwOTB9.8LeuXgGZ77WiiElviih92QztQyPbA-VVW0wA3_5FFxxS1JRAK-cRJkOSdex6jRd1_iFSdlXaMgf8oXl2J3BC7g" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.a4DqR2TAPkO82YHlEWP-q0YMUc5xjJrVJXvuUZ4X3VqW_XxNDgJbqW_JMzvq_ufh65NEOXWRjBCyo9b8hOq9ow" } ], "responses" : { "204" : { @@ -183,7 +183,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxNTY2ODYwLCJleHAiOjE3MDE1NjgwOTB9.8LeuXgGZ77WiiElviih92QztQyPbA-VVW0wA3_5FFxxS1JRAK-cRJkOSdex6jRd1_iFSdlXaMgf8oXl2J3BC7g" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.a4DqR2TAPkO82YHlEWP-q0YMUc5xjJrVJXvuUZ4X3VqW_XxNDgJbqW_JMzvq_ufh65NEOXWRjBCyo9b8hOq9ow" } ], "responses" : { "201" : { @@ -195,7 +195,7 @@ }, "examples" : { "oauth-access-token-refresh" : { - "value" : "{\n \"accessToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxNTY2ODYwLCJleHAiOjE3MDE1NjgwOTB9.8LeuXgGZ77WiiElviih92QztQyPbA-VVW0wA3_5FFxxS1JRAK-cRJkOSdex6jRd1_iFSdlXaMgf8oXl2J3BC7g\"\n}" + "value" : "{\n \"accessToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.a4DqR2TAPkO82YHlEWP-q0YMUc5xjJrVJXvuUZ4X3VqW_XxNDgJbqW_JMzvq_ufh65NEOXWRjBCyo9b8hOq9ow\"\n}" } } } @@ -294,54 +294,6 @@ } } }, - "/crew-alarms/{crewAlarmId}" : { - "patch" : { - "tags" : [ "crew Alarm" ], - "summary" : "사용자의 크루 알람에 대하여 읽음 여부 수정", - "description" : "사용자가 보낸 크루 알람의 읽음 상태를 변경한다.", - "operationId" : "update-crew-alarm-status", - "parameters" : [ { - "name" : "crewAlarmId", - "in" : "path", - "description" : "크루 알람 ID", - "required" : true, - "schema" : { - "type" : "string" - } - }, { - "name" : "Authorization", - "in" : "header", - "description" : "Bearer 토큰", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMSIsImlhdCI6MTcwMTU2Njg1NSwiZXhwIjoxNzAxNTY4MDg1fQ.V-mkDb9AL6qlT_olBpL3B8LT1wR605i8Lv7hS59mEs140vv7p77ie5Ln-z3ATsGU2w7WdYkm-1p_s1GgkbgALQ" - } ], - "requestBody" : { - "content" : { - "application/json;charset=UTF-8" : { - "schema" : { - "$ref" : "#/components/schemas/game-alarms-gameAlarmId-480660043" - }, - "examples" : { - "update-crew-alarm-status" : { - "value" : "{\n \"isRead\" : true\n}" - } - } - } - } - }, - "responses" : { - "204" : { - "description" : "204" - } - }, - "security" : [ { - "bearerAuthJWT" : [ ] - } ] - } - }, "/crews" : { "get" : { "tags" : [ "Crew" ], @@ -358,7 +310,7 @@ }, "examples" : { "findCrewsByAddress" : { - "value" : "[ {\n \"id\" : 11,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 33,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"members\" : [ {\n \"id\" : 33,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 34,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 11,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 20,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon1.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"members\" : [ {\n \"id\" : 20,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon1.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n }, {\n \"id\" : 21,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon2.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n} ]" } } } @@ -392,7 +344,7 @@ }, "examples" : { "find-crew" : { - "value" : "{\n \"id\" : 10,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 30,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"members\" : [ {\n \"id\" : 30,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n}" + "value" : "{\n \"id\" : 10,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 19,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"members\" : [ {\n \"id\" : 19,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n}" } } } @@ -423,7 +375,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyNyIsImlhdCI6MTcwMTU2Njg2MSwiZXhwIjoxNzAxNTY4MDkxfQ.doO2_l-MBIXnqge5paiBc5Y8EpyW9V8wEQ1R6e4ShSDfv8NJyfR0_TeVyJxQhMKFLeYpLY4vm2k91TzLO1qclA" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNiIsImlhdCI6MTcxMzg0NjI4MCwiZXhwIjoxNzEzODQ3NTEwfQ.B77ocJpbEv1C6HCQEDJLwKgobSOM77rBJUBnb6TWkuFo0OvjqSNJfe9IMFBJxNpTm1LS6dwsbmJgMvkSfVWkmA" } ], "responses" : { "204" : { @@ -465,7 +417,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzNSIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.dHVqlIJ9YIy0hjvL6uyZkbQQu6wD2Phz6bvab25q2XZwjm5e9JdFKJLyE38Xnuf5xmHHs7fmjOZ3tJ7nTiSGkg" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyMiIsImlhdCI6MTcxMzg0NjI4MCwiZXhwIjoxNzEzODQ3NTEwfQ.u_9lfw3NNlmUdIxWJyU7R9ulK59aEh7WdhIOfyMYLCp7G_2uTtFk28a2ebdgEb8T1PcQNvqZ6sHuZ3gAlWgZ_A" } ], "responses" : { "204" : { @@ -505,7 +457,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyNCIsImlhdCI6MTcwMTU2Njg2MSwiZXhwIjoxNzAxNTY4MDkxfQ.Dtk6jefQhKWV0QRSsIpVXbZdgCI8X1tipN0JgA_nR35JGFYKu7n5jksTR2yfio5Mldk470GnvYRptfwgvwdJ6g" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMyIsImlhdCI6MTcxMzg0NjI3OSwiZXhwIjoxNzEzODQ3NTA5fQ.dg63FdiK6kd7--4xuvLPbVewtR1JshOwcyUSCZWpf8OBOnLLT-eJyC84faxI3vVOrqzmpd-3tLojwr9xTUSsGQ" } ], "requestBody" : { "content" : { @@ -553,7 +505,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMyIsImlhdCI6MTcwMTU2Njg1NSwiZXhwIjoxNzAxNTY4MDg1fQ.WPlkLiA6GaxKVNYZFG9DsUMJWdpPfn9VeHKVwTNlA9RpyBGbWvvkQqmYlZo7WwZna7EvsDfuQJk_Vl6DQY4hOQ" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzA2NjI0OTE1LCJleHAiOjE3MDY2MjYxNDV9.dC4zkKKpRMumx9RADVFPvgkHd6Kl5cpfi5WhoUdSjZqwaVcSdJ5jMRg9ipnPR5e_Nh8Fc7P_pBGF7UjBQ_GKEg" } ], "requestBody" : { "content" : { @@ -628,7 +580,7 @@ }, "examples" : { "find-games-by-category" : { - "value" : "[ {\n \"id\" : 14,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2023-11-10\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 3,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 66,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 66,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 67,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 68,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 6,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2024-01-29\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 3,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 26,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 26,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 27,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 28,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" } } } @@ -662,7 +614,7 @@ }, "examples" : { "find-game" : { - "value" : "{\n \"id\" : 13,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2023-11-10\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 1,\n \"cost\" : 100,\n \"memberCount\" : 3,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 63,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 63,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 64,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 65,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n}" + "value" : "{\n \"id\" : 5,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2024-01-29\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 1,\n \"cost\" : 100,\n \"memberCount\" : 3,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 23,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 23,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 24,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 25,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n}" } } } @@ -701,7 +653,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1NCIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.PKyEjeMo9nYEF3oWApLMazfKHaj8ELrQLiJx5h6fkbciOcUBb7MWnUZzh83uQC31dqTkqXtUM6V4gtqNVkFuTQ" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNCIsImlhdCI6MTcwNjYyNDkxOCwiZXhwIjoxNzA2NjI2MTQ4fQ.iElm-JprLtsMW7SGNpoTM-LY6lqcUwonVW7xneXYOSKmqXjc8TtQiKRQmtvVNgzHmjPwufPv3PmnPLEKY85jmw" } ], "responses" : { "200" : { @@ -713,7 +665,7 @@ }, "examples" : { "find-all-waiting-or-confirmed-gameMembers" : { - "value" : "{\n \"id\" : 9,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2023-11-10\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 54,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 55,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 56,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n}" + "value" : "{\n \"id\" : 1,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2024-01-29\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 14,\n \"email\" : \"pickple0@pickple.kr\",\n \"nickname\" : \"pickple0\",\n \"introduction\" : \"안녕하세요. pickple0입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 15,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n }, {\n \"id\" : 16,\n \"email\" : \"pickple2@pickple.kr\",\n \"nickname\" : \"pickple2\",\n \"introduction\" : \"안녕하세요. pickple2입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n}" } } } @@ -745,7 +697,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI2MCIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.15coCclinhnhDVpT4kinpCkrjgknDgD-RI_YGw_NAY9Z6ikXrycFr4CC4yWVPvM4ZkNdbPKuCo8p5OmLP53X0Q" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyMCIsImlhdCI6MTcwNjYyNDkxOCwiZXhwIjoxNzA2NjI2MTQ4fQ.HOhZSsEClNlPlQ7QAyqn6Fx_cZwf_lwvLeZdqZwIh4kNeV2h49XcauT0OVS3Pp00dG94d4IV1z6b4dMbNuzGzA" } ], "responses" : { "204" : { @@ -779,7 +731,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI2OSIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.IuqFIajJ81XnSXtXkbLwAf4PogAKw96wVapOiU5CZJ5GYe6_F1vHOlv6Hc9NrrH8XtWeTubwUntreRbKIGsH7w" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyOSIsImlhdCI6MTcwNjYyNDkxOCwiZXhwIjoxNzA2NjI2MTQ4fQ.K9ZpCg9Livn_tM1oEVNTgLTN_RB73s9SUCglOG1tTbeAlcWhCmo9hfoH_dlJcgsQfmsuY1CD0flLNvS4wJ0r6Q" } ], "requestBody" : { "content" : { @@ -789,7 +741,7 @@ }, "examples" : { "review-mannerScores" : { - "value" : "{\n \"mannerScoreReviews\" : [ {\n \"memberId\" : 70,\n \"mannerScore\" : 1\n }, {\n \"memberId\" : 71,\n \"mannerScore\" : 1\n } ]\n}" + "value" : "{\n \"mannerScoreReviews\" : [ {\n \"memberId\" : 30,\n \"mannerScore\" : 1\n }, {\n \"memberId\" : 31,\n \"mannerScore\" : 1\n } ]\n}" } } } @@ -835,7 +787,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI2MSIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.9zmNT0ZdihZYqcoZj7efP0gnOTM6mEDwW_sYWMcfCWHV4vnikjd35bta-Mnz50Bc02dAmYp2FLhRg2CvjzN44w" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyMSIsImlhdCI6MTcwNjYyNDkxOCwiZXhwIjoxNzA2NjI2MTQ4fQ.-mcs5fbkc2Io3_BaWpt6b7kDcK5vO3fbaQXLNxivURyRIn1kPHOOJHxY9RJHq6CVtPKclZCxBlRYLKFdAV9kgA" } ], "responses" : { "204" : { @@ -875,7 +827,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1NyIsImlhdCI6MTcwMTU2Njg2MiwiZXhwIjoxNzAxNTY4MDkyfQ.0f0pN6FBGlf_XKmkQN72UbjtW44p3eQjJeq4EwHu5PQ3do5n_5jvaVkTLVjv2_8RvN4NNXEQfB_uwq5qxTNROw" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNyIsImlhdCI6MTcwNjYyNDkxOCwiZXhwIjoxNzA2NjI2MTQ4fQ.6bdVIoKsyoRlIcGQKhExKwOCJY1YyO6EGq0E_dcRSD5ICvl-xBJBZQM7YRg6ZgcO1lEgWzLVMu5rPJnv3Zp13Q" } ], "requestBody" : { "content" : { @@ -915,7 +867,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJLQUtBTzk5OTk5OSIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY3MTYzfQ.vfPRkiqTG8-iqt4k3hCLLu1HoXooKmn_l2Ub4VBi_KvbwbVhP3GFVx_cwwpCphSWDvsFQlHK6DlIaMSe1_OKrg" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJLQUtBTzk5OTk5OSIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ2NTg3fQ.UmryklNnLm_mbdsvcTfioPwW8u-bYRc5ERfQzSZWPKiGO_o-fPosHdYufvVnOe6t7sfx7GgI0dhVb8RmS_FV2Q" } ], "requestBody" : { "content" : { @@ -949,7 +901,7 @@ }, "examples" : { "create-member" : { - "value" : "{\n \"accessToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4MSIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY4MDkzfQ.VhlG0mwcOMGz4_uq_xAYRMmX0KJZwurVVuULckmnPTRFoRL0V6rZAQ-Vtu0sFN4sSD0cp4HLQzZwnG5g3xWK0g\",\n \"refreshToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MDE1NjY4NjMsImV4cCI6MTcwMTU2ODI5Mn0.cohz57h1CJ2OnAl5mjYP3jEym4OcIs7WbVmZud0skmMEyWRUB8FQGLTWNYvGE-n3G42ymiOjFr_QAuAcGLct_g\",\n \"id\" : 81,\n \"nickname\" : \"백둥\",\n \"profileImageUrl\" : \"https://amazon.image/1\",\n \"email\" : \"pickple@pickple.kr\",\n \"oauthId\" : 999999,\n \"oauthProvider\" : \"KAKAO\",\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\"\n}" + "value" : "{\n \"accessToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyMSIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ3NTE3fQ.zEaZ4oOAeTHu2rnnwG1FAv0CueaEELnyqQJjcwGYMCn5jMU13FqAUOXLwCP-eOoe4tpH5eQJkvKB0LJE-G1SQA\",\n \"refreshToken\" : \"eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3MTM4NDYyODcsImV4cCI6MTcxMzg0NzcxN30.YXt8j5frKZA6Z8f69ffcSyo35T9ksqp64mA09z8HzgfevcTsKHDFm21oxuasNLy-eBPzTjvlMyAzrcEU13josA\",\n \"id\" : 21,\n \"nickname\" : \"백둥\",\n \"profileImageUrl\" : \"https://amazon.image/1\",\n \"email\" : \"pickple@pickple.kr\",\n \"oauthId\" : 999999,\n \"oauthProvider\" : \"KAKAO\",\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\"\n}" } } } @@ -986,7 +938,7 @@ }, "examples" : { "find-member" : { - "value" : "{\n \"id\" : 79,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"crews\" : [ {\n \"id\" : 17,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 79,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\"\n } ]\n}" + "value" : "{\n \"id\" : 19,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : null,\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ],\n \"crews\" : [ {\n \"id\" : 5,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 19,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\"\n } ]\n}" } } } @@ -1017,7 +969,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3NyIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY4MDkzfQ.3SFrWLZL-VddXszlPAnE-Z9GgPROgy-IZmuBuU4VLwsLQPnCH4Ds48vpNYbMUIDd0_KeoN2bshMSPxL9GuV8HQ" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNyIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ3NTE3fQ.E_NAteyKynKjd1whOtpmmho1RK4PGRDlW1c-SbykIz_XidE--6tbCBU5AZifbSx9bzl7pvR8wvgPcC-lM-rftQ" } ], "responses" : { "200" : { @@ -1029,7 +981,7 @@ }, "examples" : { "find-created-crews-by-member-id" : { - "value" : "[ {\n \"id\" : 16,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 77,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"members\" : [ {\n \"id\" : 77,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 4,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 17,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"members\" : [ {\n \"id\" : 17,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n} ]" } } } @@ -1063,7 +1015,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3NiIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY4MDkzfQ.cI-_oiW4IUE_l7AEt9uMaVbtfPWG-UNNTmPpMcoz8RwF622Lc_MgWtY5u8C3ElP4X0bjA0qfAaNp2O0bN5Ul1Q" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNiIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ3NTE3fQ.Iqhjb0vowyrYR7gcvK3iWygZkZwBMIAe-nd34fNwOUWbxks-NUCkhogUFwzkulXnFSYK6MsmajfdnCEBY92tzg" } ], "responses" : { "200" : { @@ -1075,7 +1027,7 @@ }, "examples" : { "find-all-created-games" : { - "value" : "[ {\n \"id\" : 16,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2023-11-10\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"isReviewDone\" : false,\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 76,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 76,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 1,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2024-04-22\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"isReviewDone\" : false,\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 16,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ],\n \"members\" : [ {\n \"id\" : 16,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n} ]" } } } @@ -1117,7 +1069,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI4MCIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY4MDkzfQ.hHV8xWsmhub5ADsCJiY8IT4hwTMMFmcNx4194d4FnXQCP8k-mza473N9cJvAtPSGUJEC6x8ROVLcFZHTJabWeg" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIyMCIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ3NTE3fQ.bxansnVnvEgNrZETHaIvWsSD8kIAPegPIbUhTj4kc77eJRo3X7UwM8zC0CiT5M6HpFdB4W4UCrnORFFWo0gM6w" } ], "responses" : { "200" : { @@ -1129,7 +1081,7 @@ }, "examples" : { "find-all-crews-by-member-id" : { - "value" : "[ {\n \"id\" : 18,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 80,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"members\" : [ {\n \"id\" : 80,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 6,\n \"name\" : \"백둥크루1\",\n \"content\" : \"안녕하세요 백둥크루1 입니다.\",\n \"memberCount\" : 1,\n \"maxMemberCount\" : 15,\n \"profileImageUrl\" : \"https://amazon.profileimage/1\",\n \"backgroundImageUrl\" : \"https://amazon.backgroundimage/1\",\n \"status\" : \"모집 중\",\n \"likeCount\" : 0,\n \"competitionPoint\" : 0,\n \"leader\" : {\n \"id\" : 20,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"members\" : [ {\n \"id\" : 20,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n} ]" } } } @@ -1171,7 +1123,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3OCIsImlhdCI6MTcwMTU2Njg2MywiZXhwIjoxNzAxNTY4MDkzfQ.0B-fbqzb5yk2oJTglqqw9nI7CHhFhEbSoQ2yL2YM2lGh2-blhmdi0f1Z0Omwgm_ZGjclyUD1wX-tivpw6xR9Rw" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxOCIsImlhdCI6MTcxMzg0NjI4NywiZXhwIjoxNzEzODQ3NTE3fQ.T_lNcp0F1NBwNKVX_TIrBE80wD61cvzpx3DQDIaxXELpiek4MTERgzs8qTUo0GeC-C7E49fDkO6JAege_TQTCA" } ], "responses" : { "200" : { @@ -1183,7 +1135,7 @@ }, "examples" : { "find-all-member-games" : { - "value" : "[ {\n \"id\" : 17,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2023-11-10\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"isReviewDone\" : false,\n \"viewCount\" : 0,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 78,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ],\n \"members\" : [ {\n \"id\" : 78,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"영등포구\",\n \"positions\" : [ \"C\", \"PG\" ]\n } ]\n} ]" + "value" : "[ {\n \"id\" : 2,\n \"content\" : \"하이하이 즐겜 한 판해요\",\n \"playDate\" : \"2024-04-22\",\n \"playStartTime\" : \"11:30:00\",\n \"playEndTime\" : \"13:00:00\",\n \"playTimeMinutes\" : 90,\n \"mainAddress\" : \"서울 영등포구 도림동 254\",\n \"detailAddress\" : \"영등포 다목적 체육관 2층 201호\",\n \"latitude\" : 126.75,\n \"longitude\" : 37.125,\n \"status\" : \"모집 중\",\n \"isReviewDone\" : false,\n \"viewCount\" : 1,\n \"cost\" : 100,\n \"memberCount\" : 1,\n \"maxMemberCount\" : 5,\n \"host\" : {\n \"id\" : 18,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n },\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ],\n \"members\" : [ {\n \"id\" : 18,\n \"email\" : \"pickple1@pickple.kr\",\n \"nickname\" : \"pickple1\",\n \"introduction\" : \"안녕하세요. pickple1입니다.\",\n \"profileImageUrl\" : \"https://amazon.image\",\n \"mannerScore\" : 0,\n \"mannerScoreCount\" : 0,\n \"addressDepth1\" : \"서울시\",\n \"addressDepth2\" : \"강남구\",\n \"positions\" : [ \"C\" ]\n } ]\n} ]" } } } @@ -1217,7 +1169,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxNTY2ODYxLCJleHAiOjE3MDE1NjgwOTF9.p0RzwmBmtLbPv1eS6bcUKNDZkEwdwHXU-As8RlkyYlcI_j_zDxrgP8cAayLFi8hN_kBdx9cURHXZ_ZFLwd4y5Q" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.a4DqR2TAPkO82YHlEWP-q0YMUc5xjJrVJXvuUZ4X3VqW_XxNDgJbqW_JMzvq_ufh65NEOXWRjBCyo9b8hOq9ow" } ], "responses" : { "200" : { @@ -1229,7 +1181,7 @@ }, "examples" : { "find-all-messages-in-room" : { - "value" : "[ {\n \"type\" : \"입장\",\n \"content\" : \"pickple0님이 채팅방에 입장하셨습니다.\",\n \"sender\" : {\n \"id\" : 1,\n \"nickname\" : \"pickple0\",\n \"profileImageUrl\" : \"https://amazon.image\"\n },\n \"roomId\" : 1,\n \"createdAt\" : \"2023-12-03T10:27:41.232523\"\n}, {\n \"type\" : \"입장\",\n \"content\" : \"pickple1님이 채팅방에 입장하셨습니다.\",\n \"sender\" : {\n \"id\" : 2,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon.image\"\n },\n \"roomId\" : 1,\n \"createdAt\" : \"2023-12-03T10:27:41.247651\"\n} ]" + "value" : "[ {\n \"type\" : \"입장\",\n \"content\" : \"pickple1님이 채팅방에 입장하셨습니다.\",\n \"sender\" : {\n \"id\" : 1,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon1.image\"\n },\n \"roomId\" : 1,\n \"createdAt\" : \"2024-04-23T13:24:44.734488\"\n}, {\n \"type\" : \"입장\",\n \"content\" : \"pickple2님이 채팅방에 입장하셨습니다.\",\n \"sender\" : {\n \"id\" : 2,\n \"nickname\" : \"pickple2\",\n \"profileImageUrl\" : \"https://amazon2.image\"\n },\n \"roomId\" : 1,\n \"createdAt\" : \"2024-04-23T13:24:44.740654\"\n} ]" } } } @@ -1288,7 +1240,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3IiwiaWF0IjoxNzAxNTY2ODYxLCJleHAiOjE3MDE1NjgwOTF9.kkaXNawaJGrpuCfSKVNx24_U_6nTIUIIhL055Ga5YkpszlOGGReNOer9lsE7eCjDg2d9ZNMV5qqOstW8tqffmg" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI3IiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.684y0J0GZkxO6JWGPx17yVjRmcIi7287lIszOOb2iz4U7Td4y-bQBTD48qTkvV1kphkzhPgDnFzYChaqSUJvtw" } ], "responses" : { "200" : { @@ -1300,7 +1252,7 @@ }, "examples" : { "find-all-active-chatrooms-by-type" : { - "value" : "[ {\n \"id\" : 5,\n \"roomName\" : \"pickple1\",\n \"roomIconImageUrl\" : \"https://amazon.image\",\n \"type\" : \"개인\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"lastMessageContent\" : \"pickple1님이 채팅방에 입장하셨습니다.\",\n \"lastMessageCreatedAt\" : \"2023-12-03T10:27:41.493498\",\n \"createdAt\" : \"2023-12-03T10:27:41.48333\"\n}, {\n \"id\" : 6,\n \"roomName\" : \"pickple2\",\n \"roomIconImageUrl\" : \"https://amazon.image\",\n \"type\" : \"개인\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"lastMessageContent\" : \"pickple2님이 채팅방에 입장하셨습니다.\",\n \"lastMessageCreatedAt\" : \"2023-12-03T10:27:41.504592\",\n \"createdAt\" : \"2023-12-03T10:27:41.49518\"\n} ]" + "value" : "[ {\n \"id\" : 5,\n \"roomName\" : \"pickple2\",\n \"roomIconImageUrl\" : \"https://amazon2.image\",\n \"type\" : \"개인\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"lastMessageContent\" : \"pickple2님이 채팅방에 입장하셨습니다.\",\n \"lastMessageCreatedAt\" : \"2024-04-23T13:24:44.977997\",\n \"createdAt\" : \"2024-04-23T13:24:44.966968\"\n}, {\n \"id\" : 6,\n \"roomName\" : \"pickple3\",\n \"roomIconImageUrl\" : \"https://amazon3.image\",\n \"type\" : \"개인\",\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"lastMessageContent\" : \"pickple3님이 채팅방에 입장하셨습니다.\",\n \"lastMessageCreatedAt\" : \"2024-04-23T13:24:44.993376\",\n \"createdAt\" : \"2024-04-23T13:24:44.984141\"\n} ]" } } } @@ -1334,7 +1286,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1IiwiaWF0IjoxNzAxNTY2ODYxLCJleHAiOjE3MDE1NjgwOTF9.2EQbscmlRrtHMrQfjBGd7IliOJnz9-LuTaNWv9ABGe30u-MMskLTl0SySE6HrnX45L7TX16uTv8yaJEakMrPqQ" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1IiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.Tmlqj9n2N5NwXzv7WEmXvdZpBtWwPj_nDCzPFxQivMrXVRaQ_AgiI648odVo-4dBS52VbtpFRQScIrjjUCpoqA" } ], "responses" : { "200" : { @@ -1370,7 +1322,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzIiwiaWF0IjoxNzAxNTY2ODYxLCJleHAiOjE3MDE1NjgwOTF9.7_hFBmZbk6Bl_31mwhtV46N1svfu7hMEfLU6XehASRiOG3fcY2TAWeGN1hzkcuvRFEGYtcl8viy1R7n9GKebfQ" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIzIiwiaWF0IjoxNzEzODQ2Mjg0LCJleHAiOjE3MTM4NDc1MTR9.hlT8ioUC69w-KMgQdyvzrGU2YYHhwsLXqyW9XD2P8xlpNZwyDKE5szKSUOxfgQf8bFTCcYO_VPiTTGEPm5q8dg" } ], "requestBody" : { "content" : { @@ -1396,7 +1348,7 @@ }, "examples" : { "create-personal-room" : { - "value" : "{\n \"id\" : 3,\n \"roomName\" : \"pickple1\",\n \"roomIconImageUrl\" : \"https://amazon.image\",\n \"type\" : \"개인\",\n \"domainId\" : 4,\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"members\" : [ {\n \"id\" : 3,\n \"nickname\" : \"pickple0\",\n \"profileImageUrl\" : \"https://amazon.image\"\n }, {\n \"id\" : 4,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon.image\"\n } ],\n \"createdAt\" : \"2023-12-03T10:27:41.347575\"\n}" + "value" : "{\n \"id\" : 3,\n \"roomName\" : \"pickple2\",\n \"roomIconImageUrl\" : \"https://amazon2.image\",\n \"type\" : \"개인\",\n \"domainId\" : 4,\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"members\" : [ {\n \"id\" : 3,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon1.image\"\n }, {\n \"id\" : 4,\n \"nickname\" : \"pickple2\",\n \"profileImageUrl\" : \"https://amazon2.image\"\n } ],\n \"createdAt\" : \"2024-04-23T13:24:44.85206\"\n}" } } } @@ -1430,7 +1382,7 @@ "schema" : { "type" : "string" }, - "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMCIsImlhdCI6MTcwMTU2Njg2MSwiZXhwIjoxNzAxNTY4MDkxfQ.af7bpBpMXewUOjbOgyMt5rlPsWCHBCpnugFg_tT6z0w7ADl1go0tyWKui2lr8ZwoRJSUf_IgXOxOrGft3-Vo7w" + "example" : "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMCIsImlhdCI6MTcxMzg0NjI4NSwiZXhwIjoxNzEzODQ3NTE1fQ.oYwN4RsrfdlW94XN2_JUy7DzoAr4Q_QSmeW0-1miiIxUqHFbY7S5lzRGZLCLJkmhdxnEs_fNDlviRtVzH5dg3w" } ], "responses" : { "200" : { @@ -1442,7 +1394,7 @@ }, "examples" : { "find-chatroom-by-id" : { - "value" : "{\n \"id\" : 7,\n \"roomName\" : \"pickple1\",\n \"roomIconImageUrl\" : \"https://amazon.image\",\n \"type\" : \"개인\",\n \"domainId\" : 11,\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"members\" : [ {\n \"id\" : 10,\n \"nickname\" : \"pickple0\",\n \"profileImageUrl\" : \"https://amazon.image\"\n }, {\n \"id\" : 11,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon.image\"\n } ],\n \"createdAt\" : \"2023-12-03T10:27:41.56635\"\n}" + "value" : "{\n \"id\" : 7,\n \"roomName\" : \"pickple2\",\n \"roomIconImageUrl\" : \"https://amazon2.image\",\n \"type\" : \"개인\",\n \"domainId\" : 11,\n \"memberCount\" : 2,\n \"maxMemberCount\" : 2,\n \"playStartTime\" : null,\n \"playTimeMinutes\" : null,\n \"members\" : [ {\n \"id\" : 10,\n \"nickname\" : \"pickple1\",\n \"profileImageUrl\" : \"https://amazon1.image\"\n }, {\n \"id\" : 11,\n \"nickname\" : \"pickple2\",\n \"profileImageUrl\" : \"https://amazon2.image\"\n } ],\n \"createdAt\" : \"2024-04-23T13:24:45.085962\"\n}" } } } @@ -1841,6 +1793,51 @@ } } }, + "ChatRoomResponse" : { + "title" : "ChatRoomResponse", + "type" : "array", + "items" : { + "type" : "object", + "properties" : { + "createdAt" : { + "type" : "string", + "description" : "채팅방 생성 시각" + }, + "lastMessageCreatedAt" : { + "type" : "string", + "description" : "마지막 메시지 전송 시각" + }, + "maxMemberCount" : { + "type" : "number", + "description" : "채팅방 인원제한" + }, + "lastMessageContent" : { + "type" : "string", + "description" : "마지막 메시지" + }, + "memberCount" : { + "type" : "number", + "description" : "현재 채팅방 인원수" + }, + "roomIconImageUrl" : { + "type" : "string", + "description" : "채팅방 아이콘 이미지 경로" + }, + "id" : { + "type" : "number", + "description" : "채팅방 ID" + }, + "type" : { + "type" : "string", + "description" : "채팅방 타입 (개인, 게스트, 크루)" + }, + "roomName" : { + "type" : "string", + "description" : "채팅방 이름" + } + } + } + }, "ChatRoomDetailResponse" : { "title" : "ChatRoomDetailResponse", "type" : "object", @@ -1900,51 +1897,6 @@ } } }, - "ChatRoomResponse" : { - "title" : "ChatRoomResponse", - "type" : "array", - "items" : { - "type" : "object", - "properties" : { - "createdAt" : { - "type" : "string", - "description" : "채팅방 생성 시각" - }, - "lastMessageCreatedAt" : { - "type" : "string", - "description" : "마지막 메시지 전송 시각" - }, - "maxMemberCount" : { - "type" : "number", - "description" : "채팅방 인원제한" - }, - "lastMessageContent" : { - "type" : "string", - "description" : "마지막 메시지" - }, - "memberCount" : { - "type" : "number", - "description" : "현재 채팅방 인원수" - }, - "roomIconImageUrl" : { - "type" : "string", - "description" : "채팅방 아이콘 이미지 경로" - }, - "id" : { - "type" : "number", - "description" : "채팅방 ID" - }, - "type" : { - "type" : "string", - "description" : "채팅방 타입 (개인, 게스트, 크루)" - }, - "roomName" : { - "type" : "string", - "description" : "채팅방 이름" - } - } - } - }, "MemberProfileResponse" : { "title" : "MemberProfileResponse", "type" : "object", diff --git a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java index 181cdf29..75e927bd 100644 --- a/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java +++ b/src/test/java/kr/pickple/back/auth/service/AuthServiceTest.java @@ -28,8 +28,6 @@ import kr.pickple.back.auth.repository.RedisRepository; import kr.pickple.back.auth.service.authcode.AuthCodeRequestUrlProviderComposite; import kr.pickple.back.auth.service.memberclient.OauthMemberClientComposite; -import kr.pickple.back.fixture.domain.AddressFixtures; -import kr.pickple.back.fixture.domain.AuthFixtures; import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.repository.entity.MemberEntity; import kr.pickple.back.member.dto.response.AuthenticatedMemberResponse; @@ -38,157 +36,157 @@ @ExtendWith(MockitoExtension.class) class AuthServiceTest { - private static final OauthProvider OAUTH_PROVIDER = OauthProvider.KAKAO; - private static final String REFRESH_TOKEN_KEY = "refresh_token"; - - @InjectMocks - private OauthService oauthService; - - @Mock - private AuthCodeRequestUrlProviderComposite authCodeRequestUrlProviderComposite; - - @Mock - private OauthMemberClientComposite oauthMemberClientComposite; - - @Mock - private MemberRepository memberRepository; - - @Mock - private JwtProvider jwtProvider; - - @Mock - private RedisRepository redisRepository; - - @Mock - private JwtProperties jwtProperties; - - @Mock - private TokenExtractor tokenExtractor; - - @Test - @DisplayName("oauth 제공자를 받으면 Oauth 로그인 페이지를 반환한다.") - void redirectOauthLoginPage() { - // given - final String redirectUrl = "http://test.url"; - - given(authCodeRequestUrlProviderComposite.provide(OAUTH_PROVIDER)).willReturn(redirectUrl); - - // when - final String oauthRedirectUrl = oauthService.getAuthCodeRequestUrl(OAUTH_PROVIDER); - - // then - assertThat(oauthRedirectUrl).isEqualTo(redirectUrl); - } - - @Test - @DisplayName("oauth를 이용하여 로그인 할 수 있다.") - void oauthLogin_ReturnAuthenticated() { - // given - final String authCode = "authCode"; - final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); - final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); - final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); - final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); - final AuthTokens loginTokens = AuthFixtures.authTokensBuild(); - final Long refreshTokenExpirationTime = 10000L; - - given(memberRepository.findByOauthId(anyLong())).willReturn(Optional.ofNullable(member)); - given(oauthMemberClientComposite.fetch(any(OauthProvider.class), anyString())).willReturn(oauthMember); - given(jwtProvider.createLoginToken(anyString())).willReturn(loginTokens); - given(jwtProperties.getRefreshTokenExpirationTime()).willReturn(refreshTokenExpirationTime); - - // when - AuthenticatedMemberResponse authenticatedMemberResponse = oauthService.processLoginOrRegistration( - OAUTH_PROVIDER, authCode); - - // then - assertThat(authenticatedMemberResponse.getOauthId()).isEqualTo(member.getOauthId()); - assertThat(authenticatedMemberResponse.getOauthProvider()).isEqualTo(member.getOauthProvider()); - assertThat(authenticatedMemberResponse.getEmail()).isEqualTo(member.getEmail()); - assertThat(authenticatedMemberResponse.getNickname()).isEqualTo(member.getNickname()); - assertThat(authenticatedMemberResponse.getProfileImageUrl()).isEqualTo(member.getProfileImageUrl()); - assertThat(authenticatedMemberResponse.getAccessToken()).isEqualTo(loginTokens.getAccessToken()); - assertThat(authenticatedMemberResponse.getRefreshToken()).isEqualTo(loginTokens.getRefreshToken()); - assertThat(authenticatedMemberResponse.getAddressDepth1()).isEqualTo(addressDepth1.getName()); - assertThat(authenticatedMemberResponse.getAddressDepth2()).isEqualTo(addressDepth2.getName()); - - verify(memberRepository).findByOauthId(anyLong()); - verify(oauthMemberClientComposite).fetch(any(OauthProvider.class), anyString()); - verify(jwtProvider).createLoginToken(anyString()); - verify(jwtProperties).getRefreshTokenExpirationTime(); - verify(redisRepository).saveHash(anyString(), anyString(), any(), anyLong()); - } - - @Test - @DisplayName("oauth를 이용하여 로그인시 회원 정보가 존재하지 않을 경우 회원가입 관련 정보를 응답한다.") - void oauthLogin_ReturnRegistration() { - // given - final String authCode = "authCode"; - final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); - final MemberEntity member = null; - final AuthTokens registerToken = AuthFixtures.authTokensBuild(); - - given(memberRepository.findByOauthId(anyLong())).willReturn(Optional.ofNullable(member)); - given(oauthMemberClientComposite.fetch(any(OauthProvider.class), anyString())).willReturn(oauthMember); - given(jwtProvider.createRegisterToken(anyString())).willReturn(registerToken); - - // when - final AuthenticatedMemberResponse authenticatedMemberResponse = oauthService.processLoginOrRegistration( - OAUTH_PROVIDER, authCode); - - // then - assertThat(authenticatedMemberResponse.getOauthId()).isEqualTo(oauthMember.getOauthId()); - assertThat(authenticatedMemberResponse.getOauthProvider()).isEqualTo(oauthMember.getOauthProvider()); - assertThat(authenticatedMemberResponse.getEmail()).isEqualTo(oauthMember.getEmail()); - assertThat(authenticatedMemberResponse.getNickname()).isEqualTo(oauthMember.getNickname()); - assertThat(authenticatedMemberResponse.getProfileImageUrl()).isEqualTo(oauthMember.getProfileImageUrl()); - assertThat(authenticatedMemberResponse.getAccessToken()).isEqualTo(registerToken.getAccessToken()); - assertThat(authenticatedMemberResponse.getId()).isNull(); - assertThat(authenticatedMemberResponse.getRefreshToken()).isNull(); - assertThat(authenticatedMemberResponse.getAddressDepth1()).isNull(); - assertThat(authenticatedMemberResponse.getAddressDepth2()).isNull(); - - verify(memberRepository).findByOauthId(anyLong()); - verify(oauthMemberClientComposite).fetch(any(OauthProvider.class), anyString()); - verify(jwtProvider).createRegisterToken(anyString()); - } - - @Test - @DisplayName("accessToken이 만료되었을 때 새로 갱신 할 수 있다.") - void regenerateAccessToken() { - // given - final AuthTokens authTokens = AuthFixtures.authTokensBuild(); - final String authorizationHeader = "Bearer " + authTokens.getAccessToken(); - final RefreshToken refreshToken = AuthFixtures.refreshTokenBuild(); - final String regeneratedAccessToken = AuthFixtures.authTokensBuild().getAccessToken(); - - given(tokenExtractor.extractAccessToken(authorizationHeader)).willReturn(authTokens.getAccessToken()); - given(jwtProvider.isValidRefreshAndInvalidAccess(authTokens.getRefreshToken(), - authTokens.getAccessToken())).willReturn(true); - given(redisRepository.findHash(REFRESH_TOKEN_KEY, authTokens.getRefreshToken())).willReturn(refreshToken); - given(jwtProvider.regenerateAccessToken(String.valueOf(1L))).willReturn(regeneratedAccessToken); - - // when - final AccessTokenResponse accessTokenResponse = oauthService.regenerateAccessToken(authTokens.getRefreshToken(), - authorizationHeader); - - // then - assertThat(accessTokenResponse.getAccessToken()).isEqualTo(regeneratedAccessToken); - - verify(tokenExtractor).extractAccessToken(anyString()); - verify(jwtProvider).isValidRefreshAndInvalidAccess(anyString(), anyString()); - verify(redisRepository).findHash(anyString(), anyString()); - verify(jwtProvider).regenerateAccessToken(anyString()); - } - - @Test - @DisplayName("로그인된 사용자는 로그아웃을 할 수 있다.") - void logout() { - // given && when - final AuthTokens authTokens = AuthFixtures.authTokensBuild(); - oauthService.deleteRefreshToken(authTokens.getRefreshToken()); - - // then - verify(redisRepository).deleteHash(REFRESH_TOKEN_KEY, authTokens.getRefreshToken()); - } + // private static final OauthProvider OAUTH_PROVIDER = OauthProvider.KAKAO; + // private static final String REFRESH_TOKEN_KEY = "refresh_token"; + // + // @InjectMocks + // private OauthService oauthService; + // + // @Mock + // private AuthCodeRequestUrlProviderComposite authCodeRequestUrlProviderComposite; + // + // @Mock + // private OauthMemberClientComposite oauthMemberClientComposite; + // + // @Mock + // private MemberRepository memberRepository; + // + // @Mock + // private JwtProvider jwtProvider; + // + // @Mock + // private RedisRepository redisRepository; + // + // @Mock + // private JwtProperties jwtProperties; + // + // @Mock + // private TokenExtractor tokenExtractor; + // + // @Test + // @DisplayName("oauth 제공자를 받으면 Oauth 로그인 페이지를 반환한다.") + // void redirectOauthLoginPage() { + // // given + // final String redirectUrl = "http://test.url"; + // + // given(authCodeRequestUrlProviderComposite.provide(OAUTH_PROVIDER)).willReturn(redirectUrl); + // + // // when + // final String oauthRedirectUrl = oauthService.getAuthCodeRequestUrl(OAUTH_PROVIDER); + // + // // then + // assertThat(oauthRedirectUrl).isEqualTo(redirectUrl); + // } + // + // @Test + // @DisplayName("oauth를 이용하여 로그인 할 수 있다.") + // void oauthLogin_ReturnAuthenticated() { + // // given + // final String authCode = "authCode"; + // final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); + // final AddressDepth1Entity addressDepth1 = AddressFixtures.addressDepth1Build(); + // final AddressDepth2Entity addressDepth2 = AddressFixtures.addressDepth2Build(); + // final MemberEntity member = MemberFixtures.memberBuild(addressDepth1, addressDepth2); + // final AuthTokens loginTokens = AuthFixtures.authTokensBuild(); + // final Long refreshTokenExpirationTime = 10000L; + // + // given(memberRepository.findByOauthId(anyLong())).willReturn(Optional.ofNullable(member)); + // given(oauthMemberClientComposite.fetch(any(OauthProvider.class), anyString())).willReturn(oauthMember); + // given(jwtProvider.createLoginToken(anyString())).willReturn(loginTokens); + // given(jwtProperties.getRefreshTokenExpirationTime()).willReturn(refreshTokenExpirationTime); + // + // // when + // AuthenticatedMemberResponse authenticatedMemberResponse = oauthService.processLoginOrRegistration( + // OAUTH_PROVIDER, authCode); + // + // // then + // assertThat(authenticatedMemberResponse.getOauthId()).isEqualTo(member.getOauthId()); + // assertThat(authenticatedMemberResponse.getOauthProvider()).isEqualTo(member.getOauthProvider()); + // assertThat(authenticatedMemberResponse.getEmail()).isEqualTo(member.getEmail()); + // assertThat(authenticatedMemberResponse.getNickname()).isEqualTo(member.getNickname()); + // assertThat(authenticatedMemberResponse.getProfileImageUrl()).isEqualTo(member.getProfileImageUrl()); + // assertThat(authenticatedMemberResponse.getAccessToken()).isEqualTo(loginTokens.getAccessToken()); + // assertThat(authenticatedMemberResponse.getRefreshToken()).isEqualTo(loginTokens.getRefreshToken()); + // assertThat(authenticatedMemberResponse.getAddressDepth1()).isEqualTo(addressDepth1.getName()); + // assertThat(authenticatedMemberResponse.getAddressDepth2()).isEqualTo(addressDepth2.getName()); + // + // verify(memberRepository).findByOauthId(anyLong()); + // verify(oauthMemberClientComposite).fetch(any(OauthProvider.class), anyString()); + // verify(jwtProvider).createLoginToken(anyString()); + // verify(jwtProperties).getRefreshTokenExpirationTime(); + // verify(redisRepository).saveHash(anyString(), anyString(), any(), anyLong()); + // } + // + // @Test + // @DisplayName("oauth를 이용하여 로그인시 회원 정보가 존재하지 않을 경우 회원가입 관련 정보를 응답한다.") + // void oauthLogin_ReturnRegistration() { + // // given + // final String authCode = "authCode"; + // final OauthMember oauthMember = AuthFixtures.oauthMemberBuild(); + // final MemberEntity member = null; + // final AuthTokens registerToken = AuthFixtures.authTokensBuild(); + // + // given(memberRepository.findByOauthId(anyLong())).willReturn(Optional.ofNullable(member)); + // given(oauthMemberClientComposite.fetch(any(OauthProvider.class), anyString())).willReturn(oauthMember); + // given(jwtProvider.createRegisterToken(anyString())).willReturn(registerToken); + // + // // when + // final AuthenticatedMemberResponse authenticatedMemberResponse = oauthService.processLoginOrRegistration( + // OAUTH_PROVIDER, authCode); + // + // // then + // assertThat(authenticatedMemberResponse.getOauthId()).isEqualTo(oauthMember.getOauthId()); + // assertThat(authenticatedMemberResponse.getOauthProvider()).isEqualTo(oauthMember.getOauthProvider()); + // assertThat(authenticatedMemberResponse.getEmail()).isEqualTo(oauthMember.getEmail()); + // assertThat(authenticatedMemberResponse.getNickname()).isEqualTo(oauthMember.getNickname()); + // assertThat(authenticatedMemberResponse.getProfileImageUrl()).isEqualTo(oauthMember.getProfileImageUrl()); + // assertThat(authenticatedMemberResponse.getAccessToken()).isEqualTo(registerToken.getAccessToken()); + // assertThat(authenticatedMemberResponse.getId()).isNull(); + // assertThat(authenticatedMemberResponse.getRefreshToken()).isNull(); + // assertThat(authenticatedMemberResponse.getAddressDepth1()).isNull(); + // assertThat(authenticatedMemberResponse.getAddressDepth2()).isNull(); + // + // verify(memberRepository).findByOauthId(anyLong()); + // verify(oauthMemberClientComposite).fetch(any(OauthProvider.class), anyString()); + // verify(jwtProvider).createRegisterToken(anyString()); + // } + // + // @Test + // @DisplayName("accessToken이 만료되었을 때 새로 갱신 할 수 있다.") + // void regenerateAccessToken() { + // // given + // final AuthTokens authTokens = AuthFixtures.authTokensBuild(); + // final String authorizationHeader = "Bearer " + authTokens.getAccessToken(); + // final RefreshToken refreshToken = AuthFixtures.refreshTokenBuild(); + // final String regeneratedAccessToken = AuthFixtures.authTokensBuild().getAccessToken(); + // + // given(tokenExtractor.extractAccessToken(authorizationHeader)).willReturn(authTokens.getAccessToken()); + // given(jwtProvider.isValidRefreshAndInvalidAccess(authTokens.getRefreshToken(), + // authTokens.getAccessToken())).willReturn(true); + // given(redisRepository.findHash(REFRESH_TOKEN_KEY, authTokens.getRefreshToken())).willReturn(refreshToken); + // given(jwtProvider.regenerateAccessToken(String.valueOf(1L))).willReturn(regeneratedAccessToken); + // + // // when + // final AccessTokenResponse accessTokenResponse = oauthService.regenerateAccessToken(authTokens.getRefreshToken(), + // authorizationHeader); + // + // // then + // assertThat(accessTokenResponse.getAccessToken()).isEqualTo(regeneratedAccessToken); + // + // verify(tokenExtractor).extractAccessToken(anyString()); + // verify(jwtProvider).isValidRefreshAndInvalidAccess(anyString(), anyString()); + // verify(redisRepository).findHash(anyString(), anyString()); + // verify(jwtProvider).regenerateAccessToken(anyString()); + // } + // + // @Test + // @DisplayName("로그인된 사용자는 로그아웃을 할 수 있다.") + // void logout() { + // // given && when + // final AuthTokens authTokens = AuthFixtures.authTokensBuild(); + // oauthService.deleteRefreshToken(authTokens.getRefreshToken()); + // + // // then + // verify(redisRepository).deleteHash(REFRESH_TOKEN_KEY, authTokens.getRefreshToken()); + // } } diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java index caf68983..19a92546 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatMessageDocumentTest.java @@ -38,9 +38,9 @@ class ChatMessageDocumentTest extends IntegrationChatTest { @DisplayName("특정 채팅방의 모든 메시지 목록 조회") void findAllMessagesInRoom_ReturnChatMessageResponses() throws Exception { // given - final List memberEntities = memberSetup.save(2); - final MemberEntity sender = memberEntities.get(0); - final MemberEntity receiver = memberEntities.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); final ChatRoomDetailResponse personalChatRoom = chatRoomService.createPersonalRoom( sender.getId(), diff --git a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java index e10ce165..975ff5a3 100644 --- a/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java +++ b/src/test/java/kr/pickple/back/chat/docs/ChatRoomDocumentTest.java @@ -43,9 +43,9 @@ class ChatRoomDocumentTest extends IntegrationChatTest { @DisplayName("새 1:1 채팅방 생성") void createPersonalRoom_ReturnChatRoomDetailResponse() throws Exception { // given - final List memberEntities = memberSetup.save(2); - final MemberEntity sender = memberEntities.get(0); - final MemberEntity receiver = memberEntities.get(1); + final List members = memberSetup.save(2); + final MemberEntity sender = members.get(0); + final MemberEntity receiver = members.get(1); chatRoomService.createPersonalRoom(sender.getId(), receiver.getId()); final PersonalChatRoomCreateRequest personalChatRoomCreateRequest = ChatDtoFixtures.personalChatRoomCreateRequestBuild( diff --git a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java b/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java similarity index 58% rename from src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java rename to src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java index dcf242f1..87dfcb58 100644 --- a/src/test/java/kr/pickple/back/crew/controller/CrewEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/crew/controller/CrewControllerTest.java @@ -1,15 +1,18 @@ package kr.pickple.back.crew.controller; -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; -import kr.pickple.back.auth.domain.token.AuthTokens; -import kr.pickple.back.crew.repository.entity.CrewEntity; -import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; -import kr.pickple.back.crew.IntegrationCrewTest; -import kr.pickple.back.crew.repository.CrewMemberRepository; -import kr.pickple.back.fixture.dto.CrewDtoFixtures; -import kr.pickple.back.fixture.setup.AddressSetup; -import kr.pickple.back.member.repository.entity.MemberEntity; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,34 +21,54 @@ import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; +import kr.pickple.back.auth.domain.token.AuthTokens; +import kr.pickple.back.crew.IntegrationCrewTest; +import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; +import kr.pickple.back.fixture.dto.CrewDtoFixtures; +import kr.pickple.back.member.repository.MemberPositionRepository; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.member.repository.entity.MemberPositionEntity; @Transactional -public class CrewEntityControllerTest extends IntegrationCrewTest { +class CrewControllerTest extends IntegrationCrewTest { private static final String BASE_URL = "/crews"; @Autowired - private AddressSetup addressSetup; + private AddressDepth1Repository addressDepth1Repository; @Autowired - private CrewMemberRepository crewMemberRepository; + private AddressDepth2Repository addressDepth2Repository; + + @Autowired + private MemberPositionRepository memberPositionRepository; + + @Autowired + private CrewRepository crewRepository; @Test @DisplayName("사용자는 해당 크루의 상세 정보를 조회할 수 있다.") void findCrewDetailsById_ReturnCrewResponse() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerConfirmed(member.getId(), crew.getId()); + crew = crewRepository.findById(crew.getId()).get(); + + final AddressDepth1Entity leaderAddressDepth1 = addressDepth1Repository.findById(leader.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity leaderAddressDepth2 = addressDepth2Repository.findById(leader.getAddressDepth2Id()) + .get(); + final List leaderPositions = memberPositionRepository.findAllByMemberId(leader.getId()); //when final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{crewId}", crew.getId())); @@ -63,19 +86,18 @@ void findCrewDetailsById_ReturnCrewResponse() throws Exception { .andExpect(jsonPath("status").value(crew.getStatus().getDescription())) .andExpect(jsonPath("likeCount").value(crew.getLikeCount())) .andExpect(jsonPath("competitionPoint").value(crew.getCompetitionPoint())) - .andExpect(jsonPath("leader.id").value(crewLeader.getId())) - .andExpect(jsonPath("leader.email").value(crewLeader.getEmail())) - .andExpect(jsonPath("leader.nickname").value(crewLeader.getNickname())) - .andExpect(jsonPath("leader.introduction").value(crewLeader.getIntroduction())) - .andExpect(jsonPath("leader.profileImageUrl").value(crewLeader.getProfileImageUrl())) - .andExpect(jsonPath("leader.mannerScore").value(crewLeader.getMannerScore())) - .andExpect(jsonPath("leader.mannerScoreCount").value(crewLeader.getMannerScoreCount())) - .andExpect(jsonPath("leader.addressDepth1").value(crewLeader.getAddressDepth1().getName())) - .andExpect(jsonPath("leader.addressDepth2").value(crewLeader.getAddressDepth2().getName())) - .andExpect(jsonPath("leader.positions[0]").value(crewLeader.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("leader.positions[1]").value(crewLeader.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("members[0].id").value(crewLeader.getId())) - .andExpect(jsonPath("members[1].id").value(crewMember.getId())) + .andExpect(jsonPath("leader.id").value(leader.getId())) + .andExpect(jsonPath("leader.email").value(leader.getEmail())) + .andExpect(jsonPath("leader.nickname").value(leader.getNickname())) + .andExpect(jsonPath("leader.introduction").value(leader.getIntroduction())) + .andExpect(jsonPath("leader.profileImageUrl").value(leader.getProfileImageUrl())) + .andExpect(jsonPath("leader.mannerScore").value(leader.getMannerScore())) + .andExpect(jsonPath("leader.mannerScoreCount").value(leader.getMannerScoreCount())) + .andExpect(jsonPath("leader.addressDepth1").value(leaderAddressDepth1.getName())) + .andExpect(jsonPath("leader.addressDepth2").value(leaderAddressDepth2.getName())) + .andExpect(jsonPath("leader.positions[0]").value(leaderPositions.get(0).getPosition().getAcronym())) + .andExpect(jsonPath("members[0].id").value(leader.getId())) + .andExpect(jsonPath("members[1].id").value(member.getId())) .andDo(print()); } @@ -84,11 +106,12 @@ void findCrewDetailsById_ReturnCrewResponse() throws Exception { void applyForCrewMemberShip_Success() throws Exception { //given final List members = memberSetup.save(2); - final MemberEntity crewLeader = members.get(0); - final MemberEntity crewApplyMember = members.get(1); - final CrewEntity crew = crewSetup.save(crewLeader); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); - final String subject = String.valueOf(crewApplyMember.getId()); + final String subject = String.valueOf(member.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); //when @@ -105,13 +128,20 @@ void applyForCrewMemberShip_Success() throws Exception { @DisplayName("크루장은 크루 모집글에 참여 신청한 사용자 정보 목록을 조회할 수 있다.") void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .get(0) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerWaiting(member.getId(), crew.getId()); + + final AddressDepth1Entity leaderAddressDepth1 = addressDepth1Repository.findById(leader.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity leaderAddressDepth2 = addressDepth2Repository.findById(leader.getAddressDepth2Id()) + .get(); + final List leaderPositions = memberPositionRepository.findAllByMemberId(leader.getId()); - final String subject = String.valueOf(crewLeader.getId()); + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); //when @@ -134,18 +164,17 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { .andExpect(jsonPath("status").value(crew.getStatus().getDescription())) .andExpect(jsonPath("likeCount").value(crew.getLikeCount())) .andExpect(jsonPath("competitionPoint").value(crew.getCompetitionPoint())) - .andExpect(jsonPath("leader.id").value(crewLeader.getId())) - .andExpect(jsonPath("leader.email").value(crewLeader.getEmail())) - .andExpect(jsonPath("leader.nickname").value(crewLeader.getNickname())) - .andExpect(jsonPath("leader.introduction").value(crewLeader.getIntroduction())) - .andExpect(jsonPath("leader.profileImageUrl").value(crewLeader.getProfileImageUrl())) - .andExpect(jsonPath("leader.mannerScore").value(crewLeader.getMannerScore())) - .andExpect(jsonPath("leader.mannerScoreCount").value(crewLeader.getMannerScoreCount())) - .andExpect(jsonPath("leader.addressDepth1").value(crewLeader.getAddressDepth1().getName())) - .andExpect(jsonPath("leader.addressDepth2").value(crewLeader.getAddressDepth2().getName())) - .andExpect(jsonPath("leader.positions[0]").value(crewLeader.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("leader.positions[1]").value(crewLeader.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("members[0].id").value(crewMember.getId())) + .andExpect(jsonPath("leader.id").value(leader.getId())) + .andExpect(jsonPath("leader.email").value(leader.getEmail())) + .andExpect(jsonPath("leader.nickname").value(leader.getNickname())) + .andExpect(jsonPath("leader.introduction").value(leader.getIntroduction())) + .andExpect(jsonPath("leader.profileImageUrl").value(leader.getProfileImageUrl())) + .andExpect(jsonPath("leader.mannerScore").value(leader.getMannerScore())) + .andExpect(jsonPath("leader.mannerScoreCount").value(leader.getMannerScoreCount())) + .andExpect(jsonPath("leader.addressDepth1").value(leaderAddressDepth1.getName())) + .andExpect(jsonPath("leader.addressDepth2").value(leaderAddressDepth2.getName())) + .andExpect(jsonPath("leader.positions[0]").value(leaderPositions.get(0).getPosition().getAcronym())) + .andExpect(jsonPath("members[0].id").value(member.getId())) .andDo(print()); } @@ -153,22 +182,23 @@ void findAllCrewMembers_WaitingStatus_ReturnCrewResponse() throws Exception { @DisplayName("크루장은 다른 사용자의 크루 모집글 참여 신청을 수락할 수 있다.") void updateCrewMemberRegistrationStatus_Success() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .get(0) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerWaiting(member.getId(), crew.getId()); - final String subject = String.valueOf(crewLeader.getId()); + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest = CrewDtoFixtures - .crewMemberUpdateStatusRequest(CONFIRMED); + .crewMemberUpdateStatusRequestBuild(CONFIRMED); final String requestBody = objectMapper.writeValueAsString(crewMemberUpdateStatusRequest); //when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), crewMember.getId()) + patch(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), member.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -182,18 +212,19 @@ void updateCrewMemberRegistrationStatus_Success() throws Exception { @DisplayName("크루장은 다른 사용자의 크루 모집글 참여 신청을 거절할 수 있다.") void deleteCrewMember_CrewLeader_Success() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .get(0) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerWaiting(member.getId(), crew.getId()); - final String subject = String.valueOf(crewLeader.getId()); + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); //when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), crewMember.getId()) + delete(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), member.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -205,19 +236,25 @@ void deleteCrewMember_CrewLeader_Success() throws Exception { @DisplayName("사용자는 자신 위치 근처의 크루를 조회할 수 있다.") void findCrewsByAddress_Success() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), CONFIRMED) - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerConfirmed(member.getId(), crew.getId()); + crew = crewRepository.findById(crew.getId()).get(); + + final AddressDepth1Entity leaderAddressDepth1 = addressDepth1Repository.findById(leader.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity leaderAddressDepth2 = addressDepth2Repository.findById(leader.getAddressDepth2Id()) + .get(); + final List leaderPositions = memberPositionRepository.findAllByMemberId(leader.getId()); //when final ResultActions resultActions = mockMvc.perform( get(BASE_URL) - .param("addressDepth1", addressDepth1.getName()) - .param("addressDepth2", addressDepth2.getName()) + .param("addressDepth1", "서울시") + .param("addressDepth2", "강남구") .param("page", "0") .param("size", "10") ); @@ -236,19 +273,19 @@ void findCrewsByAddress_Success() throws Exception { .andExpect(jsonPath("$[0].status").value(crew.getStatus().getDescription())) .andExpect(jsonPath("$[0].likeCount").value(crew.getLikeCount())) .andExpect(jsonPath("$[0].competitionPoint").value(crew.getCompetitionPoint())) - .andExpect(jsonPath("$[0].leader.id").value(crewLeader.getId())) - .andExpect(jsonPath("$[0].leader.email").value(crewLeader.getEmail())) - .andExpect(jsonPath("$[0].leader.nickname").value(crewLeader.getNickname())) - .andExpect(jsonPath("$[0].leader.introduction").value(crewLeader.getIntroduction())) - .andExpect(jsonPath("$[0].leader.profileImageUrl").value(crewLeader.getProfileImageUrl())) - .andExpect(jsonPath("$[0].leader.mannerScore").value(crewLeader.getMannerScore())) - .andExpect(jsonPath("$[0].leader.mannerScoreCount").value(crewLeader.getMannerScoreCount())) - .andExpect(jsonPath("$[0].leader.addressDepth1").value(crewLeader.getAddressDepth1().getName())) - .andExpect(jsonPath("$[0].leader.addressDepth2").value(crewLeader.getAddressDepth2().getName())) - .andExpect(jsonPath("$[0].leader.positions[0]").value(crewLeader.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("$[0].leader.positions[1]").value(crewLeader.getPositions().get(1).getAcronym())) - .andExpect(jsonPath("$[0].members[0].id").value(crewLeader.getId())) - .andExpect(jsonPath("$[0].members[1].id").value(crewMember.getId())) + .andExpect(jsonPath("$[0].leader.id").value(leader.getId())) + .andExpect(jsonPath("$[0].leader.email").value(leader.getEmail())) + .andExpect(jsonPath("$[0].leader.nickname").value(leader.getNickname())) + .andExpect(jsonPath("$[0].leader.introduction").value(leader.getIntroduction())) + .andExpect(jsonPath("$[0].leader.profileImageUrl").value(leader.getProfileImageUrl())) + .andExpect(jsonPath("$[0].leader.mannerScore").value(leader.getMannerScore())) + .andExpect(jsonPath("$[0].leader.mannerScoreCount").value(leader.getMannerScoreCount())) + .andExpect(jsonPath("$[0].leader.addressDepth1").value(leaderAddressDepth1.getName())) + .andExpect(jsonPath("$[0].leader.addressDepth2").value(leaderAddressDepth2.getName())) + .andExpect( + jsonPath("$[0].leader.positions[0]").value(leaderPositions.get(0).getPosition().getAcronym())) + .andExpect(jsonPath("$[0].members[0].id").value(leader.getId())) + .andExpect(jsonPath("$[0].members[1].id").value(member.getId())) .andDo(print()); } } diff --git a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java b/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java similarity index 92% rename from src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java rename to src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java index 18b610ea..7e87a2cb 100644 --- a/src/test/java/kr/pickple/back/crew/docs/CrewEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/crew/docs/CrewDocumentTest.java @@ -1,14 +1,21 @@ package kr.pickple.back.crew.docs; -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static org.springframework.http.HttpHeaders.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; +import static com.epages.restdocs.apispec.ResourceDocumentation.headerWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.parameterWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.epages.restdocs.apispec.Schema.schema; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; @@ -23,33 +30,28 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import com.epages.restdocs.apispec.SimpleType; -import kr.pickple.back.address.repository.entity.AddressDepth1Entity; -import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.crew.IntegrationCrewTest; -import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; -import kr.pickple.back.crew.repository.CrewMemberRepository; +import kr.pickple.back.crew.repository.CrewRepository; +import kr.pickple.back.crew.repository.entity.CrewEntity; import kr.pickple.back.fixture.dto.CrewDtoFixtures; -import kr.pickple.back.fixture.setup.AddressSetup; import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -public class CrewEntityDocumentTest extends IntegrationCrewTest { +class CrewDocumentTest extends IntegrationCrewTest { private static final String BASE_URL = "/crews"; @Autowired - private AddressSetup addressSetup; - - @Autowired - private CrewMemberRepository crewMemberRepository; + private CrewRepository crewRepository; @Test @DisplayName("크루원 모집글 상세 정보 조회") void findCrewById_ReturnCrewResponse() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(3); + final MemberEntity leader = memberSetup.save(); + final CrewEntity crew = crewSetup.save(leader.getId()); //when final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{crewId}", crew.getId())) @@ -146,7 +148,8 @@ void applyForCrewMemberShip_ReturnVoid() throws Exception { final List members = memberSetup.save(2); final MemberEntity crewLeader = members.get(0); final MemberEntity crewApplyMember = members.get(1); - final CrewEntity crew = crewSetup.save(crewLeader); + + final CrewEntity crew = crewSetup.save(crewLeader.getId()); final String subject = String.valueOf(crewApplyMember.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -184,10 +187,15 @@ void applyForCrewMemberShip_ReturnVoid() throws Exception { @DisplayName("크루원 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회") void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final MemberEntity crewLeader = crew.getLeader(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerConfirmed(member.getId(), crew.getId()); + crew = crewRepository.findById(crew.getId()).get(); - final String subject = String.valueOf(crewLeader.getId()); + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); //when @@ -286,22 +294,23 @@ void findAllCrewMembers_ReturnCrewResponseWithWaitingMembers() throws Exception @DisplayName("크루원 모집 참여 신청 수락") void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .get(0) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerWaiting(member.getId(), crew.getId()); - final String subject = String.valueOf(crewLeader.getId()); + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); final CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequest = CrewDtoFixtures - .crewMemberUpdateStatusRequest(CONFIRMED); + .crewMemberUpdateStatusRequestBuild(CONFIRMED); final String requestBody = objectMapper.writeValueAsString(crewMemberUpdateStatusRequest); //when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), crewMember.getId()) + patch(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), member.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -340,18 +349,19 @@ void updateCrewMemberRegistrationStatus_ReturnVoid() throws Exception { @DisplayName("크루원 모집 참여 신청 거절/취소") void deleteCrewMember_ReturnVoid() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithWaitingMembers(2); - final MemberEntity crewLeader = crew.getLeader(); - final MemberEntity crewMember = crewMemberRepository.findAllByCrewIdAndStatus(crew.getId(), WAITING) - .get(0) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); - final String subject = String.valueOf(crewLeader.getId()); + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerWaiting(member.getId(), crew.getId()); + + final String subject = String.valueOf(leader.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); //when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), crewMember.getId()) + delete(BASE_URL + "/{crewId}/members/{memberId}", crew.getId(), member.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ) .andExpect(status().isNoContent()); @@ -383,15 +393,18 @@ void deleteCrewMember_ReturnVoid() throws Exception { @DisplayName("사용자 위치 근처 크루 조회") void findCrewsByAddress_ReturnCrews() throws Exception { //given - final CrewEntity crew = crewSetup.saveWithConfirmedMembers(2); - final AddressDepth1Entity addressDepth1 = addressSetup.findAddressDepth1("서울시"); - final AddressDepth2Entity addressDepth2 = addressSetup.findAddressDepth2("영등포구"); + final List members = memberSetup.save(2); + final MemberEntity leader = members.get(0); + final MemberEntity member = members.get(1); + + final CrewEntity crew = crewSetup.save(leader.getId()); + crewSetup.registerConfirmed(member.getId(), crew.getId()); //when final ResultActions resultActions = mockMvc.perform( get(BASE_URL) - .param("addressDepth1", addressDepth1.getName()) - .param("addressDepth2", addressDepth2.getName()) + .param("addressDepth1", "서울시") + .param("addressDepth2", "강남구") .param("page", "0") .param("size", "10") ) diff --git a/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java new file mode 100644 index 00000000..bceedc7f --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/dto/CrewDtoFixtures.java @@ -0,0 +1,16 @@ +package kr.pickple.back.fixture.dto; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.crew.dto.request.CrewMemberUpdateStatusRequest; + +public final class CrewDtoFixtures { + + private CrewDtoFixtures() { + } + + public static CrewMemberUpdateStatusRequest crewMemberUpdateStatusRequestBuild(final RegistrationStatus status) { + return CrewMemberUpdateStatusRequest.builder() + .status(status) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java index 3765c4ba..fae74040 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/crew/CrewMemberEntityFixtures.java @@ -15,6 +15,14 @@ public static CrewMemberEntity crewMemberEntityBuild(final Long memberId, final .build(); } + public static CrewMemberEntity crewMemberEntityStatusWaitingBuild(final Long memberId, final Long crewId) { + return CrewMemberEntity.builder() + .memberId(memberId) + .crewId(crewId) + .status(RegistrationStatus.WAITING) + .build(); + } + public static CrewMemberEntity crewMemberEntityStatusConfirmedBuild(final Long memberId, final Long crewId) { return CrewMemberEntity.builder() .memberId(memberId) diff --git a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java index bfd30a89..79465100 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/CrewSetup.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; @@ -37,6 +38,7 @@ public class CrewSetup { @Autowired private ChatMessageRepository chatMessageRepository; + @Transactional public CrewEntity save(final Long memberId) { final ChatRoomEntity chatRoomEntity = ChatRoomEntityFixtures.gameChatRoomEntityBuild(); final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); @@ -58,4 +60,23 @@ public CrewEntity save(final Long memberId) { return savedCrewEntity; } + + @Transactional + public CrewMemberEntity registerWaiting(final Long memberId, final Long crewId) { + final CrewMemberEntity crewMemberEntity = CrewMemberEntityFixtures.crewMemberEntityStatusWaitingBuild( + memberId, crewId); + + return crewMemberRepository.save(crewMemberEntity); + } + + @Transactional + public CrewMemberEntity registerConfirmed(final Long memberId, final Long crewId) { + final CrewEntity crewEntity = crewRepository.findById(crewId).get(); + crewRepository.updateMemberCountAndStatus(crewId, crewEntity.getMemberCount() + 1, crewEntity.getStatus()); + + final CrewMemberEntity crewMemberEntity = CrewMemberEntityFixtures.crewMemberEntityStatusConfirmedBuild( + memberId, crewId); + + return crewMemberRepository.save(crewMemberEntity); + } } diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index f2f77305..b3c89087 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.chat.repository.ChatMessageRepository; import kr.pickple.back.chat.repository.ChatRoomMemberRepository; @@ -43,6 +44,7 @@ public class GameSetup { @Autowired private ChatMessageRepository chatMessageRepository; + @Transactional public GameEntity save(final Long memberId) { final ChatRoomEntity chatRoomEntity = ChatRoomEntityFixtures.gameChatRoomEntityBuild(); final ChatRoomEntity savedChatRoomEntity = chatRoomRepository.save(chatRoomEntity); diff --git a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java index c4f4288a..0f8c493b 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/MemberSetup.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import kr.pickple.back.fixture.entity.member.MemberEntityFixtures; import kr.pickple.back.fixture.entity.member.MemberPositionEntityFixtures; @@ -21,6 +22,7 @@ public class MemberSetup { @Autowired private MemberPositionRepository memberPositionRepository; + @Transactional public MemberEntity save() { final MemberEntity memberEntity = MemberEntityFixtures.memberEntityBuild(); final MemberEntity savedMemberEntity = memberRepository.save(memberEntity); @@ -32,6 +34,7 @@ public MemberEntity save() { return savedMemberEntity; } + @Transactional public List save(final int count) { final List savedMemberEntities = MemberEntityFixtures.memberEntitiesBuild(count) .stream() diff --git a/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java b/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java similarity index 99% rename from src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java rename to src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java index e43a8af5..4dace6e3 100644 --- a/src/test/java/kr/pickple/back/member/controller/MemberEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/member/controller/MemberControllerTest.java @@ -21,7 +21,7 @@ import kr.pickple.back.position.domain.Position; @Transactional -class MemberEntityControllerTest extends IntegrationMemberTest { +class MemberControllerTest extends IntegrationMemberTest { private static final String BASE_URL = "/members"; diff --git a/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java b/src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java similarity index 99% rename from src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java rename to src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java index ab1905ad..7062f31a 100644 --- a/src/test/java/kr/pickple/back/member/docs/MemberEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/member/docs/MemberDocumentTest.java @@ -27,7 +27,7 @@ import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -class MemberEntityDocumentTest extends IntegrationMemberTest { +class MemberDocumentTest extends IntegrationMemberTest { @Test @DisplayName("사용자 회원가입") diff --git a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java b/src/test/java/kr/pickple/back/member/domain/MemberTest.java similarity index 98% rename from src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java rename to src/test/java/kr/pickple/back/member/domain/MemberTest.java index 93675ce5..3a4dbcdc 100644 --- a/src/test/java/kr/pickple/back/member/domain/MemberEntityTest.java +++ b/src/test/java/kr/pickple/back/member/domain/MemberTest.java @@ -12,7 +12,7 @@ import kr.pickple.back.fixture.domain.MemberFixtures; import kr.pickple.back.member.exception.MemberException; -class MemberEntityTest { +class MemberTest { @Test @DisplayName("멤버의 ID가 동일한지 확인한다.") From d4d880ad727e3499a4c3cf381b536e9f81481fc7 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Tue, 23 Apr 2024 20:27:29 +0900 Subject: [PATCH 117/117] =?UTF-8?q?test:=20game=20document,=20controller?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A0=95=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/game/repository/GameRepository.java | 6 +- .../back/fixture/dto/GameDtoFixtures.java | 54 ++++ .../entity/game/GameMemberEntityFixtures.java | 8 + .../pickple/back/fixture/setup/GameSetup.java | 22 ++ ...ollerTest.java => GameControllerTest.java} | 273 +++++++++++------- ...ocumentTest.java => GameDocumentTest.java} | 201 +++++++------ 6 files changed, 366 insertions(+), 198 deletions(-) create mode 100644 src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java rename src/test/java/kr/pickple/back/game/controller/{GameEntityControllerTest.java => GameControllerTest.java} (50%) rename src/test/java/kr/pickple/back/game/docs/{GameEntityDocumentTest.java => GameDocumentTest.java} (84%) diff --git a/src/main/java/kr/pickple/back/game/repository/GameRepository.java b/src/main/java/kr/pickple/back/game/repository/GameRepository.java index 6c3d2e66..056ba405 100644 --- a/src/main/java/kr/pickple/back/game/repository/GameRepository.java +++ b/src/main/java/kr/pickple/back/game/repository/GameRepository.java @@ -1,17 +1,15 @@ package kr.pickple.back.game.repository; -import static kr.pickple.back.game.exception.GameExceptionCode.*; - import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import kr.pickple.back.game.domain.GameStatus; -import kr.pickple.back.game.exception.GameException; import kr.pickple.back.game.repository.entity.GameEntity; public interface GameRepository extends JpaRepository, GameSearchRepository { @@ -27,9 +25,11 @@ Page findByAddressDepth1IdAndAddressDepth2IdAndStatusNot( List findAllByHostId(final Long hostId); + @Modifying(clearAutomatically = true) @Query("update GameEntity g set g.memberCount = :memberCount, g.status = :status where g.id = :gameId") void updateMemberCountAndStatus(final Long gameId, final Integer memberCount, final GameStatus status); + @Modifying(clearAutomatically = true) @Query("update GameEntity g set g.status = :status where g.id = :gameId") void updateRegistrationStatus(final GameStatus status, final Long gameId); diff --git a/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java b/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java new file mode 100644 index 00000000..0ccff7e2 --- /dev/null +++ b/src/test/java/kr/pickple/back/fixture/dto/GameDtoFixtures.java @@ -0,0 +1,54 @@ +package kr.pickple.back.fixture.dto; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +import kr.pickple.back.common.domain.RegistrationStatus; +import kr.pickple.back.game.dto.request.GameCreateRequest; +import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; +import kr.pickple.back.game.dto.request.MannerScoreReview; +import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; +import kr.pickple.back.member.repository.entity.MemberEntity; +import kr.pickple.back.position.domain.Position; + +public final class GameDtoFixtures { + + private GameDtoFixtures() { + } + + public static GameCreateRequest gameCreateRequestBuild() { + return GameCreateRequest.builder() + .content("pickple game") + .playDate(LocalDate.of(2024, 4, 1)) + .playStartTime(LocalTime.of(10, 0)) + .playTimeMinutes(60) + .mainAddress("서울시 강남구 논현동 1") + .detailAddress("201호") + .cost(0) + .maxMemberCount(20) + .positions(List.of(Position.CENTER)) + .build(); + } + + public static GameMemberRegistrationStatusUpdateRequest gameMemberRegistrationStatusUpdateRequestBuild( + final RegistrationStatus status + ) { + return GameMemberRegistrationStatusUpdateRequest.builder() + .status(status) + .build(); + } + + public static MannerScoreReviewsRequest mannerScoreReviewsRequestBuild(final List guests) { + final List mannerScoreReviews = guests.stream() + .map(guest -> MannerScoreReview.builder() + .memberId(guest.getId()) + .mannerScore(1) + .build()) + .toList(); + + return MannerScoreReviewsRequest.builder() + .mannerScoreReviews(mannerScoreReviews) + .build(); + } +} diff --git a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java index 67195e95..ba40abb5 100644 --- a/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java +++ b/src/test/java/kr/pickple/back/fixture/entity/game/GameMemberEntityFixtures.java @@ -15,6 +15,14 @@ public static GameMemberEntity gameMemberEntityBuild(final Long memberId, final .build(); } + public static GameMemberEntity gameMemberEntityStatusWaitingBuild(final Long memberId, final Long gameId) { + return GameMemberEntity.builder() + .memberId(memberId) + .gameId(gameId) + .status(RegistrationStatus.WAITING) + .build(); + } + public static GameMemberEntity gameMemberEntityStatusConfirmedBuild(final Long memberId, final Long gameId) { return GameMemberEntity.builder() .memberId(memberId) diff --git a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java index b3c89087..bf7ab01f 100644 --- a/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java +++ b/src/test/java/kr/pickple/back/fixture/setup/GameSetup.java @@ -70,4 +70,26 @@ public GameEntity save(final Long memberId) { return savedGameEntity; } + + @Transactional + public GameMemberEntity registerWaiting(final Long memberId, final Long gameId) { + final GameMemberEntity gameMemberEntity = GameMemberEntityFixtures.gameMemberEntityStatusWaitingBuild( + memberId, + gameId + ); + + return gameMemberRepository.save(gameMemberEntity); + } + + @Transactional + public GameMemberEntity registerConfirmed(final Long memberId, final Long gameId) { + final GameEntity gameEntity = gameRepository.findById(gameId).get(); + final GameMemberEntity gameMemberEntity = GameMemberEntityFixtures.gameMemberEntityStatusConfirmedBuild( + memberId, + gameId + ); + gameRepository.updateMemberCountAndStatus(gameId, gameEntity.getMemberCount() + 1, gameEntity.getStatus()); + + return gameMemberRepository.save(gameMemberEntity); + } } diff --git a/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java b/src/test/java/kr/pickple/back/game/controller/GameControllerTest.java similarity index 50% rename from src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java rename to src/test/java/kr/pickple/back/game/controller/GameControllerTest.java index 2b50a7cb..6331715d 100644 --- a/src/test/java/kr/pickple/back/game/controller/GameEntityControllerTest.java +++ b/src/test/java/kr/pickple/back/game/controller/GameControllerTest.java @@ -1,64 +1,97 @@ package kr.pickple.back.game.controller; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static org.springframework.http.HttpHeaders.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultActions; import org.springframework.transaction.annotation.Transactional; +import kr.pickple.back.address.repository.AddressDepth1Repository; +import kr.pickple.back.address.repository.AddressDepth2Repository; +import kr.pickple.back.address.repository.entity.AddressDepth1Entity; +import kr.pickple.back.address.repository.entity.AddressDepth2Entity; import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.GameDtoFixtures; import kr.pickple.back.game.IntegrationGameTest; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; +import kr.pickple.back.game.repository.GamePositionRepository; +import kr.pickple.back.game.repository.GameRepository; +import kr.pickple.back.game.repository.entity.GameEntity; +import kr.pickple.back.game.repository.entity.GamePositionEntity; import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -class GameEntityControllerTest extends IntegrationGameTest { +class GameControllerTest extends IntegrationGameTest { private static final String BASE_URL = "/games"; + @Autowired + private AddressDepth1Repository addressDepth1Repository; + + @Autowired + private AddressDepth2Repository addressDepth2Repository; + + @Autowired + private GameRepository gameRepository; + + @Autowired + private GamePositionRepository gamePositionRepository; + @Test @DisplayName("사용자는 게스트 모집글의 상세 정보를 조회할 수 있다.") void findGameDetailsById_ReturnGameResponse() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest.getId(), game.getId()); + game = gameRepository.findById(game.getId()).get(); + + final AddressDepth1Entity gameAddressDepth1 = addressDepth1Repository.findById(game.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity gameAddressDepth2 = addressDepth2Repository.findById(game.getAddressDepth2Id()) + .get(); + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); // when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", gameEntity.getId())); + final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", game.getId())); // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(gameEntity.getId())) - .andExpect(jsonPath("content").value(gameEntity.getContent())) - .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) - .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) - .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) - .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) - .andExpect(jsonPath("cost").value(gameEntity.getCost())) - .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) + .andExpect(jsonPath("id").value(game.getId())) + .andExpect(jsonPath("content").value(game.getContent())) + .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) + .andExpect(jsonPath("latitude").value(game.getPoint().getY())) + .andExpect(jsonPath("longitude").value(game.getPoint().getX())) + .andExpect(jsonPath("status").value(game.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(game.getViewCount())) + .andExpect(jsonPath("cost").value(game.getCost())) + .andExpect(jsonPath("memberCount").value(game.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -66,10 +99,9 @@ void findGameDetailsById_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameAddressDepth1.getName())) + .andExpect(jsonPath("addressDepth2").value(gameAddressDepth2.getName())) + .andExpect(jsonPath("positions[0]").value(gamePositions.get(0).getPosition().getAcronym())) .andExpect(jsonPath("members[0].id").value(host.getId())) .andExpect(jsonPath("members[1].id").value(guest.getId())) .andDo(print()); @@ -82,14 +114,15 @@ void registerGameMember_Success() throws Exception { final List members = memberSetup.save(2); final MemberEntity host = members.get(0); final MemberEntity guest = members.get(1); - final GameEntity gameEntity = gameSetup.save(host); + + final GameEntity game = gameSetup.save(host.getId()); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - post(BASE_URL + "/{gameId}/members", gameEntity.getId()) + post(BASE_URL + "/{gameId}/members", game.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -101,18 +134,25 @@ void registerGameMember_Success() throws Exception { @DisplayName("호스트는 게스트 모집글에 참여 신청된 사용자 정보 목록을 조회할 수 있다.") void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); + + final AddressDepth1Entity gameAddressDepth1 = addressDepth1Repository.findById(game.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity gameAddressDepth2 = addressDepth2Repository.findById(game.getAddressDepth2Id()) + .get(); + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", gameEntity.getId()) + get(BASE_URL + "/{gameId}/members", game.getId()) .param("status", WAITING.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -120,21 +160,21 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(gameEntity.getId())) - .andExpect(jsonPath("content").value(gameEntity.getContent())) - .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) - .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) - .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) - .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) - .andExpect(jsonPath("cost").value(gameEntity.getCost())) - .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) + .andExpect(jsonPath("id").value(game.getId())) + .andExpect(jsonPath("content").value(game.getContent())) + .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) + .andExpect(jsonPath("latitude").value(game.getPoint().getY())) + .andExpect(jsonPath("longitude").value(game.getPoint().getX())) + .andExpect(jsonPath("status").value(game.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(game.getViewCount())) + .andExpect(jsonPath("cost").value(game.getCost())) + .andExpect(jsonPath("memberCount").value(game.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -142,10 +182,9 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameAddressDepth1.getName())) + .andExpect(jsonPath("addressDepth2").value(gameAddressDepth2.getName())) + .andExpect(jsonPath("positions[0]").value(gamePositions.get(0).getPosition().getAcronym())) .andExpect(jsonPath("members[0].id").value(guest.getId())) .andDo(print()); } @@ -154,18 +193,26 @@ void findAllGameMembers_WaitingStatus_ReturnGameResponse() throws Exception { @DisplayName("사용자는 게스트 모집글에 참여 확정된 사용자 정보 목록을 조회할 수 있다.") void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest.getId(), game.getId()); + game = gameRepository.findById(game.getId()).get(); + + final AddressDepth1Entity gameAddressDepth1 = addressDepth1Repository.findById(game.getAddressDepth1Id()) + .get(); + final AddressDepth2Entity gameAddressDepth2 = addressDepth2Repository.findById(game.getAddressDepth2Id()) + .get(); + final List gamePositions = gamePositionRepository.findAllByGameId(game.getId()); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", gameEntity.getId()) + get(BASE_URL + "/{gameId}/members", game.getId()) .param("status", CONFIRMED.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -173,21 +220,21 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { // then resultActions.andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("id").value(gameEntity.getId())) - .andExpect(jsonPath("content").value(gameEntity.getContent())) - .andExpect(jsonPath("playDate").value(gameEntity.getPlayDate().toString())) - .andExpect(jsonPath("playStartTime").value(gameEntity.getPlayStartTime().toString() + ":00")) - .andExpect(jsonPath("playEndTime").value(gameEntity.getPlayEndTime().toString() + ":00")) - .andExpect(jsonPath("playTimeMinutes").value(gameEntity.getPlayTimeMinutes())) - .andExpect(jsonPath("mainAddress").value(gameEntity.getMainAddress())) - .andExpect(jsonPath("detailAddress").value(gameEntity.getDetailAddress())) - .andExpect(jsonPath("latitude").value(gameEntity.getPoint().getY())) - .andExpect(jsonPath("longitude").value(gameEntity.getPoint().getX())) - .andExpect(jsonPath("status").value(gameEntity.getStatus().getDescription())) - .andExpect(jsonPath("viewCount").value(gameEntity.getViewCount())) - .andExpect(jsonPath("cost").value(gameEntity.getCost())) - .andExpect(jsonPath("memberCount").value(gameEntity.getMemberCount())) - .andExpect(jsonPath("maxMemberCount").value(gameEntity.getMaxMemberCount())) + .andExpect(jsonPath("id").value(game.getId())) + .andExpect(jsonPath("content").value(game.getContent())) + .andExpect(jsonPath("playDate").value(game.getPlayDate().toString())) + .andExpect(jsonPath("playStartTime").value(game.getPlayStartTime().toString() + ":00")) + .andExpect(jsonPath("playEndTime").value(game.getPlayEndTime().toString() + ":00")) + .andExpect(jsonPath("playTimeMinutes").value(game.getPlayTimeMinutes())) + .andExpect(jsonPath("mainAddress").value(game.getMainAddress())) + .andExpect(jsonPath("detailAddress").value(game.getDetailAddress())) + .andExpect(jsonPath("latitude").value(game.getPoint().getY())) + .andExpect(jsonPath("longitude").value(game.getPoint().getX())) + .andExpect(jsonPath("status").value(game.getStatus().getDescription())) + .andExpect(jsonPath("viewCount").value(game.getViewCount())) + .andExpect(jsonPath("cost").value(game.getCost())) + .andExpect(jsonPath("memberCount").value(game.getMemberCount())) + .andExpect(jsonPath("maxMemberCount").value(game.getMaxMemberCount())) .andExpect(jsonPath("host.id").value(host.getId())) .andExpect(jsonPath("host.email").value(host.getEmail())) .andExpect(jsonPath("host.nickname").value(host.getNickname())) @@ -195,10 +242,9 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { .andExpect(jsonPath("host.profileImageUrl").value(host.getProfileImageUrl())) .andExpect(jsonPath("host.mannerScore").value(host.getMannerScore())) .andExpect(jsonPath("host.mannerScoreCount").value(host.getMannerScoreCount())) - .andExpect(jsonPath("addressDepth1").value(gameEntity.getAddressDepth1().getName())) - .andExpect(jsonPath("addressDepth2").value(gameEntity.getAddressDepth2().getName())) - .andExpect(jsonPath("positions[0]").value(gameEntity.getPositions().get(0).getAcronym())) - .andExpect(jsonPath("positions[1]").value(gameEntity.getPositions().get(1).getAcronym())) + .andExpect(jsonPath("addressDepth1").value(gameAddressDepth1.getName())) + .andExpect(jsonPath("addressDepth2").value(gameAddressDepth2.getName())) + .andExpect(jsonPath("positions[0]").value(gamePositions.get(0).getPosition().getAcronym())) .andExpect(jsonPath("members[0].id").value(host.getId())) .andExpect(jsonPath("members[1].id").value(guest.getId())) .andDo(print()); @@ -208,11 +254,12 @@ void findAllGameMembers_ConfirmedStatus_ReturnGameResponse() throws Exception { @DisplayName("호스트는 다른 사용자의 게스트 모집글 참여 신청을 수락할 수 있다.") void updateGameMemberRegistrationStatus_Success() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -223,7 +270,7 @@ void updateGameMemberRegistrationStatus_Success() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) + patch(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -237,18 +284,19 @@ void updateGameMemberRegistrationStatus_Success() throws Exception { @DisplayName("호스트는 다른 사용자의 게스트 모집글 참여 신청을 거절할 수 있다.") void deleteGameMember_Host_Success() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -260,17 +308,19 @@ void deleteGameMember_Host_Success() throws Exception { @DisplayName("사용자는 자신의 게스트 모집글 참여 신청을 취소할 수 있다.") void deleteGameMember_GuestSelf_Success() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ); @@ -282,24 +332,25 @@ void deleteGameMember_GuestSelf_Success() throws Exception { @DisplayName("사용자는 경기에 참여한 다른 사용자의 매너 스코어를 리뷰할 수 있다.") void reviewMannerScores_Success() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); - final MemberEntity host = gameEntity.getHost(); - final List gameMemberEntities = gameEntity.getGameMembers(); - final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) - .stream() - .map(GameMemberEntity::getMember) - .toList(); + final List members = memberSetup.save(3); + final MemberEntity host = members.get(0); + final MemberEntity guest1 = members.get(1); + final MemberEntity guest2 = members.get(2); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest1.getId(), game.getId()); + gameSetup.registerConfirmed(guest2.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); final MannerScoreReviewsRequest mannerScoreReviewsRequest = GameDtoFixtures.mannerScoreReviewsRequestBuild( - guests); + List.of(guest1, guest2)); final String requestBody = objectMapper.writeValueAsString(mannerScoreReviewsRequest); // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/manner-scores", gameEntity.getId()) + patch(BASE_URL + "/{gameId}/members/manner-scores", game.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) diff --git a/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java b/src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java similarity index 84% rename from src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java rename to src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java index 937018fe..47e6df66 100644 --- a/src/test/java/kr/pickple/back/game/docs/GameEntityDocumentTest.java +++ b/src/test/java/kr/pickple/back/game/docs/GameDocumentTest.java @@ -1,15 +1,24 @@ package kr.pickple.back.game.docs; -import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.*; -import static com.epages.restdocs.apispec.ResourceDocumentation.*; -import static com.epages.restdocs.apispec.Schema.*; -import static kr.pickple.back.common.domain.RegistrationStatus.*; -import static kr.pickple.back.game.domain.Category.*; -import static org.springframework.http.HttpHeaders.*; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static com.epages.restdocs.apispec.MockMvcRestDocumentationWrapper.document; +import static com.epages.restdocs.apispec.ResourceDocumentation.headerWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.parameterWithName; +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.epages.restdocs.apispec.Schema.schema; +import static kr.pickple.back.common.domain.RegistrationStatus.CONFIRMED; +import static kr.pickple.back.common.domain.RegistrationStatus.WAITING; +import static kr.pickple.back.game.domain.Category.ADDRESS; +import static org.springframework.http.HttpHeaders.AUTHORIZATION; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessResponse; +import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; @@ -26,77 +35,77 @@ import kr.pickple.back.auth.domain.token.AuthTokens; import kr.pickple.back.fixture.dto.GameDtoFixtures; import kr.pickple.back.game.IntegrationGameTest; -import kr.pickple.back.game.repository.entity.GameEntity; -import kr.pickple.back.game.repository.entity.GameMemberEntity; +import kr.pickple.back.game.dto.request.GameCreateRequest; import kr.pickple.back.game.dto.request.GameMemberRegistrationStatusUpdateRequest; import kr.pickple.back.game.dto.request.MannerScoreReviewsRequest; +import kr.pickple.back.game.repository.entity.GameEntity; import kr.pickple.back.member.repository.entity.MemberEntity; @Transactional -class GameEntityDocumentTest extends IntegrationGameTest { +class GameDocumentTest extends IntegrationGameTest { private static final String BASE_URL = "/games"; //todo: 카카오 외부 API 의존성으로 인한 테스트 실패 해결 필요. - // @Test // @DisplayName("게스트 모집글 생성") // void createGame_ReturnGameIdResponse() throws Exception { // // given + // final MemberEntity host = memberSetup.save(); + // // final GameCreateRequest gameCreateRequest = GameDtoFixtures.gameCreateRequestBuild(); // final String requestBody = objectMapper.writeValueAsString(gameCreateRequest); // - // final Member host = memberSetup.save(); // final String subject = String.valueOf(host.getId()); // final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // // // when // final ResultActions resultActions = mockMvc.perform(post(BASE_URL) - // .contentType(MediaType.APPLICATION_JSON) - // .content(requestBody) - // .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) - // ) - // .andExpect(status().isCreated()); + // .contentType(MediaType.APPLICATION_JSON) + // .content(requestBody) + // .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) + // ) + // .andExpect(status().isCreated()); // // // then // resultActions.andDo(document("create-game", - // preprocessRequest(prettyPrint()), - // preprocessResponse(prettyPrint()), - // resource( - // ResourceSnippetParameters.builder() - // .tag("Game") - // .summary("게스트 모집 생성") - // .description("게스트 모집을 생성한다.") - // .requestSchema(schema("GameCreateRequest")) - // .responseSchema(schema("GameIdResponse")) - // .requestHeaders( - // headerWithName(AUTHORIZATION).type(SimpleType.STRING) - // .description("Access Token") - // ) - // .requestFields( - // fieldWithPath("content").type(JsonFieldType.STRING) - // .description("게스트 모집글 내용"), - // fieldWithPath("playDate").type(JsonFieldType.STRING).description("경기 날짜"), - // fieldWithPath("playStartTime").type(JsonFieldType.STRING) - // .description("경기 시작 시간"), - // fieldWithPath("playTimeMinutes").type(JsonFieldType.NUMBER) - // .description("경기 진행 분"), - // fieldWithPath("mainAddress").type(JsonFieldType.STRING) - // .description("메인 주소(도/시, 구, 동, 번지)"), - // fieldWithPath("detailAddress").type(JsonFieldType.STRING) - // .description("상세 주소(층, 호수)"), - // fieldWithPath("latitude").type(JsonFieldType.VARIES).description("위도"), - // fieldWithPath("longitude").type(JsonFieldType.VARIES).description("경도"), - // fieldWithPath("cost").type(JsonFieldType.NUMBER).description("비용"), - // fieldWithPath("maxMemberCount").type(JsonFieldType.NUMBER).description("인원 제한"), - // fieldWithPath("positions").type(JsonFieldType.ARRAY).description("포지션 목록") + // preprocessRequest(prettyPrint()), + // preprocessResponse(prettyPrint()), + // resource( + // ResourceSnippetParameters.builder() + // .tag("Game") + // .summary("게스트 모집 생성") + // .description("게스트 모집을 생성한다.") + // .requestSchema(schema("GameCreateRequest")) + // .responseSchema(schema("GameIdResponse")) + // .requestHeaders( + // headerWithName(AUTHORIZATION).type(SimpleType.STRING) + // .description("Access Token") + // ) + // .requestFields( + // fieldWithPath("content").type(JsonFieldType.STRING) + // .description("게스트 모집글 내용"), + // fieldWithPath("playDate").type(JsonFieldType.STRING).description("경기 날짜"), + // fieldWithPath("playStartTime").type(JsonFieldType.STRING) + // .description("경기 시작 시간"), + // fieldWithPath("playTimeMinutes").type(JsonFieldType.NUMBER) + // .description("경기 진행 분"), + // fieldWithPath("mainAddress").type(JsonFieldType.STRING) + // .description("메인 주소(도/시, 구, 동, 번지)"), + // fieldWithPath("detailAddress").type(JsonFieldType.STRING) + // .description("상세 주소(층, 호수)"), + // fieldWithPath("latitude").type(JsonFieldType.VARIES).description("위도"), + // fieldWithPath("longitude").type(JsonFieldType.VARIES).description("경도"), + // fieldWithPath("cost").type(JsonFieldType.NUMBER).description("비용"), + // fieldWithPath("maxMemberCount").type(JsonFieldType.NUMBER).description("인원 제한"), + // fieldWithPath("positions").type(JsonFieldType.ARRAY).description("포지션 목록") + // ) + // .responseFields( + // fieldWithPath("gameId").type(JsonFieldType.NUMBER).description("게스트 모집 ID") + // ) + // .build() // ) - // .responseFields( - // fieldWithPath("gameId").type(JsonFieldType.NUMBER).description("게스트 모집 ID") - // ) - // .build() // ) - // ) // ); // } @@ -104,13 +113,20 @@ class GameEntityDocumentTest extends IntegrationGameTest { @DisplayName("조건별(장소) 게스트 모집글 조회") void findGamesByCategory_ReturnGameResponses() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); + final List members = memberSetup.save(3); + final MemberEntity host = members.get(0); + final MemberEntity guest1 = members.get(1); + final MemberEntity guest2 = members.get(2); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest1.getId(), game.getId()); + gameSetup.registerConfirmed(guest2.getId(), game.getId()); // when final ResultActions resultActions = mockMvc.perform( get(BASE_URL) .param("category", ADDRESS.getValue()) - .param("value", "서울시+영등포구") + .param("value", "서울시+강남구") .param("page", "0") .param("size", "1") ) @@ -215,10 +231,17 @@ void findGamesByCategory_ReturnGameResponses() throws Exception { @DisplayName("게스트 모집글 상세 조회") void findGameById_ReturnGameResponse() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); + final List members = memberSetup.save(3); + final MemberEntity host = members.get(0); + final MemberEntity guest1 = members.get(1); + final MemberEntity guest2 = members.get(2); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest1.getId(), game.getId()); + gameSetup.registerConfirmed(guest2.getId(), game.getId()); // when - final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", gameEntity.getId())) + final ResultActions resultActions = mockMvc.perform(get(BASE_URL + "/{gameId}", game.getId())) .andExpect(status().isOk()); // then @@ -312,7 +335,8 @@ void registerGameMember_ReturnVoid() throws Exception { final List members = memberSetup.save(2); final MemberEntity host = members.get(0); final MemberEntity guest = members.get(1); - final GameEntity gameEntity = gameSetup.save(host); + + final GameEntity gameEntity = gameSetup.save(host.getId()); final String subject = String.valueOf(guest.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -350,15 +374,21 @@ void registerGameMember_ReturnVoid() throws Exception { @DisplayName("게스트 모집에 참여 신청된 혹은 확정된 사용자 정보 목록 조회") void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(3); - final MemberEntity host = gameEntity.getHost(); + final List members = memberSetup.save(3); + final MemberEntity host = members.get(0); + final MemberEntity guest1 = members.get(1); + final MemberEntity guest2 = members.get(2); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest1.getId(), game.getId()); + gameSetup.registerWaiting(guest2.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - get(BASE_URL + "/{gameId}/members", gameEntity.getId()) + get(BASE_URL + "/{gameId}/members", game.getId()) .param("status", WAITING.getDescription()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken())) .andExpect(status().isOk()); @@ -458,11 +488,12 @@ void findAllGameMembers_ReturnGameResponseWithWaitingMembers() throws Exception @DisplayName("게스트 모집 참여 신청 수락") void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); @@ -473,7 +504,7 @@ void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) + patch(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody) @@ -512,18 +543,19 @@ void updateGameMemberRegistrationStatus_ReturnVoid() throws Exception { @DisplayName("게스트 모집 참여 신청 거절/취소") void deleteGameMember_ReturnVoid() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithWaitingMembers(2); - final MemberEntity host = gameEntity.getHost(); - final MemberEntity guest = gameEntity.getGameMembers() - .get(1) - .getMember(); + final List members = memberSetup.save(2); + final MemberEntity host = members.get(0); + final MemberEntity guest = members.get(1); + + final GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerWaiting(guest.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); // when final ResultActions resultActions = mockMvc.perform( - delete(BASE_URL + "/{gameId}/members/{memberId}", gameEntity.getId(), guest.getId()) + delete(BASE_URL + "/{gameId}/members/{memberId}", game.getId(), guest.getId()) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) ) .andExpect(status().isNoContent()); @@ -555,24 +587,25 @@ void deleteGameMember_ReturnVoid() throws Exception { @DisplayName("다른 사용자 매너 스코어 리뷰") void reviewMannerScores_ReturnVoid() throws Exception { // given - final GameEntity gameEntity = gameSetup.saveWithConfirmedMembers(3); - final MemberEntity host = gameEntity.getHost(); - final List gameMemberEntities = gameEntity.getGameMembers(); - final List guests = gameMemberEntities.subList(1, gameMemberEntities.size()) - .stream() - .map(GameMemberEntity::getMember) - .toList(); + final List members = memberSetup.save(3); + final MemberEntity host = members.get(0); + final MemberEntity guest1 = members.get(1); + final MemberEntity guest2 = members.get(2); + + GameEntity game = gameSetup.save(host.getId()); + gameSetup.registerConfirmed(guest1.getId(), game.getId()); + gameSetup.registerConfirmed(guest2.getId(), game.getId()); final String subject = String.valueOf(host.getId()); final AuthTokens authTokens = jwtProvider.createLoginToken(subject); final MannerScoreReviewsRequest mannerScoreReviewsRequest = GameDtoFixtures.mannerScoreReviewsRequestBuild( - guests); + List.of(guest1, guest2)); final String requestBody = objectMapper.writeValueAsString(mannerScoreReviewsRequest); // when final ResultActions resultActions = mockMvc.perform( - patch(BASE_URL + "/{gameId}/members/manner-scores", gameEntity.getId()) + patch(BASE_URL + "/{gameId}/members/manner-scores", game.getId()) .contentType(MediaType.APPLICATION_JSON) .header(AUTHORIZATION, "Bearer " + authTokens.getAccessToken()) .content(requestBody)