Skip to content

Commit

Permalink
Merge pull request #83 from Team-INSERT/refactor/#82
Browse files Browse the repository at this point in the history
Refactor/#82 : Auth Domain 리팩토링
  • Loading branch information
qlido authored Apr 15, 2024
2 parents 8110fce + 8027dbe commit ce8397b
Show file tree
Hide file tree
Showing 18 changed files with 181 additions and 137 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.project.bumawiki.domain.auth.service.implementation;
package com.project.bumawiki.domain.auth.implementation;

import org.springframework.stereotype.Service;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.project.bumawiki.domain.auth.service.implementation;
package com.project.bumawiki.domain.auth.implementation;

import org.springframework.stereotype.Service;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.project.bumawiki.domain.auth.service.implementation;
package com.project.bumawiki.domain.auth.implementation;

import org.springframework.stereotype.Service;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.project.bumawiki.domain.auth.service.implementation;
package com.project.bumawiki.domain.auth.implementation;

import java.util.Date;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.project.bumawiki.domain.auth.infra;

import java.io.IOException;

import com.project.bumawiki.domain.user.domain.User;
import com.project.bumawiki.domain.user.domain.authority.Authority;
import com.project.bumawiki.global.annotation.Implementation;
import com.project.bumawiki.global.error.exception.BumawikiException;
import com.project.bumawiki.global.error.exception.ErrorCode;

import leehj050211.bsmOauth.BsmOauth;
import leehj050211.bsmOauth.dto.response.BsmResourceResponse;
import leehj050211.bsmOauth.exceptions.BsmAuthCodeNotFoundException;
import leehj050211.bsmOauth.exceptions.BsmAuthInvalidClientException;
import leehj050211.bsmOauth.exceptions.BsmAuthTokenNotFoundException;
import lombok.RequiredArgsConstructor;

