Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/main/java/goorm/ddok/global/dto/PreferredAgesDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ public class PreferredAgesDto {
private Integer ageMax;

public static PreferredAgesDto of(Integer min, Integer max) {
if (min == null && max == null) return null;
Integer normalizedMin = (min == null || min == 0) ? null : min;
Integer normalizedMax = (max == null || max == 0) ? null : max;
if (normalizedMin == null && normalizedMax == null) return null;
return PreferredAgesDto.builder()
.ageMin(min)
.ageMax(max)
.ageMin(normalizedMin)
.ageMax(normalizedMax)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import goorm.ddok.global.exception.ErrorCode;
import goorm.ddok.global.exception.GlobalException;
import goorm.ddok.member.domain.User;
import goorm.ddok.reputation.dto.response.TemperatureRankResponse;
import goorm.ddok.reputation.dto.response.TemperatureRegionResponse;
import goorm.ddok.reputation.service.ReputationQueryService;
Expand Down Expand Up @@ -53,6 +52,14 @@ public void updateTop1Ranking() {
TemperatureRankResponse top1 = reputationQueryService.getTop1TemperatureRank(null);
Instant now = Instant.now();

if (top1.getUserId() == null) {
top1Cache.set(null);
lastUpdated.set(now);
log.info("ℹ️ TOP1 없음(사용자/온도 데이터 미존재), updatedAt={}", now);
return;
}


// 캐시에 저장 (updatedAt 덮어쓰기)
TemperatureRankResponse withUpdatedAt = TemperatureRankResponse.builder()
.rank(top1.getRank())
Expand Down Expand Up @@ -154,4 +161,8 @@ public List<TemperatureRegionResponse> getCachedRegionTop1() {
}
return cached;
}

public TemperatureRankResponse peekCachedTop1() {
return top1Cache.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ public ProjectDetailResponse getEditPage(Long projectId, CustomUserDetails me) {
.toList();

PreferredAgesDto ages = PreferredAgesDto.of(
(pr.getAgeMin() == 0 ? null : pr.getAgeMin()),
(pr.getAgeMax() == 0 ? null : pr.getAgeMax())
(pr.getAgeMin() == null || pr.getAgeMin() == 0 ? null : pr.getAgeMin()),
(pr.getAgeMax() == null || pr.getAgeMax() == 0 ? null : pr.getAgeMax())
);

return ProjectDetailResponse.builder()
Expand Down Expand Up @@ -208,15 +208,16 @@ public ProjectUpdateResultResponse updateProject(Long projectId,
}

// 연령 무관(null) 또는 10단위 강제
int ageMin;
int ageMax;
if (req.getPreferredAges() == null) {
ageMin = 0;
ageMax = 0;
} else {
Integer ageMin = null;
Integer ageMax = null;

if (req.getPreferredAges() != null) {
ageMin = req.getPreferredAges().getAgeMin();
ageMax = req.getPreferredAges().getAgeMax();
if (ageMin > ageMax) throw new GlobalException(ErrorCode.INVALID_AGE_RANGE);

if (ageMin > ageMax) {
throw new GlobalException(ErrorCode.INVALID_AGE_RANGE);
}
if (ageMin % 10 != 0 || ageMax % 10 != 0) {
throw new GlobalException(ErrorCode.INVALID_AGE_BUCKET);
}
Expand Down Expand Up @@ -452,8 +453,8 @@ private ProjectUpdateResultResponse buildUpdateResult(ProjectRecruitment pr, Cus

// 무관(0/0)일 때 null
PreferredAgesDto prefAges = PreferredAgesDto.of(
(pr.getAgeMin() == 0 ? null : pr.getAgeMin()),
(pr.getAgeMax() == 0 ? null : pr.getAgeMax())
(pr.getAgeMin() == null || pr.getAgeMin() == 0 ? null : pr.getAgeMin()),
(pr.getAgeMax() == null || pr.getAgeMax() == 0 ? null : pr.getAgeMax())
);

// 리더/참여자 조회
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,11 @@ public ApiResponseDto<List<TemperatureRankResponse>> getTop10TemperatureRank(
public ApiResponseDto<TemperatureRankResponse> getTop1TemperatureRank(
@AuthenticationPrincipal CustomUserDetails currentUser
) {
TemperatureRankResponse cached = reputationRankingScheduler.getCachedTop1();
TemperatureRankResponse cached = reputationRankingScheduler.peekCachedTop1();

if (cached == null) {
return ApiResponseDto.of(200, "조회 결과가 없습니다.", null);
}

Long meId = (currentUser != null) ? currentUser.getId() : null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ public List<TemperatureRegionResponse> getRegionTop1Rank(CustomUserDetails curre

private List<String> getRawRegionsForMain(String mainRegion) {
return switch (mainRegion) {
case "서울" -> List.of("서울특별시");
case "경기" -> List.of("경기도", "인천광역시");
case "강원" -> List.of("강원도", "강원특별자치도");
case "충청" -> List.of("충청북도", "충청남도", "대전광역시", "세종특별자치시", "충북", "충남", "세종시");
case "경상" -> List.of("경상북도", "경상남도", "대구광역시", "부산광역시", "울산광역시", "경북", "경남", "대구");
case "전라" -> List.of("전라북도", "전라남도", "광주광역시", "전남", "전북", "광주");
case "제주" -> List.of("제주특별자치도");
case "서울" -> List.of("서울", "서울시", "서울특별시");
case "경기도" -> List.of("경기", "인천", "경기도", "인천광역시");
case "강원도" -> List.of("강원", "강원도", "강원특별자치도");
case "충청도" -> List.of("충청", "충북", "충남", "세종", "충청북도", "충청남도", "대전", "대전광역시", "세종특별자치시", "세종시");
case "경상도" -> List.of("경상", "경상북도", "경상남도", "대구광역시", "부산광역시", "울산광역시", "부산시", "울산시", "대구시", "경북", "경남", "대구", "부산", "울산");
case "전라도" -> List.of("전라", "전라북도", "전라남도", "광주광역시", "전남", "전북", "광주");
case "제주도" -> List.of("제주", "제주도", "제주특별자치도");
default -> List.of();
};
}
Expand Down