Skip to content

Commit 1ad1e77

Browse files
Merge pull request #157 from prgrms-web-devcourse-final-project/feat/#155
[User] 유저 세팅 API 구현
2 parents 586475d + e1acf9d commit 1ad1e77

8 files changed

Lines changed: 206 additions & 34 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/auth/service/AuthService.java

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.back.web7_9_codecrete_be.domain.users.entity.SocialType;
1010
import com.back.web7_9_codecrete_be.domain.users.entity.User;
1111
import com.back.web7_9_codecrete_be.domain.users.repository.UserRepository;
12+
import com.back.web7_9_codecrete_be.domain.users.service.UserService;
1213
import com.back.web7_9_codecrete_be.domain.users.util.NicknameGenerator;
1314
import com.back.web7_9_codecrete_be.global.error.code.AuthErrorCode;
1415
import com.back.web7_9_codecrete_be.global.error.code.UserErrorCode;
@@ -19,13 +20,13 @@
1920
import org.springframework.transaction.annotation.Transactional;
2021

2122
import java.security.SecureRandom;
22-
import java.time.LocalDate;
2323

2424
@Service
2525
@RequiredArgsConstructor
2626
@Transactional
2727
public class AuthService {
2828
private final UserRepository userRepository;
29+
private final UserService userService;
2930
private final PasswordEncoder passwordEncoder;
3031
private final EmailService emailService;
3132
private final TokenService tokenService;
@@ -51,17 +52,7 @@ public void signUp(SignupRequest req) {
5152
throw new BusinessException(UserErrorCode.NICKNAME_DUPLICATED);
5253
}
5354

54-
User user = User.builder()
55-
.email(req.getEmail())
56-
.nickname(req.getNickname())
57-
.password(passwordEncoder.encode(req.getPassword()))
58-
.birth(LocalDate.parse(req.getBirth()))
59-
.profileImage(req.getProfileImage())
60-
.socialType(SocialType.LOCAL)
61-
.socialId(null)
62-
.build();
63-
64-
userRepository.save(user);
55+
userService.createLocalUser(req, passwordEncoder.encode(req.getPassword()));
6556

6657
emailService.clearVerifiedEmail(req.getEmail());
6758
}
@@ -174,17 +165,13 @@ private User registerKakaoUser(KakaoUserInfo info) {
174165

175166
String nickname = nicknameGenerator.generate();
176167

177-
User user = User.builder()
178-
.email(info.getEmail())
179-
.nickname(nickname)
180-
.password(null)
181-
.birth(null)
182-
.profileImage(info.getProfileImageUrl())
183-
.socialType(SocialType.KAKAO)
184-
.socialId(info.getSocialId())
185-
.build();
186-
187-
return userRepository.save(user);
168+
return userService.createSocialUser(
169+
info.getEmail(),
170+
nickname,
171+
info.getProfileImageUrl(),
172+
SocialType.KAKAO,
173+
info.getSocialId()
174+
);
188175
}
189176

190177
@Transactional
@@ -223,16 +210,12 @@ private User registerGoogleUser(GoogleUserInfo info) {
223210

224211
String nickname = nicknameGenerator.generate();
225212

226-
User user = User.builder()
227-
.email(info.getEmail())
228-
.nickname(nickname)
229-
.password(null)
230-
.birth(null)
231-
.profileImage(info.getProfileImageUrl())
232-
.socialType(SocialType.GOOGLE)
233-
.socialId(info.getSocialId())
234-
.build();
235-
236-
return userRepository.save(user);
213+
return userService.createSocialUser(
214+
info.getEmail(),
215+
nickname,
216+
info.getProfileImageUrl(),
217+
SocialType.GOOGLE,
218+
info.getSocialId()
219+
);
237220
}
238221
}

src/main/java/com/back/web7_9_codecrete_be/domain/users/controller/UserController.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.back.web7_9_codecrete_be.domain.users.controller;
22

