Skip to content

Commit

Permalink
Merge pull request #256 from tipi-tapi/feature/255
Browse files Browse the repository at this point in the history
대표 이미지 설정 API 추가
  • Loading branch information
choihuk authored Oct 8, 2023
2 parents 1cb0641 + 08be7c7 commit 970231f
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -88,4 +89,31 @@ public ResponseEntity<Void> reviewImage(
imageService.reviewImage(tokenInfo.getUserId(), imageId, reviewDiaryRequest.getReview());
return ResponseEntity.noContent().build();
}

@Operation(summary = "대표 이미지 설정", description = "주어진 ID의 이미지를 일기의 대표 이미지로 설정한다.")
@ApiResponses(value = {
@ApiResponse(
responseCode = "204",
description = "성공적으로 이미지를 평가함"),
@ApiResponse(
responseCode = "403",
description = "I004 : 자신의 이미지에만 접근할 수 있습니다.",
content = @Content(schema = @Schema(hidden = true))),
@ApiResponse(
responseCode = "404",
description = "D001 : 일기를 찾을 수 없습니다.",
content = @Content(schema = @Schema(hidden = true))),
@ApiResponse(
responseCode = "404",
description = "I001 : 이미지를 찾을 수 없습니다.",
content = @Content(schema = @Schema(hidden = true))),
})
@PutMapping("/{id}")
public ResponseEntity<Void> setSelectedImage(
@AuthUser JwtTokenInfo tokenInfo,
@Parameter(description = "이미지 ID", in = ParameterIn.PATH) @PathVariable("id") Long imageId
) {
imageService.setSelectedImage(tokenInfo.getUserId(), imageId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,16 @@ public void reviewImage(Long userId, Long imageId, String review) {
image.reviewImage(review);
}

@Transactional
public void setSelectedImage(Long userId, Long imageId) {
User user = validateUserService.validateUserById(userId);
Image image = validateImageService.validateImageById(imageId);
Diary diary = validateDiaryService.validateDiaryById(image.getDiary().getDiaryId(), user);

unSelectAllImage(diary.getDiaryId());
image.setSelected(true);
}

private Image validateImage(Long imageId, User user) {
Image image = imageRepository.findImage(imageId).orElseThrow(ImageNotFoundException::new);
if (image.isSelected()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class ValidateImageService {
private final ImageRepository imageRepository;

public Image validateImageById(Long imageId) {
return imageRepository.findById(imageId).orElseThrow(ImageNotFoundException::new);
return imageRepository.findImage(imageId).orElseThrow(ImageNotFoundException::new);
}

public void validateImageOwner(Long imageId, User user) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static org.mockito.Mockito.verify;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import com.fasterxml.jackson.databind.ObjectMapper;
Expand Down Expand Up @@ -99,4 +100,24 @@ void review_image(String review) throws Exception {
verify(imageService).reviewImage(imageId, REQUEST_USER_ID, review);
}
}

@Nested
@DisplayName("setSelectedImage 메서드는")
class SetSelectedImageTest {

@Test
@DisplayName("imageId에 해당하는 일기를 대표 설정한다.")
void sets_image_selected() throws Exception {
// given
Long imageId = 1L;

// when
ResultActions result = mockMvc.perform(put(BASIC_URL + "/" + imageId)
.with(SecurityMockMvcRequestPostProcessors.csrf()));

// then
result.andExpect(status().isNoContent());
verify(imageService).setSelectedImage(REQUEST_USER_ID, imageId);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.matches;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;
import static tipitapi.drawmytoday.common.testdata.TestDiary.createDiary;
import static tipitapi.drawmytoday.common.testdata.TestDiary.createDiaryWithId;
Expand All @@ -23,6 +24,7 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;
import tipitapi.drawmytoday.domain.diary.domain.Diary;
Expand All @@ -48,6 +50,7 @@ class ImageServiceTest {
ValidateDiaryService validateDiaryService;
@Mock
ValidateImageService validateImageService;
@Spy
@InjectMocks
ImageService imageService;

Expand Down Expand Up @@ -182,4 +185,31 @@ void it_updates_image_review() {
verify(validateImageService).validateImageOwner(eq(image.getImageId()), eq(user));
}
}

@Nested
@DisplayName("setSelectedImage 메서드 테스트")
class SetSelectedImageTest {

@Test
@DisplayName("user, image, diary를 검증한 후 기존 대표 설정을 해제하고 주어진 이미지를 대표 이미지로 설정한다.")
void it_sets_selected_image() {
User user = createUserWithId(1L);
Diary diary = createDiaryWithId(1L, user, createEmotion());
Image image = createImageWithId(1L, diary);
given(validateUserService.validateUserById(anyLong())).willReturn(user);
given(validateImageService.validateImageById(anyLong())).willReturn(image);
given(validateDiaryService.validateDiaryById(anyLong(), any(User.class)))
.willReturn(diary);
doNothing().when(imageService).unSelectAllImage(anyLong());

imageService.setSelectedImage(1L, 1L);

assertThat(image.isSelected()).isTrue();
verify(validateUserService).validateUserById(eq(user.getUserId()));
verify(validateImageService).validateImageById(eq(image.getImageId()));
verify(validateDiaryService).validateDiaryById(eq(diary.getDiaryId()), eq(user));
verify(imageService).unSelectAllImage(eq(diary.getDiaryId()));
}
}

}

0 comments on commit 970231f

Please sign in to comment.