From dabd285d292babfc49aa71b74d6261aae2a426cc Mon Sep 17 00:00:00 2001 From: Hm-source Date: Wed, 22 Jan 2025 10:06:55 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EC=B5=9C=EC=B4=88=20=EB=8F=84?= =?UTF-8?q?=EC=84=9C=20100=EA=B6=8C=20=EB=A1=9C=EB=93=9C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContentsScheduleController.java | 68 +++++++++++++++++++ .../service/ContentsSchedulerService.java | 14 ++++ 2 files changed, 82 insertions(+) diff --git a/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java b/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java index 299726f..3685733 100644 --- a/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java +++ b/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java @@ -2,6 +2,11 @@ import com.example.customerservice.contents.entity.SchedulerStatus; import com.example.customerservice.contents.service.ContentsSchedulerService; +import com.fasterxml.jackson.core.JsonProcessingException; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -16,6 +21,26 @@ public class ContentsScheduleController { private final ContentsSchedulerService contentsSchedulerService; + @Operation( + summary = "도서 동기화 작업 시작", + description = "도서 업데이트 작업을 예약합니다. 매주 수요일에 실행됩니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "작업이 예약되었습니다.", + content = @Content( + examples = @ExampleObject(value = "도서 업데이트 작업이 매주 수요일마다 실행되도록 예약되었습니다.") + ) + ), + @ApiResponse( + responseCode = "400", + description = "이미 작업이 실행 중입니다.", + content = @Content( + examples = @ExampleObject(value = "업데이트 작업이 이미 실행 중입니다.") + ) + ) + } + ) @PostMapping("/new-book") public ResponseEntity startBookSync() { SchedulerStatus status = contentsSchedulerService.startBookSync(50); @@ -30,6 +55,27 @@ public ResponseEntity startBookSync() { } } + + @Operation( + summary = "도서 동기화 작업 중지", + description = "현재 실행 중인 도서 업데이트 작업을 중지합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "작업이 중지되었습니다.", + content = @Content( + examples = @ExampleObject(value = "도서 업데이트 작업이 중지되었습니다.") + ) + ), + @ApiResponse( + responseCode = "400", + description = "중지할 작업이 없습니다.", + content = @Content( + examples = @ExampleObject(value = "현재 실행 중인 업데이트 작업이 없습니다.") + ) + ) + } + ) @DeleteMapping("/new-book") public ResponseEntity stopBookSync() { SchedulerStatus status = contentsSchedulerService.stopBookSync(); @@ -43,4 +89,26 @@ public ResponseEntity stopBookSync() { throw new IllegalStateException("Unexpected status: " + status); } } + @Operation( + summary = "최초 도서 데이터 저장", + description = "최신 도서 100권의 데이터를 동기화합니다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "도서 데이터 로드 완료", + content = @Content( + examples = @ExampleObject(value = "최신 도서 100권 로드 완료되었습니다.") + ) + ), + @ApiResponse( + responseCode = "500", + description = "서버 에러" + ) + } + ) + @PostMapping("/first/book") + public ResponseEntity saveBooksFirstData() throws JsonProcessingException { + contentsSchedulerService.saveNewBookWithLimit100(); + return ResponseEntity.ok("최신 도서 100권 로드 완료되었습니다."); + } } diff --git a/customer-service/src/main/java/com/example/customerservice/contents/service/ContentsSchedulerService.java b/customer-service/src/main/java/com/example/customerservice/contents/service/ContentsSchedulerService.java index 0bba7b5..bdecff2 100644 --- a/customer-service/src/main/java/com/example/customerservice/contents/service/ContentsSchedulerService.java +++ b/customer-service/src/main/java/com/example/customerservice/contents/service/ContentsSchedulerService.java @@ -58,6 +58,20 @@ public void fetchBooksForAllPages(int maxResults) throws JsonProcessingException System.out.println("Execution time: " + timeElapsed.toSeconds() + " seconds"); } + public void saveNewBookWithLimit100() throws JsonProcessingException { + int totalPages = 2; + int maxResults = 50; + ObjectMapper objectMapper = new ObjectMapper(); + + for (int page = 1; page <= totalPages; page++) { + String pageResponse = bookApiClient.fetchBooksByPage(page, maxResults); + JsonNode items = objectMapper.readTree(pageResponse).path("item"); + + List contentsList = AladinUtils.parseContentsData(items, "Book"); + saveContentsToDatabase(contentsList); + } + } + void saveContentsToDatabase(List contentsList) { List existingTitlesAndWriters = contentsRepository.findAllTitlesAndWriters(); From c33dbcdb2e6ba133919c910d453a4d2892950754 Mon Sep 17 00:00:00 2001 From: Hm-source Date: Wed, 22 Jan 2025 11:33:57 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20endpoint=20=EC=88=98=EC=A0=95(book)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contents/controller/ContentsScheduleController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java b/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java index 3685733..196c3ed 100644 --- a/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java +++ b/customer-service/src/main/java/com/example/customerservice/contents/controller/ContentsScheduleController.java @@ -17,7 +17,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/task") +@RequestMapping("/api/book") public class ContentsScheduleController { private final ContentsSchedulerService contentsSchedulerService; @@ -41,7 +41,7 @@ public class ContentsScheduleController { ) } ) - @PostMapping("/new-book") + @PostMapping("/start") public ResponseEntity startBookSync() { SchedulerStatus status = contentsSchedulerService.startBookSync(50); @@ -76,7 +76,7 @@ public ResponseEntity startBookSync() { ) } ) - @DeleteMapping("/new-book") + @DeleteMapping("/stop") public ResponseEntity stopBookSync() { SchedulerStatus status = contentsSchedulerService.stopBookSync(); From 2683085d815e31983206b55b7cc7127445bdace3 Mon Sep 17 00:00:00 2001 From: Hm-source Date: Wed, 22 Jan 2025 11:35:18 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20endpoint=20=EC=88=98=EC=A0=95(appear?= =?UTF-8?q?ance)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actor/controller/AppearanceController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/customer-service/src/main/java/com/example/customerservice/actor/controller/AppearanceController.java b/customer-service/src/main/java/com/example/customerservice/actor/controller/AppearanceController.java index 191391c..ae201f9 100644 --- a/customer-service/src/main/java/com/example/customerservice/actor/controller/AppearanceController.java +++ b/customer-service/src/main/java/com/example/customerservice/actor/controller/AppearanceController.java @@ -13,7 +13,7 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/api/appearance") +@RequestMapping("/api/movie/appearance") public class AppearanceController { private final AppearanceService appearanceService; @@ -22,10 +22,8 @@ public ResponseEntity getAppearance( @PositiveOrZero @RequestParam(defaultValue = "0") int page, @PositiveOrZero @RequestParam(defaultValue = "10") int size, @RequestParam(value = "actor") String actor - ){ AppearancePageResponse response = appearanceService.getAppearanceByName(actor, PageRequest.of(page, size)); return ResponseEntity.ok(response); } - }