Skip to content

Commit 4579e52

Browse files
authored
Release : 마이페이지에서 참여중,호스트인 파티 구분해서 조회(v1.1.0) (#72)
1 parent 7c98149 commit 4579e52

File tree

4 files changed

+106
-20
lines changed

4 files changed

+106
-20
lines changed

src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,16 @@ long countActivePartiesByHostId(
6868
@Param("userId") Long userId,
6969
@Param("activeStatuses") List<PartyStatus> activeStatuses
7070
);
71-
}
71+
72+
@Query("SELECT pp FROM PartyParticipant pp " +
73+
"JOIN FETCH pp.party p " +
74+
"JOIN FETCH p.host " +
75+
"WHERE pp.user.userId = :userId " +
76+
"AND p.host.userId != :userId " +
77+
"AND p.status = :partyStatus " +
78+
"AND pp.status = :participantStatus")
79+
List<PartyParticipant> findActivePartiesByUserIdExcludingHost(
80+
@Param("userId") Long userId,
81+
@Param("partyStatus") PartyStatus partyStatus,
82+
@Param("participantStatus") ParticipantStatus participantStatus
83+
);}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.Optional;
99

10+
import ita.tinybite.domain.party.enums.PartyStatus;
1011
import org.springframework.data.jpa.repository.JpaRepository;
1112
import org.springframework.data.jpa.repository.Query;
1213
import org.springframework.stereotype.Repository;
@@ -20,5 +21,7 @@ public interface PartyRepository extends JpaRepository<Party, Long> {
2021
List<Party> findByPickupLocation_Place(String place);
2122

2223
List<Party> findByPickupLocation_PlaceAndCategory(String place, PartyCategory category);
24+
25+
List<Party> findByHostUserIdAndStatus(Long userId, PartyStatus partyStatus);
2326
}
2427

src/main/java/ita/tinybite/domain/user/controller/UserController.java

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import jakarta.validation.Valid;
1818
import org.springframework.http.ResponseEntity;
1919
import org.springframework.security.core.annotation.AuthenticationPrincipal;
20+
import org.springframework.web.ErrorResponse;
2021
import org.springframework.web.bind.annotation.*;
2122

2223
import java.util.List;
@@ -111,19 +112,65 @@ public APIResponse<RejoinValidationResponse> validateRejoin(
111112
return success(response);
112113
}
113114

