Skip to content

Commit

Permalink
[REFACTOR] Service에서 Adapter 계층을 의존하도록 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
unanchoi committed Mar 23, 2024
1 parent 1b6c2a2 commit 224a83c
Show file tree
Hide file tree
Showing 16 changed files with 236 additions and 70 deletions.
35 changes: 15 additions & 20 deletions smeem-api/src/main/java/com/smeem/api/auth/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import com.smeem.api.diary.service.DiaryCommandService;
import com.smeem.api.member.service.MemberBadgeService;
import com.smeem.api.member.service.TrainingTimeService;
import com.smeem.common.exception.MemberException;
import com.smeem.common.exception.TokenException;
import com.smeem.domain.member.adapter.member.MemberDeleter;
import com.smeem.domain.member.adapter.member.MemberFinder;
import com.smeem.domain.member.adapter.member.MemberSaver;
import com.smeem.domain.member.model.Member;
import com.smeem.domain.member.model.SocialType;
import com.smeem.domain.member.repository.MemberRepository;
import com.smeem.external.oauth.apple.AppleService;
import com.smeem.external.oauth.kakao.KakaoService;
import lombok.RequiredArgsConstructor;
Expand All @@ -22,16 +23,16 @@
import java.security.spec.InvalidKeySpecException;

import static com.smeem.common.code.failure.AuthFailureCode.INVALID_TOKEN;
import static com.smeem.common.code.failure.MemberFailureCode.INVALID_MEMBER;
import static java.util.Objects.nonNull;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AuthService {

private final MemberRepository memberRepository;

private final MemberFinder memberFinder;
private final MemberSaver memberSaver;
private final MemberDeleter memberDeleter;
private final TokenService tokenService;
private final AppleService appleService;
private final KakaoService kakaoService;
Expand All @@ -46,7 +47,7 @@ public SignInServiceResponse signIn(final String socialAccessToken, final SignIn
val existMember = isMemberBySocialAndSocialId(socialType, socialId);
if (!existMember) {
val initialMember = Member.createInitialMember(socialType, socialId, request.fcmToken());
memberRepository.save(initialMember);
memberSaver.save(initialMember);
}
val signedMember = getMemberBySocialAndSocialId(socialType, socialId);
val isRegistered = nonNull(signedMember.getUsername());
Expand All @@ -58,37 +59,31 @@ public SignInServiceResponse signIn(final String socialAccessToken, final SignIn

@Transactional
public void signOut(final long memberId) {
val member = get(memberId);
val member = memberFinder.findById(memberId);
member.updateRefreshToken(null);
}

@Transactional
public void withdraw(final long memberId) {
val member = get(memberId);
val member = memberFinder.findById(memberId);
diaryService.deleteAllByMember(member);
trainingTimeService.deleteAllByMember(member);
memberBadgeService.deleteAllByMember(member);
memberRepository.deleteById(memberId);
}

private Member get(final long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
memberDeleter.deleteById(memberId);
}

private Member getMemberBySocialAndSocialId(final SocialType socialType, final String socialId) {
return memberRepository.findBySocialAndSocialId(socialType, socialId)
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
return memberFinder.findBySocialAndSocialId(socialType, socialId);
}

private boolean isMemberBySocialAndSocialId(SocialType socialType, String socialId) {
return memberRepository.existsBySocialAndSocialId(socialType, socialId);
return memberFinder.existsBySocialAndSocialId(socialType, socialId);
}

private String socialLogin(SocialType socialType, final String socialAccessToken) {
return switch (socialType.toString()) {
case "APPLE" -> appleService.getAppleData(socialAccessToken);
case "KAKAO" -> kakaoService.getKakaoData(socialAccessToken);
return switch (socialType) {
case APPLE -> appleService.getAppleData(socialAccessToken);
case KAKAO -> kakaoService.getKakaoData(socialAccessToken);
default -> throw new TokenException(INVALID_TOKEN);
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.smeem.api.auth.jwt.SmeemToken;
import com.smeem.api.auth.service.dto.response.TokenServiceResponse;
import com.smeem.api.member.service.MemberService;
import com.smeem.domain.member.adapter.member.MemberFinder;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.security.core.Authentication;
Expand All @@ -20,13 +21,13 @@ public class TokenService {
private static final Long ACCESS_TOKEN_EXPIRATION_TIME = 60 * 60 * 1000 * 2 * 12 * 1000000L; // 2시간
private static final Long REFRESH_TOKEN_EXPIRATION_TIME = 60 * 60 * 1000 * 24 * 14L; // 2주

private final MemberService memberService;
private final MemberFinder memberFinder;
private final TokenProvider tokenProvider;

@Transactional
public TokenServiceResponse issueToken(final long memberId) {
val token = generateSmeemToken(UserAuthentication.create(memberId));
val member = memberService.get(memberId);
val member = memberFinder.findById(memberId);
member.updateRefreshToken(token.getRefreshToken());
return TokenServiceResponse.of(token);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import com.smeem.domain.badge.adapter.BadgeFinder;
import com.smeem.domain.badge.model.Badge;
import com.smeem.domain.badge.model.BadgeType;
import com.smeem.domain.member.adapter.MemberBadgeFinder;
import com.smeem.domain.member.adapter.MemberBadgeSaver;
import com.smeem.domain.member.adapter.memberbadge.MemberBadgeFinder;
import com.smeem.domain.member.adapter.memberbadge.MemberBadgeSaver;
import com.smeem.domain.member.model.Member;
import com.smeem.domain.member.model.MemberBadge;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
package com.smeem.api.member.service;


import com.smeem.common.exception.BadgeException;
import com.smeem.domain.badge.model.Badge;
import com.smeem.domain.member.adapter.memberbadge.MemberBadgeDeleter;
import com.smeem.domain.member.adapter.memberbadge.MemberBadgeFinder;
import com.smeem.domain.member.adapter.memberbadge.MemberBadgeSaver;
import com.smeem.domain.member.model.Member;
import com.smeem.domain.member.model.MemberBadge;
import com.smeem.domain.member.repository.MemberBadgeRepository;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.smeem.common.code.failure.BadgeFailureCode.EMPTY_BADGE;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberBadgeService {

private final MemberBadgeRepository memberBadgeRepository;
private final MemberBadgeFinder memberBadgeFinder;
private final MemberBadgeSaver memberBadgeSaver;
private final MemberBadgeDeleter memberBadgeDeleter;

@Transactional
public void deleteAllByMember(final Member member) {
memberBadgeRepository.deleteAllInBatch(member.getBadges());
memberBadgeDeleter.deleteAllInBatch(member.getBadges());
}

@Transactional
Expand All @@ -31,11 +32,10 @@ public void save(Member member, Badge badge) {
.member(member)
.badge(badge)
.build();
memberBadgeRepository.save(memberBadge);
memberBadgeSaver.save(memberBadge);
}

public Badge getBadgeByMemberId(final long memberId) {
return memberBadgeRepository.findFirstByMemberIdOrderByCreatedAtDesc(memberId).orElseThrow(
() -> new BadgeException(EMPTY_BADGE)).getBadge();
return memberBadgeFinder.findFirstByMemberIdOrderByCreatedAtDesc(memberId).getBadge();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.smeem.api.member.service;


import com.smeem.api.badge.service.BadgeService;
import com.smeem.api.badge.service.dto.response.BadgeServiceResponse;
import com.smeem.api.goal.service.GoalService;
import com.smeem.api.goal.service.dto.request.GoalGetServiceRequest;
Expand All @@ -16,9 +15,11 @@
import com.smeem.common.config.ValueConfig;
import com.smeem.common.exception.MemberException;
import com.smeem.common.exception.TrainingTimeException;
import com.smeem.domain.badge.adapter.BadgeFinder;
import com.smeem.domain.badge.model.Badge;
import com.smeem.domain.member.adapter.member.MemberFinder;
import com.smeem.domain.member.adapter.member.MemberUpdater;
import com.smeem.domain.member.model.Member;
import com.smeem.domain.member.repository.MemberRepository;
import com.smeem.domain.training.model.DayType;
import com.smeem.domain.training.model.TrainingTime;
import com.smeem.external.discord.DiscordAlarmSender;
Expand All @@ -33,7 +34,6 @@
import java.util.stream.Collectors;

import static com.smeem.common.code.failure.MemberFailureCode.DUPLICATE_USERNAME;
import static com.smeem.common.code.failure.MemberFailureCode.EMPTY_MEMBER;
import static com.smeem.common.code.failure.TrainingTimeFailureCode.NOT_SET_TRAINING_TIME;
import static com.smeem.common.config.ValueConfig.SIGN_IN_MESSAGE;
import static com.smeem.external.discord.DiscordAlarmCase.INFO;
Expand All @@ -45,20 +45,21 @@
@RequiredArgsConstructor
public class MemberService {

private final MemberRepository memberRepository;

private final TrainingTimeService trainingTimeService;
private final GoalService goalService;
private final BadgeService badgeService;
private final MemberBadgeService memberBadgeService;
private final DiscordAlarmSender discordAlarmSender;

private final BadgeFinder badgeFinder;
private final MemberFinder memberFinder;
private final MemberUpdater memberUpdater;

private final ValueConfig valueConfig;

@Transactional
public MemberUpdateServiceResponse updateUserProfile(final long memberId, final MemberServiceUpdateUserProfileRequest request) {
checkMemberDuplicate(request.username());
val member = get(memberId);
val member = memberFinder.findById(memberId);
updateTermAccepted(member, request);

ArrayList<Badge> badges = new ArrayList<>();
Expand All @@ -71,7 +72,7 @@ public MemberUpdateServiceResponse updateUserProfile(final long memberId, final
}

public MemberGetServiceResponse getMemberProfile(final long memberId) {
val member = get(memberId);
val member = memberFinder.findById(memberId);
val goal = goalService.getByType(GoalGetServiceRequest.of(member.getGoal()));
val trainingTimes = trainingTimeService.getAllByMember(member);

Expand All @@ -91,28 +92,23 @@ public MemberGetServiceResponse getMemberProfile(final long memberId) {

@Transactional
public void updateLearningPlan(final long memberId, final MemberUpdatePlanServiceRequest request) {
val member = get(memberId);
val member = memberFinder.findById(memberId);
member.updateGoal(request.goalType());
member.updateHasAlarm(request.hasAlarm());
updateTrainingTime(member, request.trainingTime());
}

@Transactional
public void updateHasAlarm(final long memberId, final MemberPushUpdateServiceRequest request) {
val member = get(memberId);
val member = memberFinder.findById(memberId);
member.updateHasAlarm(request.hasAlarm());
}

public MemberNameServiceResponse checkDuplicatedName(final String name) {
val isExist = memberRepository.existsByUsername(name);
val isExist = memberFinder.existsByUsername(name);
return MemberNameServiceResponse.of(isExist);
}

public Member get(final long id) {
return memberRepository.findById(id)
.orElseThrow(() -> new MemberException(EMPTY_MEMBER));
}

private void updateTrainingTime(Member member, TrainingTimeServiceRequest request) {
if (nonNull(request) && StringUtils.hasText(request.day())) {
trainingTimeService.deleteAll(member);
Expand Down Expand Up @@ -145,13 +141,13 @@ private String getDays(List<TrainingTime> trainingTimes) {
}

private void checkMemberDuplicate(final String username) {
if (memberRepository.existsByUsername(username)) {
if (memberFinder.existsByUsername(username)) {
throw new MemberException(DUPLICATE_USERNAME);
}
}

private void addWelcomeBadge(final Member member, List<Badge> badges) {
Badge welcomeBadge = badgeService.get(valueConfig.getWELCOME_BADGE_ID());
Badge welcomeBadge = badgeFinder.findById(valueConfig.getWELCOME_BADGE_ID());
memberBadgeService.save(member, welcomeBadge);
badges.add(welcomeBadge);
}
Expand All @@ -170,7 +166,7 @@ private boolean isNewMember(Member member) {

private void updateTermAccepted(final Member member, final MemberServiceUpdateUserProfileRequest request) {
if (nonNull(request.termAccepted())) {
member.updateTermAccepted(request.termAccepted());
memberUpdater.updateTermAccepted(member, request.termAccepted());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.smeem.api.member.service;


import com.smeem.domain.member.adapter.trainingtime.TrainingTimeDeleter;
import com.smeem.domain.member.adapter.trainingtime.TrainingTimeFinder;
import com.smeem.domain.member.adapter.trainingtime.TrainingTimeSaver;
import com.smeem.domain.member.model.Member;
import com.smeem.domain.training.model.TrainingTime;
import com.smeem.domain.training.repository.TrainingTimeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand All @@ -14,26 +16,24 @@
@RequiredArgsConstructor
public class TrainingTimeService {

private final TrainingTimeRepository trainingTimeRepository;
private final TrainingTimeFinder trainingTimeFinder;
private final TrainingTimeDeleter trainingTimeDeleter;
private final TrainingTimeSaver trainingTimeSaver;

public void deleteAllByMember(Member member) {
trainingTimeRepository.deleteAllByMember(member);
}

protected TrainingTime get(Long id) {
return trainingTimeRepository.findById(id).orElse(null);
trainingTimeDeleter.deleteAllByMember(member);
}

protected void deleteAll(Member member) {
trainingTimeRepository.deleteAll(member.getTrainingTimes());
trainingTimeDeleter.deleteAllInBatch(member.getTrainingTimes());
}

protected void save(TrainingTime trainingTime) {
trainingTimeRepository.save(trainingTime);
trainingTimeSaver.save(trainingTime);
}

protected List<TrainingTime> getAllByMember(Member member) {
return trainingTimeRepository.findAllByMember(member);
return trainingTimeFinder.findAllByMember(member);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.smeem.domain.member.adapter.member;

import com.smeem.domain.member.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class MemberDeleter {

private final MemberRepository memberRepository;

public void deleteById(Long id) {
memberRepository.deleteById(id);
}
}
Loading

0 comments on commit 224a83c

Please sign in to comment.