Skip to content

Commit

Permalink
YEL-45 [hotfix] get/find repository method 분리
Browse files Browse the repository at this point in the history
YEL-45 [hotfix] get/find repository method 분리
  • Loading branch information
euije authored Aug 6, 2023
2 parents 70024e8 + 5643433 commit 9cf84bd
Show file tree
Hide file tree
Showing 87 changed files with 2,066 additions and 536 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.4.2'

// JPA & Database
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/yello/server/ServerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
@EnableJpaAuditing
@SpringBootApplication
public class ServerApplication {

public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,13 @@
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.security.SignatureException;
import java.util.Date;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import lombok.val;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Log4j2
@Component
@RequiredArgsConstructor
public class JwtTokenProvider {

public static final String ACCESS_TOKEN = "accessToken";
Expand All @@ -29,11 +27,15 @@ public class JwtTokenProvider {
private static final Long ACCESS_TOKEN_VALID_TIME = ofSeconds(30).toMillis();
private static final Long REFRESH_TOKEN_VALID_TIME = ofDays(14).toMillis();

@Value("${spring.jwt.secret}")
private String secretKey;
public String secretKey;

public JwtTokenProvider(@Value("${spring.jwt.secret}") String secretKey) {
this.secretKey = secretKey;
}

public Long getUserId(String token)
throws ExpiredJwtException, MalformedJwtException, SignatureException, IllegalArgumentException {
throws ExpiredJwtException, MalformedJwtException, SignatureException,
IllegalArgumentException {

JwtParser parser = Jwts.parserBuilder()
.setSigningKey(secretKey)
Expand All @@ -47,7 +49,8 @@ public Long getUserId(String token)
}

public String getUserUuid(String token)
throws ExpiredJwtException, MalformedJwtException, SignatureException, IllegalArgumentException {
throws ExpiredJwtException, MalformedJwtException, SignatureException,
IllegalArgumentException {
return Jwts.parserBuilder()
.setSigningKey(secretKey)
.build()
Expand Down Expand Up @@ -120,7 +123,8 @@ public String createJwt(Long userId, String uuid, Long tokenValidTime, String to
}

public void tryParse(String token)
throws ExpiredJwtException, MalformedJwtException, SignatureException, IllegalArgumentException {
throws ExpiredJwtException, MalformedJwtException, SignatureException,
IllegalArgumentException {
JwtParser parser = Jwts.parserBuilder()
.setSigningKey(secretKey)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws
.exceptionHandling()
.authenticationEntryPoint(customAuthenticationEntryPoint)
.and()
.addFilterBefore(new JwtFilter(userRepository), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JwtFilter(userRepository),
UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(new JwtExceptionFilter(jwtTokenProvider), JwtFilter.class)
.addFilterBefore(new ExceptionHandlerFilter(), JwtExceptionFilter.class)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import java.util.List;
import javax.validation.constraints.NotNull;
import lombok.Builder;

@Builder
public record OnBoardingFriendRequest(
@NotNull List<String> friendKakaoId,
@NotNull Long groupId
@NotNull List<String> friendKakaoId
) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public record OnBoardingFriend(

public static OnBoardingFriend of(User user) {
return OnBoardingFriend.builder()
.group(user.getSocial()==Social.KAKAO ? "KAKAO" : "SCHOOL")
.group(user.getSocial() == Social.KAKAO ? "KAKAO" : "SCHOOL")
.id(user.getId())
.name(user.getName())
.profileImage(user.getProfileImage())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.yello.server.global.exception.CustomException;

public class AuthBadRequestException extends CustomException {

public AuthBadRequestException(ErrorCode error) {
super(error, "[AuthBadRequestException] " + error.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.yello.server.global.exception.CustomException;

public class AuthNotFoundException extends CustomException {

public AuthNotFoundException(ErrorCode error) {
super(error, "[AuthNotFoundException] " + error.getMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ public void commence(HttpServletRequest request, HttpServletResponse response,
ObjectMapper objectMapper = new ObjectMapper();
log.error("인증에 실패했습니다.");

CustomAuthenticationException exception = new CustomAuthenticationException(AUTHENTICATION_ERROR);
CustomAuthenticationException exception =
new CustomAuthenticationException(AUTHENTICATION_ERROR);
response.setStatus(exception.getHttpStatus());
response.setContentType(APPLICATION_JSON_VALUE);
response.setCharacterEncoding("UTF-8");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ protected void doFilterInternal(
val accessHeader = request.getHeader(AUTHORIZATION);
log.info("Authorization : {}", accessHeader);

if (accessHeader==null || !accessHeader.startsWith(BEARER)) {
if (accessHeader == null || !accessHeader.startsWith(BEARER)) {
throw new CustomAuthenticationException(AUTHENTICATION_ERROR);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public class JwtFilter extends OncePerRequestFilter {
private final UserRepository userRepository;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {

final String requestPath = request.getServletPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,40 +34,55 @@
import com.yello.server.domain.user.entity.User;
import com.yello.server.domain.user.exception.UserConflictException;
import com.yello.server.domain.user.repository.UserRepository;
import com.yello.server.global.common.factory.ListFactory;
import com.yello.server.global.common.factory.PaginationFactory;
import com.yello.server.global.common.util.RestUtil;
import java.util.ArrayList;
import com.yello.server.infrastructure.redis.repository.TokenRepository;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.validation.constraints.NotNull;
import lombok.Builder;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.data.domain.Pageable;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


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


private final UserRepository userRepository;
private final SchoolRepository schoolRepository;
private final FriendRepository friendRepository;
private final CooldownRepository cooldownRepository;
private final JwtTokenProvider jwtTokenProvider;
private final ValueOperations<Long, ServiceTokenVO> tokenValueOperations;
private final TokenRepository tokenValueOperations;

@Transactional
// TODO softDelete 우아하게 처리하는 방법으로 바꾸기
public void renewUserInformation(User currentUser) {
currentUser.renew();

friendRepository.findAllByUserIdNotFiltered(currentUser.getId())
.forEach(Friend::renew);
friendRepository.findAllByTargetIdNotFiltered(currentUser.getId())
.forEach(Friend::renew);
cooldownRepository.findByUserIdNotFiltered(currentUser.getId())
.ifPresent(Cooldown::renew);
}

// TODO 응답을 주입 받을 수 있도록 설계
// TODO 테스트 코드 작성
public OAuthResponse oauthLogin(OAuthRequest oAuthRequest) {
final ResponseEntity<KakaoTokenInfo> response = RestUtil.getKakaoTokenInfo(oAuthRequest.accessToken());
final ResponseEntity<KakaoTokenInfo> response = RestUtil.getKakaoTokenInfo(
oAuthRequest.accessToken());

if (response.getStatusCode()==BAD_REQUEST || response.getStatusCode()==UNAUTHORIZED) {
if (response.getStatusCode() == BAD_REQUEST || response.getStatusCode() == UNAUTHORIZED) {
throw new OAuthException(OAUTH_TOKEN_EXCEPTION);
}

Expand All @@ -76,24 +91,11 @@ public OAuthResponse oauthLogin(OAuthRequest oAuthRequest) {
throw new NotSignedInException(NOT_SIGNIN_USER_EXCEPTION);
}

final User user = target.get();
final ServiceTokenVO serviceTokenVO = jwtTokenProvider.createServiceToken(
user.getId(),
user.getUuid()
);
final User currentUser = target.get();
final ServiceTokenVO serviceTokenVO =
this.registerToken(currentUser.getId(), currentUser.getUuid());

tokenValueOperations.set(
user.getId(),
serviceTokenVO
);

user.renew();
friendRepository.findAllByUserIdNotFiltered(user.getId())
.forEach(Friend::renew);
friendRepository.findAllByTargetIdNotFiltered(user.getId())
.forEach(Friend::renew);
cooldownRepository.findByUserIdNotFiltered(user.getId())
.ifPresent(Cooldown::renew);
this.renewUserInformation(currentUser);

return OAuthResponse.of(serviceTokenVO);
}
Expand All @@ -103,67 +105,81 @@ public Boolean isYelloIdDuplicated(String yelloId) {
throw new AuthBadRequestException(YELLOID_REQUIRED_EXCEPTION);
}

userRepository.getByYelloId(yelloId);
return true;
return userRepository.findByYelloId(yelloId).isPresent();
}

@Transactional
public SignUpResponse signUp(SignUpRequest signUpRequest) {
final User signUpUser = this.signUpUser(signUpRequest);
this.recommendUser(signUpRequest.recommendId());
final ServiceTokenVO signUpToken = this.registerToken(signUpUser.getId(), signUpUser.getUuid());
this.makeFriend(signUpUser, signUpRequest.friends());

return SignUpResponse.of(signUpUser.getYelloId(), signUpToken);
}

public User signUpUser(SignUpRequest signUpRequest) {
// exception
final Optional<User> userByUUID = userRepository.findByUuid(signUpRequest.uuid());
if (userByUUID.isPresent()) {
throw new UserConflictException(UUID_CONFLICT_USER_EXCEPTION);
}
userRepository.findByUuid(signUpRequest.uuid())
.ifPresent(action -> {
throw new UserConflictException(UUID_CONFLICT_USER_EXCEPTION);
});

final Optional<User> userByYelloId = userRepository.findByYelloId(signUpRequest.yelloId());
if (userByYelloId.isPresent()) {
throw new UserConflictException(YELLOID_CONFLICT_USER_EXCEPTION);
}
userRepository.findByYelloId(signUpRequest.yelloId())
.ifPresent(action -> {
throw new UserConflictException(YELLOID_CONFLICT_USER_EXCEPTION);
});

School group = schoolRepository.findById(signUpRequest.groupId());
School group = schoolRepository.getById(signUpRequest.groupId());

final User newSignInUser = userRepository.save(User.of(signUpRequest, signUpRequest.uuid(), group));
ServiceTokenVO newUserTokens = jwtTokenProvider.createServiceToken(
newSignInUser.getId(),
newSignInUser.getUuid()
);
final User newSignInUser = userRepository.save(User.of(signUpRequest, group));
return newSignInUser;
}

if (signUpRequest.recommendId()!=null && !"".equals(signUpRequest.recommendId())) {
final User recommendedUser = userRepository.getByYelloId(signUpRequest.recommendId());
public void recommendUser(String recommendYelloId) {
if (recommendYelloId != null && !recommendYelloId.isEmpty()) {
User recommendedUser = userRepository.getByYelloId(recommendYelloId);
recommendedUser.increaseRecommendCount();

final Optional<Cooldown> cooldown = cooldownRepository.findByUserId(recommendedUser.getId());
final Optional<Cooldown> cooldown =
cooldownRepository.findByUserId(recommendedUser.getId());
cooldown.ifPresent(cooldownRepository::delete);
}
}

public ServiceTokenVO registerToken(Long id, String uuid) {
ServiceTokenVO newUserTokens = jwtTokenProvider.createServiceToken(
id,
uuid
);
tokenValueOperations.set(id, newUserTokens);

signUpRequest.friends()
return newUserTokens;
}

public void makeFriend(User user, List<Long> friendIds) {
friendIds
.stream()
.map(userRepository::getById)
.map(userRepository::findById)
.forEach(friend -> {
friendRepository.save(Friend.createFriend(newSignInUser, friend));
friendRepository.save(Friend.createFriend(friend, newSignInUser));
if (friend.isPresent()) {
friendRepository.save(Friend.createFriend(user, friend.get()));
friendRepository.save(Friend.createFriend(friend.get(), user));
}
});

tokenValueOperations.set(newSignInUser.getId(), newUserTokens);
return SignUpResponse.of(newSignInUser.getYelloId(), newUserTokens);
}

public OnBoardingFriendResponse findOnBoardingFriends(OnBoardingFriendRequest friendRequest, Pageable pageable) {
List<User> totalList = new ArrayList<>();
public OnBoardingFriendResponse findOnBoardingFriends(OnBoardingFriendRequest friendRequest,
Pageable pageable) {

schoolRepository.findById(friendRequest.groupId());

final List<User> groupFriends = userRepository.findAllByGroupId(friendRequest.groupId());
final List<User> kakaoFriends = friendRequest.friendKakaoId()
final List<User> kakaoFriends = ListFactory.toNonNullableList(friendRequest.friendKakaoId()
.stream()
.map(String::valueOf)
.map(userRepository::getByUuid)
.toList();
.map(userRepository::findByUuid)
.toList());

totalList.addAll(groupFriends);
totalList.addAll(kakaoFriends);

totalList = totalList.stream()
final List<User> totalList = kakaoFriends
.stream()
.distinct()
.sorted(Comparator.comparing(User::getName))
.toList();
Expand All @@ -177,13 +193,16 @@ public OnBoardingFriendResponse findOnBoardingFriends(OnBoardingFriendRequest fr

public GroupNameSearchResponse findSchoolsBySearch(String keyword, Pageable pageable) {
int totalCount = schoolRepository.countDistinctSchoolNameContaining(keyword);
final List<String> nameList = schoolRepository.findDistinctSchoolNameContaining(keyword, pageable);
final List<String> nameList = schoolRepository.findDistinctSchoolNameContaining(keyword,
pageable);
return GroupNameSearchResponse.of(totalCount, nameList);
}

public DepartmentSearchResponse findDepartmentsBySearch(String schoolName, String keyword, Pageable pageable) {
public DepartmentSearchResponse findDepartmentsBySearch(String schoolName, String keyword,
Pageable pageable) {
int totalCount = schoolRepository.countAllBySchoolNameContaining(schoolName, keyword);
final List<School> schoolResult = schoolRepository.findAllBySchoolNameContaining(schoolName, keyword, pageable);
final List<School> schoolResult = schoolRepository.findAllBySchoolNameContaining(schoolName,
keyword, pageable);
return DepartmentSearchResponse.of(totalCount, schoolResult);
}

Expand Down
Loading

0 comments on commit 9cf84bd

Please sign in to comment.