Skip to content

Commit ddd0776

Browse files
authored
Merge pull request #309 from ASSU-dev/fix/#308-map-search
[FIX/#308] store 검색 로직 수정
2 parents 089d3ea + 8823846 commit ddd0776

5 files changed

Lines changed: 46 additions & 73 deletions

File tree

src/main/java/com/assu/server/domain/map/controller/MapController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public BaseResponse<?> getLocationsByKeyword(
156156

157157
return switch (role) {
158158
case STUDENT -> {
159-
List<StoreMapResponseDTO> list = mapService.searchStores(keyword);
159+
List<StoreMapResponseDTO> list = mapService.searchStores(keyword, memberId);
160160
yield BaseResponse.onSuccess(SuccessStatus._OK, list);
161161
}
162162
case ADMIN -> {

src/main/java/com/assu/server/domain/map/service/MapService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public interface MapService {
1212
List<PartnerMapResponseDTO> getPartners(MapRequestDTO viewport, Long memberId);
1313
List<StoreMapResponseDTO> getStores(MapRequestDTO viewport, Long memberId);
1414

15-
List<StoreMapResponseDTO> searchStores(String keyword);
15+
List<StoreMapResponseDTO> searchStores(String keyword, Long memberId);
1616
List<PartnerMapResponseDTO> searchPartner(String keyword, Long memberId);
1717
List<AdminMapResponseDTO> searchAdmin(String keyword, Long memberId);
1818
}

src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java

Lines changed: 42 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import org.springframework.data.domain.PageRequest;
2525
import org.springframework.stereotype.Service;
2626
import org.springframework.transaction.annotation.Transactional;
27-
28-
import java.time.LocalDate;
2927
import java.util.*;
3028
import java.util.stream.Collectors;
3129

@@ -102,7 +100,7 @@ public List<StoreMapResponseDTO> getStores(MapRequestDTO viewport, Long memberId
102100
}
103101

104102
// 2) 해당 학생의 활성 UserPaper 조회 (paper, store, admin fetch join 포함)
105-
final List<UserPaper> userPapers = userPaperRepository.findActivePartnershipsByStudentId(memberId, LocalDate.now());
103+
final List<UserPaper> userPapers = userPaperRepository.findActivePartnershipsByStudentId(memberId);
106104
if (userPapers.isEmpty()) {
107105
return List.of(); // active 제휴가 없으면 빈 리스트 반환
108106
}
@@ -230,79 +228,55 @@ private String generateBenefitText(PaperContent content) {
230228
}
231229

232230
@Override
233-
public List<StoreMapResponseDTO> searchStores(String keyword) {
234-
List<Store> stores = storeRepository.findByNameContainingIgnoreCaseOrderByIdDescWithPartner(keyword);
231+
public List<StoreMapResponseDTO> searchStores(String keyword, Long memberId) {
232+
List<UserPaper> userPapers = userPaperRepository.findActivePartnershipsByStudentId(memberId);
235233

236-
if (stores.isEmpty()) {
234+
if (userPapers.isEmpty()) {
237235
return List.of();
238236
}
239237

240-
List<Long> storeIds = stores.stream().map(Store::getId).toList();
241-
242-
// 매장별 모든 active Paper 조회
243-
List<Paper> papers = paperRepository.findByStoreIdIn(storeIds, ActivationStatus.ACTIVE);
244-
245-
// active 제휴가 없는 매장 필터링
246-
Set<Long> storeIdsWithActivePaper = papers.stream()
247-
.map(p -> p.getStore().getId())
248-
.collect(Collectors.toSet());
249-
250-
List<Store> storesWithActivePaper = stores.stream()
251-
.filter(s -> storeIdsWithActivePaper.contains(s.getId()))
252-
.toList();
253-
254-
if (storesWithActivePaper.isEmpty()) {
238+
Map<Store, List<Paper>> storePaperMap = userPapers.stream()
239+
.map(UserPaper::getPaper)
240+
.filter(paper -> paper.getStore().getName().toLowerCase().replace(" ","").contains(keyword.toLowerCase().replace(" ","")))
241+
.collect(Collectors.groupingBy(Paper::getStore));
242+
243+
if (storePaperMap.isEmpty()) {
255244
return List.of();
256245
}
257246

258-
// 매장별 Paper 그룹화
259-
Map<Long, List<Paper>> papersByStore = papers.stream()
260-
.collect(Collectors.groupingBy(p -> p.getStore().getId()));
261-
262-
// 모든 paper의 모든 PaperContent 조회
263-
List<Long> allPaperIds = papers.stream().map(Paper::getId).toList();
264-
Map<Long, List<PaperContent>> contentsByPaperId = allPaperIds.isEmpty()
265-
? Collections.emptyMap()
266-
: paperContentRepository.findByPaperIdIn(allPaperIds).stream()
267-
.collect(Collectors.groupingBy(
268-
pc -> pc.getPaper().getId()
269-
));
270-
271-
return storesWithActivePaper.stream().map(s -> {
272-
List<Paper> storePapers = papersByStore.getOrDefault(s.getId(), List.of());
273-
274-
// admin별로 그룹화해서 benefits 리스트 생성
275-
Map<Long, List<String>> benefitsByAdmin = storePapers.stream()
276-
.collect(Collectors.groupingBy(
277-
paper -> paper.getAdmin().getId(),
278-
Collectors.flatMapping(
279-
paper -> {
280-
List<PaperContent> contents = contentsByPaperId.getOrDefault(paper.getId(), List.of());
281-
return contents.stream().map(this::resolveBenefit);
282-
},
283-
Collectors.filtering(
284-
benefit -> benefit != null && !benefit.isBlank(),
285-
Collectors.toList()
286-
)
287-
)
288-
));
289-
290-
List<StoreMapResponseDTO.PartnershipInfo> partnerships = benefitsByAdmin.entrySet().stream()
291-
.map(entry -> {
292-
Long adminId = entry.getKey();
293-
List<String> benefits = entry.getValue();
294-
String adminName = storePapers.stream()
295-
.filter(p -> p.getAdmin().getId().equals(adminId))
296-
.findFirst()
297-
.map(p -> p.getAdmin().getName())
298-
.orElse(null);
299-
return new StoreMapResponseDTO.PartnershipInfo(adminId, adminName, benefits);
300-
})
301-
.filter(p -> p.adminId() != null && !p.benefits().isEmpty())
302-
.toList();
247+
List<Long> paperIds = storePaperMap.values().stream()
248+
.flatMap(List::stream)
249+
.map(Paper::getId)
250+
.toList();
303251

304-
return StoreMapResponseDTO.ofWithPartnerships(s, partnerships, amazonS3Manager);
305-
}).toList();
252+
Map<Long, List<PaperContent>> contentsByPaperId = paperContentRepository.findByPaperIdIn(paperIds).stream()
253+
.collect(Collectors.groupingBy(pc -> pc.getPaper().getId()));
254+
255+
return storePaperMap.entrySet().stream()
256+
.map(entry -> {
257+
Store store = entry.getKey();
258+
List<Paper> papers = entry.getValue();
259+
260+
List<StoreMapResponseDTO.PartnershipInfo> partnerships = papers.stream()
261+
.map(paper -> {
262+
List<String> benefits = contentsByPaperId.getOrDefault(paper.getId(), List.of()).stream()
263+
.map(this::resolveBenefit)
264+
.filter(benefit -> benefit != null && !benefit.isBlank())
265+
.toList();
266+
267+
return new StoreMapResponseDTO.PartnershipInfo(
268+
paper.getAdmin().getId(),
269+
paper.getAdmin().getName(),
270+
benefits
271+
);
272+
})
273+
.filter(p -> !p.benefits().isEmpty())
274+
.toList();
275+
276+
return StoreMapResponseDTO.ofWithPartnerships(store, partnerships, amazonS3Manager);
277+
})
278+
.filter(dto -> !dto.partnerships().isEmpty())
279+
.toList();
306280
}
307281

308282
@Override

src/main/java/com/assu/server/domain/user/repository/UserPaperRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ public interface UserPaperRepository extends JpaRepository<UserPaper, Long> {
1919
AND p.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE
2020
ORDER BY p.id DESC
2121
""")
22-
List<UserPaper> findActivePartnershipsByStudentId(@Param("studentId") Long studentId,
23-
@Param("today") LocalDate today);
22+
List<UserPaper> findActivePartnershipsByStudentId(@Param("studentId") Long studentId);
2423

2524
boolean existsByStudentIdAndPaperId(Long studentId, Long paperId);
2625

src/main/java/com/assu/server/domain/user/service/StudentServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public Page<StudentResponseDTO.UsageDetail> getUnreviewedUsage(Long memberId, Pa
138138

139139
@Override
140140
public List<StudentResponseDTO.UsablePartnershipDTO> getUsablePartnership(Long memberId, Boolean all) {
141-
List<UserPaper> userPapers = userPaperRepository.findActivePartnershipsByStudentId(memberId, LocalDate.now());
141+
List<UserPaper> userPapers = userPaperRepository.findActivePartnershipsByStudentId(memberId);
142142

143143
// Goods 일괄 조회 (N+1 방지)
144144
List<Long> contentIds = userPapers.stream()

0 commit comments

Comments
 (0)