Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin' into feat/#309
Browse files Browse the repository at this point in the history
  • Loading branch information
cruelladevil committed Aug 17, 2023
2 parents c455857 + c44a1a7 commit 6bf1c42
Show file tree
Hide file tree
Showing 71 changed files with 1,617 additions and 764 deletions.
22 changes: 11 additions & 11 deletions backend/src/main/java/shook/shook/auth/application/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@
import org.springframework.stereotype.Service;
import shook.shook.auth.application.dto.GoogleAccessTokenResponse;
import shook.shook.auth.application.dto.GoogleMemberInfoResponse;
import shook.shook.auth.application.dto.TokenInfo;
import shook.shook.auth.application.dto.TokenReissueResponse;
import shook.shook.auth.application.dto.ReissueAccessTokenResponse;
import shook.shook.auth.application.dto.TokenPair;
import shook.shook.member.application.MemberService;
import shook.shook.member.domain.Email;
import shook.shook.member.domain.Member;
import shook.shook.member.domain.Nickname;

Expand All @@ -20,30 +19,31 @@ public class AuthService {
private final GoogleInfoProvider googleInfoProvider;
private final TokenProvider tokenProvider;

public TokenInfo login(final String accessCode) {
public TokenPair login(final String authorizationCode) {
final GoogleAccessTokenResponse accessTokenResponse =
googleInfoProvider.getAccessToken(accessCode);
googleInfoProvider.getAccessToken(authorizationCode);
final GoogleMemberInfoResponse memberInfo = googleInfoProvider
.getMemberInfo(accessTokenResponse.getAccessToken());

final String userEmail = memberInfo.getEmail();
final Member member = memberService.findByEmail(new Email(userEmail))

final Member member = memberService.findByEmail(userEmail)
.orElseGet(() -> memberService.register(userEmail));

final long memberId = member.getId();
final Long memberId = member.getId();
final String nickname = member.getNickname();
final String accessToken = tokenProvider.createAccessToken(memberId, nickname);
final String refreshToken = tokenProvider.createRefreshToken(memberId, nickname);
return new TokenInfo(accessToken, refreshToken);
return new TokenPair(accessToken, refreshToken);
}

public TokenReissueResponse reissueToken(final String refreshToken) {
public ReissueAccessTokenResponse reissueAccessTokenByRefreshToken(final String refreshToken) {
final Claims claims = tokenProvider.parseClaims(refreshToken);
final Long memberId = claims.get("memberId", Long.class);
final String nickname = claims.get("nickname", String.class);
memberService.findByIdAndNickname(memberId, new Nickname(nickname));
memberService.findByIdAndNicknameThrowIfNotExist(memberId, new Nickname(nickname));

final String accessToken = tokenProvider.createAccessToken(memberId, nickname);
return new TokenReissueResponse(accessToken);
return new ReissueAccessTokenResponse(accessToken);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package shook.shook.auth.application;

import java.util.HashMap;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import shook.shook.auth.application.dto.GoogleAccessTokenRequest;
import shook.shook.auth.application.dto.GoogleAccessTokenResponse;
import shook.shook.auth.application.dto.GoogleMemberInfoResponse;
import shook.shook.auth.exception.OAuthException;
Expand Down Expand Up @@ -46,18 +47,14 @@ public GoogleMemberInfoResponse getMemberInfo(final String accessToken) {
headers.set(AUTHORIZATION_HEADER, TOKEN_PREFIX + accessToken);
final HttpEntity<Object> request = new HttpEntity<>(headers);

final GoogleMemberInfoResponse responseEntity = restTemplate.exchange(
final ResponseEntity<GoogleMemberInfoResponse> response = restTemplate.exchange(
GOOGLE_MEMBER_INFO_URL,
HttpMethod.GET,
request,
GoogleMemberInfoResponse.class
).getBody();
);

if (!Objects.requireNonNull(responseEntity).isVerifiedEmail()) {
throw new OAuthException.InvalidEmailException();
}

return responseEntity;
return response.getBody();
} catch (HttpClientErrorException e) {
throw new OAuthException.InvalidAccessTokenException();
} catch (HttpServerErrorException e) {
Expand All @@ -67,19 +64,19 @@ public GoogleMemberInfoResponse getMemberInfo(final String accessToken) {

public GoogleAccessTokenResponse getAccessToken(final String authorizationCode) {
try {
final GoogleAccessTokenRequest googleAccessTokenRequest = new GoogleAccessTokenRequest(
authorizationCode,
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
LOGIN_REDIRECT_URL,
GRANT_TYPE);
final HttpEntity<GoogleAccessTokenRequest> request = new HttpEntity<>(
googleAccessTokenRequest);

return Objects.requireNonNull(restTemplate.postForEntity(
final HashMap<String, String> params = new HashMap<>();
params.put("code", authorizationCode);
params.put("client_id", GOOGLE_CLIENT_ID);
params.put("client_secret", GOOGLE_CLIENT_SECRET);
params.put("redirect_uri", LOGIN_REDIRECT_URL);
params.put("grant_type", GRANT_TYPE);

final ResponseEntity<GoogleAccessTokenResponse> response = restTemplate.postForEntity(
GOOGLE_ACCESS_TOKEN_URL,
request,
GoogleAccessTokenResponse.class).getBody());
params,
GoogleAccessTokenResponse.class);

return Objects.requireNonNull(response.getBody());

} catch (HttpClientErrorException e) {
throw new OAuthException.InvalidAuthorizationCodeException();
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
@AllArgsConstructor
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
public class TokenReissueResponse {
public class ReissueAccessTokenResponse {

private String accessToken;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

@AllArgsConstructor
@Getter
public class TokenInfo {
public class TokenPair {

private String accessToken;
private String refreshToken;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,28 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import shook.shook.auth.application.AuthService;
import shook.shook.auth.application.dto.TokenReissueResponse;
import shook.shook.auth.application.dto.ReissueAccessTokenResponse;
import shook.shook.auth.exception.AuthorizationException;

@RequiredArgsConstructor
@RestController
public class TokenController {
public class AccessTokenReissueController {

private static final String EMPTY_REFRESH_TOKEN = "none";
private static final String REFRESH_TOKEN_KEY = "refreshToken";

private final AuthService authService;

@GetMapping("/reissue")
public ResponseEntity<TokenReissueResponse> reissue(
@CookieValue(value = "refreshToken", defaultValue = "none") final String refreshToken
public ResponseEntity<ReissueAccessTokenResponse> reissueAccessToken(
@CookieValue(value = REFRESH_TOKEN_KEY, defaultValue = EMPTY_REFRESH_TOKEN) final String refreshToken
) {
if (refreshToken.equals("none")) {
if (refreshToken.equals(EMPTY_REFRESH_TOKEN)) {
throw new AuthorizationException.RefreshTokenNotFoundException();
}
final TokenReissueResponse response = authService.reissueToken(refreshToken);
final ReissueAccessTokenResponse response =
authService.reissueAccessTokenByRefreshToken(refreshToken);

return ResponseEntity.ok(response);
}
}
11 changes: 5 additions & 6 deletions backend/src/main/java/shook/shook/auth/ui/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import shook.shook.auth.application.AuthService;
import shook.shook.auth.application.dto.TokenInfo;
import shook.shook.auth.application.dto.TokenPair;
import shook.shook.auth.ui.dto.LoginResponse;

@RequiredArgsConstructor
Expand All @@ -20,14 +20,13 @@ public class AuthController {

@GetMapping("/login/google")
public ResponseEntity<LoginResponse> googleLogin(
@RequestParam("code") final String accessCode,
@RequestParam("code") final String authorizationCode,
final HttpServletResponse response
) {
final TokenInfo tokenInfo = authService.login(accessCode);
final Cookie cookie = cookieProvider.createRefreshTokenCookie(
tokenInfo.getRefreshToken());
final TokenPair tokenPair = authService.login(authorizationCode);
final Cookie cookie = cookieProvider.createRefreshTokenCookie(tokenPair.getRefreshToken());
response.addCookie(cookie);
final LoginResponse loginResponse = new LoginResponse(tokenInfo.getAccessToken());
final LoginResponse loginResponse = new LoginResponse(tokenPair.getAccessToken());
return ResponseEntity.ok(loginResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public CookieProvider(@Value("${cookie.valid-time}") final int cookieAge) {
public Cookie createRefreshTokenCookie(final String refreshToken) {
final Cookie cookie = new Cookie("refreshToken", refreshToken);
cookie.setMaxAge(cookieAge);
cookie.setPath("/reissue");
cookie.setPath("/api/reissue");
cookie.setHttpOnly(true);
cookie.setSecure(true);
return cookie;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public boolean preHandle(
final Claims claims = tokenProvider.parseClaims(token);
final Long memberId = claims.get("memberId", Long.class);
final String nickname = claims.get("nickname", String.class);
memberService.findByIdAndNickname(memberId, new Nickname(nickname));
memberService.findByIdAndNicknameThrowIfNotExist(memberId, new Nickname(nickname));

authContext.setAuthenticatedMember(memberId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,26 +22,20 @@ public class MemberService {

@Transactional
public Member register(final String email) {
findByEmail(new Email(email))
.ifPresent(member -> {
throw new MemberException.ExistMemberException();
});
findByEmail(email).ifPresent(member -> {
throw new MemberException.ExistMemberException();
});
final String nickname = email.split(EMAIL_SPILT_DELIMITER)[NICKNAME_INDEX];
final Member newMember = new Member(email, nickname);
return memberRepository.save(newMember);
}

public Optional<Member> findByEmail(final Email email) {
return memberRepository.findByEmail(email);
public Optional<Member> findByEmail(final String email) {
return memberRepository.findByEmail(new Email(email));
}

public Member findByIdAndNickname(final Long id, final Nickname nickname) {
public Member findByIdAndNicknameThrowIfNotExist(final Long id, final Nickname nickname) {
return memberRepository.findByIdAndNickname(id, nickname)
.orElseThrow(MemberException.MemberNotExistException::new);
}

public Member findById(final Long id) {
return memberRepository.findById(id)
.orElseThrow(MemberException.MemberNotExistException::new);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,4 @@ public ResponseEntity<ErrorResponse> handleMemberException(final MemberException

return ResponseEntity.badRequest().body(ErrorResponse.from(e));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,10 @@ private List<SongTotalLikeCountDto> sortByHighestLikeCountAndId(
) {
return songWithLikeCounts.stream()
.sorted(
Comparator.comparing(SongTotalLikeCountDto::getTotalLikeCount,
Comparator.reverseOrder())
.thenComparing(dto -> dto.getSong().getId(), Comparator.reverseOrder())
Comparator.comparing(
SongTotalLikeCountDto::getTotalLikeCount,
Comparator.reverseOrder()
).thenComparing(dto -> dto.getSong().getId(), Comparator.reverseOrder())
).toList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.transaction.annotation.Transactional;
import shook.shook.member.domain.Member;
import shook.shook.member.domain.repository.MemberRepository;
import shook.shook.member.exception.MemberException.MemberNotExistException;
import shook.shook.member.exception.MemberException;
import shook.shook.song.application.killingpart.dto.KillingPartCommentRegisterRequest;
import shook.shook.song.application.killingpart.dto.KillingPartCommentResponse;
import shook.shook.song.domain.killingpart.KillingPart;
Expand All @@ -25,10 +25,13 @@ public class KillingPartCommentService {
private final MemberRepository memberRepository;

@Transactional
public void register(final long partId, final KillingPartCommentRegisterRequest request,
final Long memberId) {
public void register(
final Long partId,
final KillingPartCommentRegisterRequest request,
final Long memberId
) {
final Member member = memberRepository.findById(memberId)
.orElseThrow(MemberNotExistException::new);
.orElseThrow(MemberException.MemberNotExistException::new);

final KillingPart killingPart = killingPartRepository.findById(partId)
.orElseThrow(KillingPartException.PartNotExistException::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ private void create(final KillingPart killingPart, final Member member) {
return;
}

final KillingPartLike likeOnKillingPart = likeRepository
.findByKillingPartAndMember(killingPart, member)
.orElseGet(() -> createNewLike(killingPart, member));
final KillingPartLike likeOnKillingPart =
likeRepository.findByKillingPartAndMember(killingPart, member)
.orElseGet(() -> createNewLike(killingPart, member));

killingPart.like(likeOnKillingPart);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import shook.shook.voting_song.domain.repository.VoteRepository;
import shook.shook.voting_song.domain.repository.VotingSongPartRepository;
import shook.shook.voting_song.domain.repository.VotingSongRepository;
import shook.shook.voting_song.exception.VotingSongException.VotingSongNotExistException;
import shook.shook.voting_song.exception.VotingSongException;
import shook.shook.voting_song.exception.VotingSongPartException;

@RequiredArgsConstructor
Expand All @@ -24,12 +24,9 @@ public class VotingSongPartService {
private final VoteRepository voteRepository;

@Transactional
public void register(
final Long votingSongId,
final VotingSongPartRegisterRequest request
) {
public void register(final Long votingSongId, final VotingSongPartRegisterRequest request) {
final VotingSong votingSong = votingSongRepository.findById(votingSongId)
.orElseThrow(VotingSongNotExistException::new);
.orElseThrow(VotingSongException.VotingSongNotExistException::new);

final int startSecond = request.getStartSecond();
final PartLength partLength = PartLength.findBySecond(request.getLength());
Expand All @@ -44,20 +41,14 @@ public void register(
voteToExistPart(votingSong, votingSongPart);
}

private void addPartAndVote(
final VotingSong votingSong,
final VotingSongPart votingSongPart
) {
private void addPartAndVote(final VotingSong votingSong, final VotingSongPart votingSongPart) {
votingSong.addPart(votingSongPart);
votingSongPartRepository.save(votingSongPart);

voteToPart(votingSongPart);
}

private void voteToExistPart(
final VotingSong votingSong,
final VotingSongPart votingSongPart
) {
private void voteToExistPart(final VotingSong votingSong, final VotingSongPart votingSongPart) {
final VotingSongPart existPart = votingSong.getSameLengthPartStartAt(votingSongPart)
.orElseThrow(VotingSongPartException.PartNotExistException::new);

Expand Down
Loading

0 comments on commit 6bf1c42

Please sign in to comment.