From 65f64d450891abb7beb7e3cc49ba419caad72d1b Mon Sep 17 00:00:00 2001 From: youngreal <59333182+youngreal@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:03:35 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8feat:=20=EC=A0=84=EC=B2=B4=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EB=B0=A9=EB=AC=B8?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/controller/MapController.java | 4 +- .../dndtravel/map/domain/MemberRegion.java | 54 +++++++++++++++++++ .../com/dnd/dndtravel/map/domain/Region.java | 18 +++---- .../repository/MemberRegionRepository.java | 11 ++++ .../dnd/dndtravel/map/service/MapService.java | 31 +++++++---- .../service/dto/response/RegionResponse.java | 17 ++++-- 6 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/dnd/dndtravel/map/domain/MemberRegion.java create mode 100644 src/main/java/com/dnd/dndtravel/map/repository/MemberRegionRepository.java diff --git a/src/main/java/com/dnd/dndtravel/map/controller/MapController.java b/src/main/java/com/dnd/dndtravel/map/controller/MapController.java index 76133d3..184439a 100644 --- a/src/main/java/com/dnd/dndtravel/map/controller/MapController.java +++ b/src/main/java/com/dnd/dndtravel/map/controller/MapController.java @@ -16,6 +16,8 @@ public class MapController { @GetMapping("/maps") public RegionResponse map() { - return mapService.allRegions(); + Long memberId = 1L; + return mapService.allRegions(memberId); + } } } diff --git a/src/main/java/com/dnd/dndtravel/map/domain/MemberRegion.java b/src/main/java/com/dnd/dndtravel/map/domain/MemberRegion.java new file mode 100644 index 0000000..d1af6a2 --- /dev/null +++ b/src/main/java/com/dnd/dndtravel/map/domain/MemberRegion.java @@ -0,0 +1,54 @@ +package com.dnd.dndtravel.map.domain; + +import com.dnd.dndtravel.member.domain.Member; + +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 lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class MemberRegion { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "region_id") + private Region region; + + private int visitCount; // 방문 횟수 + + @Builder + private MemberRegion(Member member, Region region, int visitCount) { + this.member = member; + this.region = region; + this.visitCount = visitCount; + } + + public static MemberRegion of(Member member, Region region, int visitCount) { + return MemberRegion.builder() + .member(member) + .region(region) + .visitCount(visitCount) + .build(); + } + + public boolean isVisited() { + return this.visitCount > 0; + } +} diff --git a/src/main/java/com/dnd/dndtravel/map/domain/Region.java b/src/main/java/com/dnd/dndtravel/map/domain/Region.java index ef0d29c..dcfb438 100644 --- a/src/main/java/com/dnd/dndtravel/map/domain/Region.java +++ b/src/main/java/com/dnd/dndtravel/map/domain/Region.java @@ -1,8 +1,6 @@ package com.dnd.dndtravel.map.domain; import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -21,19 +19,15 @@ public class Region { private String name; // 지역 이름 - @Enumerated(EnumType.STRING) - private VisitOpacity visitOpacity; // 방문 횟수(색의 opacity) - - public static Region of(String name, VisitOpacity visitOpacity) { - return new Region(name, visitOpacity); + public static Region of(String name) { + return new Region(name); } - public boolean isVisited() { - return visitOpacity.isNotZero(); + private Region(String name) { + this.name = name; } - private Region(String name, VisitOpacity visitOpacity) { - this.name = name; - this.visitOpacity = visitOpacity; + public boolean isEqualTo(String name) { + return this.name.equals(name); } } diff --git a/src/main/java/com/dnd/dndtravel/map/repository/MemberRegionRepository.java b/src/main/java/com/dnd/dndtravel/map/repository/MemberRegionRepository.java new file mode 100644 index 0000000..c09db39 --- /dev/null +++ b/src/main/java/com/dnd/dndtravel/map/repository/MemberRegionRepository.java @@ -0,0 +1,11 @@ +package com.dnd.dndtravel.map.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.dnd.dndtravel.map.domain.MemberRegion; + +public interface MemberRegionRepository extends JpaRepository { + List findByMemberId(Long memberId); +} diff --git a/src/main/java/com/dnd/dndtravel/map/service/MapService.java b/src/main/java/com/dnd/dndtravel/map/service/MapService.java index 3f70715..9ceb789 100644 --- a/src/main/java/com/dnd/dndtravel/map/service/MapService.java +++ b/src/main/java/com/dnd/dndtravel/map/service/MapService.java @@ -15,20 +15,33 @@ @RequiredArgsConstructor @Service public class MapService { + private final RegionRepository regionRepository; + private final MemberRepository memberRepository; + private final MemberRegionRepository memberRegionRepository; - private final MapRepository mapRepository; - + // 모든 지역 조회(홈) @Transactional(readOnly = true) - public RegionResponse allRegions() { - List all = mapRepository.findAll(); + public RegionResponse allRegions(Long memberId) { + //todo custom ex + Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException("존재하지 않는 유저")); - List regions = all.stream() + // 유저의 지역 방문기록 전부 가져온다 + List memberRegions = memberRegionRepository.findByMemberId(memberId); + List regions = regionRepository.findAll().stream() .map(RegionDto::from) .toList(); - int visitCount = (int)all.stream() - .filter(Region::isVisited) - .count(); - return new RegionResponse(regions, visitCount); + if (memberRegions.isEmpty()) { + return new RegionResponse(regions, member.getSelectedColor()); + } + + return new RegionResponse( + updateRegionDto(regions, memberRegions), + (int)memberRegions.stream() + .filter(MemberRegion::isVisited) + .count(), + member.getSelectedColor() + ); + } } } diff --git a/src/main/java/com/dnd/dndtravel/map/service/dto/response/RegionResponse.java b/src/main/java/com/dnd/dndtravel/map/service/dto/response/RegionResponse.java index 7ca098f..515f90e 100644 --- a/src/main/java/com/dnd/dndtravel/map/service/dto/response/RegionResponse.java +++ b/src/main/java/com/dnd/dndtravel/map/service/dto/response/RegionResponse.java @@ -3,16 +3,23 @@ import java.util.List; import com.dnd.dndtravel.map.service.dto.RegionDto; +import com.dnd.dndtravel.member.domain.SelectedColor; public record RegionResponse( - List regions, - int visitCount, - int totalCount + List regions, // 지역별 opacity 정보, 땅 이름 + int visitCount, // 방문 지도 개수 + int totalCount, // 전체 땅 개수 + SelectedColor selectedColor // 선택된 컬러 ) { private static final int TOTAL_COUNT = 16; // 전체 지역구의 개수, 변경가능성이 낮아 16이라는 상수로 고정 + private static final int DEFAULT_VISIT_COUNT = 0; - public RegionResponse(List regions, int visitCount) { - this(regions, visitCount, TOTAL_COUNT); + public RegionResponse(List regions, int visitCount, SelectedColor selectedColor) { + this(regions, visitCount, TOTAL_COUNT, selectedColor); + } + + public RegionResponse(List regions, SelectedColor selectedColor) { + this(regions, DEFAULT_VISIT_COUNT, TOTAL_COUNT, selectedColor); } }