Skip to content

Commit

Permalink
fix: 월 일만 비교하도록 변경 (#455)
Browse files Browse the repository at this point in the history
  • Loading branch information
hocaron authored Aug 5, 2024
2 parents 5c85242 + 1b38351 commit f142f13
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import kr.mashup.branding.domain.generation.Generation;
import kr.mashup.branding.service.member.MemberBirthdayDto;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.List;

public interface MemberProfileRepositoryCustom {

List<MemberBirthdayDto> retrieveByBirthDateBetween(LocalDate startDate, LocalDate endDate, Generation generation);
List<MemberBirthdayDto> retrieveByBirthDateBetween(MonthDay startDate, MonthDay endDate, Generation generation);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package kr.mashup.branding.repository.member;

import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import kr.mashup.branding.domain.generation.Generation;
import kr.mashup.branding.service.member.MemberBirthdayDto;
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.List;

import static kr.mashup.branding.domain.member.QMember.member;
Expand All @@ -18,9 +19,9 @@ public class MemberProfileRepositoryCustomImpl implements MemberProfileRepositor
private final JPAQueryFactory queryFactory;

@Override
public List<MemberBirthdayDto> retrieveByBirthDateBetween(LocalDate startDate, LocalDate endDate, Generation generation) {
public List<MemberBirthdayDto> retrieveByBirthDateBetween(MonthDay startDate, MonthDay endDate, Generation generation) {
return queryFactory
.select(Projections.fields(
.select(Projections.constructor(
MemberBirthdayDto.class,
member.id.as("memberId"),
member.name.as("name"),
Expand All @@ -30,7 +31,18 @@ public List<MemberBirthdayDto> retrieveByBirthDateBetween(LocalDate startDate, L
.from(memberProfile)
.join(member).on(member.id.eq(memberProfile.memberId))
.join(memberGeneration).on(member.id.eq(memberGeneration.member.id))
.where(memberProfile.birthDate.between(startDate, endDate).and(memberGeneration.generation.eq(generation)))
.where(
birthDateBetween(startDate, endDate)
.and(memberGeneration.generation.eq(generation))
)
.fetch();
}

private BooleanExpression birthDateBetween(MonthDay startDate, MonthDay endDate) {

return memberProfile.birthDate.month().gt(startDate.getMonthValue())
.or(memberProfile.birthDate.month().eq(startDate.getMonthValue()).and(memberProfile.birthDate.dayOfMonth().goe(startDate.getDayOfMonth())))
.and(memberProfile.birthDate.month().lt(endDate.getMonthValue())
.or(memberProfile.birthDate.month().eq(endDate.getMonthValue()).and(memberProfile.birthDate.dayOfMonth().loe(endDate.getDayOfMonth()))));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,20 @@
import lombok.Getter;

import java.time.LocalDate;
import java.time.MonthDay;

@Getter
public class MemberBirthdayDto {

private Long memberId;
private String name;
private Platform platform;
private LocalDate birthDate;
private final Long memberId;
private final String name;
private final Platform platform;
private final MonthDay birthDate;

public MemberBirthdayDto(Long memberId, String name, Platform platform, LocalDate birthDate) {
this.memberId = memberId;
this.name = name;
this.platform = platform;
this.birthDate = MonthDay.from(birthDate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.List;

@Service
Expand Down Expand Up @@ -51,7 +52,7 @@ public MemberProfile findOrSave(Long memberId) {
.orElseGet(() -> memberProfileRepository.save(MemberProfile.from(memberId)));
}

public List<MemberBirthdayDto> findByBirthDateBetween(LocalDate startDate, LocalDate endDate, Generation generation) {
public List<MemberBirthdayDto> findByBirthDateBetween(MonthDay startDate, MonthDay endDate, Generation generation) {
return memberProfileRepository.retrieveByBirthDateBetween(startDate, endDate, generation);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

@Service
Expand All @@ -45,16 +45,17 @@ public MemberBirthdaysResponse getUpcomingBirthdays(Long memberId, Integer days)
Member member = memberService.findMemberById(memberId);
Generation generation = generationService.getCurrentGeneration(member);

boolean isBirthdayToday = memberProfileService.isBirthdayToday(memberId);
Map<LocalDate, List<MemberBirthdayDto>> upcomingBirthdays = calculateUpcomingBirthdays(member, days, generation);
Set<Long> sentMemberIds = birthdayService.getSentBirthdayCardMemberIds(memberId, generation.getId());
var isBirthdayToday = memberProfileService.isBirthdayToday(memberId);
var upcomingBirthdays = calculateUpcomingBirthdays(member, days, generation);
var sentMemberIds = birthdayService.getSentBirthdayCardMemberIds(memberId, generation.getId());

return MemberBirthdaysResponse.of(isBirthdayToday, sentMemberIds, upcomingBirthdays);
}

private Map<LocalDate, List<MemberBirthdayDto>> calculateUpcomingBirthdays(Member member, Integer days, Generation generation) {
LocalDate now = LocalDate.now();
return memberProfileService.findByBirthDateBetween(now, now.plusDays(days), generation)
private Map<MonthDay, List<MemberBirthdayDto>> calculateUpcomingBirthdays(Member member, Integer days, Generation generation) {
MonthDay today = MonthDay.from(LocalDate.now());
MonthDay endDay = MonthDay.from(LocalDate.now().plusDays(days));
return memberProfileService.findByBirthDateBetween(today, endDay, generation)
.stream()
.filter(birthdayDto -> birthdayDto.getMemberId() != member.getId())
.collect(Collectors.groupingBy(MemberBirthdayDto::getBirthDate));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package kr.mashup.branding.ui.member.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.List;

@Getter
@RequiredArgsConstructor
public class MemberBirthdayResponse {

private final LocalDate date;
@JsonFormat(pattern = "MM-dd")
private final MonthDay date;
private final List<Member> members;

@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.time.MonthDay;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
Expand All @@ -21,17 +22,17 @@ public class MemberBirthdaysResponse {

private final List<MemberBirthdayResponse> upcomingBirthdays;

public static MemberBirthdaysResponse of(boolean isBirthdayToday, Set<Long> sentMemberIds, Map<LocalDate, List<MemberBirthdayDto>> upcomingBirthdays) {
public static MemberBirthdaysResponse of(boolean isBirthdayToday, Set<Long> sentMemberIds, Map<MonthDay, List<MemberBirthdayDto>> upcomingBirthdays) {
List<MemberBirthdayResponse> responses = createResponses(sentMemberIds, upcomingBirthdays);

LocalDate today = LocalDate.now();
MonthDay today = MonthDay.from(LocalDate.now());
MemberBirthdayResponse todayBirthday = extractTodayBirthday(today, responses);
List<MemberBirthdayResponse> sortedResponses = sortUpcomingBirthdays(today, responses);

return new MemberBirthdaysResponse(isBirthdayToday, todayBirthday, sortedResponses);
}

private static List<MemberBirthdayResponse> createResponses(Set<Long> sentMemberIds, Map<LocalDate, List<MemberBirthdayDto>> birthdayDtos) {
private static List<MemberBirthdayResponse> createResponses(Set<Long> sentMemberIds, Map<MonthDay, List<MemberBirthdayDto>> birthdayDtos) {
return birthdayDtos.entrySet().stream()
.map(entry -> new MemberBirthdayResponse(
entry.getKey(),
Expand All @@ -47,14 +48,14 @@ private static List<MemberBirthdayResponse> createResponses(Set<Long> sentMember
.collect(Collectors.toList());
}

private static MemberBirthdayResponse extractTodayBirthday(LocalDate today, List<MemberBirthdayResponse> responses) {
private static MemberBirthdayResponse extractTodayBirthday(MonthDay today, List<MemberBirthdayResponse> responses) {
return responses.stream()
.filter(response -> today.equals(response.getDate()))
.findFirst()
.orElse(null);
}

private static List<MemberBirthdayResponse> sortUpcomingBirthdays(LocalDate today, List<MemberBirthdayResponse> responses) {
private static List<MemberBirthdayResponse> sortUpcomingBirthdays(MonthDay today, List<MemberBirthdayResponse> responses) {
return responses.stream()
.filter(response -> !today.equals(response.getDate()))
.sorted(Comparator.comparing(MemberBirthdayResponse::getDate))
Expand Down

0 comments on commit f142f13

Please sign in to comment.