Skip to content

Commit

Permalink
Merge pull request #209 from Team-Smeme/refactor_#198_unan3
Browse files Browse the repository at this point in the history
[REFACTOR] 3차 리팩토링 진행
  • Loading branch information
unanchoi authored Feb 27, 2024
2 parents 316c512 + 469e0bb commit 0f41821
Show file tree
Hide file tree
Showing 40 changed files with 432 additions and 297 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ public class AuthController {
private final TokenService tokenService;

@PostMapping
public ResponseEntity<BaseResponse<?>> signIn(@RequestHeader("Authorization") String socialAccessToken,
public ResponseEntity<BaseResponse<?>> signIn(@RequestHeader("Authorization") final String socialAccessToken,
@RequestBody SignInRequest request) throws NoSuchAlgorithmException, InvalidKeySpecException {
val response = SignInResponse.of(authService.signIn(socialAccessToken, SignInServiceRequest.of(request)));
val response = SignInResponse.from(authService.signIn(socialAccessToken, SignInServiceRequest.of(request)));
return ApiResponseUtil.success(SUCCESS_SIGNIN, response);
}

@PostMapping("/token")
public ResponseEntity<BaseResponse<?>> reissueToken(Principal principal) {
val response = TokenResponse.of(tokenService.issueToken(Util.getMemberId(principal)));
val response = TokenResponse.from(tokenService.issueToken(Util.getMemberId(principal)));
return ApiResponseUtil.success(SUCCESS_ISSUE_TOKEN, response);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public record SignInResponse(
boolean hasPlan
) {

public static SignInResponse of(SignInServiceResponse response) {
public static SignInResponse from(SignInServiceResponse response) {
return SignInResponse.builder()
.accessToken(response.accessToken())
.refreshToken(response.refreshToken())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public record TokenResponse(
String refreshToken
) {

public static TokenResponse of(TokenServiceResponse response) {
public static TokenResponse from(TokenServiceResponse response) {
return TokenResponse.builder()
.accessToken(response.accessToken())
.refreshToken(response.refreshToken())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import lombok.val;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
Expand All @@ -20,7 +21,6 @@
import static com.smeem.api.auth.jwt.JwtValidationType.VALID_JWT;


@Slf4j
@Component
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends OncePerRequestFilter {
Expand All @@ -29,23 +29,22 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull FilterChain filterChain) throws IOException, ServletException {
try {
final String token = getJwtFromRequest(request);

if (StringUtils.hasText(token) && tokenValidator.validateToken(token) == VALID_JWT) {
Long userId = tokenValidator.getUserFromJwt(token);
UserAuthentication authentication = new UserAuthentication(userId, null, null);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (AuthException exception) {
log.error("error : ", exception);
final String token = getJwtFromRequest(request);
if (isValidToken(token)) {
val userId = tokenValidator.getUserFromJwt(token);
UserAuthentication authentication = new UserAuthentication(userId, null, null);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}

private boolean isValidToken(String token) {
return StringUtils.hasText(token) && tokenValidator.validateToken(token) == VALID_JWT;
}

private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
return (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) ? bearerToken.substring("Bearer ".length()) : null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

public enum JwtValidationType {
VALID_JWT,
INVALID_JWT_TOKEN,
INVALID_JWT,
INVALID_JWT_SIGNATURE,
EXPIRED_JWT_TOKEN,
UNSUPPORTED_JWT_TOKEN,
EXPIRED_JWT,
UNSUPPORTED_JWT,
EMPTY_JWT
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import java.util.Date;

@Slf4j
@Component
@RequiredArgsConstructor
public class TokenProvider {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
package com.smeem.api.auth.jwt;

import com.smeem.common.exception.AuthException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import static com.smeem.api.auth.jwt.JwtValidationType.INVALID_JWT_TOKEN;
import static com.smeem.api.auth.jwt.JwtValidationType.INVALID_JWT;
import static com.smeem.api.auth.jwt.JwtValidationType.VALID_JWT;

@Component
@RequiredArgsConstructor
@Slf4j
public class TokenValidator {
private final SecretKeyFactory secretKeyFactory;

public JwtValidationType validateToken(String token) {
try {
getBody(token);
return VALID_JWT;
} catch (AuthException ex) {
log.error(String.valueOf(INVALID_JWT_TOKEN));
return INVALID_JWT_TOKEN;
} catch (RuntimeException ex) {
return INVALID_JWT;
}
}

public Long getUserFromJwt(String token) {
public long getUserFromJwt(String token) {
Claims claims = getBody(token);
return Long.parseLong(claims.get("memberId").toString());
}
Expand Down
20 changes: 10 additions & 10 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 @@ -11,8 +11,8 @@
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.AppleSignInService;
import com.smeem.external.oauth.kakao.KakaoSignInService;
import com.smeem.external.oauth.apple.AppleService;
import com.smeem.external.oauth.kakao.KakaoService;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.stereotype.Service;
Expand All @@ -33,8 +33,8 @@ public class AuthService {
private final MemberRepository memberRepository;

private final TokenService tokenService;
private final AppleSignInService appleSignInService;
private final KakaoSignInService kakaoSignInService;
private final AppleService appleService;
private final KakaoService kakaoService;
private final MemberBadgeService memberBadgeService;
private final DiaryCommandService diaryService;
private final TrainingTimeService trainingTimeService;
Expand All @@ -58,13 +58,13 @@ public SignInServiceResponse signIn(final String socialAccessToken, final SignIn

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

@Transactional
public void withdraw(final long memberId) {
Member member = get(memberId);
val member = get(memberId);
diaryService.deleteAllByMember(member);
trainingTimeService.deleteAllByMember(member);
memberBadgeService.deleteAllByMember(member);
Expand All @@ -76,7 +76,7 @@ private Member get(final long memberId) {
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
}

private Member getMemberBySocialAndSocialId(SocialType socialType, String socialId) {
private Member getMemberBySocialAndSocialId(final SocialType socialType, final String socialId) {
return memberRepository.findBySocialAndSocialId(socialType, socialId)
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
}
Expand All @@ -85,10 +85,10 @@ private boolean isMemberBySocialAndSocialId(SocialType socialType, String social
return memberRepository.existsBySocialAndSocialId(socialType, socialId);
}

private String socialLogin(SocialType socialType, String socialAccessToken) throws NoSuchAlgorithmException, InvalidKeySpecException {
private String socialLogin(SocialType socialType, final String socialAccessToken) {
return switch (socialType.toString()) {
case "APPLE" -> appleSignInService.getAppleData(socialAccessToken);
case "KAKAO" -> kakaoSignInService.getKakaoData(socialAccessToken);
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 @@ -11,7 +11,7 @@ public record AcquiredBadgeResponse(
String imageUrl,
BadgeType type
) {
public static AcquiredBadgeResponse of(AcquiredBadgeServiceResponse response) {
public static AcquiredBadgeResponse from(AcquiredBadgeServiceResponse response) {
return AcquiredBadgeResponse.builder()
.name(response.name())
.imageUrl(response.imageUrl())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.smeem.api.badge.controller.dto.response;

import com.smeem.api.badge.service.dto.response.BadgeBaseServiceResponse;
import com.smeem.domain.badge.model.BadgeType;
import lombok.AccessLevel;
import lombok.Builder;

import static lombok.AccessLevel.PRIVATE;

@Builder(access = PRIVATE)
public record BadgeBaseResponse(
String name,
BadgeType type,
String imageUrl
) {

public static BadgeBaseResponse from(BadgeBaseServiceResponse response) {
return BadgeBaseResponse.builder()
.name(response.name())
.imageUrl(response.imageUrl())
.type(response.type())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,69 +1,20 @@
package com.smeem.api.badge.controller.dto.response;

import com.smeem.domain.badge.model.Badge;
import com.smeem.domain.badge.model.BadgeType;
import com.smeem.domain.member.model.MemberBadge;
import lombok.*;

import java.util.List;
import java.util.Map;

import static lombok.AccessLevel.PRIVATE;

@Builder(access = PRIVATE)
public record BadgeListResponse(
List<BadgeTypeResponse> badgeTypes
) {
public static BadgeListResponse of(Map<BadgeType, List<Badge>> badgeMap, List<MemberBadge> memberBadges) {
val badgeTypes = getBadgesType(badgeMap, memberBadges);
return new BadgeListResponse(badgeTypes);
}

private static List<BadgeTypeResponse> getBadgesType(Map<BadgeType, List<Badge>> badgeMap, List<MemberBadge> memberBadges) {
return badgeMap.keySet().stream()
.map(type -> BadgeTypeResponse.of(type, badgeMap.get(type), memberBadges))
.toList();
}

@Builder
public record BadgeTypeResponse(
BadgeType badgeType,
String badgeTypeName,
List<BadgeResponseDTO> badges
) {
public static BadgeTypeResponse of(BadgeType type, List<Badge> badges, List<MemberBadge> memberBadges) {
return BadgeTypeResponse.builder()
.badgeType(type)
.badgeTypeName(type.getDescription())
.badges(getBadges(badges, memberBadges))
.build();
}

private static List<BadgeResponseDTO> getBadges(List<Badge> badges, List<MemberBadge> memberBadges) {
return badges.stream()
.map(badge -> BadgeResponseDTO.of(badge, memberBadges))
.toList();
}
}

@Builder
public record BadgeResponseDTO(
String name,
BadgeType type,
String imageUrl
public static BadgeListResponse from(
List<BadgeTypeResponse> response
) {

private static BadgeResponseDTO of(Badge badge, List<MemberBadge> memberBadges) {
return BadgeResponseDTO.builder()
.name(badge.getName())
.type(badge.getType())
.imageUrl(getImageUrl(badge, memberBadges))
.build();
}

private static String getImageUrl(Badge badge, List<MemberBadge> memberBadges) {
return hasBadge(badge, memberBadges) ? badge.getBadgeImage().getImageUrl() : badge.getBadgeImage().getGrayImageUrl();
}

private static boolean hasBadge(Badge badge, List<MemberBadge> memberBadges) {
return memberBadges.stream().anyMatch(memberBadge -> memberBadge.getBadge().equals(badge));
}
return BadgeListResponse.builder()
.badgeTypes(response)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public record BadgeResponse(
String imageUrl
) {

public static BadgeResponse of(BadgeServiceResponse response) {
public static BadgeResponse from(BadgeServiceResponse response) {
return new BadgeResponse(
response.id(),
response.name(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.smeem.api.badge.controller.dto.response;

import com.smeem.api.badge.service.dto.response.BadgeBaseServiceResponse;
import com.smeem.api.badge.service.dto.response.BadgeTypeServiceResponse;
import com.smeem.domain.badge.model.Badge;
import com.smeem.domain.badge.model.BadgeType;
import com.smeem.domain.member.model.MemberBadge;
import lombok.Builder;

import java.util.List;

import static lombok.AccessLevel.PRIVATE;

@Builder(access = PRIVATE)
public record BadgeTypeResponse(
BadgeType badgeType,
String badgeTypeName,
List<BadgeBaseResponse> badges
) {
public static BadgeTypeResponse from(BadgeTypeServiceResponse response) {
return BadgeTypeResponse.builder()
.badgeType(response.badgeType())
.badgeTypeName(response.badgeTypeName())
.badges(response.badges()
.stream()
.map(BadgeBaseResponse::from).toList())
.build();
}
}
Loading

0 comments on commit 0f41821

Please sign in to comment.