1+ package store .lastdance .controller .user ;
2+
3+ import io .swagger .v3 .oas .annotations .Operation ;
4+ import io .swagger .v3 .oas .annotations .Parameter ;
5+ import io .swagger .v3 .oas .annotations .tags .Tag ;
6+ import jakarta .servlet .http .HttpServletRequest ;
7+ import jakarta .servlet .http .HttpServletResponse ;
8+ import jakarta .validation .Valid ;
9+ import lombok .RequiredArgsConstructor ;
10+ import org .springframework .http .MediaType ;
11+ import org .springframework .http .ResponseEntity ;
12+ import org .springframework .security .core .annotation .AuthenticationPrincipal ;
13+ import org .springframework .web .bind .annotation .*;
14+ import org .springframework .web .multipart .MultipartFile ;
15+ import store .lastdance .converter .UserConverter ;
16+ import store .lastdance .domain .user .User ;
17+ import store .lastdance .dto .response .ApiResponse ;
18+ import store .lastdance .dto .user .UserResponseDTO ;
19+ import store .lastdance .dto .user .UserUpdateRequestDTO ;
20+ import store .lastdance .security .oauth .CustomOAuth2User ;
21+ import store .lastdance .service .user .UserV2QueryService ;
22+ import store .lastdance .service .user .UserV2Service ;
23+
24+ import java .util .UUID ;
25+
26+ @ RestController
27+ @ RequestMapping ("/api/v2/users" )
28+ @ RequiredArgsConstructor
29+ @ Tag (name = "User" , description = "사용자 관리 API" )
30+ public class UserV2Controller {
31+
32+ private final UserV2Service userV2Service ;
33+ private final UserV2QueryService userV2QueryService ;
34+ private final UserConverter userConverter ;
35+
36+ @ PatchMapping ("/me" )
37+ @ Operation (summary = "내 정보 수정" , description = "닉네임 수정" )
38+ public ResponseEntity <ApiResponse <UserResponseDTO >> updateMyInfo (
39+ @ Parameter (hidden = true ) @ AuthenticationPrincipal CustomOAuth2User oAuth2User ,
40+ @ Valid @ RequestBody UserUpdateRequestDTO requestDTO
41+ ) {
42+ UUID userId = oAuth2User .getUserId ();
43+ User updatedUser = userV2Service .updateMyInfo (userId , requestDTO );
44+ UserResponseDTO dto = userConverter .toResponseDTO (updatedUser );
45+ return ResponseEntity .ok (ApiResponse .success (dto ));
46+ }
47+
48+ @ PostMapping (value = "/me/profile-image" , consumes = MediaType .MULTIPART_FORM_DATA_VALUE )
49+ @ Operation (summary = "프로필 이미지 업로드" , description = "JPG, PNG 형식만 지원, 최대 5MB" )
50+ public ResponseEntity <ApiResponse <UserResponseDTO >> uploadProfileImage (
51+ @ Parameter (hidden = true ) @ AuthenticationPrincipal CustomOAuth2User oAuth2User ,
52+ @ RequestParam ("file" ) MultipartFile file
53+ ) {
54+ UUID userId = oAuth2User .getUserId ();
55+ UserResponseDTO dto = userV2Service .updateProfileImage (userId , file );
56+ return ResponseEntity .ok (ApiResponse .success (dto ));
57+ }
58+
59+ @ DeleteMapping ("/me/profile-image" )
60+ @ Operation (summary = "프로필 이미지 삭제" , description = "기본 이미지로 변경" )
61+ public ResponseEntity <ApiResponse <UserResponseDTO >> deleteProfileImage (
62+ @ Parameter (hidden = true ) @ AuthenticationPrincipal CustomOAuth2User oAuth2User
63+ ) {
64+ UUID userId = oAuth2User .getUserId ();
65+ UserResponseDTO dto = userV2Service .deleteProfileImage (userId );
66+ return ResponseEntity .ok (ApiResponse .success (dto ));
67+ }
68+
69+ @ GetMapping ("/nickname/check" )
70+ @ Operation (summary = "닉네임 중복 확인" , description = "사용 가능 여부 체크" )
71+ public ResponseEntity <ApiResponse <Boolean >> checkNickname (
72+ @ RequestParam ("nickname" ) String nickname ,
73+ @ Parameter (hidden = true ) @ AuthenticationPrincipal CustomOAuth2User oAuth2User
74+ ) {
75+ UUID userId = oAuth2User .getUserId ();
76+ boolean isAvailable = userV2QueryService .isNicknameAvailable (userId , nickname );
77+ return ResponseEntity .ok (ApiResponse .success (isAvailable ));
78+ }
79+
80+ @ DeleteMapping ("/me" )
81+ @ Operation (summary = "계정 비활성화" , description = "계정 비활성화 및 토큰 무효화" )
82+ public ResponseEntity <ApiResponse <String >> deactivateAccount (
83+ @ Parameter (hidden = true ) @ AuthenticationPrincipal CustomOAuth2User oAuth2User ,
84+ @ Parameter (hidden = true ) HttpServletRequest request ,
85+ @ Parameter (hidden = true ) HttpServletResponse response
86+ ) {
87+ UUID userId = oAuth2User .getUserId ();
88+ userV2Service .deactivateUser (userId , request , response );
89+ return ResponseEntity .ok (ApiResponse .success ("계정이 비활성화되었습니다." ));
90+ }
91+ }
0 commit comments