Skip to content

Commit a42cdf1

Browse files
authored
[EC-215] feat: 회원정보 수정 API 구현 (#225)
1 parent b90b6e5 commit a42cdf1

File tree

11 files changed

+165
-11
lines changed

11 files changed

+165
-11
lines changed

api/src/main/java/org/example/educheck/domain/member/controller/MyController.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.example.educheck.domain.member.controller;
22

3+
import jakarta.validation.Valid;
34
import lombok.RequiredArgsConstructor;
5+
import org.example.educheck.domain.member.dto.UpdateMyProfileRequestDto;
46
import org.example.educheck.domain.member.dto.response.MyProfileResponseDto;
57
import org.example.educheck.domain.member.entity.Member;
68
import org.example.educheck.domain.member.service.MyService;
@@ -10,9 +12,7 @@
1012
import org.springframework.http.ResponseEntity;
1113
import org.springframework.security.access.prepost.PreAuthorize;
1214
import org.springframework.security.core.annotation.AuthenticationPrincipal;
13-
import org.springframework.web.bind.annotation.GetMapping;
14-
import org.springframework.web.bind.annotation.RequestMapping;
15-
import org.springframework.web.bind.annotation.RestController;
15+
import org.springframework.web.bind.annotation.*;
1616

1717
@RestController
1818
@RequestMapping("/api/my")
@@ -36,4 +36,18 @@ public ResponseEntity<ApiResponse<MyProfileResponseDto>> getMyProfile(@Authentic
3636
)
3737
);
3838
}
39+
40+
@PatchMapping
41+
public ResponseEntity<ApiResponse<Void>> updateMyProfile(@AuthenticationPrincipal Member member, @Valid @RequestBody UpdateMyProfileRequestDto requestDto) {
42+
43+
myService.updateMyProfile(member, requestDto);
44+
45+
return ResponseEntity.ok(
46+
ApiResponse.ok(
47+
"개인 정보 수정 성공",
48+
"OK",
49+
null
50+
)
51+
);
52+
}
3953
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.example.educheck.domain.member.dto;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.PastOrPresent;
5+
import jakarta.validation.constraints.Pattern;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
import org.hibernate.validator.constraints.Length;
11+
12+
import java.time.LocalDate;
13+
14+
@Getter
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class EditMyProfileRequestDto {
19+
@Email(message = "이메일 형식이 올바르지 않습니다.")
20+
private String email;
21+
22+
@Length(min = 2, max = 50, message = "이름은 2개 자리 이상 50개 자리 이하로 입력할 수 있습니다.")
23+
private String name;
24+
25+
@Pattern(regexp = "^\\d{3}-\\d{3,4}-\\d{4}$", message = "전화번호 형식이 올바르지 않습니다.")
26+
private String phoneNumber;
27+
28+
@PastOrPresent(message = "생년월일은 오늘 날짜를 초과할 수 없습니다.")
29+
private LocalDate birthDate;
30+
31+
@Length(min = 8, message = "비밀번호은 8개 자리 이상으로 입력할 수 있습니다.")
32+
private String password;
33+
34+
}

api/src/main/java/org/example/educheck/domain/member/dto/LoginResponseDto.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class LoginResponseDto {
2222
private Long campusId;
2323
private Long courseId;
2424
private String courseName;
25-
private LocalDateTime lastLoginDate;
26-
private LocalDateTime lastPasswordChangeDate;
25+
private LocalDateTime lastLoginDateTime;
26+
private LocalDateTime lastPasswordChangeDateTime;
2727

2828
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.example.educheck.domain.member.dto;
2+
3+
import jakarta.validation.constraints.PastOrPresent;
4+
import jakarta.validation.constraints.Pattern;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
import java.time.LocalDate;
10+
11+
@Getter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class UpdateMyProfileRequestDto {
15+
@Pattern(regexp = "^\\d{3}-\\d{3,4}-\\d{4}$", message = "전화번호 형식이 올바르지 않습니다.")
16+
public String phoneNumber;
17+
@PastOrPresent(message = "생년월일은 오늘 날짜를 초과할 수 없습니다.")
18+
public LocalDate birthDate;
19+
20+
public String currentPassword;
21+
public String newPassword;
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.example.educheck.domain.member.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class EmailCheckResponseDto {
11+
private boolean available;
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.example.educheck.domain.member.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.time.LocalDate;
9+
import java.time.LocalDateTime;
10+
11+
@Getter
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class LoginResponseDto {
16+
17+
private Long id;
18+
private String email;
19+
private String name;
20+
private String phoneNumber;
21+
private LocalDate birthDate;
22+
private Long campusId;
23+
private Long courseId;
24+
private String courseName;
25+
private LocalDateTime lastLoginDate;
26+
private LocalDateTime lastPasswordChangeDate;
27+
28+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.example.educheck.domain.member.dto.response;
2+
3+
public class RefreshTokenRotateResponseDto {
4+
5+
}

api/src/main/java/org/example/educheck/domain/member/entity/Member.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public class Member implements UserDetails {
3030
private String phoneNumber;
3131
private LocalDate birthDate;
3232
private String password;
33-
private LocalDateTime lastLoginDate;
34-
private LocalDateTime lastPasswordChangeDate;
33+
private LocalDateTime lastLoginDateTime;
34+
private LocalDateTime lastPasswordChangeDateTime;
3535

3636
@Enumerated(EnumType.STRING)
3737
@Column(columnDefinition = "VARCHAR(50)")

api/src/main/java/org/example/educheck/domain/member/repository/MemberRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
1717

1818
@Query("""
1919
select new org.example.educheck.domain.member.dto.LoginResponseDto(
20-
m.id, m.email, m.name, m.phoneNumber, m.birthDate, c.id, cr.id, cr.name, m.lastLoginDate, m.lastPasswordChangeDate)
20+
m.id, m.email, m.name, m.phoneNumber, m.birthDate, c.id, cr.id, cr.name, m.lastLoginDateTime, m.lastPasswordChangeDateTime)
2121
from Member m
2222
LEFT JOIN Student s ON s.member.id = m.id
2323
LEFT JOIN Registration r ON r.student.id = s.id
@@ -29,7 +29,7 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
2929

3030
@Query("""
3131
select new org.example.educheck.domain.member.dto.LoginResponseDto(
32-
m.id, m.email, m.name, m.phoneNumber, m.birthDate, c.id, cr.id, cr.name, m.lastLoginDate, m.lastPasswordChangeDate
32+
m.id, m.email, m.name, m.phoneNumber, m.birthDate, c.id, cr.id, cr.name, m.lastLoginDateTime, m.lastPasswordChangeDateTime
3333
)
3434
from Member m
3535
LEFT JOIN Staff st ON st.member.id = m.id

api/src/main/java/org/example/educheck/domain/member/service/AuthService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public LoginResponseDto login(LoginRequestDto requestDto, HttpServletResponse re
9898
setTokensInResponse(authenticate, response);
9999
LoginResponseDto loginResponseDto = roleBasedLogin(member);
100100

101-
member.setLastLoginDate(LocalDateTime.now());
101+
member.setLastLoginDateTime(LocalDateTime.now());
102102

103103
return loginResponseDto;
104104
}

0 commit comments

Comments
 (0)