Skip to content

Commit

Permalink
Merge pull request #23 from Team-HMH/feat/#22-get-user-info-api
Browse files Browse the repository at this point in the history
feat - 유저 정보 불러오기 기능 구현
  • Loading branch information
kseysh authored Jan 10, 2024
2 parents 080e8b7 + 0c4b684 commit 5036a70
Show file tree
Hide file tree
Showing 13 changed files with 91 additions and 65 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package sopt.org.HMH.domain.challenge.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import sopt.org.HMH.domain.app.dto.request.AppGoalTimeRequest;
import java.util.List;

public record ChallengeRequest(

Integer period,
Long goalTime,
List<AppGoalTimeRequest> apps
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,10 @@ public class DayChallenge extends BaseTimeEntity {
@OneToMany(mappedBy = "dayChallenge")
private List<App> apps;

@Builder
public DayChallenge(Challenge challenge, Long goalTime) {
this.challenge = challenge;
this.goalTime = goalTime;
this.isSuccess = false;
this.isSuccess = true;
this.didGettingPoint = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@
import sopt.org.HMH.domain.user.dto.request.SocialPlatformRequest;
import sopt.org.HMH.domain.user.dto.request.SocialSignUpRequest;
import sopt.org.HMH.domain.user.dto.response.LoginResponse;
import sopt.org.HMH.domain.user.dto.response.UserInfoResponse;
import sopt.org.HMH.domain.user.service.UserService;
import sopt.org.HMH.global.auth.jwt.JwtProvider;
import sopt.org.HMH.global.auth.jwt.TokenDto;
import sopt.org.HMH.global.auth.jwt.TokenResponse;
import sopt.org.HMH.global.common.Util;
import sopt.org.HMH.global.common.response.ApiResponse;
import sopt.org.HMH.global.common.response.EmptyJsonResponse;

Expand All @@ -27,39 +28,46 @@ public class UserController {
private final UserService userService;

@PostMapping("/login")
public ResponseEntity<ApiResponse<LoginResponse>> login(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody SocialPlatformRequest request
public ResponseEntity<ApiResponse<LoginResponse>> orderLogin(
@RequestHeader("Authorization") final String socialAccessToken,
@RequestBody final SocialPlatformRequest request
) {
return ResponseEntity
.status(UserSuccess.LOGIN_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.LOGIN_SUCCESS, userService.login(socialAccessToken, request)));
}

@PostMapping("/signup")
public ResponseEntity<ApiResponse<LoginResponse>> signup(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody SocialSignUpRequest request
public ResponseEntity<ApiResponse<LoginResponse>> orderSignup(
@RequestHeader("Authorization") final String socialAccessToken,
@RequestBody final SocialSignUpRequest request
) {
return ResponseEntity
.status(UserSuccess.SIGNUP_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.SIGNUP_SUCCESS, userService.signup(socialAccessToken, request)));
}

@GetMapping("/reissue")
public ResponseEntity<ApiResponse<TokenDto>> reissue(
@RequestHeader("Authorization") String refreshToken
public ResponseEntity<ApiResponse<TokenResponse>> orderReissue(
@RequestHeader("Authorization") final String refreshToken
) {
return ResponseEntity
.status(UserSuccess.REISSUE_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.REISSUE_SUCCESS, userService.reissueToken(refreshToken)));
}

@PostMapping("/logout")
public ResponseEntity<ApiResponse<?>> logout(Principal principal) {
userService.logout(JwtProvider.getUserFromPrincipal(principal));
public ResponseEntity<ApiResponse<?>> orderLogout(Principal principal) {
userService.logout(Util.getUserId(principal));
return ResponseEntity
.status(UserSuccess.LOGOUT_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.LOGOUT_SUCCESS,new EmptyJsonResponse()));
.body(ApiResponse.success(UserSuccess.LOGOUT_SUCCESS, new EmptyJsonResponse()));
}

@GetMapping
public ResponseEntity<ApiResponse<UserInfoResponse>> orderGetUserInfo(Principal principal) {
return ResponseEntity
.status(UserSuccess.GET_USER_INFO_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.GET_USER_INFO_SUCCESS, userService.getUserInfo(Util.getUserId(principal))));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,15 @@
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "onboarding_info")
@NoArgsConstructor
@AllArgsConstructor
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class OnboardingInfo {

@Id
Expand All @@ -33,4 +29,10 @@ public class OnboardingInfo {
private List<OnboardingProblem> problem;

private String averageUseTime;

@Builder
public OnboardingInfo(List<OnboardingProblem> problem, String averageUseTime) {
this.problem = problem;
this.averageUseTime = averageUseTime;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@
@Entity
@Table(name = "problem")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
public class OnboardingProblem {

@Id
Expand All @@ -26,4 +24,9 @@ public class OnboardingProblem {
private Long id;

private String problem;

@Builder
public OnboardingProblem(String problem) {
this.problem = problem;
}
}
8 changes: 4 additions & 4 deletions src/main/java/sopt/org/HMH/domain/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ public class User extends BaseTimeEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "name")
private String name;

@Column(name = "social_platform")
@Enumerated(EnumType.STRING)
private SocialPlatform socialPlatform;

@Column(name = "social_id")
private Long socialId;

@Column(name = "profile_image_url")
@Builder.Default
private Integer point = 0;

@Column(columnDefinition = "TEXT")
private String profileImageUrl;

@OneToOne
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum UserSuccess implements SuccessBase {
SIGNUP_SUCCESS(HttpStatus.OK, "회원가입에 성공했습니다."),
REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다."),
LOGOUT_SUCCESS(HttpStatus.OK, "로그아웃에 성공했습니다."),
GET_USER_INFO_SUCCESS(HttpStatus.OK, "유저의 정보를 불러오는데에 성공했습니다."),
;

private final HttpStatus status;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package sopt.org.HMH.domain.user.dto.response;

import sopt.org.HMH.domain.user.domain.User;
import sopt.org.HMH.global.auth.jwt.TokenDto;
import sopt.org.HMH.global.auth.jwt.TokenResponse;

public record LoginResponse(
Long userId,
String accessToken,
String refreshToken
){

public static LoginResponse of(User loginUser, TokenDto tokenDto) {
public static LoginResponse of(User loginUser, TokenResponse tokenResponse) {
return new LoginResponse(
loginUser.getId(),
tokenDto.getAccessToken(),
tokenDto.getRefreshToken()
tokenResponse.getAccessToken(),
tokenResponse.getRefreshToken()
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package sopt.org.HMH.domain.user.dto.response;

import sopt.org.HMH.domain.user.domain.User;

public record UserInfoResponse(
String name,
Integer point
) {
public static UserInfoResponse of(User user) {
return new UserInfoResponse(
user.getName(),
user.getPoint()
);
}
}
22 changes: 14 additions & 8 deletions src/main/java/sopt/org/HMH/domain/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@
import sopt.org.HMH.domain.user.dto.request.SocialPlatformRequest;
import sopt.org.HMH.domain.user.dto.request.SocialSignUpRequest;
import sopt.org.HMH.domain.user.dto.response.LoginResponse;
import sopt.org.HMH.domain.user.dto.response.UserInfoResponse;
import sopt.org.HMH.domain.user.repository.OnboardingInfoRepository;
import sopt.org.HMH.domain.user.repository.UserRepository;
import sopt.org.HMH.global.auth.jwt.JwtProvider;
import sopt.org.HMH.global.auth.jwt.TokenDto;
import sopt.org.HMH.global.auth.jwt.TokenResponse;
import sopt.org.HMH.global.auth.jwt.exception.JwtError;
import sopt.org.HMH.global.auth.jwt.exception.JwtException;
import sopt.org.HMH.global.auth.security.UserAuthentication;
Expand Down Expand Up @@ -54,14 +55,14 @@ public LoginResponse signup(String socialAccessToken, SocialSignUpRequest reques
// 이미 회원가입된 유저가 있다면 400 Error 발생
validateDuplicateUser(socialId, socialPlatform);

OnboardingInfo onboardingInfo = createOnboardingInfo(request);
User user = createUser(socialPlatform, socialId, onboardingInfo);
OnboardingInfo onboardingInfo = registerOnboardingInfo(request);
User user = addUser(socialPlatform, socialId, onboardingInfo);

return performLogin(socialAccessToken, socialPlatform, user);
}

@Transactional
public TokenDto reissueToken(String refreshToken) {
public TokenResponse reissueToken(String refreshToken) {
refreshToken = parseTokenString(refreshToken);
Long userId = jwtProvider.validateRefreshToken(refreshToken);
validateUserId(userId); // userId가 DB에 저장된 유효한 값인지 검사
Expand All @@ -74,6 +75,11 @@ public void logout(Long userId) {
jwtProvider.deleteRefreshToken(userId);
}

public UserInfoResponse getUserInfo(Long userId) {
User user = userRepository.findByIdOrThrowException(userId);
return UserInfoResponse.of(user);
}

private void validateUserId(Long userId) {
if (!userRepository.existsById(userId)) {
throw new UserException(UserError.NOT_FOUND_USER);
Expand Down Expand Up @@ -113,11 +119,11 @@ private LoginResponse performLogin(String socialAccessToken, SocialPlatform soci
if (socialPlatform == SocialPlatform.KAKAO) {
kakaoLoginService.updateUserInfoByKakao(loginUser, socialAccessToken);
}
TokenDto tokenDto = jwtProvider.issueToken(new UserAuthentication(loginUser.getId(), null, null));
return LoginResponse.of(loginUser, tokenDto);
TokenResponse tokenResponse = jwtProvider.issueToken(new UserAuthentication(loginUser.getId(), null, null));
return LoginResponse.of(loginUser, tokenResponse);
}

private User createUser(SocialPlatform socialPlatform, Long socialId, OnboardingInfo onboardingInfo) {
private User addUser(SocialPlatform socialPlatform, Long socialId, OnboardingInfo onboardingInfo) {
User user = User.builder()
.socialPlatform(socialPlatform)
.socialId(socialId)
Expand All @@ -127,7 +133,7 @@ private User createUser(SocialPlatform socialPlatform, Long socialId, Onboarding
return user;
}

private OnboardingInfo createOnboardingInfo(SocialSignUpRequest request) {
private OnboardingInfo registerOnboardingInfo(SocialSignUpRequest request) {
List<OnboardingProblem> problemList = new ArrayList<>();
for (String problem : request.onboardingRequest().problemList()) {
problemList.add(
Expand Down
17 changes: 2 additions & 15 deletions src/main/java/sopt/org/HMH/global/auth/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package sopt.org.HMH.global.auth.jwt;

import static java.util.Objects.isNull;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Header;
Expand All @@ -11,7 +9,6 @@
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.util.Base64;
import java.util.Date;
import javax.crypto.SecretKey;
Expand Down Expand Up @@ -46,8 +43,8 @@ protected void init() {
/**
* Access 토큰, Refresh 토큰 발급
*/
public TokenDto issueToken(Authentication authentication) {
return TokenDto.of(
public TokenResponse issueToken(Authentication authentication) {
return TokenResponse.of(
generateAccessToken(authentication),
generateRefreshToken(authentication));
}
Expand Down Expand Up @@ -169,14 +166,4 @@ private SecretKey getSigningKey() {
// HMAC SHA 알고리즘을 사용하는 Secret Key 생성
return Keys.hmacShaKeyFor(encodedKey.getBytes());
}

/**
* Principal 객체로부터 User의 식별자를 추출하는 메서드
*/
public static Long getUserFromPrincipal(Principal principal) {
if (isNull(principal)) {
throw new JwtException(JwtError.EMPTY_PRINCIPLE_EXCEPTION);
}
return Long.valueOf(principal.getName());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class TokenDto {
public class TokenResponse {

private String accessToken;
private String refreshToken;

public static TokenDto of(String accessToken, String refreshToken) {
return new TokenDto(accessToken, refreshToken);
public static TokenResponse of(String accessToken, String refreshToken) {
return new TokenResponse(accessToken, refreshToken);
}
}
19 changes: 13 additions & 6 deletions src/main/java/sopt/org/HMH/global/common/Util.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
package sopt.org.HMH.global.common;

import java.security.Principal;
import sopt.org.HMH.global.auth.jwt.exception.JwtError;
import sopt.org.HMH.global.auth.jwt.exception.JwtException;

import static java.util.Objects.isNull;

public class Util {
// public static Long getUserId(Principal principal) {
// if (isNull(principal)) {
// throw new SecurityException(EMPTY_ACCESS_TOKEN.getMessage());
// }
// return Long.valueOf(principal.getName());
// }

/**
* Principal 객체로부터 User의 식별자를 추출하는 메서드
*/
public static Long getUserId(Principal principal) {
if (isNull(principal)) {
throw new JwtException(JwtError.EMPTY_PRINCIPLE_EXCEPTION);
}
return Long.valueOf(principal.getName());
}
}

0 comments on commit 5036a70

Please sign in to comment.