Skip to content

Commit

Permalink
✨feat: 전체 지역 조회에 방문횟수 표시
Browse files Browse the repository at this point in the history
  • Loading branch information
youngreal committed Aug 23, 2024
1 parent 7841292 commit 65f64d4
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public class MapController {

@GetMapping("/maps")
public RegionResponse map() {
return mapService.allRegions();
Long memberId = 1L;
return mapService.allRegions(memberId);
}
}
}
54 changes: 54 additions & 0 deletions src/main/java/com/dnd/dndtravel/map/domain/MemberRegion.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
18 changes: 6 additions & 12 deletions src/main/java/com/dnd/dndtravel/map/domain/Region.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<MemberRegion, Long> {
List<MemberRegion> findByMemberId(Long memberId);
}
31 changes: 22 additions & 9 deletions src/main/java/com/dnd/dndtravel/map/service/MapService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Region> all = mapRepository.findAll();
public RegionResponse allRegions(Long memberId) {
//todo custom ex
Member member = memberRepository.findById(memberId).orElseThrow(() -> new RuntimeException("존재하지 않는 유저"));

List<RegionDto> regions = all.stream()
// 유저의 지역 방문기록 전부 가져온다
List<MemberRegion> memberRegions = memberRegionRepository.findByMemberId(memberId);
List<RegionDto> 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()
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<RegionDto> regions,
int visitCount,
int totalCount
List<RegionDto> 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<RegionDto> regions, int visitCount) {
this(regions, visitCount, TOTAL_COUNT);
public RegionResponse(List<RegionDto> regions, int visitCount, SelectedColor selectedColor) {
this(regions, visitCount, TOTAL_COUNT, selectedColor);
}

public RegionResponse(List<RegionDto> regions, SelectedColor selectedColor) {
this(regions, DEFAULT_VISIT_COUNT, TOTAL_COUNT, selectedColor);
}
}

0 comments on commit 65f64d4

Please sign in to comment.