From e444c3729d29f43785ef91a9d7ca44ad8de61d51 Mon Sep 17 00:00:00 2001 From: JeongHoon Lee Date: Fri, 16 May 2025 18:28:27 +0900 Subject: [PATCH] fix bug empty files sent when onboarding & update memebr --- .../member/controller/ProfileController.java | 17 +++++++++----- .../controller/RegistrationController.java | 22 +++++++++++++------ .../controller/port/MemberOnboardService.java | 1 + .../fontorybe/member/domain/Member.java | 16 ++++++++++++++ .../service/MemberOnboardServiceImpl.java | 16 ++++++++++++++ src/main/resources/application.properties | 4 ++++ .../ProfileControllerIntegrationTest.java | 3 ++- .../fontorybe/unit/mock/TestContainer.java | 1 + 8 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/fontory/fontorybe/member/controller/ProfileController.java b/src/main/java/org/fontory/fontorybe/member/controller/ProfileController.java index b651cee..ed2fdae 100644 --- a/src/main/java/org/fontory/fontorybe/member/controller/ProfileController.java +++ b/src/main/java/org/fontory/fontorybe/member/controller/ProfileController.java @@ -72,21 +72,26 @@ public ResponseEntity getMyProfile( public ResponseEntity updateMember( @Login UserPrincipal userPrincipal, @RequestPart MemberUpdateRequest req, - @SingleFileUpload @RequestPart("file") List files + @SingleFileUpload @RequestPart(value = "file", required = false) List files ) { Long requestMemberId = userPrincipal.getId(); - MultipartFile file = extractSingleMultipartFile(files); - log.info("Request received: update member ID: {} with request: {}", requestMemberId, req); - logFileDetails(file, "Member profile image upload"); - FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId); + if (files != null && !files.isEmpty()) { + MultipartFile file = extractSingleMultipartFile(files); + logFileDetails(file, "Member profile image upload"); + FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId); + log.info("fileUploadResult: {}", fileUploadResult); + } else { + log.info("No profile image upload found"); + } + Member updatedMember = memberUpdateService.update(requestMemberId, req); log.info("Updated : Member ID: {} Updated successfully with nickname: {}, terms : {}", updatedMember.getId(), updatedMember.getNickname(), updatedMember.getTerms()); - MyProfileResponse myProfileResponse = MyProfileResponse.from(updatedMember, fileUploadResult.getFileUrl()); + MyProfileResponse myProfileResponse = MyProfileResponse.from(updatedMember, cloudStorageService.getProfileImageUrl(updatedMember.getProfileImageKey())); log.info("Response sent: MyProfileDto : {}", myProfileResponse); return ResponseEntity diff --git a/src/main/java/org/fontory/fontorybe/member/controller/RegistrationController.java b/src/main/java/org/fontory/fontorybe/member/controller/RegistrationController.java index 3d054b2..631c496 100644 --- a/src/main/java/org/fontory/fontorybe/member/controller/RegistrationController.java +++ b/src/main/java/org/fontory/fontorybe/member/controller/RegistrationController.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.fontory.fontorybe.authentication.adapter.inbound.annotation.Login; import org.fontory.fontorybe.authentication.domain.UserPrincipal; +import org.fontory.fontorybe.file.application.port.CloudStorageService; import org.fontory.fontorybe.file.application.port.FileService; import org.fontory.fontorybe.file.domain.FileUploadResult; import org.fontory.fontorybe.file.application.annotation.SingleFileUpload; @@ -17,6 +18,7 @@ import org.fontory.fontorybe.member.domain.Member; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.parameters.P; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -32,6 +34,7 @@ @RequestMapping("/register") @Tag(name = "사용자 - 신규", description = "회원가입/온보딩") public class RegistrationController { + private final CloudStorageService cloudStorageService; private final MemberLookupService memberLookupService; private final MemberOnboardService memberOnboardService; private final FileService fileService; @@ -59,24 +62,29 @@ public ResponseEntity checkDuplicate( public ResponseEntity register( @Login UserPrincipal user, @RequestPart InitMemberInfoRequest req, - @SingleFileUpload @RequestPart("file") List files + @SingleFileUpload @RequestPart(value = "file", required = false) List files ) { Long requestMemberId = user.getId(); - MultipartFile file = extractSingleMultipartFile(files); - log.info("Request received: Create member ID: {} with request: {}", requestMemberId, req); - logFileDetails(file, "Member profile image upload"); - FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId); - Member updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req, fileUploadResult); + Member updatedMember; + if (files != null && !files.isEmpty()) { + MultipartFile file = extractSingleMultipartFile(files); + logFileDetails(file, "Member profile image upload"); + FileUploadResult fileUploadResult = fileService.uploadProfileImage(file, requestMemberId); + updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req, fileUploadResult); + } else { + log.info("No profile image upload found"); + updatedMember = memberOnboardService.initNewMemberInfo(requestMemberId, req); + } log.info("Response sent: Member ID: {} Created successfully with nickname: {}", updatedMember.getId(), updatedMember.getNickname()); return ResponseEntity .status(HttpStatus.CREATED) - .body(MemberCreateResponse.from(updatedMember, fileUploadResult.getFileUrl())); + .body(MemberCreateResponse.from(updatedMember, cloudStorageService.getProfileImageUrl(updatedMember.getProfileImageKey()))); } private void logFileDetails(MultipartFile file, String context) { diff --git a/src/main/java/org/fontory/fontorybe/member/controller/port/MemberOnboardService.java b/src/main/java/org/fontory/fontorybe/member/controller/port/MemberOnboardService.java index 8441560..65b55e8 100644 --- a/src/main/java/org/fontory/fontorybe/member/controller/port/MemberOnboardService.java +++ b/src/main/java/org/fontory/fontorybe/member/controller/port/MemberOnboardService.java @@ -8,4 +8,5 @@ public interface MemberOnboardService { Member fetchOrCreateMember(Provide p); Member initNewMemberInfo(Long requestMemberId, InitMemberInfoRequest initMemberInfoRequest, FileUploadResult fileUploadResult); + Member initNewMemberInfo(Long requestMemberId, InitMemberInfoRequest initMemberInfoRequest); } diff --git a/src/main/java/org/fontory/fontorybe/member/domain/Member.java b/src/main/java/org/fontory/fontorybe/member/domain/Member.java index dd1d166..3e0d323 100644 --- a/src/main/java/org/fontory/fontorybe/member/domain/Member.java +++ b/src/main/java/org/fontory/fontorybe/member/domain/Member.java @@ -65,6 +65,22 @@ public Member initNewMemberInfo(InitMemberInfoRequest initNewMemberInfo, String .build(); } + public Member initNewMemberInfo(InitMemberInfoRequest initNewMemberInfo) { + return Member.builder() + .id(this.id) + .nickname(initNewMemberInfo.getNickname()) + .gender(initNewMemberInfo.getGender()) + .birth(initNewMemberInfo.getBirth()) + .terms(initNewMemberInfo.getTerms()) + .profileImageKey(this.profileImageKey) + .createdAt(this.createdAt) + .provideId(this.provideId) + .deletedAt(this.deletedAt) + .provideId(this.provideId) + .status(MemberStatus.ACTIVATE) + .build(); + } + public Member update(MemberUpdateRequest memberUpdateRequest) { return Member.builder() //tobe update diff --git a/src/main/java/org/fontory/fontorybe/member/service/MemberOnboardServiceImpl.java b/src/main/java/org/fontory/fontorybe/member/service/MemberOnboardServiceImpl.java index 07c615f..ec9fd37 100644 --- a/src/main/java/org/fontory/fontorybe/member/service/MemberOnboardServiceImpl.java +++ b/src/main/java/org/fontory/fontorybe/member/service/MemberOnboardServiceImpl.java @@ -58,6 +58,22 @@ public Member initNewMemberInfo(Long requestMemberId, return memberRepository.save(targetMember.initNewMemberInfo(initNewMemberInfoRequest, fileMetadata.getKey())); } + @Override + @Transactional + public Member initNewMemberInfo(Long requestMemberId, + InitMemberInfoRequest initNewMemberInfoRequest) { + Member targetMember = memberLookupService.getOrThrowById(requestMemberId); + if (targetMember.getStatus() == MemberStatus.ACTIVATE) { + throw new MemberAlreadyJoinedException(); + } else if (memberLookupService.existsByNickname(initNewMemberInfoRequest.getNickname())) { + throw new MemberDuplicateNameExistsException(); + } + + checkContainsBadWord(initNewMemberInfoRequest.getNickname()); + + return memberRepository.save(targetMember.initNewMemberInfo(initNewMemberInfoRequest)); + } + private void checkContainsBadWord(String nickname) { if (badWordFiltering.blankCheck(nickname)) { throw new MemberContainsBadWordException(); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1ad54b1..b6e7e95 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -34,3 +34,7 @@ member.default.birth=1999-12-31 member.default.profile-image-key=default member.default.terms-agree=false +# max file size +spring.servlet.multipart.maxFileSize=5MB +# max total file size +spring.servlet.multipart.maxRequestSize=10MB \ No newline at end of file diff --git a/src/test/java/org/fontory/fontorybe/integration/member/controller/ProfileControllerIntegrationTest.java b/src/test/java/org/fontory/fontorybe/integration/member/controller/ProfileControllerIntegrationTest.java index bb20fbc..895cb5f 100644 --- a/src/test/java/org/fontory/fontorybe/integration/member/controller/ProfileControllerIntegrationTest.java +++ b/src/test/java/org/fontory/fontorybe/integration/member/controller/ProfileControllerIntegrationTest.java @@ -27,6 +27,7 @@ import static org.fontory.fontorybe.TestConstants.*; import static org.fontory.fontorybe.TestConstants.UPDATE_MEMBER_TERMS; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; @@ -106,7 +107,7 @@ void updateMemberSuccessTest() throws Exception { .andExpect(jsonPath("$.memberId", is(TEST_MEMBER_ID.intValue()))) .andExpect(jsonPath("$.nickname", is(UPDATE_MEMBER_NICKNAME))) .andExpect(jsonPath("$.terms", is(UPDATE_MEMBER_TERMS))) - .andExpect(jsonPath("$.profileImageUrl", is(testMember.getProfileImageKey()))) + .andExpect(jsonPath("$.profileImageUrl", containsString(testMember.getProfileImageKey()))) .andExpect(jsonPath("$.gender", is(testMember.getGender().name()))) .andExpect(jsonPath("$.birth", is(testMember.getBirth().toString()))); } diff --git a/src/test/java/org/fontory/fontorybe/unit/mock/TestContainer.java b/src/test/java/org/fontory/fontorybe/unit/mock/TestContainer.java index 064f1a8..8e556b7 100644 --- a/src/test/java/org/fontory/fontorybe/unit/mock/TestContainer.java +++ b/src/test/java/org/fontory/fontorybe/unit/mock/TestContainer.java @@ -191,6 +191,7 @@ public TestContainer() { registrationController = RegistrationController.builder() .memberLookupService(memberLookupService) .memberOnboardService(memberOnboardService) + .cloudStorageService(cloudStorageService) .fileService(fileService) .build(); }