Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 검색api 1차 구현 #116

Merged
merged 1 commit into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,56 @@ public ResponseEntity<?> diaryShare(@RequestParam("diaryId") Long diaryId){

}

@GetMapping("/api/diary/search")

public ResponseEntity<?>diarySearch(@RequestHeader(value = "Authorization") String authHeader,@RequestBody SearchRequestDto requestDto){

try{
Long memberId=extractMemberIdFromRequestHeader(authHeader);
String searchKeyword= requestDto.getSearchKeyword();
List<Diary> diaries = diaryService.searchDiaries(memberId, searchKeyword);

if (diaries.isEmpty()) {
return ResponseEntity.status(ErrorType.REQUEST_VALIDATION_ERROR.getHttpStatus())
.body(ApiResponse.error(ErrorType.REQUEST_VALIDATION_ERROR, "해당 검색어에 대한 일기가 존재하지 않습니다."));
}
List<DiarySearchResponseDto> 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<String,List<DiarySearchResponseDto>> 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);
Expand All @@ -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); // 정해진 범위의 내용 반환
}





}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.kau.kkoolbeeServer.domain.diary.dto.request;

import lombok.Getter;

@Getter
public class SearchRequestDto {
private String searchKeyword;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ public interface DiaryRepository extends JpaRepository<Diary,Long> {

List<Diary> findByMemberIdAndFeeling(Long memberId,Feeling feeling);

List<Diary> findByMemberIdAndTitleContainingOrContentContaining(Long memberId, String titleKeyword, String contentKeyword);

}
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ private String formatPromptForImageGeneration(String diaryContent) {
}


public List<Diary> searchDiaries(Long memberId, String searchKeyword) {
return diaryRepository.findByMemberIdAndTitleContainingOrContentContaining(memberId, searchKeyword, searchKeyword);
}




}
Loading