114-
@Operation(summary = "활성 파티 목록 조회", description = "사용자가 참여 중인 활성 파티 목록을 조회합니다.")
115+
@Operation(
116+
summary = "호스팅 중인 파티 목록 조회",
117+
description = "현재 사용자가 호스트로 있는 활성 파티 목록을 조회합니다."
118+
)
115119
@ApiResponses({
116-
@ApiResponse(responseCode = "200", description = "조회 성공",
117-
content = @Content(array = @ArraySchema(schema = @Schema(implementation = PartyCardResponse.class)))),
118-
@ApiResponse(responseCode = "401", description = "인증 실패")
120+
@ApiResponse(
121+
responseCode = "200",
122+
description = "조회 성공",
123+
content = @Content(
124+
array = @ArraySchema(schema = @Schema(implementation = PartyCardResponse.class))
125+
)
126+
),
127+
@ApiResponse(
128+
responseCode = "401",
129+
description = "인증 실패",
130+
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
131+
)
119132
})
120-
@GetMapping("/parties/active")
121-
public ResponseEntity<List<PartyCardResponse>> getActiveParties(
133+
@GetMapping("/parties/hosting")
134+
public ResponseEntity<List<PartyCardResponse>> getHostingParties(
122135
@AuthenticationPrincipal Long userId) {
123-
List<PartyCardResponse> response = userService.getActiveParties(userId);
136+
List<PartyCardResponse> response = userService.getHostingParties(userId);
124137
return ResponseEntity.ok(response);
125138
}
126139

140+
@ApiResponses({
141+
@ApiResponse(
142+
responseCode = "200",
143+
description = "조회 성공",
144+
content = @Content(
145+
array = @ArraySchema(schema = @Schema(implementation = PartyCardResponse.class))
146+
)
147+
),
148+
@ApiResponse(
149+
responseCode = "401",
150+
description = "인증 실패",
151+
content = @Content(schema = @Schema(implementation = ErrorResponse.class))
152+
)
153+
})
154+
@GetMapping("/parties/participating")
155+
public ResponseEntity<List<PartyCardResponse>> getParticipatingParties(
156+
@AuthenticationPrincipal Long userId) {
157+
List<PartyCardResponse> response = userService.getParticipatingParties(userId);
158+
return ResponseEntity.ok(response);
159+
}
160+
161+
// @Operation(summary = "활성 파티 목록 조회", description = "사용자가 참여 중인 활성 파티 목록을 조회합니다.")
162+
// @ApiResponses({
163+
// @ApiResponse(responseCode = "200", description = "조회 성공",
164+
// content = @Content(array = @ArraySchema(schema = @Schema(implementation = PartyCardResponse.class)))),
165+
// @ApiResponse(responseCode = "401", description = "인증 실패")
166+
// })
167+
// @GetMapping("/parties/active")
168+
// public ResponseEntity<List<PartyCardResponse>> getActiveParties(
169+
// @AuthenticationPrincipal Long userId) {
170+
// List<PartyCardResponse> response = userService.getActiveParties(userId);
171+
// return ResponseEntity.ok(response);
172+
// }
173+
127174
@Operation(summary = "닉네임 중복 확인", description = "닉네임 사용 가능 여부를 확인합니다.")
128175
@ApiResponses({
129176
@ApiResponse(responseCode = "200", description = "사용 가능한 닉네임"),

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

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import ita.tinybite.domain.party.enums.ParticipantStatus;
88
import ita.tinybite.domain.party.enums.PartyStatus;
99
import ita.tinybite.domain.party.repository.PartyParticipantRepository;
10+
import ita.tinybite.domain.party.repository.PartyRepository;
1011
import ita.tinybite.domain.user.dto.req.UpdateUserReqDto;
1112
import ita.tinybite.domain.user.dto.res.RejoinValidationResponse;
1213
import ita.tinybite.domain.user.dto.res.UserResDto;
@@ -19,6 +20,7 @@
1920
import ita.tinybite.global.exception.BusinessException;
2021
import ita.tinybite.global.exception.errorcode.AuthErrorCode;
2122
import ita.tinybite.global.location.LocationService;
23+
import lombok.RequiredArgsConstructor;
2224
import org.springframework.stereotype.Service;
2325
import org.springframework.transaction.annotation.Transactional;
2426

@@ -29,6 +31,7 @@
2931
import java.util.stream.Collectors;
3032

3133
@Service
34+
@RequiredArgsConstructor
3235
@Transactional(readOnly = true)
3336
public class UserService {
3437

@@ -37,18 +40,7 @@ public class UserService {
3740
private final LocationService locationService;
3841
private final WithDrawUserRepository withDrawUserRepository;
3942
private final PartyParticipantRepository participantRepository;
40-
41-
public UserService(SecurityProvider securityProvider,
42-
UserRepository userRepository,
43-
LocationService locationService,
44-
PartyParticipantRepository participantRepository,
45-
WithDrawUserRepository withDrawUserRepository) {
46-
this.securityProvider = securityProvider;
47-
this.userRepository = userRepository;
48-
this.locationService = locationService;
49-
this.participantRepository = participantRepository;
50-
this.withDrawUserRepository = withDrawUserRepository;
51-
}
43+
private final PartyRepository partyRepository;
5244

5345
public UserResDto getUser() {
5446
User user = securityProvider.getCurrentUser();
@@ -183,4 +175,36 @@ public RejoinValidationResponse validateRejoin(String email) {
183175
.build();
184176
}
185177

178+
public List<PartyCardResponse> getHostingParties(Long userId) {
179+
List<Party> parties = partyRepository.findByHostUserIdAndStatus(
180+
userId,
181+
PartyStatus.RECRUITING
182+
);
183+
184+
return parties.stream()
185+
.map(party -> {
186+
int currentParticipants = participantRepository
187+
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
188+
return PartyCardResponse.from(party, currentParticipants, true, ParticipantStatus.APPROVED);
189+
})
190+
.collect(Collectors.toList());
191+
}
192+
193+
public List<PartyCardResponse> getParticipatingParties(Long userId) {
194+
List<PartyParticipant> participants = participantRepository
195+
.findActivePartiesByUserIdExcludingHost(
196+
userId,
197+
PartyStatus.RECRUITING,
198+
ParticipantStatus.APPROVED
199+
);
200+
201+
return participants.stream()
202+
.map(pp -> {
203+
Party party = pp.getParty();
204+
int currentParticipants = participantRepository
205+
.countByPartyIdAndStatus(party.getId(), ParticipantStatus.APPROVED);
206+
return PartyCardResponse.from(party, currentParticipants, false, pp.getStatus());
207+
})
208+
.collect(Collectors.toList());
209+
}
186210
}

0 commit comments

Comments
 (0)