Skip to content

Commit 11e13a1

Browse files
authored
Merge pull request #19 from KusitmsHDmedi/feature/14-user
[feat] 초대 code 생성 api 구현
2 parents a00e55a + 995c585 commit 11e13a1

File tree

5 files changed

+106
-9
lines changed

5 files changed

+106
-9
lines changed

src/main/java/com/kusithm/hdmedi_server/domain/user/controller/AuthController.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
import com.kusithm.hdmedi_server.domain.user.dto.request.UserAuthRequestDto;
44
import com.kusithm.hdmedi_server.domain.user.dto.request.UserSignUpRequestDto;
5+
import com.kusithm.hdmedi_server.domain.user.dto.response.AuthCodeResponseDto;
56
import com.kusithm.hdmedi_server.domain.user.dto.response.UserAuthResponseDto;
67
import com.kusithm.hdmedi_server.domain.user.service.AuthService;
78
import com.kusithm.hdmedi_server.global.common.BaseResponse;
89
import com.kusithm.hdmedi_server.global.common.SuccessCode;
10+
import com.kusithm.hdmedi_server.global.config.auth.AuthenticatedUserId;
911
import lombok.RequiredArgsConstructor;
12+
import org.hibernate.query.criteria.JpaCriteriaUpdate;
1013
import org.springframework.http.HttpStatus;
1114
import org.springframework.http.ResponseEntity;
1215
import org.springframework.stereotype.Controller;
13-
import org.springframework.web.bind.annotation.PostMapping;
14-
import org.springframework.web.bind.annotation.RequestBody;
15-
import org.springframework.web.bind.annotation.RequestHeader;
16-
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.*;
1717

