diff --git a/src/main/java/org/kau/kkoolbeeServer/domain/diary/controller/DiaryController.java b/src/main/java/org/kau/kkoolbeeServer/domain/diary/controller/DiaryController.java index e54f3e8..a6fce21 100644 --- a/src/main/java/org/kau/kkoolbeeServer/domain/diary/controller/DiaryController.java +++ b/src/main/java/org/kau/kkoolbeeServer/domain/diary/controller/DiaryController.java @@ -320,6 +320,56 @@ public ResponseEntity diaryShare(@RequestParam("diaryId") Long diaryId){ } + @GetMapping("/api/diary/search") + + public ResponseEntitydiarySearch(@RequestHeader(value = "Authorization") String authHeader,@RequestBody SearchRequestDto requestDto){ + + try{ + Long memberId=extractMemberIdFromRequestHeader(authHeader); + String searchKeyword= requestDto.getSearchKeyword(); + List diaries = diaryService.searchDiaries(memberId, searchKeyword); + + if (diaries.isEmpty()) { + return ResponseEntity.status(ErrorType.REQUEST_VALIDATION_ERROR.getHttpStatus()) + .body(ApiResponse.error(ErrorType.REQUEST_VALIDATION_ERROR, "해당 검색어에 대한 일기가 존재하지 않습니다.")); + } + List diaryList = diaries.stream() + .map(diary -> { + String excerptContent = getFirstExcerpt(diary.getContent(), searchKeyword); + + + + + return new DiarySearchResponseDto(diary.getId(), diary.getWritedAt(),diary.getTitle(), diary.getImageurl(),excerptContent , searchKeyword); + }) + .collect(Collectors.toList()); + + Map> responseMap=Map.of("diaryList", diaryList); + + + + return ResponseEntity.ok().body(ApiResponse.success(SuccessType.PROCESS_SUCCESSED,responseMap)); + + + + } catch (IllegalArgumentException e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.error(ErrorType.INVALID_HTTP_REQUEST_ERROR)); + } + catch(Exception e){ + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.error(ErrorType.INTERNAL_SERVER_ERROR)); + + + + + } + + + } + + + public Long extractMemberIdFromRequestHeader(String authHeader) { if (authHeader != null && authHeader.startsWith("Bearer ")) { String accessToken = authHeader.substring(7); @@ -330,6 +380,21 @@ public Long extractMemberIdFromRequestHeader(String authHeader) { } + private String getFirstExcerpt(String content, String keyword) { + // content에 keyword가 없을 경우 null 반환 + if (!content.contains(keyword)) { + return null; // 키워드가 없으면 null 반환 + } + + int index = content.indexOf(keyword); + int start = Math.max(0, index - 3); // 앞쪽 3자 + int end = Math.min(content.length(), index + keyword.length() + 3); // 키워드 끝까지 + 3자 + + return content.substring(start, end); // 정해진 범위의 내용 반환 + } + + + } \ No newline at end of file diff --git a/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/request/SearchRequestDto.java b/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/request/SearchRequestDto.java new file mode 100644 index 0000000..88c8dbc --- /dev/null +++ b/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/request/SearchRequestDto.java @@ -0,0 +1,8 @@ +package org.kau.kkoolbeeServer.domain.diary.dto.request; + +import lombok.Getter; + +@Getter +public class SearchRequestDto { + private String searchKeyword; +} diff --git a/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/response/DiarySearchResponseDto.java b/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/response/DiarySearchResponseDto.java new file mode 100644 index 0000000..b7071c8 --- /dev/null +++ b/src/main/java/org/kau/kkoolbeeServer/domain/diary/dto/response/DiarySearchResponseDto.java @@ -0,0 +1,19 @@ +package org.kau.kkoolbeeServer.domain.diary.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Getter +public class DiarySearchResponseDto { + private Long diaryId; + private LocalDateTime createdDate; + private String diaryTitle; + private String imageUrl; + + private String diaryContent; + + private String keyWord; +} diff --git a/src/main/java/org/kau/kkoolbeeServer/domain/diary/repository/DiaryRepository.java b/src/main/java/org/kau/kkoolbeeServer/domain/diary/repository/DiaryRepository.java index aa6a1cb..b9657ab 100644 --- a/src/main/java/org/kau/kkoolbeeServer/domain/diary/repository/DiaryRepository.java +++ b/src/main/java/org/kau/kkoolbeeServer/domain/diary/repository/DiaryRepository.java @@ -18,4 +18,6 @@ public interface DiaryRepository extends JpaRepository { List findByMemberIdAndFeeling(Long memberId,Feeling feeling); + List findByMemberIdAndTitleContainingOrContentContaining(Long memberId, String titleKeyword, String contentKeyword); + } diff --git a/src/main/java/org/kau/kkoolbeeServer/domain/diary/service/DiaryService.java b/src/main/java/org/kau/kkoolbeeServer/domain/diary/service/DiaryService.java index 7ee7779..0ac9ad7 100644 --- a/src/main/java/org/kau/kkoolbeeServer/domain/diary/service/DiaryService.java +++ b/src/main/java/org/kau/kkoolbeeServer/domain/diary/service/DiaryService.java @@ -233,6 +233,11 @@ private String formatPromptForImageGeneration(String diaryContent) { } + public List searchDiaries(Long memberId, String searchKeyword) { + return diaryRepository.findByMemberIdAndTitleContainingOrContentContaining(memberId, searchKeyword, searchKeyword); + } + + }