Skip to content

Commit b5e2b77

Browse files
authored
Refactor/339 기관 프로필 이미지 업데이트 리팩토링 (#348)
* refactor: 선호 물품 컨트롤러 리팩토링 - userId 직렬화 어노테이션 변경 - 테스트및 검증 완료 * feat: 유저 공통속성 엔티티 프로필 url 변경 메서드 구현 - 프로필 이미지 url 필드를 변경하는 메서드 구현 - 테스트및 검증 완료 * feat: 유저 공통속성 프로필 이미지 업데이트 유스케이스 구현 - 프로필 이미지 업데이트 유스케이스및 구현체 구현 - 요청 레코드 생성 - 테스트및 검증 완료 * feat: 기관 프로필 이미지 변경 유스케이스 구 - 프로필 이미지 업데이트 유스케이스및 구현체 구현 - 요청 레코드 생성 - 테스트및 검증 완료 * feat: 기관 프로필 이미지 변경 컨트롤러 구현 - 프로필 이미지 업데이트 엔드 포인트 구현 - 테스트및 검증 완료
1 parent 4bcb963 commit b5e2b77

File tree

13 files changed

+352
-33
lines changed

13 files changed

+352
-33
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.somemore.center.controller;
2+
3+
import com.somemore.center.dto.request.CenterProfileImgUpdateRequestDto;
4+
import com.somemore.center.usecase.UpdateCenterProfileImgUseCase;
5+
import com.somemore.global.auth.annotation.UserId;
6+
import com.somemore.global.common.response.ApiResponse;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.security.access.annotation.Secured;
11+
import org.springframework.web.bind.annotation.PutMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.util.UUID;
16+
17+
@Tag(name = "Center Command API", description = "기관 프로필 수정 API")
18+
@RequiredArgsConstructor
19+
@RequestMapping("/api/center")
20+
@RestController
21+
public class CenterCommandApiController {
22+
23+
private final UpdateCenterProfileImgUseCase updateCenterProfileImgUseCase;
24+
25+
@Secured("ROLE_CENTER")
26+
@Operation(summary = "기관 프로필 이미지 수정", description = "기관의 프로필 이미지를 수정합니다.")
27+
@PutMapping("/profileImgUpdate")
28+
public ApiResponse<String> updateCenterProfile(
29+
@UserId UUID centerId,
30+
CenterProfileImgUpdateRequestDto requestDto
31+
) {
32+
33+
String presignedUrl = updateCenterProfileImgUseCase.updateCenterProfileImg(centerId, requestDto);
34+
35+
return ApiResponse.ok(presignedUrl,"센터 프로필 수정 성공");
36+
}
37+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.somemore.center.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
public record CenterProfileImgUpdateRequestDto(
6+
@Schema(description = "파일 이름", example = "image.png")
7+
String fileName
8+
) {
9+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.somemore.center.service;
2+
3+
import com.somemore.center.domain.NEWCenter;
4+
import com.somemore.center.dto.request.CenterProfileImgUpdateRequestDto;
5+
import com.somemore.center.repository.NEWCenterRepository;
6+
import com.somemore.center.usecase.UpdateCenterProfileImgUseCase;
7+
import com.somemore.global.exception.BadRequestException;
8+
import com.somemore.global.imageupload.usecase.ImageUploadUseCase;
9+
import com.somemore.user.dto.request.UpdateProfileImgUrlRequestDto;
10+
import com.somemore.user.usecase.UpdateProfileImgUrlUseCase;
11+
import com.somemore.user.usecase.UserQueryUseCase;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
15+
16+
import java.util.UUID;
17+
18+
import static com.somemore.global.exception.ExceptionMessage.NOT_EXISTS_CENTER;
19+
20+
@RequiredArgsConstructor
21+
@Service
22+
@Transactional
23+
public class UpdateCenterProfileImgService implements UpdateCenterProfileImgUseCase {
24+
25+
private final ImageUploadUseCase imageUploadUseCase;
26+
private final UserQueryUseCase userQueryUseCase;
27+
private final UpdateProfileImgUrlUseCase updateProfileImgUrlUseCase;
28+
private final NEWCenterRepository centerRepository;
29+
30+
@Override
31+
public String updateCenterProfileImg(UUID centerId, CenterProfileImgUpdateRequestDto requestDto) {
32+
33+
NEWCenter center = centerRepository.findById(centerId)
34+
.orElseThrow(() -> new BadRequestException(NOT_EXISTS_CENTER));
35+
36+
String presignedUrl = imageUploadUseCase.getPresignedUrl(requestDto.fileName());
37+
38+
String fileUrl = presignedUrl.split("\\?")[0];
39+
40+
UpdateProfileImgUrlRequestDto updateProfileImgUrlRequestDto = new UpdateProfileImgUrlRequestDto(center.getUserId(), fileUrl);
41+
42+
updateProfileImgUrlUseCase.updateProfileImgUrl(updateProfileImgUrlRequestDto);
43+
44+
return presignedUrl;
45+
}
46+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.somemore.center.usecase;
2+
3+
import com.somemore.center.dto.request.CenterProfileImgUpdateRequestDto;
4+
5+
import java.util.UUID;
6+
7+
public interface UpdateCenterProfileImgUseCase {
8+
String updateCenterProfileImg(UUID centerId, CenterProfileImgUpdateRequestDto requestDto);
9+
}

src/main/java/com/somemore/domains/center/controller/PreferItemCommandApiController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.somemore.domains.center.dto.response.PreferItemCreateResponseDto;
55
import com.somemore.domains.center.usecase.command.CreatePreferItemUseCase;
66
import com.somemore.domains.center.usecase.command.DeletePreferItemUseCase;
7-
import com.somemore.global.auth.annotation.CurrentUser;
7+
import com.somemore.global.auth.annotation.UserId;
88
import com.somemore.global.common.response.ApiResponse;
99
import io.swagger.v3.oas.annotations.Operation;
1010
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -34,9 +34,9 @@ public class PreferItemCommandApiController {
3434
@PostMapping()
3535
public ApiResponse<PreferItemCreateResponseDto> registerPreferItem(
3636
@Valid @RequestBody PreferItemCreateRequestDto requestDto,
37-
@CurrentUser UUID userId) {
37+
@UserId UUID centerId) {
3838

39-
PreferItemCreateResponseDto responseDto = createPreferItemUseCase.createPreferItem(userId,
39+
PreferItemCreateResponseDto responseDto = createPreferItemUseCase.createPreferItem(centerId,
4040
requestDto);
4141

4242
return ApiResponse.ok(200, responseDto, "관심 기관 등록 성공");
@@ -45,7 +45,7 @@ public ApiResponse<PreferItemCreateResponseDto> registerPreferItem(
4545
@Secured("ROLE_CENTER")
4646
@Operation(summary = "기관 선호물품 삭제 API")
4747
@DeleteMapping("/{preferItemId}")
48-
public ApiResponse<String> deletePreferItem(@CurrentUser UUID centerId, @PathVariable Long preferItemId) {
48+
public ApiResponse<String> deletePreferItem(@UserId UUID centerId, @PathVariable Long preferItemId) {
4949

5050
deletePreferItemUseCase.deletePreferItem(centerId, preferItemId);
5151

src/main/java/com/somemore/user/domain/UserCommonAttribute.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ public void update(CommonBasicInfoRequestDto commonBasicInfoRequestDto) {
5353
this.isCustomized = true;
5454
}
5555

56+
public void updateImgUrl(String imgUrl) {
57+
this.imgUrl = imgUrl;
58+
}
59+
5660
public static UserCommonAttribute createDefault(UUID userId, UserRole role) {
5761
return UserCommonAttribute.builder()
5862
.userId(userId)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.somemore.user.dto.request;
2+
3+
import java.util.UUID;
4+
5+
public record UpdateProfileImgUrlRequestDto(
6+
UUID userId,
7+
String profileImgUrl
8+
) {
9+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.somemore.user.service;
2+
3+
import com.somemore.user.domain.UserCommonAttribute;
4+
import com.somemore.user.dto.request.UpdateProfileImgUrlRequestDto;
5+
import com.somemore.user.usecase.UpdateProfileImgUrlUseCase;
6+
import com.somemore.user.usecase.UserQueryUseCase;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
import org.springframework.transaction.annotation.Transactional;
10+
11+
@RequiredArgsConstructor
12+
@Service
13+
@Transactional
14+
public class UpdateProfileImgUrlService implements UpdateProfileImgUrlUseCase {
15+
16+
private final UserQueryUseCase userQueryUseCase;
17+
18+
@Override
19+
public void updateProfileImgUrl(UpdateProfileImgUrlRequestDto updateProfileImgUrlRequestDto) {
20+
UserCommonAttribute userCommonAttribute =
21+
userQueryUseCase.getCommonAttributeByUserId(updateProfileImgUrlRequestDto.userId());
22+
23+
userCommonAttribute.updateImgUrl(updateProfileImgUrlRequestDto.profileImgUrl());
24+
}
25+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.somemore.user.usecase;
2+
3+
import com.somemore.user.dto.request.UpdateProfileImgUrlRequestDto;
4+
5+
public interface UpdateProfileImgUrlUseCase {
6+
void updateProfileImgUrl(UpdateProfileImgUrlRequestDto updateProfileImgUrlRequestDto);
7+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.somemore.center.controller;
2+
3+
import com.somemore.center.dto.request.CenterProfileImgUpdateRequestDto;
4+
import com.somemore.center.usecase.UpdateCenterProfileImgUseCase;
5+
import com.somemore.support.ControllerTestSupport;
6+
import static org.mockito.Mockito.times;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.when;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.DisplayName;
11+
import org.springframework.boot.test.mock.mockito.MockBean;
12+
import org.springframework.http.MediaType;
13+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
14+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
15+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
16+
17+
import java.util.UUID;
18+
19+
class CenterCommandApiControllerTest extends ControllerTestSupport {
20+
21+
@MockBean
22+
private UpdateCenterProfileImgUseCase updateCenterProfileImgUseCase;
23+
24+
@DisplayName("기관 프로필 이미지를 수정할 수 있다. (controller)")
25+
@Test
26+
void updateCenterProfile() throws Exception {
27+
28+
// given
29+
UUID centerId = UUID.randomUUID();
30+
CenterProfileImgUpdateRequestDto requestDto = new CenterProfileImgUpdateRequestDto("test.jpg");
31+
32+
String expectedPresignedUrl = "https://example.com/presigned-url/test.jpg";
33+
when(updateCenterProfileImgUseCase.updateCenterProfileImg(centerId, requestDto))
34+
.thenReturn(expectedPresignedUrl);
35+
36+
// when & then
37+
mockMvc.perform(
38+
put("/api/center/profileImgUpdate")
39+
.header("X-User-Id", centerId.toString()) // @UserId를 시뮬레이션
40+
.contentType(MediaType.APPLICATION_JSON)
41+
.content(objectMapper.writeValueAsString(requestDto))
42+
)
43+
.andExpect(status().isOk())
44+
.andExpect(jsonPath("$.code").value("200"))
45+
.andExpect(jsonPath("$.message").value("센터 프로필 수정 성공"))
46+
.andExpect(jsonPath("$.data").value(expectedPresignedUrl));
47+
48+
verify(updateCenterProfileImgUseCase, times(1)).updateCenterProfileImg(centerId, requestDto);
49+
}
50+
51+
}

0 commit comments

Comments
 (0)