Skip to content

Commit 9a6cdb9

Browse files
authored
feat : 파티 목록 조회 api 개선 (#123)
1 parent 0e697f8 commit 9a6cdb9

File tree

4 files changed

+63
-20
lines changed

4 files changed

+63
-20
lines changed

backend/src/main/java/com/back/domain/party/party/controller/ApiV1PartyController.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.back.domain.member.entity.Member;
44
import com.back.domain.member.service.MemberService;
5-
import com.back.domain.mission.entity.Mission;
65
import com.back.domain.mission.enums.MissionCategory;
76
import com.back.domain.party.party.dto.*;
87
import com.back.domain.party.party.entity.Party;
@@ -145,14 +144,8 @@ public ResponseEntity<ApiResponse<Page<PartyDto>>> getPublicParties(
145144
@GetMapping("/{partyId}")
146145
@Operation(summary = "파티 상세 조회", description = "특정 파티의 상세 정보를 조회하고 조회수를 1 증가시키는 API (미션ID 포함)")
147146
public ResponseEntity<ApiResponse<PartyDto>> getPartyDetails(@PathVariable Integer partyId) {
148-
// 1. 파티 정보 조회 및 조회수 증가
149-
Party party = partyService.getPartyDetails(partyId);
150147

151-
// 2. 파티에 연결된 미션 정보 조회 (Service에 추가된 헬퍼 메서드 사용)
152-
Mission mission = partyService.getMissionByPartyId(partyId);
153-
154-
// 3. Party와 Mission 정보를 모두 DTO에 담아 반환
155-
PartyDto partyDto = new PartyDto(party, mission);
148+
PartyDto partyDto = partyService.getPartyDetails(partyId);
156149

157150
return ResponseEntity
158151
.status(HttpStatus.OK)

backend/src/main/java/com/back/domain/party/party/dto/PartyDto.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class PartyDto {
2929
private LocalDate endDate;
3030
private LocalDate createDate;
3131
private Integer views;
32+
private String missionTitle;
33+
private Boolean missionIsCompleted;
3234

3335

3436
public PartyDto(Party party, Mission mission) {
@@ -53,11 +55,24 @@ public PartyDto(Party party, Mission mission) {
5355
this.category = mission.getCategory();
5456
this.startDate = mission.getStartDate();
5557
this.endDate = mission.getEndDate();
58+
this.missionTitle = mission.getTitle();
59+
this.missionIsCompleted = mission.isCompleted();
60+
} else {
61+
this.category = null;
62+
this.startDate = null;
63+
this.endDate = null;
64+
this.missionTitle = null;
65+
this.missionIsCompleted = null;
5666
}
5767

5868
this.members = party.getPartyMembers().stream()
5969
.filter(pm -> pm.getStatus() == PartyMemberStatus.ACCEPTED)
60-
.map(partyMember -> new PartyMemberDto(partyMember.getMember()))
70+
.map(partyMember -> {
71+
return new PartyMemberDto(
72+
partyMember.getMember(),
73+
null
74+
);
75+
})
6176
.collect(Collectors.toList());
6277
}
6378

@@ -79,10 +94,12 @@ public PartyDto(Party party) {
7994
this.category = null;
8095
this.startDate = null;
8196
this.endDate = null;
97+
this.missionTitle = null;
98+
this.missionIsCompleted = null;
8299

83100
this.members = party.getPartyMembers().stream()
84101
.filter(pm -> pm.getStatus() == PartyMemberStatus.ACCEPTED)
85-
.map(partyMember -> new PartyMemberDto(partyMember.getMember()))
102+
.map(partyMember -> new PartyMemberDto(partyMember.getMember(), null))
86103
.collect(Collectors.toList());
87104
}
88105

backend/src/main/java/com/back/domain/party/party/dto/PartyMemberDto.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ public class PartyMemberDto {
1212
private Integer id;
1313
private String email;
1414
private String name;
15+
private String status;
16+
17+
public PartyMemberDto(Member member, String missionStatus) {
18+
this.id = member.getId();
19+
this.email = member.getEmail();
20+
this.name = member.getName();
21+
this.status = missionStatus;
22+
}
1523

1624
public PartyMemberDto(Member member) {
1725
this.id = member.getId();

backend/src/main/java/com/back/domain/party/party/service/PartyService.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import com.back.domain.member.repository.MemberRepository;
55
import com.back.domain.mission.entity.Mission;
66
import com.back.domain.mission.enums.MissionCategory;
7+
import com.back.domain.mission.repository.MissionCompletionLogRepository;
78
import com.back.domain.mission.repository.MissionRepository;
89
import com.back.domain.party.party.dto.PartyDto;
10+
import com.back.domain.party.party.dto.PartyMemberDto;
911
import com.back.domain.party.party.dto.PartyRequestDto;
1012
import com.back.domain.party.party.dto.PartyUpdateRequestDto;
1113
import com.back.domain.party.party.entity.Party;
@@ -41,6 +43,8 @@ public class PartyService {
4143
private final MemberRepository memberRepository;
4244
private final PartyMemberRepository partyMemberRepository;
4345
private final MissionRepository missionRepository;
46+
private final MissionCompletionLogRepository completionLogRepository;
47+
4448

4549
public Page<PartyDto> getPublicPartyList(
4650
Pageable pageable,
@@ -210,23 +214,44 @@ public void deleteParty(Integer partyId, Integer memberId) {
210214
partyRepository.delete(party);
211215
}
212216

217+
private String getMemberMissionStatus(Integer missionId, Integer memberId) {
218+
boolean isCompleted = completionLogRepository.existsByMissionIdAndMemberId(missionId, memberId);
219+
return isCompleted ? "COMPLETED" : "PROGRESS";
220+
}
221+
222+
// 파티 상세 조회 (캐시 적용)
213223
@Cacheable(value = "partyDetails", key = "#partyId")
214-
@Transactional
215-
public Party getPartyDetails(Integer partyId) {
224+
@Transactional(readOnly = true)
225+
public PartyDto getPartyDetails(Integer partyId) {
216226
Party party = partyRepository.findById(partyId)
217227
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "파티를 찾을 수 없습니다."));
218228

219229
party.incrementViews();
220230

221-
return party;
222-
}
231+
Mission mission = missionRepository.findByPartyId(partyId).stream().findFirst().orElse(null);
232+
233+
// 파티원 DTO 리스트 생성 로직
234+
List<PartyMemberDto> memberDtos = party.getPartyMembers().stream()
235+
.filter(pm -> pm.getStatus() == PartyMemberStatus.ACCEPTED)
236+
.map(partyMember -> {
237+
String memberMissionStatus = null;
238+
if (mission != null) {
239+
memberMissionStatus = getMemberMissionStatus( // 상태 계산 로직 사용
240+
mission.getId(),
241+
partyMember.getMember().getId()
242+
);
243+
}
244+
return new PartyMemberDto(
245+
partyMember.getMember(),
246+
memberMissionStatus
247+
);
248+
})
249+
.collect(Collectors.toList());
223250

224-
@Cacheable(value = "missionByParty", key = "#partyId")
225-
@Transactional(readOnly = true)
226-
public Mission getMissionByPartyId(Integer partyId) {
227-
return missionRepository.findByPartyId(partyId).stream()
228-
.findFirst()
229-
.orElse(null);
251+
PartyDto dto = new PartyDto(party, mission);
252+
dto.setMembers(memberDtos);
253+
254+
return dto;
230255
}
231256

232257
@Transactional

0 commit comments

Comments
 (0)