Skip to content

Commit

Permalink
Merge pull request #331 from Team-Sopetit/refactor/#320-chan
Browse files Browse the repository at this point in the history
[REFACTOR] auth 관련 리팩토링
  • Loading branch information
Chan531 authored Aug 21, 2024
2 parents b4bc7db + fa3c987 commit 8145e8d
Show file tree
Hide file tree
Showing 21 changed files with 149 additions and 148 deletions.
38 changes: 19 additions & 19 deletions src/main/java/com/soptie/server/api/controller/AuthApi.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,23 @@
package com.soptie.server.api.controller;

import static com.soptie.server.common.message.AuthMessage.*;
import static com.soptie.server.api.controller.dto.response.SuccessResponse.*;

import java.security.Principal;

import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.soptie.server.api.controller.docs.AuthApiDocs;
import com.soptie.server.domain.usecase.AuthService;
import com.soptie.server.domain.auth.SignInServiceRequest;
import com.soptie.server.domain.auth.TokenGetServiceRequest;
import com.soptie.server.api.controller.dto.response.BaseResponse;
import com.soptie.server.api.controller.dto.response.SuccessResponse;
import com.soptie.server.api.controller.dto.request.auth.SignInRequest;
import com.soptie.server.api.controller.dto.response.SuccessResponse;
import com.soptie.server.api.controller.dto.response.auth.SignInResponse;
import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse;
import com.soptie.server.api.controller.generic.SuccessMessage;
import com.soptie.server.domain.auth.AuthService;

import lombok.RequiredArgsConstructor;
import lombok.val;
Expand All @@ -33,34 +29,38 @@ public class AuthApi implements AuthApiDocs {

private final AuthService authService;

@ResponseStatus(HttpStatus.OK)
@PostMapping
public ResponseEntity<SuccessResponse<SignInResponse>> signIn(
public SuccessResponse<SignInResponse> signIn(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody SignInRequest request
) {
val response = SignInResponse.of(authService.signIn(SignInServiceRequest.of(socialAccessToken, request)));
return ResponseEntity.ok(success(SUCCESS_SIGN_IN.getMessage(), response));
val response = authService.signIn(socialAccessToken, request);
return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_IN.getMessage(), response);
}

@ResponseStatus(HttpStatus.OK)
@PostMapping("/token")
public ResponseEntity<SuccessResponse<TokenGetResponse>> reissueToken(
public SuccessResponse<TokenGetResponse> reissueToken(
@RequestHeader("Authorization") String refreshToken
) {
val response = TokenGetResponse.of(authService.reissueToken(TokenGetServiceRequest.of(refreshToken)));
return ResponseEntity.ok(success(SUCCESS_RECREATE_TOKEN.getMessage(), response));
val response = authService.reissueToken(refreshToken);
return SuccessResponse.success(SuccessMessage.SUCCESS_RECREATE_TOKEN.getMessage(), response);
}

@ResponseStatus(HttpStatus.OK)
@PostMapping("/logout")
public ResponseEntity<BaseResponse> signOut(Principal principal) {
public SuccessResponse<?> signOut(Principal principal) {
val memberId = Long.parseLong(principal.getName());
authService.signOut(memberId);
return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage()));
return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_OUT.getMessage());
}

