Skip to content

Commit e674d73

Browse files
authored
Deploy: Merge to main (#75)
* Feature/73 search party (#74) * feat : 파티 검색 추가 * fix : 스웨거 description 추가
1 parent 4579e52 commit e674d73

6 files changed

Lines changed: 76 additions & 12 deletions

File tree

‎src/main/java/ita/tinybite/domain/party/controller/PartyController.java‎

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
import io.swagger.v3.oas.annotations.responses.ApiResponses;
99
import io.swagger.v3.oas.annotations.tags.Tag;
1010
import ita.tinybite.domain.auth.entity.JwtTokenProvider;
11-
import ita.tinybite.domain.chat.entity.ChatRoom;
1211
import ita.tinybite.domain.party.dto.request.PartyCreateRequest;
12+
import ita.tinybite.domain.party.dto.request.PartyQueryListResponse;
1313
import ita.tinybite.domain.party.dto.request.PartyUpdateRequest;
14-
import ita.tinybite.domain.party.dto.request.UserLocation;
1514
import ita.tinybite.domain.party.dto.response.ChatRoomResponse;
1615
import ita.tinybite.domain.party.dto.response.PartyDetailResponse;
1716
import ita.tinybite.domain.party.dto.response.PartyListResponse;
1817
import ita.tinybite.domain.party.entity.PartyParticipant;
1918
import ita.tinybite.domain.party.enums.PartyCategory;
2019
import ita.tinybite.domain.party.service.PartyService;
20+
import ita.tinybite.global.response.APIResponse;
2121
import jakarta.validation.Valid;
2222
import lombok.RequiredArgsConstructor;
2323
import org.springframework.http.ResponseEntity;
@@ -438,4 +438,27 @@ public ResponseEntity<Void> deleteParty(
438438
partyService.deleteParty(partyId, userId);
439439
return ResponseEntity.noContent().build();
440440
}
441+
442+
@Operation(
443+
summary = "파티 검색",
444+
description = """
445+
q 문자열을 포함하는 제목을 가진 파티를 검색합니다. <br>
446+
slice 페이지 처리를 위해, 조회할 다음 페이지가 있는지 체크하는 hasNext 필드와, <br>
447+
몇 번째 페이지 인지 (page), 한 페이지 당 몇 개의 파티를 조회할 지 (size) 파라미터로 입력해주시면 됩니다.
448+
"""
449+
)
450+
@GetMapping("/search")
451+
public APIResponse<PartyQueryListResponse> getParty(
452+
@RequestParam String q,
453+
@Parameter(
454+
description = "파티 카테고리",
455+
example = "ALL",
456+
schema = @Schema(allowableValues = {"ALL", "DELIVERY", "GROCERY", "HOUSEHOLD"})
457+
)
458+
@RequestParam(defaultValue = "ALL") PartyCategory category,
459+
@RequestParam(defaultValue = "0") int page,
460+
@RequestParam(defaultValue = "20") int size
461+
) {
462+
return APIResponse.success(partyService.searchParty(q, category, page, size));
463+
}
441464
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ita.tinybite.domain.party.dto.request;
2+
3+
import ita.tinybite.domain.party.dto.response.PartyCardResponse;
4+
import lombok.Builder;
5+
6+
import java.util.List;
7+
8+
@Builder
9+
public record PartyQueryListResponse(
10+
List<PartyCardResponse> parties,
11+
Boolean hasNext
12+
) {
13+
}

‎src/main/java/ita/tinybite/domain/party/dto/response/PartyCardResponse.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class PartyCardResponse {
2626
private PartyCategory category;
2727
private LocalDateTime createdAt;
2828

29-
public static PartyCardResponse from(Party party, int currentParticipants, boolean isHost, ParticipantStatus status) {
29+
public static PartyCardResponse from(Party party, int currentParticipants) {
3030
return PartyCardResponse.builder()
3131
.partyId(party.getId())
3232
.thumbnailImage(party.getThumbnailImage())

‎src/main/java/ita/tinybite/domain/party/repository/PartyRepository.java‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package ita.tinybite.domain.party.repository;
22

33
import io.lettuce.core.dynamic.annotation.Param;
4-
import ita.tinybite.domain.party.entity.Neighborhood;
54
import ita.tinybite.domain.party.entity.Party;
65
import ita.tinybite.domain.party.enums.PartyCategory;
76
import java.util.List;
87
import java.util.Optional;
98

109
import ita.tinybite.domain.party.enums.PartyStatus;
10+
import org.springframework.data.domain.Page;
11+
import org.springframework.data.domain.Pageable;
1112
import org.springframework.data.jpa.repository.JpaRepository;
1213
import org.springframework.data.jpa.repository.Query;
1314
import org.springframework.stereotype.Repository;
@@ -23,5 +24,8 @@ public interface PartyRepository extends JpaRepository<Party, Long> {
2324
List<Party> findByPickupLocation_PlaceAndCategory(String place, PartyCategory category);
2425

2526
List<Party> findByHostUserIdAndStatus(Long userId, PartyStatus partyStatus);
26-
}
2727

28+
Page<Party> findByTitleContaining(String title, Pageable pageable);
29+
30+
Page<Party> findByTitleContainingAndCategory(String title, PartyCategory category, Pageable pageable);
31+
}

‎src/main/java/ita/tinybite/domain/party/service/PartyService.java‎

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import ita.tinybite.domain.chat.enums.ChatRoomType;
55
import ita.tinybite.domain.chat.repository.ChatRoomRepository;
66
import ita.tinybite.domain.party.dto.request.PartyCreateRequest;
7+
import ita.tinybite.domain.party.dto.request.PartyQueryListResponse;
78
import ita.tinybite.domain.party.dto.request.PartyUpdateRequest;
8-
import ita.tinybite.domain.party.dto.request.UserLocation;
99
import ita.tinybite.domain.party.dto.response.*;
1010
import ita.tinybite.domain.party.entity.Party;
1111
import ita.tinybite.domain.party.entity.PartyParticipant;
@@ -19,14 +19,15 @@
1919
import ita.tinybite.domain.user.repository.UserRepository;
2020

2121
import java.time.LocalDateTime;
22-
import java.util.ArrayList;
2322
import java.util.List;
2423
import java.util.stream.Collectors;
2524

2625
import ita.tinybite.global.location.LocationService;
2726
import ita.tinybite.global.util.DistanceCalculator;
28-
import lombok.Data;
2927
import lombok.RequiredArgsConstructor;
28+
import org.springframework.data.domain.Page;
29+
import org.springframework.data.domain.PageRequest;
30+
import org.springframework.data.domain.Pageable;
3031
import org.springframework.stereotype.Service;
3132
import org.springframework.transaction.annotation.Transactional;
3233

@@ -666,5 +667,29 @@ private String getDescriptionIfPresent(String description) {
666667
private String formatDistanceIfExists(Double distance) {
667668
return distance!= null? DistanceCalculator.formatDistance(distance):null;
668669
}
670+
671+
// 파티 검색 조회
672+
public PartyQueryListResponse searchParty(String q, PartyCategory category, int page, int size) {
673+
Pageable pageable = PageRequest.of(page, size);
674+
675+
// category가 없을 시에는 ALL로 처리
676+
Page<Party> result = (category == null || category == PartyCategory.ALL)
677+
? partyRepository.findByTitleContaining(q, pageable)
678+
: partyRepository.findByTitleContainingAndCategory(q, category, pageable);
679+
680+
681+
List<PartyCardResponse> partyCardResponseList = result.stream()
682+
.map(party -> {
683+
int currentParticipants = participantRepository
684+
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
685+
return PartyCardResponse.from(party, currentParticipants);
686+
})
687+
.toList();
688+
689+
return PartyQueryListResponse.builder()
690+
.parties(partyCardResponseList)
691+
.hasNext(result.hasNext())
692+
.build();
693+
}
669694
}
670695

‎src/main/java/ita/tinybite/domain/user/service/UserService.java‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ public List<PartyCardResponse> getActiveParties(Long userId) {
102102
Party party = pp.getParty();
103103
int currentParticipants = participantRepository
104104
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
105-
boolean isHost = party.getHost().getUserId().equals(userId);
106-
return PartyCardResponse.from(party, currentParticipants, isHost, pp.getStatus());
105+
return PartyCardResponse.from(party, currentParticipants);
107106
})
108107
.collect(Collectors.toList());
109108
}
@@ -185,7 +184,7 @@ public List<PartyCardResponse> getHostingParties(Long userId) {
185184
.map(party -> {
186185
int currentParticipants = participantRepository
187186
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
188-
return PartyCardResponse.from(party, currentParticipants, true, ParticipantStatus.APPROVED);
187+
return PartyCardResponse.from(party, currentParticipants);
189188
})
190189
.collect(Collectors.toList());
191190
}
@@ -203,7 +202,7 @@ public List<PartyCardResponse> getParticipatingParties(Long userId) {
203202
Party party = pp.getParty();
204203
int currentParticipants = participantRepository
205204
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
206-
return PartyCardResponse.from(party, currentParticipants, false, pp.getStatus());
205+
return PartyCardResponse.from(party, currentParticipants);
207206
})
208207
.collect(Collectors.toList());
209208
}

0 commit comments

Comments
 (0)