diff --git a/perfume-api/src/docs/asciidoc/index.adoc b/perfume-api/src/docs/asciidoc/index.adoc index 09de5704..ebc0dcf0 100644 --- a/perfume-api/src/docs/asciidoc/index.adoc +++ b/perfume-api/src/docs/asciidoc/index.adoc @@ -87,6 +87,13 @@ include::{snippets}/update-user-profile/http-response.adoc[] === 실패 응답 include::{snippets}/update-user-profile-failed/http-response.adoc[] +== 프로필 사진 수정 +=== 요청 +include::{snippets}/update-user-profile-pic/http-request.adoc[] + +=== 응답 +include::{snippets}/update-user-profile-pic/http-response.adoc[] + == 로그인 중인 회원 탈퇴 === 요청 include::{snippets}/leave-user/http-request.adoc[] diff --git a/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java index bf897045..fe78cf9d 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java +++ b/perfume-api/src/main/java/io/perfume/api/user/adapter/in/http/UserSupportController.java @@ -10,6 +10,8 @@ import io.perfume.api.user.application.port.in.dto.UserProfileResult; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; +import java.io.IOException; +import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -19,9 +21,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import java.io.IOException; -import java.time.LocalDateTime; - @RestController @RequiredArgsConstructor @RequestMapping("/v1") diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateProfilePicUseCase.java b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateProfilePicUseCase.java index 983b1a76..7380ebc2 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateProfilePicUseCase.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/UpdateProfilePicUseCase.java @@ -1,9 +1,7 @@ package io.perfume.api.user.application.port.in; -import java.time.LocalDateTime; - import io.perfume.api.user.application.port.in.dto.UpdateProfilePicResult; -import org.springframework.web.multipart.MultipartFile; +import java.time.LocalDateTime; public interface UpdateProfilePicUseCase { diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfilePicResult.java b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfilePicResult.java index 17c05233..5695ecdc 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfilePicResult.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/port/in/dto/UpdateProfilePicResult.java @@ -4,7 +4,7 @@ public record UpdateProfilePicResult(Long userId, Long fileId, String url) { - public static UpdateProfilePicResult from(Long userId, FileResult fileResult) { - return new UpdateProfilePicResult(userId, fileResult.id(), fileResult.url()); - } + public static UpdateProfilePicResult from(Long userId, FileResult fileResult) { + return new UpdateProfilePicResult(userId, fileResult.id(), fileResult.url()); + } } diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/service/SupportUserService.java b/perfume-api/src/main/java/io/perfume/api/user/application/service/SupportUserService.java index 85d5b89c..bf456702 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/service/SupportUserService.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/service/SupportUserService.java @@ -61,8 +61,8 @@ public String findEncryptedUsername(String email) { @Override public void leave(Long userId) { try { - User user = userQueryRepository.loadUser(userId) - .orElseThrow(() -> new UserNotFoundException(userId)); + User user = + userQueryRepository.loadUser(userId).orElseThrow(() -> new UserNotFoundException(userId)); LocalDateTime now = LocalDateTime.now(); user.softDelete(now); userRepository.save(user); diff --git a/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateProfilePicService.java b/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateProfilePicService.java index 6fc7c572..5ce80925 100644 --- a/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateProfilePicService.java +++ b/perfume-api/src/main/java/io/perfume/api/user/application/service/UpdateProfilePicService.java @@ -8,11 +8,10 @@ import io.perfume.api.user.application.port.out.UserQueryRepository; import io.perfume.api.user.application.port.out.UserRepository; import io.perfume.api.user.domain.User; +import java.time.LocalDateTime; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; - @Service @Transactional public class UpdateProfilePicService implements UpdateProfilePicUseCase { @@ -22,8 +21,9 @@ public class UpdateProfilePicService implements UpdateProfilePicUseCase { private final FileService fileUploadService; public UpdateProfilePicService( - UserQueryRepository userQueryRepository, - UserRepository userRepository, FileService fileUploadService) { + UserQueryRepository userQueryRepository, + UserRepository userRepository, + FileService fileUploadService) { this.userQueryRepository = userQueryRepository; this.userRepository = userRepository; this.fileUploadService = fileUploadService; @@ -33,7 +33,10 @@ public UpdateProfilePicService( @Transactional public UpdateProfilePicResult update(Long userId, byte[] imageFileContent, LocalDateTime now) { FileResult fileResult = fileUploadService.uploadFile(imageFileContent, userId, now); - User user = userQueryRepository.findUserById(userId).orElseThrow(() -> new UserNotFoundException(userId)); + User user = + userQueryRepository + .findUserById(userId) + .orElseThrow(() -> new UserNotFoundException(userId)); user.updateThumbnailId(fileResult.id()); userRepository.save(user); return UpdateProfilePicResult.from(userId, fileResult); diff --git a/perfume-api/src/test/java/io/perfume/api/user/adapter/in/http/UserSupportControllerTest.java b/perfume-api/src/test/java/io/perfume/api/user/adapter/in/http/UserSupportControllerTest.java index 1cb0c68d..420e8904 100644 --- a/perfume-api/src/test/java/io/perfume/api/user/adapter/in/http/UserSupportControllerTest.java +++ b/perfume-api/src/test/java/io/perfume/api/user/adapter/in/http/UserSupportControllerTest.java @@ -1,11 +1,25 @@ package io.perfume.api.user.adapter.in.http; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doNothing; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.multipart; +import static org.springframework.restdocs.payload.PayloadDocumentation.*; +import static org.springframework.restdocs.request.RequestDocumentation.partWithName; +import static org.springframework.restdocs.request.RequestDocumentation.requestParts; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + import com.fasterxml.jackson.databind.ObjectMapper; import io.perfume.api.user.adapter.in.http.dto.UpdateEmailRequestDto; import io.perfume.api.user.adapter.in.http.dto.UpdatePasswordRequestDto; import io.perfume.api.user.adapter.in.http.dto.UpdateProfileRequestDto; import io.perfume.api.user.application.port.in.*; import io.perfume.api.user.application.port.in.dto.UserProfileResult; +import java.time.LocalDate; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -27,21 +41,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.WebApplicationContext; -import java.time.LocalDate; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.documentationConfiguration; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.multipart; -import static org.springframework.restdocs.payload.PayloadDocumentation.*; -import static org.springframework.restdocs.request.RequestDocumentation.partWithName; -import static org.springframework.restdocs.request.RequestDocumentation.requestParts; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) @Transactional @SpringBootTest @@ -214,25 +213,26 @@ void updateProfile() throws Exception { void updateProfilePic() throws Exception { // given final MockMultipartFile profilePic = - new MockMultipartFile("file", "test.png", "text/plain", "file".getBytes()); + new MockMultipartFile("file", "test.txt", "text/plain", "file".getBytes()); // when & then mockMvc - .perform( - multipart("/v1/user/profile-pic") - .file(profilePic) - .accept(MediaType.APPLICATION_JSON) - .characterEncoding("UTF-8") - .contentType(MediaType.MULTIPART_FORM_DATA) - .with(request -> { - request.setMethod("PATCH"); - return request; - })) - .andExpect(status().isOk()) - .andDo( - document( - "update-user-profile-pic", - requestParts(partWithName("file").description("업로드할 프로필 사진")))); + .perform( + multipart("/v1/user/profile-pic") + .file(profilePic) + .accept(MediaType.APPLICATION_JSON) + .characterEncoding("UTF-8") + .contentType(MediaType.MULTIPART_FORM_DATA) + .with( + request -> { + request.setMethod("PATCH"); + return request; + })) + .andExpect(status().isOk()) + .andDo( + document( + "update-user-profile-pic", + requestParts(partWithName("file").description("업로드할 프로필 사진")))); } @Test