Skip to content

Commit

Permalink
Feat: #10 로그인 회원가입 request 방식 수정, User 관련 API 구현
Browse files Browse the repository at this point in the history
* Feat: 회원가입/로그인 토큰 입력 Header->body로 변경, User 관련 api 제작

* Feat: User 엔티티 Wrapper Class로 수정, WebConfig 추가

* Feat: User 클래스 Getter 어노테이션 추가
  • Loading branch information
yerim216 authored May 29, 2024
1 parent 74b4dc0 commit 4cbb838
Show file tree
Hide file tree
Showing 13 changed files with 247 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.nzgeneration.domain.auth;

import com.example.nzgeneration.domain.auth.dto.AuthRequestDto.CreateUserRequest;
import com.example.nzgeneration.domain.auth.dto.AuthRequestDto.UserIdTokenRequest;
import com.example.nzgeneration.domain.auth.dto.AuthResponseDto.LoginSimpleInfo;
import com.example.nzgeneration.domain.auth.enums.ResponseType;
import com.example.nzgeneration.global.common.response.ApiResponse;
Expand All @@ -9,7 +10,6 @@
import lombok.RequiredArgsConstructor;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -24,11 +24,8 @@ public class AuthController {

@PostMapping("/login")
@Operation(summary = "로그인/회원가입 api", description = "code : Authorization code / 회원가입, 로그인 구분 없이 동일한 API 사용")
public ApiResponse<LoginSimpleInfo> login(@RequestHeader("Authorization") String idToken){
if (idToken != null && idToken.startsWith("Bearer ")) {
idToken = idToken.substring("Bearer ".length());
}
LoginSimpleInfo loginSimpleInfo = authService.login(idToken);
public ApiResponse<LoginSimpleInfo> login(@RequestBody UserIdTokenRequest userTokenRequest){
LoginSimpleInfo loginSimpleInfo = authService.login(userTokenRequest.getIdToken());
if(loginSimpleInfo.getResponseType()== ResponseType.SIGN_IN){
return ApiResponse.onSuccess(loginSimpleInfo);
}
Expand All @@ -37,11 +34,8 @@ public ApiResponse<LoginSimpleInfo> login(@RequestHeader("Authorization") String

@PostMapping("/signup/extra")
@Operation(summary = "회원가입 추가 정보 입력 api")
public ApiResponse<LoginSimpleInfo> signUp(@RequestHeader("Authorization") String token, @RequestBody CreateUserRequest createUserRequest){
if (token != null && token.startsWith("Bearer ")) {
token = token.substring("Bearer ".length());
}
return ApiResponse.onSuccess(authService.signUp(token, createUserRequest));
public ApiResponse<LoginSimpleInfo> signUp(@RequestBody CreateUserRequest createUserRequest){
return ApiResponse.onSuccess(authService.signUp(createUserRequest));
}

@PostMapping("/refresh-token")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ public LoginSimpleInfo login(String idToken){
}

@Transactional
public LoginSimpleInfo signUp(String token, CreateUserRequest createUserRequest){
String email = jwtTokenProvider.validateTempTokenAndGetEmail(token);
public LoginSimpleInfo signUp(CreateUserRequest createUserRequest){
String email = jwtTokenProvider.validateTempTokenAndGetEmail(createUserRequest.getToken());
if(userRepository.findByEmail(email).isPresent())
throw new GeneralException(ErrorStatus._DUPLICATE_USER);
User user = User.toEntity(email, createUserRequest);
System.out.println("Saving user with badgeCount: " + user.getBadgeCount());
userRepository.save(user);
String accessToken = jwtTokenProvider.createAccessToken(user.getPayload());
String refreshToken = jwtTokenProvider.createRefreshToken(user.getId());
user.updateToken(accessToken, refreshToken);
System.out.println("Saving user with badgeCount: " + user.getBadgeCount());
return LoginSimpleInfo.toDTO(accessToken, refreshToken, ResponseType.SIGN_IN);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class AuthRequestDto {
@NoArgsConstructor
@AllArgsConstructor
public static class CreateUserRequest {
private String token;
private String nickName;
private String walletAddress;
private String profileImgUrl;
Expand All @@ -18,4 +19,14 @@ public static class CreateUserRequest {

}

@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class UserIdTokenRequest{
private String idToken;

}



}
35 changes: 29 additions & 6 deletions src/main/java/com/example/nzgeneration/domain/user/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand All @@ -19,11 +20,11 @@
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Getter
public class User extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
private Long id;

private String nickname;
Expand All @@ -34,17 +35,22 @@ public class User extends BaseTimeEntity {

private String walletAddress;

private int badgeCount;
private Integer badgeCount = 0;

private int cumulativePoint;
@ColumnDefault("0")
private Integer cumulativePoint = 0;

private int currentPoint;
@ColumnDefault("0")
private Integer currentPoint = 0;

@ColumnDefault("0")
private Integer nftCount = 0;

@ColumnDefault("true")
private boolean isAllowLocationInfo;
private Boolean isAllowLocationInfo;

@ColumnDefault("true")
private boolean isAllowAdNotification;
private Boolean isAllowAdNotification;

public void stamp(int point) {
this.cumulativePoint += point;
Expand All @@ -59,10 +65,26 @@ public void updateToken(String accessToken, String refreshToken){
this.refreshToken = refreshToken;
}

public void updateNickName(String nickname){
this.nickname = nickname;
}

public void updateWalletAddress(String walletAddress){
this.walletAddress = walletAddress;
}

public void updateProfileImg(String imgUrl){
this.profileImageUrl = imgUrl;
}

public String getPayload(){
return this.getId()+"+nz";
}

public LocalDateTime getCreatedAt(){
return super.getCreatedAt();
}

public static User toEntity(String email, CreateUserRequest createUserRequest){
return User.builder()
.nickname(createUserRequest.getNickName())
Expand All @@ -74,6 +96,7 @@ public static User toEntity(String email, CreateUserRequest createUserRequest){
.badgeCount(0)
.cumulativePoint(0)
.currentPoint(0)
.nftCount(0)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,72 @@
package com.example.nzgeneration.domain.user;


import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserEditingPageDetailInfo;
import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserMyPageDetailInfo;
import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserSigningSimpleInfo;
import com.example.nzgeneration.global.common.response.ApiResponse;
import com.example.nzgeneration.global.security.CurrentUser;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/user")
public class UserController {
private final UserService userService;

@PostMapping("member/stamp")
@PostMapping("/stamp")
public ApiResponse<String> addStamp(@CurrentUser User user) {
userService.addStamp(user);
return ApiResponse.onSuccess("스탬프 찍기 성공");
}
@GetMapping("/check-nickname/{nickName}")
@Operation(summary = "닉네임 중복 확인", description = "true : 사용가능한 닉네임, false : 사용 불가능한 닉네임")
public ApiResponse<Boolean> checkNickName(@PathVariable String nickName){
boolean status = userService.checkNickNameDuplicate(nickName);
return ApiResponse.onSuccess(status);
}
@PatchMapping("/nickname/{nickName}")
public ApiResponse<String> updateNickName(@CurrentUser User user, @PathVariable String nickName){
userService.updateNickName(user, nickName);
return ApiResponse.onSuccess("닉네임 수정 완료");

}
@PatchMapping("/wallet-address/{walletAddress}")
public ApiResponse<String> updateWalletAddress(@CurrentUser User user, @PathVariable String walletAddress){
userService.updateWalletAddress(user, walletAddress);
return ApiResponse.onSuccess("지갑 주소 수정 완료");
}
@PatchMapping("/profile-image")
public ApiResponse<String> updateProfileImg(@CurrentUser User user, @RequestPart MultipartFile image){
userService.updateUserProfileImage(user, image);
return ApiResponse.onSuccess("프로필 사진 수정 완료");
}
@GetMapping("/days-signing")
public ApiResponse<UserSigningSimpleInfo> getDaysSigning(@CurrentUser User user){
return ApiResponse.onSuccess(userService.getDaysSigning(user));
}

@GetMapping("/my-page")
public ApiResponse<UserMyPageDetailInfo> getMyPageInfo(@CurrentUser User user){
return ApiResponse.onSuccess(userService.getMyPageInfo(user));
}

@GetMapping("/edit-page")
public ApiResponse<UserEditingPageDetailInfo> getEditPage(@CurrentUser User user){
return ApiResponse.onSuccess(userService.getEditPageInfo(user));
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
Optional<User> findByRefreshToken(String token);
Optional<User> findByNickname(String name);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
package com.example.nzgeneration.domain.user;

import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserEditingPageDetailInfo;
import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserMyPageDetailInfo;
import com.example.nzgeneration.domain.user.dto.UserResponseDto.UserSigningSimpleInfo;
import com.example.nzgeneration.global.common.response.code.status.ErrorStatus;
import com.example.nzgeneration.global.common.response.exception.GeneralException;
import com.example.nzgeneration.global.s3.S3Service;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;
private final S3Service s3Service;

@Transactional
public void addStamp(User user) {
Expand All @@ -21,4 +29,49 @@ public void addStamp(User user) {
//TODO - 포인트 상수, 기준 정하기
user.stamp(20);
}

@Transactional
public boolean checkNickNameDuplicate(String name){
if(userRepository.findByNickname(name).isPresent()){
return false;
}
return true;
}

@Transactional
public void updateNickName(User user, String name){
if(!checkNickNameDuplicate(name)){
throw new GeneralException(ErrorStatus._DUPLICATE_NICKNAME);
}
user.updateNickName(name);
}

@Transactional
public void updateWalletAddress(User user, String address){
user.updateWalletAddress(address);
}

@Transactional
public void updateUserProfileImage(User user, MultipartFile image){
String profileImgUrl = s3Service.uploadFile(image).getImgUrl();
user.updateProfileImg(profileImgUrl);
}

public UserSigningSimpleInfo getDaysSigning(User user){
LocalDateTime createdAt= user.getCreatedAt();
LocalDateTime now = LocalDateTime.now();
long daysBetween = ChronoUnit.DAYS.between(createdAt, now)+1;
return UserSigningSimpleInfo.toDTO(user, daysBetween);
}

public UserMyPageDetailInfo getMyPageInfo(User user){
return UserMyPageDetailInfo.toDTO(user);
}

public UserEditingPageDetailInfo getEditPageInfo(User user){
return UserEditingPageDetailInfo.toDTO(user);
}



}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.example.nzgeneration.domain.user.dto;

import com.example.nzgeneration.domain.user.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class UserResponseDto {
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class UserSigningSimpleInfo{
private String nickName;
private long howManyDays;

public static UserSigningSimpleInfo toDTO(User user, long days){
return UserSigningSimpleInfo.builder()
.nickName(user.getNickname())
.howManyDays(days)
.build();

}
}

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class UserMyPageDetailInfo{
private String nickName;
private Integer currentPoint;
private Integer badgeCount;
private Integer nftCount;

public static UserMyPageDetailInfo toDTO(User user){
return UserMyPageDetailInfo.builder()
.nickName(user.getNickname())
.badgeCount(user.getBadgeCount())
.currentPoint(user.getCurrentPoint())
.nftCount(user.getNftCount())
.build();
}
}

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public static class UserEditingPageDetailInfo{
private String profileImgUrl;
private String nickName;
private String walletAddress;

public static UserEditingPageDetailInfo toDTO(User user){
return UserEditingPageDetailInfo.builder()
.profileImgUrl(user.getProfileImageUrl())
.nickName(user.getNickname())
.walletAddress(user.getWalletAddress())
.build();
}

}

}
Loading

0 comments on commit 4cbb838

Please sign in to comment.