Skip to content

Commit 456a7db

Browse files
authored
Merge pull request #154 from dnd-side-project/feature/#136-searchAll
Feature/#136 통합검색 전체
2 parents 7a7b4b5 + c7cdc92 commit 456a7db

File tree

13 files changed

+243
-1
lines changed

13 files changed

+243
-1
lines changed

src/main/java/com/dnd/reevserver/domain/retrospect/repository/RetrospectRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import java.util.List;
1414

1515

16-
public interface RetrospectRepository extends JpaRepository<Retrospect, Long> {
16+
public interface RetrospectRepository extends JpaRepository<Retrospect, Long>, RetrospectRepositoryCustom {
1717

1818
@Query("""
1919
SELECT
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.dnd.reevserver.domain.retrospect.repository;
2+
3+
import com.dnd.reevserver.domain.retrospect.entity.Retrospect;
4+
import java.util.List;
5+
6+
public interface RetrospectRepositoryCustom {
7+
List<Retrospect> searchForKeyword(String keyword);
8+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.dnd.reevserver.domain.retrospect.repository;
2+
3+
import static org.springframework.util.StringUtils.hasText;
4+
import static com.dnd.reevserver.domain.retrospect.entity.QRetrospect.retrospect;
5+
6+
import com.dnd.reevserver.domain.retrospect.entity.QRetrospect;
7+
import com.dnd.reevserver.domain.retrospect.entity.Retrospect;
8+
import com.querydsl.core.BooleanBuilder;
9+
import com.querydsl.core.types.dsl.BooleanExpression;
10+
import com.querydsl.jpa.impl.JPAQueryFactory;
11+
import java.util.List;
12+
import lombok.RequiredArgsConstructor;
13+
14+
@RequiredArgsConstructor
15+
public class RetrospectRepositoryCustomImpl implements RetrospectRepositoryCustom {
16+
private final JPAQueryFactory queryFactory;
17+
18+
@Override
19+
public List<Retrospect> searchForKeyword(String keyword) {
20+
BooleanBuilder builder = new BooleanBuilder();
21+
22+
BooleanExpression titleCondition = containTitle(keyword);
23+
if(titleCondition != null) {
24+
builder.or(titleCondition);
25+
}
26+
27+
BooleanExpression contentCondition = containContent(keyword);
28+
if(contentCondition != null) {
29+
builder.or(contentCondition);
30+
}
31+
32+
return queryFactory
33+
.select(retrospect)
34+
.from(retrospect)
35+
.where(builder)
36+
.fetch();
37+
}
38+
39+
//제목에 포함
40+
private BooleanExpression containTitle(String keyword){
41+
if(!hasText(keyword)){
42+
return null;
43+
}
44+
return retrospect.title.containsIgnoreCase(keyword);
45+
}
46+
47+
//내용에 포함
48+
private BooleanExpression containContent(String keyword){
49+
if(!hasText(keyword)){
50+
return null;
51+
}
52+
return retrospect.content.containsIgnoreCase(keyword);
53+
}
54+
55+
}

src/main/java/com/dnd/reevserver/domain/retrospect/service/RetrospectService.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.dnd.reevserver.domain.retrospect.dto.request.*;
1919
import com.dnd.reevserver.domain.retrospect.entity.Retrospect;
2020
import com.dnd.reevserver.domain.retrospect.repository.RetrospectRepository;
21+
import com.dnd.reevserver.domain.search.dto.response.SearchRetrospectResponseDto;
2122
import com.dnd.reevserver.domain.statistics.service.StatisticsService;
2223
import com.dnd.reevserver.domain.team.entity.Team;
2324
import com.dnd.reevserver.domain.team.service.TeamService;
@@ -207,6 +208,16 @@ public long countByGroupId(Long groupId) {
207208
return retrospectRepository.countByGroupId(groupId);
208209
}
209210

211+
//통합검색에서 검색
212+
@Transactional(readOnly = true)
213+
public List<SearchRetrospectResponseDto> searchForKeyword(String keyword){
214+
List<Retrospect> retrospects = retrospectRepository.searchForKeyword(keyword);
215+
return retrospects.stream()
216+
.map(this::convertToRetrospectResponse)
217+
.toList();
218+
}
219+
220+
210221
public int getLikeCount(Long retrospectId) {
211222
return likeRepository.getLikeCount(retrospectId);
212223
}
@@ -280,4 +291,13 @@ private RetrospectSingleResponseDto convertToSingleDto(Retrospect retrospect, Li
280291
.categories(categoriesName)
281292
.build();
282293
}
294+
295+
private SearchRetrospectResponseDto convertToRetrospectResponse(Retrospect retrospect){
296+
return SearchRetrospectResponseDto.builder()
297+
.retrospectId(retrospect.getRetrospectId())
298+
.title(retrospect.getTitle())
299+
.userName(retrospect.getMember().getNickname())
300+
.timeString(timeStringUtil.getTimeString(retrospect.getUpdatedAt()))
301+
.build();
302+
}
283303
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.dnd.reevserver.domain.search.controller;
2+
3+
import com.dnd.reevserver.domain.search.dto.response.SearchAllResponseDto;
4+
import com.dnd.reevserver.domain.search.service.SearchService;
5+
import java.util.List;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.core.parameters.P;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
@RestController
15+
@RequestMapping("/api/v1/search")
16+
@RequiredArgsConstructor
17+
public class SearchController {
18+
19+
private final SearchService searchService;
20+
21+
@GetMapping
22+
public ResponseEntity<SearchAllResponseDto> search (@RequestParam(required = false) String keyword){
23+
SearchAllResponseDto response = searchService.searchAll(keyword);
24+
return ResponseEntity.ok().body(response);
25+
}
26+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.dnd.reevserver.domain.search.controller;
2+
3+
import com.dnd.reevserver.domain.search.dto.response.SearchAllResponseDto;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.Parameter;
6+
import io.swagger.v3.oas.annotations.tags.Tag;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.RequestParam;
9+
10+
@Tag(name = "통합검색 API", description = "통합검색과 관련한 API입니다.")
11+
public interface SearchControllerDocs {
12+
13+
@Operation(summary = "통합 검색 API", description = "통합 검색을 수행합니다.")
14+
ResponseEntity<SearchAllResponseDto> search (@Parameter(name = "keyword",
15+
description = "회고 제목이나 내용에 포함될 경우, 그룹 제목이나 한줄소개에 포함될 경우") @RequestParam(required = false) String keyword);
16+
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.dnd.reevserver.domain.search.dto.response;
2+
3+
import java.util.List;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record SearchAllResponseDto(List<SearchGroupResponseDto> groups, List<SearchRetrospectResponseDto> retrospects) {
8+
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.dnd.reevserver.domain.search.dto.response;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record SearchGroupResponseDto(Long groupId, String groupName, String introduction,
7+
Integer userCount, Long retrospectCount) {
8+
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.dnd.reevserver.domain.search.dto.response;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record SearchRetrospectResponseDto(Long retrospectId, String title,
7+
String userName, String timeString) {
8+
9+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.dnd.reevserver.domain.search.service;
2+
3+
import com.dnd.reevserver.domain.retrospect.dto.response.RetrospectResponseDto;
4+
import com.dnd.reevserver.domain.retrospect.entity.Retrospect;
5+
import com.dnd.reevserver.domain.retrospect.service.RetrospectService;
6+
import com.dnd.reevserver.domain.search.dto.response.SearchAllResponseDto;
7+
import com.dnd.reevserver.domain.search.dto.response.SearchGroupResponseDto;
8+
import com.dnd.reevserver.domain.search.dto.response.SearchRetrospectResponseDto;
9+
import com.dnd.reevserver.domain.team.dto.response.GroupDetailResponseDto;
10+
import com.dnd.reevserver.domain.team.entity.Team;
11+
import com.dnd.reevserver.domain.team.service.TeamService;
12+
import com.dnd.reevserver.global.util.TimeStringUtil;
13+
import java.util.List;
14+
import lombok.RequiredArgsConstructor;
15+
import org.springframework.stereotype.Service;
16+
import org.springframework.transaction.annotation.Transactional;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
public class SearchService {
21+
22+
private final TeamService teamService;
23+
private final RetrospectService retrospectService;
24+
private final TimeStringUtil timeStringUtil;
25+
26+
@Transactional(readOnly = true)
27+
public SearchAllResponseDto searchAll(String keyword){
28+
List<SearchGroupResponseDto> groups = teamService.searchForKeyword(keyword);
29+
List<SearchRetrospectResponseDto> retrospects = retrospectService.searchForKeyword(keyword);
30+
return new SearchAllResponseDto(groups, retrospects);
31+
}
32+
33+
34+
}

0 commit comments

Comments
 (0)