Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat - 유저 정보 불러오기 기능 구현 #23

Merged
merged 36 commits into from
Jan 10, 2024
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
f6a9725
feat - #13 회원가입 기능 구현
kseysh Jan 9, 2024
3794fd3
merge - #13 #18 브랜치를 pull 받아 merge
kseysh Jan 9, 2024
97111ce
refactor - #18 사용하지 않는 파일 삭제
kseysh Jan 9, 2024
2e49b3e
chore - #18 request파일의 네이밍 request로 변경
kseysh Jan 9, 2024
165e861
del - #18 사용하지 않는 파일 삭제
kseysh Jan 9, 2024
53f8c6e
chore - #18 response 폴더 네이밍 request로 변경
kseysh Jan 9, 2024
95b7681
feat - #18 OnboardingInfo 객체 추가
kseysh Jan 9, 2024
8ab3e95
feat - #18 회원가입 로직 구현
kseysh Jan 9, 2024
b212be1
refactor - #18 기능이 더 명확하게 표현되는 함수 네이밍으로 수정
kseysh Jan 9, 2024
0ada677
refactor - #18 공통된 메서드 추출을 통한 리팩토링과 명확한 기능 설명을 위한 함수 네이밍 수정
kseysh Jan 9, 2024
7f1d5c6
refactor - #18 불필요한 토큰 파싱과정 삭제
kseysh Jan 9, 2024
adf9ea1
merge - #18 develop 브랜치와 merge
kseysh Jan 9, 2024
8721b50
merge - #18 PR전 develop 브랜치와 merge
kseysh Jan 9, 2024
7741811
feat - #22 Util 클래스를 추가하여 전역에서 userId를 가져오는 코드 생성
kseysh Jan 9, 2024
eea879a
chore - #22 controller 네이밍 컨벤션에 맞게 변경
kseysh Jan 9, 2024
90e06ca
chore - #22 tokenDto 네이밍 tokenResponse로 변경
kseysh Jan 9, 2024
4b84835
feat - #22 유저 정보 불러오기 기능 구현
kseysh Jan 9, 2024
c982333
chore - #22 이후 포인트 사용 api를 위한 isSuccess값 true로 변경
kseysh Jan 9, 2024
84c746f
feat - #3 CI / CD 스크립트 작성
kseysh Dec 30, 2023
0e896a3
feat - #3 deploy Shell 스크립트 작성
kseysh Dec 30, 2023
4e69397
feat - #3 예외 핸들링 클래스 구현 및 공통 응답 클래스 구현
kseysh Dec 31, 2023
70e609d
feat - #3 CD파일 codedeploy 및 bucket 이름 변경
kseysh Dec 31, 2023
81383bc
feat - #3 배포 테스트용 health check controller 구현
kseysh Dec 31, 2023
050923d
feat - #3 secret 파일 .gitignore에 추가
kseysh Dec 31, 2023
41fc691
chore - cd 파일 수정
kseysh Jan 1, 2024
16d9690
chore - #4 불필요한 공백 제거
kseysh Jan 1, 2024
0413556
feat - #3 appspec 파일 추가
kseysh Jan 2, 2024
64a5346
feat - #3 CI/CD 파일에서 배포 조건 변경
kseysh Jan 2, 2024
e3c6467
docs - #7 PR 템플릿, ISSUE 템플릿에 deploy 커밋 컨벤션 추가
kseysh Jan 2, 2024
5231d73
fix - #11 배포 프로필 삭제 및 환경변수 설정 플로우 추가
kseysh Jan 4, 2024
74906d3
chore - #11 application.yml로 이름 통일
kseysh Jan 4, 2024
54f00b7
chore - #11 application.yml로 이름 통일
kseysh Jan 4, 2024
c7f37e1
chore - #11 PLAIN.jar 파일 배포시 삭제하기 위한 옵션 추가
kseysh Jan 4, 2024
df1ceff
feat - #22 클래스의 Builder를 생성자에서 Builder를 사용하는 것으로 변경
kseysh Jan 10, 2024
91a6efd
refactor - #22 request 매개변수에 final 추가하여 불변성 보장
kseysh Jan 10, 2024
0c4b684
refactor - #22 사용하지 않는 name 옵션 삭제 및 profileImageUrl TEXT 타입으로 설정
kseysh Jan 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
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(

kseysh marked this conversation as resolved.
Show resolved Hide resolved
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;
kseysh marked this conversation as resolved.
Show resolved Hide resolved
this.didGettingPoint = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import sopt.org.HMH.domain.user.domain.exception.UserSuccess;
import sopt.org.HMH.domain.user.dto.request.SocialLoginRequest;
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 @@ -26,17 +28,27 @@ public class UserController {
private final UserService userService;

@PostMapping("/login")
public ResponseEntity<ApiResponse<LoginResponse>> login(
public ResponseEntity<ApiResponse<LoginResponse>> orderLogin(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody SocialLoginRequest request
@RequestBody 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>> orderSignup(
@RequestHeader("Authorization") String socialAccessToken,
@RequestBody 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(
public ResponseEntity<ApiResponse<TokenResponse>> orderReissue(
@RequestHeader("Authorization") String refreshToken
) {
return ResponseEntity
kseysh marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -45,10 +57,18 @@ public ResponseEntity<ApiResponse<TokenDto>> reissue(
}

@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("/")
kseysh marked this conversation as resolved.
Show resolved Hide resolved
public ResponseEntity<ApiResponse<UserInfoResponse>> orderGetUserInfo(Principal principal) {
System.out.println(Util.getUserId(principal));
kseysh marked this conversation as resolved.
Show resolved Hide resolved
return ResponseEntity
.status(UserSuccess.GET_USER_INFO_SUCCESS.getHttpStatus())
.body(ApiResponse.success(UserSuccess.GET_USER_INFO_SUCCESS, userService.getUserInfo(Util.getUserId(principal))));
}
}
36 changes: 36 additions & 0 deletions src/main/java/sopt/org/HMH/domain/user/domain/OnboardingInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package sopt.org.HMH.domain.user.domain;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
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.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "onboarding_info")
kseysh marked this conversation as resolved.
Show resolved Hide resolved
@NoArgsConstructor
@AllArgsConstructor
@Builder
kseysh marked this conversation as resolved.
Show resolved Hide resolved
public class OnboardingInfo {

@Id
@Column(name = "onboarding_info_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "onboarding_info_id")
private List<OnboardingProblem> problem;
kseysh marked this conversation as resolved.
Show resolved Hide resolved

private String averageUseTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sopt.org.HMH.domain.user.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@Table(name = "problem")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
kseysh marked this conversation as resolved.
Show resolved Hide resolved
public class OnboardingProblem {

@Id
@Column(name = "problem_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String problem;
}
16 changes: 16 additions & 0 deletions src/main/java/sopt/org/HMH/domain/user/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import sopt.org.HMH.domain.challenge.domain.Challenge;
import sopt.org.HMH.global.auth.social.SocialPlatform;
import sopt.org.HMH.global.common.domain.BaseTimeEntity;

Expand All @@ -39,9 +44,20 @@ public class User extends BaseTimeEntity {
@Column(name = "social_id")
private Long socialId;

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

@Column(name = "profile_image_url")
private String profileImageUrl;
kseysh marked this conversation as resolved.
Show resolved Hide resolved

@OneToOne
@JoinColumn(name = "onboarding_info_id")
private OnboardingInfo onboardingInfo;

@OneToMany(mappedBy = "user")
private List<Challenge> challenges;

public void updateSocialInfo(String nickname, String profileImageUrl) {
this.name = nickname;
this.profileImageUrl = profileImageUrl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public enum UserError implements ErrorBase {

// 400 BAD REQUEST
INVALID_USER(HttpStatus.BAD_REQUEST, "Principle 객체가 없습니다."),
DUPLICATE_USER(HttpStatus.BAD_REQUEST, "이미 회원가입된 유저입니다."),

// 401 UNAUTHORIZED

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
public enum UserSuccess implements SuccessBase {

LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."),
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
@@ -0,0 +1,13 @@
package sopt.org.HMH.domain.user.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

public record OnboardingRequest(

String averageUseTime,

@JsonProperty(value = "problem")
List<String> problemList
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import sopt.org.HMH.global.auth.social.SocialPlatform;

public record SocialLoginRequest(
public record SocialPlatformRequest(
SocialPlatform socialPlatform
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package sopt.org.HMH.domain.user.dto.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import sopt.org.HMH.domain.challenge.dto.request.ChallengeRequest;
import sopt.org.HMH.global.auth.social.SocialPlatform;

public record SocialSignUpRequest(

SocialPlatform socialPlatform,
@JsonProperty(value = "onboarding")
OnboardingRequest onboardingRequest,
@JsonProperty(value = "challenge")
ChallengeRequest challengeRequest
) {
}
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()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package sopt.org.HMH.domain.user.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import sopt.org.HMH.domain.user.domain.OnboardingInfo;

public interface OnboardingInfoRepository extends JpaRepository<OnboardingInfo, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ default User findByIdOrThrowException(Long userId) {
}

Optional<User> findBySocialPlatformAndSocialId(SocialPlatform socialPlatform, Long socialId);
boolean existsBySocialPlatformAndSocialId(SocialPlatform socialPlatform, Long socialId);
}
Loading