@ResponseStatus(HttpStatus.OK)
@DeleteMapping
public ResponseEntity<BaseResponse> withdrawal(Principal principal) {
public SuccessResponse<?> withdrawal(Principal principal) {
val memberId = Long.parseLong(principal.getName());
authService.withdraw(memberId);
return ResponseEntity.ok(success(SUCCESS_WITHDRAWAL.getMessage()));
return SuccessResponse.success(SuccessMessage.SUCCESS_WITHDRAWAL.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

import java.security.Principal;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;

import com.soptie.server.api.controller.dto.response.BaseResponse;
import com.soptie.server.api.controller.dto.request.auth.SignInRequest;
import com.soptie.server.api.controller.dto.response.ErrorResponse;
import com.soptie.server.api.controller.dto.response.SuccessResponse;
import com.soptie.server.api.controller.dto.request.auth.SignInRequest;
import com.soptie.server.api.controller.dto.response.auth.SignInResponse;
import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse;

Expand Down Expand Up @@ -37,7 +35,7 @@ public interface AuthApiDocs {
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
ResponseEntity<SuccessResponse<SignInResponse>> signIn(
SuccessResponse<SignInResponse> signIn(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody SignInRequest request
);
Expand All @@ -64,7 +62,7 @@ ResponseEntity<SuccessResponse<SignInResponse>> signIn(
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
ResponseEntity<SuccessResponse<TokenGetResponse>> reissueToken(
SuccessResponse<TokenGetResponse> reissueToken(
@RequestHeader("Authorization") String refreshToken
);

Expand All @@ -89,7 +87,7 @@ ResponseEntity<SuccessResponse<TokenGetResponse>> reissueToken(
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
ResponseEntity<BaseResponse> signOut(@Parameter(hidden = true) Principal principal);
SuccessResponse<?> signOut(@Parameter(hidden = true) Principal principal);

@Operation(
summary = "회원 탈퇴",
Expand All @@ -112,5 +110,5 @@ ResponseEntity<SuccessResponse<TokenGetResponse>> reissueToken(
description = "서버 내부 오류",
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
ResponseEntity<BaseResponse> withdrawal(@Parameter(hidden = true) Principal principal);
SuccessResponse<?> withdrawal(@Parameter(hidden = true) Principal principal);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.soptie.server.api.controller.dto.request.auth;

import lombok.NonNull;
import com.soptie.server.domain.member.SocialType;

import jakarta.validation.constraints.NotNull;

public record SignInRequest(
@NonNull SocialType socialType
@NotNull SocialType socialType
) {

public static SignInRequest of(SocialType socialType) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
package com.soptie.server.api.controller.dto.response.auth;

import static lombok.AccessLevel.*;
import static lombok.AccessLevel.PRIVATE;

import com.soptie.server.domain.auth.SignInServiceResponse;
import com.soptie.server.domain.auth.Token;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.NonNull;

@Builder(access = PRIVATE)
public record SignInResponse(
@NonNull String accessToken,
@NonNull String refreshToken,
@Schema(description = "액세스 토큰")
@NotNull String accessToken,
@Schema(description = "리프레시 토큰")
@NotNull String refreshToken,
@Schema(description = "멤버 인형 존재 여부", example = "true")
boolean isMemberDollExist
) {

public static SignInResponse of(SignInServiceResponse response) {
public static SignInResponse of(Token token, boolean isMemberDollExist) {
return SignInResponse.builder()
.accessToken(response.accessToken())
.refreshToken(response.refreshToken())
.isMemberDollExist(response.isMemberDollExist())
.accessToken(token.getAccessToken())
.refreshToken(token.getRefreshToken())
.isMemberDollExist(isMemberDollExist)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
package com.soptie.server.api.controller.dto.response.auth;

import static lombok.AccessLevel.*;

import com.soptie.server.domain.auth.TokenGetServiceResponse;
import static lombok.AccessLevel.PRIVATE;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.NonNull;

@Builder(access = PRIVATE)
public record TokenGetResponse(
@NonNull String accessToken
@NotNull String accessToken
) {

public static TokenGetResponse of(TokenGetServiceResponse response) {
public static TokenGetResponse from(String accessToken) {
return TokenGetResponse.builder()
.accessToken(response.accessToken())
.accessToken(accessToken)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
@RequiredArgsConstructor
@Getter
public enum SuccessMessage {
/* auth */
SUCCESS_SIGN_IN("로그인 성공"),
SUCCESS_RECREATE_TOKEN("토큰 재발급 성공"),
SUCCESS_SIGN_OUT("로그아웃 성공"),
SUCCESS_WITHDRAWAL("회원 탈퇴 성공"),

/* member */
CREATE_MEMBER_PROFILE("회원 프로필 등록 성공"),
GIVE_COTTON("솜뭉치 주기 성공"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
public enum ExceptionCode {
/* 4xx */
BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청"),
UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "권한 없음"),
NOT_FOUND(HttpStatus.NOT_FOUND, "찾을 수 없는 리소스"),
NOT_AVAILABLE(HttpStatus.NOT_ACCEPTABLE, "접근할 수 없는 리소스");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,69 +1,71 @@
package com.soptie.server.domain.auth;

import static com.soptie.server.common.message.MemberErrorCode.*;

import java.util.Objects;

import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.soptie.server.api.controller.dto.request.auth.SignInRequest;
import com.soptie.server.api.controller.dto.response.auth.SignInResponse;
import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse;
import com.soptie.server.api.web.jwt.JwtTokenProvider;
import com.soptie.server.api.web.jwt.UserAuthentication;
import com.soptie.server.common.support.ValueConfig;
import com.soptie.server.domain.usecase.AuthService;
import com.soptie.server.domain.member.Member;
import com.soptie.server.domain.member.SocialType;
import com.soptie.server.external.oauth.AppleService;
import com.soptie.server.external.oauth.KakaoService;
import com.soptie.server.persistence.repository.MemberRepository;
import com.soptie.server.persistence.adapter.MemberAdapter;
import com.soptie.server.persistence.adapter.MemberDollAdapter;
import com.soptie.server.persistence.adapter.MemberMissionAdapter;
import com.soptie.server.persistence.adapter.MemberRoutineAdapter;

import lombok.RequiredArgsConstructor;
import lombok.val;

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

private final JwtTokenProvider jwtTokenProvider;
private final MemberRepository memberRepository;
private final KakaoService kakaoService;
private final AppleService appleService;
private final MemberService memberService;
private final MemberDollService memberDollService;
private final ValueConfig valueConfig;

private final MemberRoutineDeleter memberRoutineDeleter;
private final MemberDollAdapter memberDollAdapter;
private final MemberRoutineAdapter memberRoutineAdapter;
private final MemberMissionAdapter memberMissionAdapter;
private final MemberAdapter memberAdapter;

@Override
@Transactional
public SignInServiceResponse signIn(SignInServiceRequest request) {
val member = getMember(request.socialAccessToken(), request.socialType());
public SignInResponse signIn(String socialAccessToken, SignInRequest request) {
val member = getMember(socialAccessToken, request.socialType());
val token = getToken(member);
val isMemberDollExist = member.isMemberDollExist();
return SignInServiceResponse.of(token, isMemberDollExist);
val isMemberDollExist = memberDollAdapter.isExistByMember(member.getId());
;
memberAdapter.update(member);
return SignInResponse.of(token, isMemberDollExist);
}

@Override
public TokenGetServiceResponse reissueToken(TokenGetServiceRequest request) {
val member = findMember(request.refreshToken());
public TokenGetResponse reissueToken(String refreshToken) {
val member = memberAdapter.findByRefreshToken(getTokenFromBearerString(refreshToken));
val token = generateAccessToken(member.getId());
return TokenGetServiceResponse.of(token);
return TokenGetResponse.from(token);
}

@Override
@Transactional
public void signOut(long memberId) {
val member = findMember(memberId);
val member = memberAdapter.findById(memberId);
member.resetRefreshToken();
}

@Override
@Transactional
public void withdraw(long memberId) {
val member = findMember(memberId);
deleteMemberDoll(member.getMemberDoll());
memberRoutineDeleter.deleteByMember(member);
deleteMember(member);
memberAdapter.findById(memberId);
memberRoutineAdapter.deleteAllByMemberId(memberId);
memberMissionAdapter.deleteAllByMemberId(memberId);
memberDollAdapter.deleteByMember(memberId);
memberAdapter.delete(memberId);
}

private Member getMember(String socialAccessToken, SocialType socialType) {
Expand All @@ -79,13 +81,12 @@ private String getSocialId(String socialAccessToken, SocialType socialType) {
}

private Member signUp(SocialType socialType, String socialId) {
return memberRepository.findBySocialTypeAndSocialId(socialType, socialId)
return memberAdapter.findBySocialTypeAndSocialId(socialType, socialId)
.orElseGet(() -> saveMember(socialType, socialId));
}

private Member saveMember(SocialType socialType, String socialId) {
val member = Member.builder().socialType(socialType).socialId(socialId).build();
return memberRepository.save(member);
return memberAdapter.save(socialType, socialId);
}

private Token getToken(Member member) {
Expand All @@ -101,15 +102,6 @@ private Token generateToken(Authentication authentication) {
.build();
}

private Member findMember(long id) {
return memberRepository.findById(id).orElseThrow(() -> new MemberException(INVALID_MEMBER));
}

private Member findMember(String refreshToken) {
return memberRepository.findByRefreshToken(getTokenFromBearerString(refreshToken))
.orElseThrow(() -> new MemberException(INVALID_MEMBER));
}

private String getTokenFromBearerString(String token) {
return token.replaceFirst(ValueConfig.BEARER_HEADER, ValueConfig.BLANK);
}
Expand All @@ -118,14 +110,4 @@ private String generateAccessToken(long memberId) {
val authentication = new UserAuthentication(memberId, null, null);
return jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired());
}

private void deleteMemberDoll(MemberDoll memberDoll) {
if (Objects.nonNull(memberDoll)) {
memberDollService.deleteMemberDoll(memberDoll); //TODO: using adapter
}
}

private void deleteMember(Member member) {
memberService.deleteMember(member);
}
}

This file was deleted.

Loading

0 comments on commit 8145e8d

Please sign in to comment.