Skip to content

Commit 31f080b

Browse files
authored
feat : 파티 신청/초대 관리 로직 개선 및 api 응답 통일 (#152)
* feat : 상태 enum 확장 및 dto 추가 * feat : 여러 상태를 한번에 조회하는 메서드 추가 * feat : 파티 에러 코드 추가 * feat: 파티 신청/초대 관리 로직 개선 및 API 응답 통일
1 parent 63e4864 commit 31f080b

File tree

7 files changed

+187
-76
lines changed

7 files changed

+187
-76
lines changed

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

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -153,44 +153,63 @@ public ResponseEntity<ApiResponse<PartyDto>> getPartyDetails(@PathVariable Integ
153153
}
154154

155155
@PostMapping("/{partyId}/invite")
156-
@Operation(summary = "파티 초대 (코드)", description = "파티장이 다른 멤버를 코드를 사용하여 파티에 초대하는 API")
157-
public ResponseEntity<ApiResponse<Void>> inviteMember(
156+
@Operation(summary = "파티에 멤버 초대", description = "파티장이 멤버 코드로 다른 사용자를 파티에 초대합니다. 상태는 INVITED로 설정됩니다.")
157+
public ResponseEntity<ApiResponse<PartyMemberStatusResponse>> inviteMember(
158158
@PathVariable Integer partyId,
159-
@RequestBody @Valid InvitationDto invitationDto,
159+
@Valid @RequestBody InvitationDto invitationDto,
160160
Authentication authentication
161161
) {
162162
Integer leaderId = getMemberIdFromAuthentication(authentication);
163-
partyService.inviteMember(partyId, leaderId, invitationDto.getInvitedMemberCode());
163+
164+
PartyMemberStatusResponse responseContent = partyService.inviteMember(
165+
partyId,
166+
leaderId,
167+
invitationDto.getInvitedMemberCode()
168+
);
164169

165170
return ResponseEntity
166171
.status(HttpStatus.OK)
167-
.body(ApiResponse.success("200", "파티 초대 성공"));
172+
.body(ApiResponse.success("200", "초대 성공", responseContent));
168173
}
169174

170175
@PostMapping("/{partyId}/accept")
171-
@Operation(summary = "초대/신청 수락", description = "초대/신청 대기 중인 멤버를 파티원이 되도록 수락하는 API")
172-
public ResponseEntity<ApiResponse<Void>> acceptInvitation(
176+
@Operation(summary = "파티 가입 신청/초대 수락", description = "파티장이 대기 중인 멤버의 가입 신청 또는 초대를 수락합니다. (PENDING | INVITED) -> ACCEPTED")
177+
public ResponseEntity<ApiResponse<PartyMemberStatusResponse>> acceptInvitation(
173178
@PathVariable Integer partyId,
179+
@Valid @RequestBody MemberIdRequest memberIdRequest,
174180
Authentication authentication
175181
) {
176-
Integer memberId = getMemberIdFromAuthentication(authentication);
177-
partyService.acceptInvitation(partyId, memberId);
182+
Integer leaderId = getMemberIdFromAuthentication(authentication);
183+
184+
PartyMemberStatusResponse responseContent = partyService.acceptInvitation(
185+
partyId,
186+
memberIdRequest.getMemberId(),
187+
leaderId
188+
);
189+
178190
return ResponseEntity
179191
.status(HttpStatus.OK)
180-
.body(ApiResponse.success("200", "초대/신청 수락 성공"));
192+
.body(ApiResponse.success("200", "초대/신청 수락 성공", responseContent));
181193
}
182194

183195
@PostMapping("/{partyId}/reject")
184-
@Operation(summary = "초대/신청 거절", description = "초대/신청 대기 중인 멤버를 거절하는 API")
185-
public ResponseEntity<ApiResponse<Void>> rejectInvitation(
196+
@Operation(summary = "파티 가입 신청/초대 거절 (소프트 삭제)", description = "파티장이 대기 중인 멤버의 신청 또는 초대를 거절하고 상태를 REJECTED로 변경합니다. (PENDING | INVITED) -> REJECTED")
197+
public ResponseEntity<ApiResponse<PartyMemberStatusResponse>> rejectInvitation(
186198
@PathVariable Integer partyId,
199+
@Valid @RequestBody MemberIdRequest memberIdRequest,
187200
Authentication authentication
188201
) {
189-
Integer memberId = getMemberIdFromAuthentication(authentication);
190-
partyService.rejectInvitation(partyId, memberId);
202+
Integer leaderId = getMemberIdFromAuthentication(authentication);
203+
204+
PartyMemberStatusResponse responseContent = partyService.rejectInvitation(
205+
partyId,
206+
memberIdRequest.getMemberId(),
207+
leaderId
208+
);
209+
191210
return ResponseEntity
192211
.status(HttpStatus.OK)
193-
.body(ApiResponse.success("200", "초대/신청 거절 성공"));
212+
.body(ApiResponse.success("200", "초대/신청 거절 성공", responseContent));
194213
}
195214

196215
@DeleteMapping("/{partyId}/members/{kickedMemberId}")
@@ -209,15 +228,15 @@ public ResponseEntity<ApiResponse<Void>> kickMember(
209228
}
210229

211230
@GetMapping("/{partyId}/requests")
212-
@Operation(summary = "파티 가입 신청/초대 목록 조회", description = "파티장이 가입 신청 또는 초대 대기 중인 멤버 목록을 조회하는 API")
231+
@Operation(summary = "파티 가입 신청/초대 목록 조회", description = "파티장이 PENDING(신청) 또는 INVITED(초대) 대기 중인 멤버 목록을 조회합니다. 응답에 status 필드가 포함됩니다.")
213232
public ResponseEntity<ApiResponse<List<PartyMemberDto>>> getPendingJoinRequests(
214233
@PathVariable Integer partyId,
215234
Authentication authentication
216235
) {
217236
Integer leaderId = getMemberIdFromAuthentication(authentication);
218237
List<PartyMember> pendingRequests = partyService.getPendingJoinRequests(partyId, leaderId);
219238
List<PartyMemberDto> requestDtos = pendingRequests.stream()
220-
.map(pm -> new PartyMemberDto(pm.getMember()))
239+
.map(pm -> new PartyMemberDto(pm.getMember(), pm.getStatus().name()))
221240
.collect(Collectors.toList());
222241

223242
return ResponseEntity
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.back.domain.party.party.dto;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
import lombok.Getter;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
public class MemberIdRequest {
10+
@NotNull(message = "멤버 ID는 필수 입력 항목입니다.")
11+
private Integer memberId;
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.back.domain.party.party.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
@NoArgsConstructor
10+
public class PartyMemberStatusResponse {
11+
private Integer memberId;
12+
private String status;
13+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.back.domain.party.party.entity;
22

33
public enum PartyMemberStatus {
4-
PENDING, // 초대 대기
5-
ACCEPTED, // 파티원
4+
PENDING, // 파티 가입 신청 대기 (멤버 -> 리더)
5+
INVITED, // 파티 초대 대기 (리더 -> 멤버)
6+
ACCEPTED, // 신청/초대 수락
7+
REJECTED, // 신청/초대 거절
68
COMPLETED, // 미션 완료
79
LEFT // 도중에 나감 또는 중도 포기
810
}

backend/src/main/java/com/back/domain/party/party/repository/PartyMemberRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.springframework.data.jpa.repository.JpaRepository;
77
import org.springframework.stereotype.Repository;
88

9+
import java.util.Collection;
910
import java.util.List;
1011
import java.util.Optional;
1112

@@ -24,4 +25,7 @@ public interface PartyMemberRepository extends JpaRepository<PartyMember, PartyM
2425
// 파티원 수 조회용 메서드 추가
2526
long countByParty_IdAndStatus(Integer partyId, PartyMemberStatus status);
2627

28+
// 특정 파티의 여러 상태에 해당하는 파티원들을 찾는 메서드
29+
List<PartyMember> findByParty_IdAndStatusIn(Integer partyId, Collection<PartyMemberStatus> statuses);
30+
2731
}

0 commit comments

Comments
 (0)