1818
@RequiredArgsConstructor
1919
@RequestMapping("/api/user")
@@ -23,17 +23,24 @@ public class AuthController {
2323

2424
@PostMapping("/signIn")
2525
public ResponseEntity<BaseResponse<?>> signIn(@RequestHeader("Authorization") final String token,
26-
@RequestBody final UserAuthRequestDto userAuthRequestDto){
26+
@RequestBody final UserAuthRequestDto userAuthRequestDto) {
2727
final UserAuthResponseDto responseDto = authService.signIn(token, userAuthRequestDto);
2828
return ResponseEntity.status(HttpStatus.OK)
2929
.body(BaseResponse.of(SuccessCode.OK, responseDto));
3030
}
3131

3232
@PostMapping("/signUp")
3333
public ResponseEntity<BaseResponse<?>> signUp(@RequestHeader("Authorization") final String token,
34-
@RequestBody final UserSignUpRequestDto userSignUpRequestDto){
34+
@RequestBody final UserSignUpRequestDto userSignUpRequestDto) {
3535
final UserAuthResponseDto responseDto = authService.signUp(token, userSignUpRequestDto);
36-
return ResponseEntity.status(HttpStatus.OK)
37-
.body(BaseResponse.of(SuccessCode.OK, responseDto));
36+
return ResponseEntity.status(HttpStatus.CREATED)
37+
.body(BaseResponse.of(SuccessCode.CREATED, responseDto));
38+
}
39+
40+
@GetMapping("/authCode")
41+
public ResponseEntity<BaseResponse<?>> createAuthCode(@AuthenticatedUserId final Long userId) {
42+
final AuthCodeResponseDto responseDto = authService.createAuthCode(userId);
43+
return ResponseEntity.status(HttpStatus.CREATED)
44+
.body(BaseResponse.of(SuccessCode.CREATED, responseDto));
3845
}
3946
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.kusithm.hdmedi_server.domain.user.domain;
2+
3+
import jakarta.persistence.Id;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import org.springframework.data.redis.core.RedisHash;
8+
9+
@AllArgsConstructor
10+
@Builder
11+
@Getter
12+
@RedisHash(value = "authCode", timeToLive = 604800000)
13+
public class AuthCode {
14+
@Id
15+
private String authCode;
16+
private Long id;
17+
18+
public static AuthCode createAuthCode(String authCode, Long id){
19+
return AuthCode.builder()
20+
.authCode(authCode)
21+
.id(id)
22+
.build();
23+
}
24+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.kusithm.hdmedi_server.domain.user.dto.response;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class AuthCodeResponseDto {
9+
private String authCode;
10+
11+
public static AuthCodeResponseDto of(String authCode){
12+
return AuthCodeResponseDto.builder()
13+
.authCode(authCode)
14+
.build();
15+
}
16+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.kusithm.hdmedi_server.domain.user.repository;
2+
3+
import com.kusithm.hdmedi_server.domain.user.domain.AuthCode;
4+
import org.springframework.data.repository.CrudRepository;
5+
6+
public interface AuthCodeRepository extends CrudRepository<AuthCode, Long> {
7+
boolean existsByAuthCode(String authCode);
8+
}

src/main/java/com/kusithm/hdmedi_server/domain/user/service/AuthService.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.kusithm.hdmedi_server.domain.user.service;
22

33
import com.kusithm.hdmedi_server.domain.user.auth.naver.NaverOAuthProvider;
4+
import com.kusithm.hdmedi_server.domain.user.domain.AuthCode;
45
import com.kusithm.hdmedi_server.domain.user.domain.Platform;
56
import com.kusithm.hdmedi_server.domain.user.domain.User;
67
import com.kusithm.hdmedi_server.domain.user.dto.request.UserAuthRequestDto;
78
import com.kusithm.hdmedi_server.domain.user.dto.request.UserSignUpRequestDto;
9+
import com.kusithm.hdmedi_server.domain.user.dto.response.AuthCodeResponseDto;
810
import com.kusithm.hdmedi_server.domain.user.dto.response.UserAuthResponseDto;
11+
import com.kusithm.hdmedi_server.domain.user.repository.AuthCodeRepository;
912
import com.kusithm.hdmedi_server.domain.user.repository.RefreshTokenRepository;
1013
import com.kusithm.hdmedi_server.domain.user.repository.UserRepository;
1114
import com.kusithm.hdmedi_server.global.config.jwt.JwtProvider;
@@ -16,6 +19,8 @@
1619
import lombok.RequiredArgsConstructor;
1720
import org.springframework.stereotype.Service;
1821

22+
import java.security.SecureRandom;
23+
1924
import static com.kusithm.hdmedi_server.domain.user.domain.RefreshToken.createRefreshToken;
2025
import static com.kusithm.hdmedi_server.global.error.exception.ErrorCode.DUPLICATE_USER;
2126
import static com.kusithm.hdmedi_server.global.error.exception.ErrorCode.USER_NOT_FOUND;
@@ -26,9 +31,13 @@
2631
public class AuthService {
2732
private final NaverOAuthProvider naverOAuthProvider;
2833
private final RefreshTokenRepository refreshTokenRepository;
34+
private final AuthCodeRepository authCodeRepository;
2935
private final UserRepository userRepository;
3036
private final JwtProvider jwtProvider;
3137

38+
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
39+
private static final int CODE_LENGTH = 6;
40+
3241
public UserAuthResponseDto signIn(String token, UserAuthRequestDto requestDto) {
3342
Platform platform = Platform.getEnumPlatformFrom(requestDto.getPlatform());
3443
String platformId = getPlatformId(token);
@@ -38,7 +47,7 @@ public UserAuthResponseDto signIn(String token, UserAuthRequestDto requestDto) {
3847
return UserAuthResponseDto.of(issuedToken, findUser);
3948
}
4049

41-
public UserAuthResponseDto signUp(String token, UserSignUpRequestDto requestDto){
50+
public UserAuthResponseDto signUp(String token, UserSignUpRequestDto requestDto) {
4251
Platform platform = Platform.getEnumPlatformFrom(requestDto.getPlatform());
4352
String platformId = getPlatformId(token);
4453
validateDuplicateUser(platform, platformId);
@@ -48,6 +57,39 @@ public UserAuthResponseDto signUp(String token, UserSignUpRequestDto requestDto)
4857
return UserAuthResponseDto.of(issuedToken, saveUser);
4958
}
5059

60+
public AuthCodeResponseDto createAuthCode(Long userId) {
61+
String authCode = createAuthCodeAtSecureRandom(new SecureRandom());
62+
AuthCode createdAuthCode = AuthCode.createAuthCode(authCode, userId);
63+
saveAuthCode(createdAuthCode);
64+
return AuthCodeResponseDto.of(createdAuthCode.getAuthCode());
65+
}
66+
67+
private void saveAuthCode(AuthCode createdAuthCode) {
68+
authCodeRepository.save(createdAuthCode);
69+
}
70+
71+
private boolean duplicateAuthCode(String authCode) {
72+
return authCodeRepository.existsByAuthCode(authCode);
73+
}
74+
75+
private String createAuthCodeAtSecureRandom(SecureRandom random) {
76+
StringBuilder codeBuilder;
77+
do {
78+
codeBuilder = createAuthCodeWithStringBuilder(random);
79+
} while (duplicateAuthCode(codeBuilder.toString()));
80+
return codeBuilder.toString();
81+
}
82+
83+
private StringBuilder createAuthCodeWithStringBuilder(SecureRandom random){
84+
StringBuilder codeBuilder = new StringBuilder();
85+
for (int i = 0; i < CODE_LENGTH; i++) {
86+
int randomIndex = random.nextInt(CHARACTERS.length());
87+
char randomChar = CHARACTERS.charAt(randomIndex);
88+
codeBuilder.append(randomChar);
89+
}
90+
return codeBuilder;
91+
}
92+
5193
private User getUser(Platform platform, String platformId) {
5294
return userRepository.findUserByPlatformAndPlatformId(platform, platformId)
5395
.orElseThrow(() -> new EntityNotFoundException(USER_NOT_FOUND));

0 commit comments

Comments
 (0)