Skip to content

Commit 0f78457

Browse files
authored
Feature/user language select (#180)
* feature : 유저 언어 기본 1번으로 세팅, 유저 정보 get 요청 시 선택한 언어 노출 * feature : 유저 로그인 타입 추가 * refactor : userFactory * test : test user 수정 * test 수정
1 parent d16d016 commit 0f78457

File tree

13 files changed

+97
-27
lines changed

13 files changed

+97
-27
lines changed

src/main/java/org/ezcode/codetest/application/usermanagement/auth/service/AuthService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.ezcode.codetest.application.usermanagement.user.dto.response.ChangeUserPasswordResponse;
1717
import org.ezcode.codetest.application.usermanagement.user.dto.response.LogoutResponse;
1818
import org.ezcode.codetest.application.usermanagement.user.dto.response.VerifyFindPasswordResponse;
19+
import org.ezcode.codetest.domain.language.model.entity.Language;
20+
import org.ezcode.codetest.domain.language.service.LanguageDomainService;
1921
import org.ezcode.codetest.domain.user.exception.AuthException;
2022
import org.ezcode.codetest.domain.user.exception.UserException;
2123
import org.ezcode.codetest.domain.user.exception.code.AuthExceptionCode;
@@ -41,6 +43,7 @@
4143
public class AuthService {
4244

4345
private final UserDomainService userDomainService;
46+
private final LanguageDomainService languageDomainService;
4447
private final JwtUtil jwtUtil;
4548
private final RedisTemplate<String, String> redisTemplate;
4649
private final MailService mailService;
@@ -80,12 +83,14 @@ private void userRegisterationProcess(SignupRequest request) {
8083
//3. 만약 아예 첫 가입 유저일 때
8184
private void createNewUser(SignupRequest request, String encodedPassword) {
8285
String nickname = userDomainService.generateUniqueNickname();
86+
Language language = languageDomainService.getLanguage(1L); //기본적으로 1번 언어로 가입 시 세팅
8387
User newUser = User.emailUser(
8488
request.getEmail(),
8589
encodedPassword,
8690
request.getUsername(),
8791
nickname,
88-
request.getAge()
92+
request.getAge(),
93+
language
8994
);
9095

9196
userDomainService.createUser(newUser);

src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/request/ModifyUserInfoRequest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ public record ModifyUserInfoRequest(
1717
String introduction,
1818

1919
@Schema(description = "나이", example = "28")
20-
Integer age
20+
Integer age,
21+
22+
@Schema(description = "언어 id", example = "1")
23+
Long languageId
2124
) {
2225
}

src/main/java/org/ezcode/codetest/application/usermanagement/user/dto/response/UserInfoResponse.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.ezcode.codetest.application.usermanagement.user.dto.response;
22

3+
import java.util.List;
4+
5+
import org.ezcode.codetest.domain.language.model.entity.Language;
36
import org.ezcode.codetest.domain.user.model.entity.User;
7+
import org.ezcode.codetest.domain.user.model.enums.AuthType;
48
import org.ezcode.codetest.domain.user.model.enums.Tier;
59
import org.ezcode.codetest.domain.user.model.enums.UserRole;
610

@@ -47,10 +51,18 @@ public class UserInfoResponse {
4751
@Schema(description = "사용자가 푼 문제 총 개수", example = "1235")
4852
private final int totalSolvedCount;
4953

54+
@Schema(description = "사용자가 선택한 언어. 기본적으로 1번 언어로 세팅됩니다", example = "1")
55+
private final Language language;
56+
57+
@Schema(description = "사용자가 가입한 경로(자체/소셜)의 리스트를 보여줍니다", example = "[GOOGLE, GITHUB, EMAIL]")
58+
private final List<AuthType> userAuthTypes;
59+
5060
@Builder
5161
public UserInfoResponse(String username, String email, String nickname, UserRole userRole, Tier tier,
5262
Integer age, String githubUrl, String blogUrl, String profileImageUrl, String introduction, boolean verified,
53-
int totalSolvedCount) {
63+
int totalSolvedCount,
64+
Language language,
65+
List<AuthType> userAuthTypes) {
5466
this.username = username;
5567
this.email = email;
5668
this.nickname = nickname;
@@ -63,6 +75,8 @@ public UserInfoResponse(String username, String email, String nickname, UserRole
6375
this.userRole = userRole;
6476
this.verified = verified;
6577
this.totalSolvedCount = totalSolvedCount;
78+
this.language = language;
79+
this.userAuthTypes = userAuthTypes;
6680
}
6781

6882
public static UserInfoResponse fromEntity(User user) {

src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import java.time.LocalDateTime;
44
import java.time.temporal.ChronoUnit;
55
import java.util.List;
6+
import java.util.stream.Collectors;
67

78
import org.ezcode.codetest.application.usermanagement.user.dto.response.GrantAdminRoleResponse;
89
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserDailySolvedHistoryResponse;
910
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserProfileImageResponse;
1011
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserReviewTokenResponse;
1112
import org.ezcode.codetest.application.usermanagement.user.model.UsersByWeek;
13+
import org.ezcode.codetest.domain.language.model.entity.Language;
14+
import org.ezcode.codetest.domain.language.service.LanguageDomainService;
1215
import org.ezcode.codetest.domain.submission.dto.DailyCorrectCount;
1316
import org.ezcode.codetest.domain.submission.dto.WeeklySolveCount;
1417
import org.ezcode.codetest.application.usermanagement.user.dto.request.ChangeUserPasswordRequest;
@@ -23,6 +26,7 @@
2326
import org.ezcode.codetest.domain.user.exception.code.UserExceptionCode;
2427
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
2528
import org.ezcode.codetest.domain.user.model.entity.User;
29+
import org.ezcode.codetest.domain.user.model.entity.UserAuthType;
2630
import org.ezcode.codetest.domain.user.model.enums.AuthType;
2731
import org.ezcode.codetest.domain.user.model.enums.UserRole;
2832
import org.ezcode.codetest.domain.user.service.MailService;
@@ -46,6 +50,7 @@
4650
public class UserService {
4751

4852
private final UserDomainService userDomainService;
53+
private final LanguageDomainService languageDomainService;
4954
private final SubmissionDomainService submissionDomainService;
5055
private final RedisTemplate<String, String> redisTemplate;
5156
private final S3Uploader s3Uploader;
@@ -55,6 +60,9 @@ public UserInfoResponse getUserInfo(AuthUser authUser) {
5560
log.info("authUserEmail: {}, authUserID : {}", authUser.getEmail(), authUser.getId());
5661
User user = userDomainService.getUserById(authUser.getId());
5762
int userSubmissionCount = submissionDomainService.findSubmissionCountByUserId(user.getId());
63+
List<UserAuthType> userAuthTypes = userDomainService.getUserAuthTypesByUser(user);
64+
List<AuthType> authTypes = userAuthTypes.stream()
65+
.map(UserAuthType::getAuthType).toList();
5866

5967
return UserInfoResponse.builder()
6068
.username(user.getUsername())
@@ -69,19 +77,23 @@ public UserInfoResponse getUserInfo(AuthUser authUser) {
6977
.tier(user.getTier())
7078
.verified(user.isVerified())
7179
.totalSolvedCount(userSubmissionCount)
80+
.language(user.getLanguage())
81+
.userAuthTypes(authTypes)
7282
.build();
7383
}
7484

7585
@Transactional
7686
public UserInfoResponse modifyUserInfo(AuthUser authUser, ModifyUserInfoRequest request, MultipartFile image) {
7787
User user = userDomainService.getUserById(authUser.getId());
88+
Language findLangauge = languageDomainService.getLanguage(request.languageId());
7889

7990
user.modifyUserInfo(
8091
request.nickname(),
8192
request.githubUrl(),
8293
request.blogUrl(),
8394
request.introduction(),
84-
request.age());
95+
request.age(),
96+
findLangauge);
8597

8698
if (image != null && !image.isEmpty()) {
8799
String profileImageUrl = uploadProfileImage(image);
@@ -105,6 +117,7 @@ public UserInfoResponse modifyUserInfo(AuthUser authUser, ModifyUserInfoRequest
105117
.githubUrl(user.getGithubUrl())
106118
.userRole(user.getRole())
107119
.tier(user.getTier())
120+
.language(user.getLanguage())
108121
.build();
109122
}
110123

src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,23 @@
44
import java.util.List;
55

66
import org.ezcode.codetest.common.base.entity.BaseEntity;
7+
import org.ezcode.codetest.domain.language.model.entity.Language;
78
import org.ezcode.codetest.domain.user.model.enums.Tier;
89
import org.ezcode.codetest.domain.user.model.enums.UserRole;
910

1011
import jakarta.persistence.CascadeType;
1112
import jakarta.persistence.Column;
12-
import jakarta.persistence.ElementCollection;
1313
import jakarta.persistence.Entity;
1414
import jakarta.persistence.EnumType;
1515
import jakarta.persistence.Enumerated;
1616
import jakarta.persistence.FetchType;
1717
import jakarta.persistence.GeneratedValue;
1818
import jakarta.persistence.GenerationType;
1919
import jakarta.persistence.Id;
20+
import jakarta.persistence.JoinColumn;
21+
import jakarta.persistence.ManyToOne;
2022
import jakarta.persistence.OneToMany;
23+
import jakarta.persistence.OneToOne;
2124
import jakarta.persistence.Table;
2225
import lombok.AccessLevel;
2326
import lombok.Builder;
@@ -72,17 +75,20 @@ public class User extends BaseEntity {
7275
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
7376
private List<UserAuthType> userAuthTypes = new ArrayList<>();
7477

78+
@ManyToOne(fetch = FetchType.LAZY)
79+
@JoinColumn(name = "language_id")
80+
private Language language;
81+
7582
private boolean verified; //이메일 인증 여부
7683

7784
private boolean gitPushStatus; //깃허브 자동 push 여부
7885

79-
8086
/*
8187
처음 유저 생성(가입) 시에는 기본 정보만 받음
8288
- 이메일, 비번, 이름, 별명, 나이
8389
-> 이후 회원정보 업데이트할 때, 원하는 정보를 입력할 수 있도록 함
8490
*/
85-
public static User emailUser(String email, String password, String username, String nickname, Integer age){
91+
public static User emailUser(String email, String password, String username, String nickname, Integer age, Language language) {
8692
return User.builder()
8793
.email(email)
8894
.password(password)
@@ -94,14 +100,15 @@ public static User emailUser(String email, String password, String username, Str
94100
.isDeleted(false)
95101
.verified(false)
96102
.gitPushStatus(false)
103+
.language(language)
97104
.build();
98105
}
99106

100107
/*
101108
OAuth2로 로그인한 유저 저장
102109
구글 이외의 다른 소셜 로그인 확장 가능성을 고려해 socialUser 이름 유지
103110
*/
104-
public static User socialUser(String email, String username, String nickname, String password){
111+
public static User socialUser(String email, String username, String nickname, String password, Language language) {
105112
return User.builder()
106113
.email(email)
107114
.username(username)
@@ -112,11 +119,12 @@ public static User socialUser(String email, String username, String nickname, St
112119
.isDeleted(false)
113120
.verified(false)
114121
.gitPushStatus(false)
122+
.language(language)
115123
.build();
116124
}
117125

118126
//깃허브 아이디와 url을 함께 저장하기 위해 따로 저장
119-
public static User githubUser(String email, String username, String nickname, String password, String githubUrl){
127+
public static User githubUser(String email, String username, String nickname, String password, String githubUrl, Language language){
120128
return User.builder()
121129
.email(email)
122130
.username(username)
@@ -128,13 +136,14 @@ public static User githubUser(String email, String username, String nickname, St
128136
.verified(false)
129137
.githubUrl(githubUrl)
130138
.gitPushStatus(false)
139+
.language(language)
131140
.build();
132141
}
133142

134143

135144
@Builder
136145
public User(String email, String password, String username, String nickname,
137-
Integer age, Tier tier, UserRole role, boolean isDeleted, boolean verified, String githubUrl, boolean gitPushStatus) {
146+
Integer age, Tier tier, UserRole role, boolean isDeleted, boolean verified, String githubUrl, boolean gitPushStatus, Language language) {
138147
this.email = email;
139148
this.password = password;
140149
this.username = username;
@@ -146,18 +155,20 @@ public User(String email, String password, String username, String nickname,
146155
this.verified = verified;
147156
this.githubUrl = githubUrl;
148157
this.gitPushStatus = gitPushStatus;
158+
this.language = language;
149159
}
150160

151161
/*
152162
유저 정보 업데이트
153163
- 만약 입력 값이 없다면, 기존 값 유지
154164
*/
155-
public void modifyUserInfo(String nickname, String githubUrl, String blogUrl, String introduction, Integer age){
165+
public void modifyUserInfo(String nickname, String githubUrl, String blogUrl, String introduction, Integer age, Language language) {
156166
this.nickname = (nickname == null || nickname.isBlank()) ? this.nickname : nickname;
157167
this.githubUrl = (githubUrl == null || githubUrl.isBlank()) ? this.githubUrl : githubUrl;
158168
this.blogUrl = (blogUrl == null || blogUrl.isBlank()) ? this.blogUrl : blogUrl;
159169
this.introduction = (introduction == null || introduction.isBlank()) ? this.introduction : introduction;
160170
this.age = (age == null) ? this.age : age;
171+
this.language = (language == null) ? this.language : language;
161172
}
162173

163174

src/main/java/org/ezcode/codetest/domain/user/model/entity/UserFactory.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import java.util.UUID;
44

55
import org.ezcode.codetest.application.usermanagement.user.dto.response.OAuth2Response;
6+
import org.ezcode.codetest.domain.language.model.entity.Language;
67

78
public class UserFactory {
89
public static User createSocialUser(
910
OAuth2Response response,
1011
String nickname,
11-
String provider
12+
String provider,
13+
Language language
1214
) {
1315
//나중에 확장성 고려해서 switch문 사용
1416
return switch (provider.toLowerCase()) {
@@ -18,13 +20,16 @@ public static User createSocialUser(
1820
response.getName(),
1921
nickname,
2022
UUID.randomUUID().toString(),
21-
response.getGithubUrl()
23+
response.getGithubUrl(),
24+
language
25+
2226
);
2327
default -> User.socialUser(
2428
response.getEmail(),
2529
response.getName(),
2630
nickname,
27-
UUID.randomUUID().toString()
31+
UUID.randomUUID().toString(),
32+
language
2833
);
2934
};
3035
}

src/main/java/org/ezcode/codetest/domain/user/repository/UserAuthTypeRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ public interface UserAuthTypeRepository {
1010
void createUserAuthType(UserAuthType userAuthType);
1111

1212
List<AuthType> getUserAuthType(User user);
13+
14+
List<UserAuthType> getUserAuthTypesByUser(User user);
1315
}

src/main/java/org/ezcode/codetest/domain/user/service/CustomOAuth2UserService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.ezcode.codetest.application.usermanagement.user.dto.response.GithubOAuth2Response;
66
import org.ezcode.codetest.application.usermanagement.user.dto.response.GoogleOAuth2Response;
77
import org.ezcode.codetest.application.usermanagement.user.dto.response.OAuth2Response;
8+
import org.ezcode.codetest.domain.language.model.entity.Language;
9+
import org.ezcode.codetest.domain.language.service.LanguageDomainService;
810
import org.ezcode.codetest.domain.user.exception.UserException;
911
import org.ezcode.codetest.domain.user.exception.code.UserExceptionCode;
1012
import org.ezcode.codetest.domain.user.model.entity.CustomOAuth2User;
@@ -33,6 +35,7 @@ public class CustomOAuth2UserService extends DefaultOAuth2UserService {
3335
private final UserRepository userRepository;
3436
private final UserAuthTypeRepository userAuthTypeRepository;
3537
private final UserDomainService userDomainService;
38+
private final LanguageDomainService languageDomainService;
3639
private final UserGithubService userGithubService;
3740

3841
@Override
@@ -82,7 +85,8 @@ private void processUser(
8285

8386
private void createNewUser(OAuth2Response response, AuthType authType, String provider) {
8487
String nickname = userDomainService.generateUniqueNickname();
85-
User newUser = UserFactory.createSocialUser(response, nickname, provider);
88+
Language language = languageDomainService.getLanguage(1L); //기본적으로 1번 언어로 가입 시 세팅
89+
User newUser = UserFactory.createSocialUser(response, nickname, provider, language);
8690
newUser.setVerified();
8791
newUser.setReviewToken(20);
8892
userRepository.createUser(newUser);

src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,5 +128,8 @@ public User getUserByEmail(String email) {
128128
return userRepository.getUserByEmail(email);
129129
}
130130

131+
public List<UserAuthType> getUserAuthTypesByUser(User user) {
132+
return userAuthTypeRepository.getUserAuthTypesByUser(user);
133+
}
131134

132135
}

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserAuthTypeRepositoryImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,11 @@ public List<AuthType> getUserAuthType(User user) {
2727
.map(UserAuthType::getAuthType).toList();
2828
}
2929

30+
@Override
31+
public List<UserAuthType> getUserAuthTypesByUser(User user) {
32+
userAuthTypeJpaRepository.findUserAuthTypeByUser(user).stream()
33+
.map(UserAuthType::getAuthType).toList();
34+
return List.of();
35+
}
36+
3037
}

0 commit comments

Comments
 (0)