-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathUserController.java
More file actions
122 lines (111 loc) · 5.66 KB
/
UserController.java
File metadata and controls
122 lines (111 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.sprint.mission.discodeit.controller;
import com.sprint.mission.discodeit.dto.BinaryContentCreateDto;
import com.sprint.mission.discodeit.dto.BinaryContentDto;
import com.sprint.mission.discodeit.dto.UserCreateRequest;
import com.sprint.mission.discodeit.dto.UserDto;
import com.sprint.mission.discodeit.dto.UserStatusDto;
import com.sprint.mission.discodeit.dto.UserStatusUpdateRequest;
import com.sprint.mission.discodeit.dto.UserUpdateRequest;
import com.sprint.mission.discodeit.service.BinaryContentService;
import com.sprint.mission.discodeit.service.UserService;
import com.sprint.mission.discodeit.service.UserStatusService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.ArraySchema;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import java.io.IOException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
import org.springframework.web.multipart.MultipartFile;
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/users")
@Slf4j
public class UserController {
private final UserService userService;
private final UserStatusService userStatusService;
private final BinaryContentService binaryContentService;
// 사용자 등록
@Operation(summary = "사용자 등록", description = "새로운 사용자를 시스템에 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "등록 성공",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserDto.class)))
})
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<UserDto> join(
@RequestPart("userCreateRequest") @Valid UserCreateRequest dto,
@RequestPart(value = "profile", required = false) MultipartFile profile) throws IOException {
log.info("사용자 등록 요청: username={}, email={}", dto.username(), dto.email());
UserDto result = userService.create(dto, profile);
log.info("사용자 등록 완료: username={}, email={}", dto.username(), dto.email());
return ResponseEntity.status(HttpStatus.CREATED).body(result);
}
// 사용자 정보 수정
@Operation(summary = "사용자 정보 수정", description = "이름, 프로필 이미지 등 사용자의 기본 정보를 수정합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "수정 성공",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserDto.class))),
@ApiResponse(responseCode = "404", description = "사용자를 찾을 수 없음")
})
@RequestMapping(value = "/{userId}", method = RequestMethod.PATCH, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<UserDto> update(
@PathVariable UUID userId,
@RequestPart("userUpdateRequest") @Valid UserUpdateRequest dto,
@RequestPart(value = "profile", required = false) MultipartFile profile) throws IOException {
log.info("사용자 수정 요청: userId={}", userId);
UserDto result = userService.update(userId, dto, profile);
log.info("사용자 수정 완료: userId={}", userId);
return ResponseEntity.status(HttpStatus.OK).body(result);
}
// 사용자 삭제
@Operation(summary = "사용자 삭제", description = "ID에 해당하는 사용자를 영구 삭제합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "204", description = "삭제 성공")
})
@RequestMapping(value = "/{userId}", method = RequestMethod.DELETE)
public ResponseEntity<Void> delete(@PathVariable UUID userId) {
log.info("사용자 삭제 요청: userId={}", userId);
userService.delete(userId);
log.info("사용자 삭제 완료: userId={}", userId);
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
}
// 모든 사용자 조회
@Operation(summary = "모든 사용자 조회", description = "시스템에 등록된 전체 사용자 목록을 가져옵니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공",
content = @Content(
mediaType = "application/json",
array = @ArraySchema(schema = @Schema(implementation = UserDto.class))
))
})
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<UserDto>> findAll() {
return new ResponseEntity<>(userService.findAll(), HttpStatus.OK);
}
// 사용자 온라인 상태 업데이트
@Operation(
summary = "사용자 온라인 상태 업데이트",
description = "사용자의 상태(ONLINE, OFFLINE, DONOTDISTURB 등)를 변경합니다."
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "상태 업데이트 성공",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserDto.class))),
@ApiResponse(responseCode = "404", description = "사용자 상태 정보를 찾을 수 없음")
})
@RequestMapping(value = "/{userId}/userStatus", method = RequestMethod.PATCH)
public ResponseEntity<UserStatusDto> updateStatus(@PathVariable UUID userId,
@RequestBody @Valid UserStatusUpdateRequest dto) {
return ResponseEntity
.status(HttpStatus.OK)
.body(userStatusService.updateByUserId(userId, dto));
}
}