Skip to content

Commit

Permalink
Merge branch 'develop' of https://github.com/mash-up-kr/mashup-server
Browse files Browse the repository at this point in the history
…into develop
  • Loading branch information
kyung-hwan-kim committed Aug 29, 2024
2 parents 5a167f3 + 5442b2c commit 0016dfd
Show file tree
Hide file tree
Showing 22 changed files with 230 additions and 113 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package kr.mashup.branding.aop.cipher;

import kr.mashup.branding.domain.ResultCode;
import kr.mashup.branding.domain.exception.BadRequestException;
import kr.mashup.branding.util.CipherUtil;
import kr.mashup.branding.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -29,32 +29,31 @@ public class ApiCipherAspect {
private String cipherTime;

@Before(value = "@annotation(checkApiCipherTime)")
public void checkApiCipherTime(CheckApiCipherTime checkApiCipherTime){
public void checkApiCipherTime(CheckApiCipherTime checkApiCipherTime) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String encryptedKey = request.getHeader("cipher");

if(checkApiCipherTime.alwaysRequired()){
if(!StringUtils.hasText(encryptedKey)){
throw new BadRequestException();
if (checkApiCipherTime.alwaysRequired()) {
if (!StringUtils.hasText(encryptedKey)) {
throw new BadRequestException(ResultCode.BAD_REQUEST);
}
checkClientTimeDifference(encryptedKey);
}else{
if(StringUtils.hasText(encryptedKey)){
} else {
if (StringUtils.hasText(encryptedKey)) {
checkClientTimeDifference(encryptedKey);
}
}
}

private void checkClientTimeDifference(String auth){
private void checkClientTimeDifference(String auth) {

final String clientEpochTime = CipherUtil.decryptAES128(auth, cipherKey);
final LocalDateTime clientTime = DateUtil.fromEpochString(clientEpochTime);
final LocalDateTime serverTime = LocalDateTime.now();
final Long timeDifference = ChronoUnit.SECONDS.between(clientTime, serverTime);
log.info(timeDifference.toString());
if(timeDifference > Long.parseLong(cipherTime)) {
throw new BadRequestException();
if (timeDifference > Long.parseLong(cipherTime)) {
throw new BadRequestException(ResultCode.BAD_REQUEST, String.format("클라이언트 시간 차이가 허용된 범위를 초과했습니다. (%d초)", timeDifference));
}
}

}
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 @@ -7,6 +7,7 @@
import org.springframework.data.domain.Pageable;

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

import static kr.mashup.branding.repository.member.MemberRepositoryCustomImpl.MemberScoreQueryResult;
Expand All @@ -23,5 +24,5 @@ public interface MemberRepositoryCustom {

List<Member> findAllActiveByGeneration(Generation generation);

List<Member> retrieveByBirthDate(Generation generation, LocalDate birthDate);
List<Member> retrieveByBirthDate(Generation generation, MonthDay monthDay);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.springframework.data.domain.Sort;

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

Expand Down Expand Up @@ -148,12 +149,15 @@ public List<Member> findAllActiveByGeneration(Generation generation) {
}

@Override
public List<Member> retrieveByBirthDate(Generation generation, LocalDate birthDate) {
public List<Member> retrieveByBirthDate(Generation generation, MonthDay monthDay) {
return queryFactory
.selectFrom(member)
.innerJoin(memberProfile).on(memberProfile.memberId.eq(member.id))
.innerJoin(memberGeneration).on(memberGeneration.generation.eq(generation))
.where(memberProfile.birthDate.eq(birthDate))
.innerJoin(memberGeneration).on(memberGeneration.member.eq(member))
.where(
memberProfile.birthDate.month().eq(monthDay.getMonthValue())
.and(memberProfile.birthDate.dayOfMonth().eq(monthDay.getDayOfMonth()))
)
.fetch();
}
}
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,13 +52,14 @@ 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);
}

public boolean isBirthdayToday(long memberId) {
return memberProfileRepository.findByMemberId(memberId)
.filter(memberProfile -> LocalDate.now().equals(memberProfile.getBirthDate()))
.filter(memberProfile -> memberProfile.getBirthDate() != null)
.filter(memberProfile -> MonthDay.now().equals(MonthDay.from(memberProfile.getBirthDate())))
.isPresent();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -349,20 +350,27 @@ public MemberGeneration getCurrentMemberGeneration(Member member) {

@Transactional(readOnly = true)
public List<Member> getAllByBirthdayRecipient(Generation generation) {
return memberRepository.retrieveByBirthDate(generation, LocalDate.now());
return memberRepository.retrieveByBirthDate(generation, MonthDay.now());
}

@Transactional(readOnly = true)
public List<Member> getAllByBirthdaySender(Generation generation) {

// 생일자가 없는 경우는 푸시 알림을 보내지 않음
List<Member> recipients = memberRepository.retrieveByBirthDate(generation, MonthDay.now());
if (recipients.isEmpty()) {
return List.of();
}

List<Member> senders = memberRepository.findAllActiveByGeneration(generation);
List<Member> recipients = memberRepository.retrieveByBirthDate(generation, LocalDate.now());
senders.removeAll(recipients);
// 오늘 생일인 멤버가 한 명뿐인 경우, 그 멤버를 발신자 목록에서 제외
if (recipients.size() == 1) {
senders.removeAll(recipients);
}

return senders;
}


@Transactional
public void updatePushCheckTime(final Member member) {
member.updatePushCheckTime(LocalDateTime.now());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public Boolean isEnabledMemberPopup(Member member, PopupType popupType) {
return memberPopup.get().getIsEnabled() && memberPopup.get().getLastViewedAt().toLocalDate().isBefore(LocalDate.now());
}

public void save(Member member, PopupType popupType) {
memberPopupRepository.save(MemberPopup.of(true, LocalDateTime.now().minusDays(1), member, popupType));
public void deleteMemberPopup(Member member) {
memberPopupRepository.deleteByMember(member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package kr.mashup.branding.config.filter;

import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import java.io.IOException;

import static kr.mashup.branding.config.web.MemberAuthArgumentResolver.MDC_MEMBER_ID;

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MDCLoggingFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
} finally {
MDC.remove(MDC_MEMBER_ID);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import kr.mashup.branding.security.JwtService;
import kr.mashup.branding.security.MemberAuth;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
Expand All @@ -15,9 +17,11 @@

@Component
@RequiredArgsConstructor
@Slf4j
public class MemberAuthArgumentResolver implements HandlerMethodArgumentResolver {

private final JwtService jwtService;
public static final String MDC_MEMBER_ID = "memberId";

@Override
public boolean supportsParameter(MethodParameter parameter) {
Expand All @@ -38,6 +42,8 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m
if (memberId == null || memberGenerationId == null) {
throw new UnauthorizedException();
}

MDC.put(MDC_MEMBER_ID, String.valueOf(memberId));
return MemberAuth.of(memberId, memberGenerationId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public BirthdayCardsResponse getMy(Long memberId) {
birthdayCard.getSenderMemberName(),
birthdayCard.getSenderMemberPlatform().getName(),
birthdayCard.getMessage(),
birthdayCard.getMessage()
birthdayCard.getImageUrl()
))
.collect(Collectors.toList());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@
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.Objects;
import java.util.stream.Collectors;

@Service
Expand All @@ -45,18 +46,19 @@ 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.now();
MonthDay endDay = MonthDay.from(LocalDate.now().plusDays(days));
return memberProfileService.findByBirthDateBetween(today, endDay, generation)
.stream()
.filter(birthdayDto -> birthdayDto.getMemberId() != member.getId())
.filter(birthdayDto -> !Objects.equals(birthdayDto.getMemberId(), member.getId()))
.collect(Collectors.groupingBy(MemberBirthdayDto::getBirthDate));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public void updateFirstMember() {
Member firstScoredMember = firstScore.getMemberGeneration().getMember();
DanggnRankingReward danggnRankingReward = DanggnRankingReward.from(firstScoredMember.getId(), currentGeneration.getId());
danggnRankingRewardService.save(danggnRankingReward);
memberPopupService.save(firstScoredMember, PopupType.DANGGN_REWARD);
memberPopupService.findOrSaveMemberPopupByMemberAndType(firstScoredMember, PopupType.DANGGN_REWARD);
}
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

@Service
@RequiredArgsConstructor
public class MashongFacadeService {
Expand Down Expand Up @@ -149,4 +152,12 @@ public PlatformMashongStatusResponse readCurrentStatus(Long memberGenerationId)

return PlatformMashongStatusResponse.of(platformMashong, mashongPopcorn);
}

@Transactional(readOnly = true)
public Long withMashongDaysCount(Long memberGenerationId) {
LocalDate now = LocalDate.now();
MemberGeneration memberGeneration = memberService.findByMemberGenerationId(memberGenerationId);
LocalDate generationStartedAt = memberGeneration.getGeneration().getStartedAt();
return ChronoUnit.DAYS.between(generationStartedAt, now);
}
}
Loading

0 comments on commit 0016dfd

Please sign in to comment.