diff --git a/src/main/java/org/fontory/fontorybe/bookmark/service/BookmarkServiceImpl.java b/src/main/java/org/fontory/fontorybe/bookmark/service/BookmarkServiceImpl.java index 424ea3d..77ae62b 100644 --- a/src/main/java/org/fontory/fontorybe/bookmark/service/BookmarkServiceImpl.java +++ b/src/main/java/org/fontory/fontorybe/bookmark/service/BookmarkServiceImpl.java @@ -80,7 +80,10 @@ public Page getBookmarkedFonts(Long memberId, int page, int size, List filtered = fonts.stream() .filter(font -> !StringUtils.hasText(keyword) || font.getName().contains(keyword)) - .map(font -> FontResponse.from(font, true)) + .map(font -> { + Member writer = memberService.getOrThrowById(font.getMemberId()); + return FontResponse.from(font, true, writer.getNickname()); + }) .toList(); return new PageImpl<>(filtered, pageRequest, bookmarks.getTotalElements()); diff --git a/src/main/java/org/fontory/fontorybe/font/controller/FontController.java b/src/main/java/org/fontory/fontorybe/font/controller/FontController.java index b74e434..ea474b3 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/FontController.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/FontController.java @@ -23,7 +23,6 @@ import org.fontory.fontorybe.font.controller.dto.FontCreateDTO; import org.fontory.fontorybe.font.controller.dto.FontCreateResponse; import org.fontory.fontorybe.font.controller.dto.FontDeleteResponse; -import org.fontory.fontorybe.font.controller.dto.FontDetailResponse; import org.fontory.fontorybe.font.controller.dto.FontPageResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressUpdateDTO; @@ -38,7 +37,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -180,10 +178,14 @@ public ResponseEntity getFonts( @Operation(summary = "폰트 상세보기") @Parameter(name = "fontId", description = "상세 조회 할 폰트 ID") @GetMapping("/{fontId}") - public ResponseEntity getFont(@PathVariable Long fontId) { + public ResponseEntity getFont( + @PathVariable Long fontId, + @Login(required = false) UserPrincipal userPrincipal + ) { + Long memberId = userPrincipal != null ? userPrincipal.getId() : null; log.info("Request received: Get font details for font ID: {}", fontId); - FontDetailResponse font = fontService.getFont(fontId); + FontResponse font = fontService.getFont(fontId, memberId); log.info("Response sent: Font details returned for font ID: {}, name: {}", fontId, font.getName()); diff --git a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontCreateResponse.java b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontCreateResponse.java index 700a9ab..557a50a 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontCreateResponse.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontCreateResponse.java @@ -13,7 +13,6 @@ public class FontCreateResponse { private Long id; private String name; private FontStatus status; - private Long memberId; private LocalDateTime createdAt; private FileUploadResponse fileUploadResponse; @@ -22,7 +21,6 @@ public static FontCreateResponse from(Font font, FileUploadResponse fileUploadRe .id(font.getId()) .name(font.getName()) .status(font.getStatus()) - .memberId(font.getMemberId()) .createdAt(font.getCreatedAt()) .fileUploadResponse(fileUploadResponse) .build(); diff --git a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontDetailResponse.java b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontDetailResponse.java deleted file mode 100644 index a4fcf63..0000000 --- a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontDetailResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.fontory.fontorybe.font.controller.dto; - -import lombok.Builder; -import lombok.Getter; -import org.fontory.fontorybe.font.domain.Font; - -@Getter -@Builder -public class FontDetailResponse { - private Long id; - private String name; - private String example; - private String writerName; - private Long downloadCount; - private Long bookmarkCount; - private Long memberId; - - public static FontDetailResponse from(Font font, String writerName) { - return FontDetailResponse.builder() - .id(font.getId()) - .name(font.getName()) - .example(font.getExample()) - .writerName(writerName) - .downloadCount(font.getDownloadCount()) - .bookmarkCount(font.getBookmarkCount()) - .memberId(font.getMemberId()) - .build(); - } -} diff --git a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontPageResponse.java b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontPageResponse.java index d79cc61..d1b06fe 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontPageResponse.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontPageResponse.java @@ -14,7 +14,6 @@ public class FontPageResponse { private Long downloadCount; private Long bookmarkCount; private boolean isBookmarked; - private Long memberId; public static FontPageResponse from(Font font, String writerName, boolean isBookmarked) { return FontPageResponse.builder() @@ -25,7 +24,6 @@ public static FontPageResponse from(Font font, String writerName, boolean isBook .downloadCount(font.getDownloadCount()) .bookmarkCount(font.getBookmarkCount()) .isBookmarked(isBookmarked) - .memberId(font.getMemberId()) .build(); } } diff --git a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontProgressResponse.java b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontProgressResponse.java index 76cade3..a91dab0 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontProgressResponse.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontProgressResponse.java @@ -1,5 +1,6 @@ package org.fontory.fontorybe.font.controller.dto; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import org.fontory.fontorybe.font.domain.Font; @@ -11,12 +12,14 @@ public class FontProgressResponse { private Long id; private String name; private FontStatus status; + private LocalDateTime createdAt; public static FontProgressResponse from(Font font) { return FontProgressResponse.builder() .id(font.getId()) .name(font.getName()) .status(font.getStatus()) + .createdAt(font.getCreatedAt()) .build(); } } diff --git a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontResponse.java b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontResponse.java index 75b9e64..98f837e 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/dto/FontResponse.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/dto/FontResponse.java @@ -13,9 +13,9 @@ public class FontResponse { private Long downloadCount; private Long bookmarkCount; private boolean isBookmarked; - private Long memberId; + private String writerName; - public static FontResponse from(Font font, boolean isBookmarked) { + public static FontResponse from(Font font, boolean isBookmarked, String writerName) { return FontResponse.builder() .id(font.getId()) .name(font.getName()) @@ -23,7 +23,7 @@ public static FontResponse from(Font font, boolean isBookmarked) { .downloadCount(font.getDownloadCount()) .bookmarkCount(font.getBookmarkCount()) .isBookmarked(isBookmarked) - .memberId(font.getMemberId()) + .writerName(writerName) .build(); } } diff --git a/src/main/java/org/fontory/fontorybe/font/controller/port/FontService.java b/src/main/java/org/fontory/fontorybe/font/controller/port/FontService.java index 00fca17..6117354 100644 --- a/src/main/java/org/fontory/fontorybe/font/controller/port/FontService.java +++ b/src/main/java/org/fontory/fontorybe/font/controller/port/FontService.java @@ -4,7 +4,6 @@ import org.fontory.fontorybe.file.domain.FileDetails; import org.fontory.fontorybe.font.controller.dto.FontCreateDTO; import org.fontory.fontorybe.font.controller.dto.FontDeleteResponse; -import org.fontory.fontorybe.font.controller.dto.FontDetailResponse; import org.fontory.fontorybe.font.controller.dto.FontPageResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressUpdateDTO; @@ -19,7 +18,7 @@ public interface FontService { Font update(Long memberId, Long fontId, FontUpdateDTO fontUpdateDTO); Font getOrThrowById(Long id); Page getFonts(Long memberId, int page, int size); - FontDetailResponse getFont(Long fondId); + FontResponse getFont(Long fondId, Long memberId); FontDeleteResponse delete(Long memberId, Long fontId); Page getFontPage(Long memberId, int page, int size, String sortBy, String keyword); List getOtherFonts(Long fontId); diff --git a/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java b/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java index a6a5b84..a32aa69 100644 --- a/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java +++ b/src/main/java/org/fontory/fontorybe/font/service/FontServiceImpl.java @@ -8,7 +8,6 @@ import org.fontory.fontorybe.file.domain.FileDetails; import org.fontory.fontorybe.font.controller.dto.FontCreateDTO; import org.fontory.fontorybe.font.controller.dto.FontDeleteResponse; -import org.fontory.fontorybe.font.controller.dto.FontDetailResponse; import org.fontory.fontorybe.font.controller.dto.FontPageResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressUpdateDTO; @@ -106,8 +105,10 @@ public Page getFonts(Long memberId, int page, int size) { Page result = fontPage.map(font -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, font.getId()); - return FontResponse.from(font, bookmarked); + Member writer = memberService.getOrThrowById(font.getMemberId()); + return FontResponse.from(font, bookmarked, writer.getNickname()); }); + log.info("Service completed: Retrieved {} fonts out of {} total for member ID: {}", result.getNumberOfElements(), result.getTotalElements(), memberId); @@ -116,15 +117,22 @@ public Page getFonts(Long memberId, int page, int size) { @Override @Transactional(readOnly = true) - public FontDetailResponse getFont(Long fontId) { + public FontResponse getFont(Long fontId, Long memberId) { log.info("Service executing: Fetching font details for font ID: {}", fontId); Font targetFont = getOrThrowById(fontId); - Member member = memberService.getOrThrowById(targetFont.getMemberId()); + Member writer = memberService.getOrThrowById(targetFont.getMemberId()); + + boolean isBookmarked = false; + if (memberId != null) { + isBookmarked = bookmarkRepository.existsByMemberIdAndFontId(memberId, fontId); + } + + FontResponse fontResponse = FontResponse.from(targetFont, isBookmarked, writer.getNickname()); - FontDetailResponse response = FontDetailResponse.from(targetFont, member.getNickname()); log.info("Service completed: Retrieved font details for font ID: {} with name: {}", fontId, targetFont.getName()); - return response; + + return fontResponse; } @Override @@ -198,7 +206,8 @@ public List getOtherFonts(Long fontId) { List result = fonts.stream() .map(f -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), f.getId()); - return FontResponse.from(f, bookmarked); + Member writer = memberService.getOrThrowById(f.getMemberId()); + return FontResponse.from(f, bookmarked, writer.getNickname()); }) .collect(Collectors.toList()); @@ -218,7 +227,8 @@ public List getMyPopularFonts(Long memberId) { List result = fonts.stream() .map(f -> { boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), f.getId()); - return FontResponse.from(f, bookmarked); + Member writer = memberService.getOrThrowById(f.getMemberId()); + return FontResponse.from(f, bookmarked, writer.getNickname()); }) .collect(Collectors.toList()); @@ -236,14 +246,18 @@ public List getPopularFonts(Long memberId) { List result; if (memberId == null) { result = fonts.stream() - .map(font -> FontResponse.from(font, false)) + .map(font -> { + Member writer = memberService.getOrThrowById(font.getMemberId()); + return FontResponse.from(font, false, writer.getNickname()); + }) .collect(Collectors.toList()); } else { Member member = memberService.getOrThrowById(memberId); result = fonts.stream() - .map(f -> { - boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), f.getId()); - return FontResponse.from(f, bookmarked); + .map(font -> { + boolean bookmarked = bookmarkRepository.existsByMemberIdAndFontId(member.getId(), font.getId()); + Member writer = memberService.getOrThrowById(font.getMemberId()); + return FontResponse.from(font, bookmarked, writer.getNickname()); }) .collect(Collectors.toList()); } @@ -276,9 +290,11 @@ public FontResponse fontDownload(Long memberId, Long fontId) { fontRepository.save(targetFont); + Member writer = memberService.getOrThrowById(targetFont.getMemberId()); + log.info("Service completed: Font ID: {} download successfully", fontId); - return FontResponse.from(targetFont, isBookmarked); + return FontResponse.from(targetFont, isBookmarked, writer.getNickname()); } private void checkFontOwnership(Long requestMemberId, Long targetMemberId) { diff --git a/src/test/java/org/fontory/fontorybe/integration/font/FontControllerIntegrationTest.java b/src/test/java/org/fontory/fontorybe/integration/font/FontControllerIntegrationTest.java index 8dd493c..d3ee9f6 100644 --- a/src/test/java/org/fontory/fontorybe/integration/font/FontControllerIntegrationTest.java +++ b/src/test/java/org/fontory/fontorybe/integration/font/FontControllerIntegrationTest.java @@ -138,7 +138,6 @@ void addFontSuccess() throws Exception { .andExpect(status().isCreated()) .andExpect(jsonPath("$.name", is(newFontName))) .andExpect(jsonPath("$.status", is("PROGRESS"))) - .andExpect(jsonPath("$.memberId", is(existMemberId.intValue()))) .andExpect(jsonPath("$.createdAt").isNotEmpty()); } @@ -247,7 +246,6 @@ void getMyFontsSuccess() throws Exception { .andExpect(jsonPath("$.content[0].downloadCount").isNumber()) .andExpect(jsonPath("$.content[0].bookmarkCount").isNumber()) .andExpect(jsonPath("$.content[0].bookmarked").isBoolean()) - .andExpect(jsonPath("$.content[0].memberId").isNotEmpty()) .andExpect(jsonPath("$.totalElements").isNumber()) .andExpect(jsonPath("$.totalPages").isNumber()) .andExpect(jsonPath("$.size").value(5)) @@ -277,8 +275,7 @@ void getFontDetailSuccess() throws Exception { .andExpect(jsonPath("$.example", is(existFontExample))) .andExpect(jsonPath("$.writerName", is(existMemberName))) .andExpect(jsonPath("$.downloadCount", is(existFontDownloadCount.intValue()))) - .andExpect(jsonPath("$.bookmarkCount", is(existFontBookmarkCount.intValue()))) - .andExpect(jsonPath("$.memberId", is(existMemberId.intValue()))); + .andExpect(jsonPath("$.bookmarkCount", is(existFontBookmarkCount.intValue()))); } @Test @@ -320,7 +317,6 @@ void getFontPageSuccess() throws Exception { .andExpect(jsonPath("$.content[0].downloadCount").isNumber()) .andExpect(jsonPath("$.content[0].bookmarkCount").isNumber()) .andExpect(jsonPath("$.content[0].bookmarked").isBoolean()) - .andExpect(jsonPath("$.content[0].memberId").isNotEmpty()) .andExpect(jsonPath("$.totalPages").isNumber()) .andExpect(jsonPath("$.totalElements").isNumber()) .andExpect(jsonPath("$.size").value(5)) diff --git a/src/test/java/org/fontory/fontorybe/integration/font/FontServiceIntegrationTest.java b/src/test/java/org/fontory/fontorybe/integration/font/FontServiceIntegrationTest.java index 2f682b3..8f09c0e 100644 --- a/src/test/java/org/fontory/fontorybe/integration/font/FontServiceIntegrationTest.java +++ b/src/test/java/org/fontory/fontorybe/integration/font/FontServiceIntegrationTest.java @@ -7,17 +7,13 @@ import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.doNothing; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import org.fontory.fontorybe.file.application.FileService; -import org.fontory.fontorybe.file.domain.FileCreate; import org.fontory.fontorybe.file.domain.FileDetails; -import org.fontory.fontorybe.file.domain.FileType; import org.fontory.fontorybe.font.controller.dto.FontCreateDTO; import org.fontory.fontorybe.font.controller.dto.FontDeleteResponse; -import org.fontory.fontorybe.font.controller.dto.FontDetailResponse; import org.fontory.fontorybe.font.controller.dto.FontPageResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressResponse; import org.fontory.fontorybe.font.controller.dto.FontProgressUpdateDTO; @@ -35,7 +31,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; @@ -231,10 +226,6 @@ void getFontsSuccess() { assertThat(result.getContent()).hasSizeLessThanOrEqualTo(size); assertThat(result.getTotalElements()).isGreaterThanOrEqualTo(7); - result.getContent().forEach(font -> - assertThat(font.getMemberId()).isEqualTo(existMemberId) - ); - List ids = result.getContent().stream() .map(FontResponse::getId) .toList(); @@ -249,7 +240,7 @@ void getFontsSuccess() { @DisplayName("font - getFont detail success test") void getFontDetailSuccess() { // when - FontDetailResponse detail = fontService.getFont(existFontId); + FontResponse detail = fontService.getFont(existFontId, null); // then assertAll( @@ -362,7 +353,6 @@ void getOtherFontsSuccess() { result.forEach(font -> { assertThat(font.getId()).isNotEqualTo(existFontId); - assertThat(font.getMemberId()).isEqualTo(existMemberId); }); } @@ -422,7 +412,6 @@ void getMyPopularFontsSuccess() { assertThat(scores).isEqualTo(sorted); - result.forEach(font -> assertThat(font.getMemberId()).isEqualTo(existMemberId)); } @Test