Skip to content

Commit aa3dcfa

Browse files
authored
Merge pull request #38 from Go-Socket-Project/feature/profile-modify
Profile Modify
2 parents 22fa66a + 63cfeb7 commit aa3dcfa

File tree

6 files changed

+93
-4
lines changed

6 files changed

+93
-4
lines changed

src/main/java/com/mycom/socket/auth/config/SecurityConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
4040

4141
.authorizeHttpRequests(auth -> auth
4242
.requestMatchers(
43-
"/","/api/auth/**", "/swagger-ui/**", "/v3/api-docs/**"
43+
"/","/api/auth/**", "/api/profile/**", "/swagger-ui/**", "/v3/api-docs/**"
4444
).permitAll()
4545
.anyRequest()
4646
.authenticated());
Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,51 @@
11
package com.mycom.socket.go_socket.controller;
22

33
import com.mycom.socket.auth.security.MemberDetails;
4+
import com.mycom.socket.go_socket.dto.request.PasswordUpdateRequest;
5+
import com.mycom.socket.go_socket.dto.request.ProfileUpdateRequest;
46
import com.mycom.socket.go_socket.dto.response.ProfileResponse;
7+
import com.mycom.socket.go_socket.entity.Member;
8+
import com.mycom.socket.go_socket.service.MemberService;
9+
import jakarta.validation.Valid;
510
import lombok.RequiredArgsConstructor;
611
import org.springframework.security.core.annotation.AuthenticationPrincipal;
7-
import org.springframework.web.bind.annotation.GetMapping;
8-
import org.springframework.web.bind.annotation.RequestMapping;
9-
import org.springframework.web.bind.annotation.RestController;
12+
import org.springframework.web.bind.annotation.*;
1013

1114
@RestController
1215
@RequiredArgsConstructor
1316
@RequestMapping("/api/profile")
1417
public class ProfileController {
1518

19+
private final MemberService memberService;
20+
1621
@GetMapping
1722
public ProfileResponse getProfile(@AuthenticationPrincipal MemberDetails memberDetails) {
1823
return ProfileResponse.of(memberDetails.getMember());
1924
}
25+
26+
@PutMapping
27+
public ProfileResponse updateProfile(
28+
@AuthenticationPrincipal MemberDetails memberDetails,
29+
@RequestBody @Valid ProfileUpdateRequest request
30+
) {
31+
Member updatedMember = memberService.updateProfile(
32+
memberDetails.getMember().getEmail(),
33+
request.nickname(),
34+
request.intro()
35+
);
36+
return ProfileResponse.of(updatedMember);
37+
}
38+
39+
@PutMapping("/password")
40+
public void updatePassword(
41+
@AuthenticationPrincipal MemberDetails memberDetails,
42+
@RequestBody @Valid PasswordUpdateRequest request
43+
) {
44+
memberService.updatePassword(
45+
memberDetails.getMember().getEmail(),
46+
request.currentPassword(),
47+
request.newPassword()
48+
);
49+
}
50+
2051
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.mycom.socket.go_socket.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.Size;
5+
6+
public record PasswordUpdateRequest(
7+
@NotBlank(message = "현재 비밀번호는 필수입니다")
8+
String currentPassword,
9+
@NotBlank(message = "새 비밀번호는 필수입니다")
10+
@Size(min = 8, message = "비밀번호는 8자 이상이어야 합니다")
11+
String newPassword
12+
) {}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.mycom.socket.go_socket.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.Size;
5+
6+
public record ProfileUpdateRequest(
7+
@NotBlank(message = "닉네임은 필수입니다")
8+
@Size(min = 2, max = 20, message = "닉네임은 2자 이상 20자 이하여야 합니다")
9+
String nickname,
10+
@Size(max = 100, message = "자기소개는 100자를 초과할 수 없습니다")
11+
String intro
12+
) {}

src/main/java/com/mycom/socket/go_socket/entity/Member.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,13 @@ public Member(String email, String nickname, String password, String intro, Memb
5050
public void updateRefreshToken(String updateRefreshToken) {
5151
this.refreshToken = updateRefreshToken;
5252
}
53+
54+
public void updateProfile(String nickname, String intro) {
55+
this.nickname = nickname;
56+
this.intro = intro;
57+
}
58+
59+
public void updatePassword(String encodedPassword) {
60+
this.password = encodedPassword;
61+
}
5362
}

src/main/java/com/mycom/socket/go_socket/service/MemberService.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.mycom.socket.go_socket.service;
22

3+
import com.mycom.socket.global.exception.NotFoundException;
4+
import com.mycom.socket.go_socket.entity.Member;
35
import com.mycom.socket.go_socket.repository.MemberRepository;
46
import lombok.RequiredArgsConstructor;
7+
import org.springframework.security.crypto.password.PasswordEncoder;
58
import org.springframework.stereotype.Service;
69
import org.springframework.transaction.annotation.Transactional;
710

@@ -11,4 +14,26 @@
1114
public class MemberService {
1215

1316
private final MemberRepository memberRepository;
17+
private final PasswordEncoder passwordEncoder;
18+
19+
@Transactional
20+
public Member updateProfile(String email, String nickname, String intro) {
21+
Member member = memberRepository.findByEmail(email)
22+
.orElseThrow(() -> new NotFoundException("사용자를 찾을 수 없습니다."));
23+
24+
member.updateProfile(nickname, intro);
25+
return member;
26+
}
27+
28+
@Transactional
29+
public void updatePassword(String email, String currentPassword, String newPassword) {
30+
Member member = memberRepository.findByEmail(email)
31+
.orElseThrow(() -> new NotFoundException("현재 비밀번호가 일치하지 않습니다."));
32+
33+
if (!passwordEncoder.matches(currentPassword, member.getPassword())) {
34+
throw new NotFoundException("새 비밀번호는 현재 비밀번호와 달라야 합니다.");
35+
}
36+
37+
member.updatePassword(passwordEncoder.encode(newPassword));
38+
}
1439
}

0 commit comments

Comments
 (0)