@Implementation
@RequiredArgsConstructor
public class BsmLoginHandler {
private final BsmOauth bsmOauth;

public User getUserByAuthId(String authId) {
try {
String token = bsmOauth.getToken(authId);
BsmResourceResponse response = bsmOauth.getResource(token);
return createUnknownUser(response);
} catch (BsmAuthCodeNotFoundException | BsmAuthTokenNotFoundException e) {
throw new BumawikiException(ErrorCode.INVALID_AUTHID);
} catch (BsmAuthInvalidClientException e) {
throw new BumawikiException(ErrorCode.INVALID_BSM_CLIENT);
} catch (IOException e) {
throw new BumawikiException(ErrorCode.INTERNAL_SERVER_ERROR);
}
}

private User createUnknownUser(BsmResourceResponse resource) {
return User.builder()
.email(resource.getEmail())
.nickName(resource.getNickname())
.authority(Authority.USER)
.enroll(resource.getStudent().getEnrolledAt())
.name(resource.getStudent().getName())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
import com.project.bumawiki.domain.auth.annotation.AdminOnly;
import com.project.bumawiki.domain.auth.annotation.LoginOrNot;
import com.project.bumawiki.domain.auth.annotation.LoginRequired;
import com.project.bumawiki.domain.auth.service.implementation.AuthReader;
import com.project.bumawiki.domain.auth.service.implementation.AuthUpdater;
import com.project.bumawiki.domain.auth.implementation.AuthReader;
import com.project.bumawiki.domain.auth.implementation.AuthUpdater;
import com.project.bumawiki.domain.auth.util.BearerTokenExtractor;
import com.project.bumawiki.domain.auth.util.JwtParser;
import com.project.bumawiki.domain.user.domain.User;
import com.project.bumawiki.domain.user.domain.authority.Authority;
import com.project.bumawiki.domain.user.domain.repository.UserRepository;
import com.project.bumawiki.domain.user.implementation.UserReader;
import com.project.bumawiki.global.error.exception.BumawikiException;
import com.project.bumawiki.global.error.exception.ErrorCode;

Expand All @@ -30,8 +30,7 @@ public class AuthInterceptor implements HandlerInterceptor {
private final JwtParser jwtParser;
private final AuthUpdater authUpdater;
private final AuthReader authReader;
//TODO UserReader로 변경
private final UserRepository userRepository;
private final UserReader userReader;

private static void shouldUserAdmin(User currentUser) {
if (currentUser.getAuthority() != Authority.ADMIN) {
Expand All @@ -55,7 +54,7 @@ public boolean preHandle(
String jwt = BearerTokenExtractor.extract(bearer);
Long userId = jwtParser.getIdFromJwt(jwt);

User user = userRepository.getById(userId);
User user = userReader.getById(userId);

authUpdater.updateCurrentUser(user);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.project.bumawiki.domain.auth.presentation.dto.LoginReqestDto;
import com.project.bumawiki.domain.auth.presentation.dto.RefreshTokenRequestDto;
import com.project.bumawiki.domain.auth.presentation.dto.TokenResponseDto;
import com.project.bumawiki.domain.auth.service.AccessTokenRefreshService;
import com.project.bumawiki.domain.auth.service.UserSignUpOrUpdateService;
import com.project.bumawiki.domain.auth.service.CommandAuthService;

import lombok.RequiredArgsConstructor;

Expand All @@ -20,16 +21,15 @@
@RestController
@RequestMapping("/api/auth")
public class AuthController {
private final UserSignUpOrUpdateService userSignUpOrUpdateService;
private final AccessTokenRefreshService accessTokenRefreshService;
private final CommandAuthService commandAuthService;

@PostMapping("/oauth/bsm")
public TokenResponseDto userSignup(@RequestHeader("authCode") String authCode) throws IOException {
return TokenResponseDto.from(userSignUpOrUpdateService.execute(authCode));
public TokenResponseDto userSignup(@RequestBody LoginReqestDto loginReqestDto) throws IOException {
return TokenResponseDto.from(commandAuthService.login(loginReqestDto.accessToken()));
}

@PutMapping("/refresh/access")
public TokenResponseDto refreshAccessToken(@RequestHeader("refreshToken") String refreshToken) {
return TokenResponseDto.from(accessTokenRefreshService.execute(refreshToken));
public TokenResponseDto refreshAccessToken(@RequestBody RefreshTokenRequestDto refreshTokenRequestDto) {
return TokenResponseDto.from(commandAuthService.refresh(refreshTokenRequestDto.refreshToken()));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.project.bumawiki.domain.auth.presentation.dto;

public record AccessTokenRequestDto(
public record LoginReqestDto(
String accessToken
) {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.project.bumawiki.domain.auth.service;

import org.springframework.stereotype.Service;

import com.project.bumawiki.domain.auth.domain.Token;
import com.project.bumawiki.domain.auth.implementation.AuthReader;
import com.project.bumawiki.domain.auth.implementation.AuthValidator;
import com.project.bumawiki.domain.auth.implementation.TokenProvider;
import com.project.bumawiki.domain.auth.infra.BsmLoginHandler;
import com.project.bumawiki.domain.auth.util.BearerTokenExtractor;
import com.project.bumawiki.domain.user.domain.User;
import com.project.bumawiki.domain.user.implementation.UserCreator;
import com.project.bumawiki.domain.user.implementation.UserReader;
import com.project.bumawiki.domain.user.implementation.UserUpdater;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class CommandAuthService {
private final AuthValidator authValidator;
private final AuthReader authReader;
private final BsmLoginHandler bsmLoginHandler;
private final TokenProvider tokenProvider;
private final UserReader userReader;
private final UserCreator userCreator;
private final UserUpdater userUpdater;

public Token login(String authId) {
User unknownUser = bsmLoginHandler.getUserByAuthId(authId);
User user = userReader.getByEmail(unknownUser.getEmail());

if (user == null) {
userCreator.create(unknownUser);
} else {
userUpdater.update(user, unknownUser);
}

return tokenProvider.createNewTokens(user);
}

public Token refresh(String bearer) {
String refreshToken = BearerTokenExtractor.extract(bearer);
authValidator.shouldRefreshTokenValid(refreshToken);

Long userId = authReader.getIdFromJwt(refreshToken);
String accessToken = tokenProvider.createAccessToken(userReader.getById(userId));

return new Token(accessToken, refreshToken);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,19 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BearerTokenExtractor {

private static final String BEARER_TYPE = "Bearer ";
private static final String PREFIX = "Bearer";
private static final String BEARER_JWT_REGEX = "^Bearer [A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.?[A-Za-z0-9-_.+/=]*$";

public static String extract(String bearer) {
validate(bearer);
return bearer.replace(BEARER_TYPE, "").trim();
return bearer.replace(PREFIX, "").trim();
}

private static void validate(String authorization) {
if (authorization == null) {
private static void validate(String bearer) {
if (bearer == null) {
throw new BumawikiException(ErrorCode.TOKEN_MISSING);
}
if (!authorization.matches(BEARER_JWT_REGEX)) {
if (!bearer.matches(BEARER_JWT_REGEX)) {
throw new BumawikiException(ErrorCode.INVALID_JWT);
}
}
Expand Down
12 changes: 5 additions & 7 deletions src/main/java/com/project/bumawiki/domain/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import leehj050211.bsmOauth.dto.response.BsmResourceResponse;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -83,12 +82,11 @@ public List<ThumbsUpResponseDto> getList() {
.toList();
}

public User update(BsmResourceResponse resource) {
this.email = resource.getEmail();
this.name = resource.getStudent().getName();
this.enroll = resource.getStudent().getEnrolledAt();
this.nickName = resource.getNickname();
return this;
public void update(User user) {
this.email = user.getEmail();
this.name = user.getName();
this.enroll = user.getEnroll();
this.nickName = user.getNickName();
}

public void changeUserAuthority(Authority authority) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,7 @@
import org.springframework.data.jpa.repository.JpaRepository;

import com.project.bumawiki.domain.user.domain.User;
import com.project.bumawiki.domain.user.exception.UserNotFoundException;

public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);

default User getById(Long id) {
return findById(id).orElseThrow(() -> UserNotFoundException.EXCEPTION);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.project.bumawiki.domain.user.implementation;

import com.project.bumawiki.domain.user.domain.User;
import com.project.bumawiki.domain.user.domain.repository.UserRepository;
import com.project.bumawiki.global.annotation.Implementation;

import lombok.RequiredArgsConstructor;

@Implementation
@RequiredArgsConstructor
public class UserCreator {
private final UserRepository userRepository;

public void create(User user) {
userRepository.save(user);
}
}
Loading

0 comments on commit ce8397b

Please sign in to comment.