33
import com.back.web7_9_codecrete_be.domain.auth.service.TokenService;
4+
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserSettingUpdateRequest;
45
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserUpdateNicknameRequest;
56
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserUpdatePasswordRequest;
67
import com.back.web7_9_codecrete_be.domain.users.dto.response.UserResponse;
8+
import com.back.web7_9_codecrete_be.domain.users.dto.response.UserSettingResponse;
79
import com.back.web7_9_codecrete_be.domain.users.entity.User;
810
import com.back.web7_9_codecrete_be.domain.users.service.UserService;
911
import com.back.web7_9_codecrete_be.global.rq.Rq;
@@ -87,4 +89,22 @@ public RsData<?> restoreByToken(@RequestParam String token) {
8789
userService.restoreByToken(token);
8890
return RsData.success("계정이 성공적으로 복구되었습니다.");
8991
}
92+
93+
@Operation(summary = "유저 설정 조회", description = "로그인한 사용자의 설정 정보를 조회합니다.")
94+
@GetMapping("/settings")
95+
public RsData<?> getMySettings() {
96+
User user = rq.getUser();
97+
UserSettingResponse response = userService.getMySettings(user);
98+
return RsData.success("유저 설정 조회 성공", response);
99+
}
100+
101+
@Operation(summary = "유저 설정 수정", description = "로그인한 사용자의 설정 정보를 부분 수정합니다.")
102+
@PatchMapping("/settings")
103+
public RsData<?> updateMySettings(
104+
@RequestBody UserSettingUpdateRequest req
105+
) {
106+
User user = rq.getUser();
107+
userService.updateMySettings(user, req);
108+
return RsData.success("유저 설정 수정 성공");
109+
}
90110
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.back.web7_9_codecrete_be.domain.users.dto.request;
2+
3+
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class UserSettingUpdateRequest{
9+
@Schema(description = "이메일 알림 설정", example = "true")
10+
Boolean emailNotifications;
11+
12+
@Schema(description = "다크 모드 설정", example = "false")
13+
Boolean darkMode;
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.back.web7_9_codecrete_be.domain.users.dto.response;
2+
3+
import com.back.web7_9_codecrete_be.domain.users.entity.UserSetting;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class UserSettingResponse {
8+
9+
private final boolean emailNotifications;
10+
private final boolean darkMode;
11+
12+
public UserSettingResponse(boolean emailNotifications, boolean darkMode) {
13+
this.emailNotifications = emailNotifications;
14+
this.darkMode = darkMode;
15+
}
16+
17+
public static UserSettingResponse from(UserSetting setting) {
18+
return new UserSettingResponse(
19+
setting.isEmailNotifications(),
20+
setting.isDarkMode()
21+
);
22+
}
23+
}

src/main/java/com/back/web7_9_codecrete_be/domain/users/entity/User.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ public class User {
6969
@Column(name = "social_id", length = 100)
7070
private String socialId;
7171

72+
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
73+
private UserSetting userSetting;
74+
7275
@Builder
7376
public User(String email,
7477
String nickname,
@@ -120,4 +123,8 @@ public void restore() {
120123
this.status = UserStatus.ACTIVE;
121124
this.deletedDate = null;
122125
}
126+
127+
public void initSetting() {
128+
this.userSetting = new UserSetting(this);
129+
}
123130
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.back.web7_9_codecrete_be.domain.users.entity;
2+
3+
import jakarta.persistence.*;
4+
import lombok.AccessLevel;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@Entity
10+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
11+
@Table(name = "user_settings")
12+
public class UserSetting {
13+
@Id
14+
private Long userId;
15+
16+
@OneToOne(fetch = FetchType.LAZY, optional = false)
17+
@JoinColumn(name = "user_id", nullable = false)
18+
@MapsId
19+
private User user;
20+
21+
@Column(name = "email_notifications", nullable = false)
22+
private boolean emailNotifications;
23+
24+
@Column(name = "dark_mode", nullable = false)
25+
private boolean darkMode;
26+
27+
public UserSetting(User user) {
28+
this.user = user;
29+
this.emailNotifications = true; // 기본값 설정
30+
this.darkMode = false; // 기본값 설정
31+
}
32+
33+
public void changeEmailNotifications(boolean emailNotifications) {
34+
this.emailNotifications = emailNotifications;
35+
}
36+
37+
public void changeDarkMode(boolean darkMode) {
38+
this.darkMode = darkMode;
39+
}
40+
41+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.back.web7_9_codecrete_be.domain.users.repository;
2+
3+
import com.back.web7_9_codecrete_be.domain.users.entity.UserSetting;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface UserSettingRepository extends JpaRepository<UserSetting, Long> {
7+
}

src/main/java/com/back/web7_9_codecrete_be/domain/users/service/UserService.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.back.web7_9_codecrete_be.domain.users.service;
22

33

4+
import com.back.web7_9_codecrete_be.domain.auth.dto.request.SignupRequest;
45
import com.back.web7_9_codecrete_be.domain.auth.service.TokenService;
56
import com.back.web7_9_codecrete_be.domain.email.service.EmailService;
7+
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserSettingUpdateRequest;
68
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserUpdateNicknameRequest;
79
import com.back.web7_9_codecrete_be.domain.users.dto.request.UserUpdatePasswordRequest;
810
import com.back.web7_9_codecrete_be.domain.users.dto.response.UserResponse;
11+
import com.back.web7_9_codecrete_be.domain.users.dto.response.UserSettingResponse;
12+
import com.back.web7_9_codecrete_be.domain.users.entity.SocialType;
913
import com.back.web7_9_codecrete_be.domain.users.entity.User;
14+
import com.back.web7_9_codecrete_be.domain.users.entity.UserSetting;
1015
import com.back.web7_9_codecrete_be.domain.users.repository.UserRepository;
1116
import com.back.web7_9_codecrete_be.domain.users.repository.UserRestoreTokenRedisRepository;
1217
import com.back.web7_9_codecrete_be.global.error.code.UserErrorCode;
@@ -20,6 +25,7 @@
2025
import org.springframework.transaction.annotation.Transactional;
2126
import org.springframework.web.multipart.MultipartFile;
2227

28+
import java.time.LocalDate;
2329
import java.time.LocalDateTime;
2430
import java.util.UUID;
2531

@@ -44,6 +50,52 @@ public UserResponse getMyInfo(User user) {
4450
return UserResponse.from(user);
4551
}
4652

53+
// 회원 가입(로컬)
54+
public User createLocalUser(SignupRequest req, String encodedPassword) {
55+
56+
User user = User.builder()
57+
.email(req.getEmail())
58+
.nickname(req.getNickname())
59+
.password(encodedPassword)
60+
.birth(LocalDate.parse(req.getBirth()))
61+
.profileImage(req.getProfileImage())
62+
.socialType(SocialType.LOCAL)
63+
.socialId(null)
64+
.build();
65+
66+
user.initSetting();
67+
68+
userRepository.save(user);
69+
70+
return user;
71+
}
72+
73+
// 회원 가입(소셜)
74+
public User createSocialUser(
75+
String email,
76+
String nickname,
77+
String profileImage,
78+
SocialType socialType,
79+
String socialId
80+
) {
81+
82+
User user = User.builder()
83+
.email(email)
84+
.nickname(nickname)
85+
.password(null)
86+
.birth(null)
87+
.profileImage(profileImage)
88+
.socialType(socialType)
89+
.socialId(socialId)
90+
.build();
91+
92+
user.initSetting();
93+
94+
userRepository.save(user);
95+
96+
return user;
97+
}
98+
4799
// 닉네임 수정
48100
public UserResponse updateNickname(User user, UserUpdateNicknameRequest req) {
49101
validateActiveUser(user);
@@ -170,4 +222,29 @@ public void restoreByToken(String token) {
170222
userRestoreTokenRedisRepository.delete(token);
171223
}
172224

225+
@Transactional(readOnly = true)
226+
public UserSettingResponse getMySettings(User user) {
227+
validateActiveUser(user);
228+
229+
User managedUser = userRepository.findById(user.getId())
230+
.orElseThrow(() -> new BusinessException(UserErrorCode.USER_NOT_FOUND));
231+
232+
return UserSettingResponse.from(managedUser.getUserSetting());
233+
}
234+
235+
public void updateMySettings(User user, UserSettingUpdateRequest req) {
236+
validateActiveUser(user);
237+
238+
User managedUser = userRepository.findById(user.getId())
239+
.orElseThrow(() -> new BusinessException(UserErrorCode.USER_NOT_FOUND));
240+
241+
UserSetting setting = managedUser.getUserSetting();
242+
243+
if (req.getEmailNotifications() != null) {
244+
setting.changeEmailNotifications(req.getEmailNotifications());
245+
}
246+
if (req.getDarkMode() != null) {
247+
setting.changeDarkMode(req.getDarkMode());
248+
}
249+
}
173250
}

0 commit comments

Comments
 (0)