From 994b6b3834592dde35ddb1907f8484384ba0029a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Wed, 10 Dec 2025 17:20:14 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat(party):=20Party=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=EB=94=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchduo/domain/party/entity/Party.java | 42 ++++++++++++ .../domain/party/entity/PartyMember.java | 65 +++++++++++++++++++ .../domain/party/entity/PartyMemberRole.java | 6 ++ .../domain/party/entity/PartyMemberState.java | 6 ++ .../domain/party/entity/PartyStatus.java | 6 ++ 5 files changed, 125 insertions(+) create mode 100644 src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java create mode 100644 src/main/java/com/back/matchduo/domain/party/entity/PartyMemberRole.java create mode 100644 src/main/java/com/back/matchduo/domain/party/entity/PartyMemberState.java create mode 100644 src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java diff --git a/src/main/java/com/back/matchduo/domain/party/entity/Party.java b/src/main/java/com/back/matchduo/domain/party/entity/Party.java index 7687a58..8181448 100644 --- a/src/main/java/com/back/matchduo/domain/party/entity/Party.java +++ b/src/main/java/com/back/matchduo/domain/party/entity/Party.java @@ -1,10 +1,52 @@ package com.back.matchduo.domain.party.entity; import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; @Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "party") public class Party { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "party_id") private Long id; + + @Column(name = "post_id", nullable = false) + private Long postId; + + @Column(name = "leader_id", nullable = false) + private Long leaderId; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private PartyStatus status; + + @Column(name = "created_at", nullable = false) + private LocalDateTime createdAt; + + @Column(name = "closed_at", nullable = false) + private LocalDateTime closedAt; + + + public Party(Long postId, Long leaderId) { + this.postId = postId; + this.leaderId = leaderId; + this.status = PartyStatus.ACTIVE; + this.createdAt = LocalDateTime.now(); + this.closedAt = this.createdAt.plusHours(6); + } + + + public void closeParty() { + if (this.status == PartyStatus.ACTIVE) { + this.status = PartyStatus.CLOSED; + } + } } diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java new file mode 100644 index 0000000..f49a337 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java @@ -0,0 +1,65 @@ +package com.back.matchduo.domain.party.entity; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table( + // 파티 중복 참여 방지 unique + name = "party_member", + uniqueConstraints = { + @UniqueConstraint( + name = "uk_party_member_user", + columnNames = {"party_id", "user_id"} + ) + } +) +public class PartyMember { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "party_member_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "party_id", nullable = false) + private Party party; + + @Column(name = "user_id", nullable = false) + private Long userId; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private PartyMemberRole role; // LEADER, MEMBER + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private PartyMemberState state; // JOINED, LEFT + + @Column(name = "joined_at", nullable = false) + private LocalDateTime joinedAt; + + @Column(name = "left_at") + private LocalDateTime leftAt; + + + public PartyMember(Party party, Long userId, PartyMemberRole role) { + this.party = party; + this.userId = userId; + this.role = role; + this.state = PartyMemberState.JOINED; + this.joinedAt = LocalDateTime.now(); + } + + + public void leaveParty() { + this.state = PartyMemberState.LEFT; + this.leftAt = LocalDateTime.now(); + } +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberRole.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberRole.java new file mode 100644 index 0000000..b68da92 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberRole.java @@ -0,0 +1,6 @@ +package com.back.matchduo.domain.party.entity; + +public enum PartyMemberRole { + LEADER, // 파티장 + MEMBER // 파티원 + } \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberState.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberState.java new file mode 100644 index 0000000..403fb68 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyMemberState.java @@ -0,0 +1,6 @@ +package com.back.matchduo.domain.party.entity; + +public enum PartyMemberState { + JOINED, // 참여 중 + LEFT, // 나감 (탈퇴/강퇴) +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java new file mode 100644 index 0000000..6c6e049 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java @@ -0,0 +1,6 @@ +package com.back.matchduo.domain.party.entity; + +public enum PartyStatus { + ACTIVE, // 모집완료 시 + CLOSED // 모집중 , 게임완료일 시 +} From 6455cbe99fb55f177f8ae79b5283e73d8af49fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Thu, 11 Dec 2025 14:31:54 +0900 Subject: [PATCH 2/6] =?UTF-8?q?refactor(party):=20=EC=88=98=EB=8F=99,=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=ED=8C=8C=ED=8B=B0=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../matchduo/domain/party/entity/Party.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/back/matchduo/domain/party/entity/Party.java b/src/main/java/com/back/matchduo/domain/party/entity/Party.java index 8181448..2a4acc2 100644 --- a/src/main/java/com/back/matchduo/domain/party/entity/Party.java +++ b/src/main/java/com/back/matchduo/domain/party/entity/Party.java @@ -31,7 +31,12 @@ public class Party { @Column(name = "created_at", nullable = false) private LocalDateTime createdAt; - @Column(name = "closed_at", nullable = false) + // 자동 파티완료 된 경우 + @Column(name = "expires_at", nullable = false) + private LocalDateTime expiresAt; + + // 수동 파티완료, 자동 파티완료 된 경우의 시간 + @Column(name = "closed_at") private LocalDateTime closedAt; @@ -40,13 +45,23 @@ public Party(Long postId, Long leaderId) { this.leaderId = leaderId; this.status = PartyStatus.ACTIVE; this.createdAt = LocalDateTime.now(); - this.closedAt = this.createdAt.plusHours(6); - } + this.expiresAt = this.createdAt.plusHours(6); + } + // 파티장이 수동 파티완료 처리 public void closeParty() { if (this.status == PartyStatus.ACTIVE) { this.status = PartyStatus.CLOSED; + this.closedAt = LocalDateTime.now(); // 현재 시간 기록 + } + } + + // 스케줄러가 자동 파티완료 처리 + public void expireParty() { + if (this.status == PartyStatus.ACTIVE) { + this.status = PartyStatus.CLOSED; + this.closedAt = this.expiresAt; // 만료 예정 시간이 곧 종료 시간 } } } From 3de0b8bfea9dc38eb283c6d7ac4b564e8febb9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Thu, 11 Dec 2025 14:32:30 +0900 Subject: [PATCH 3/6] =?UTF-8?q?refactor(party):=20=EC=9E=AC=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=ED=8C=8C=ED=8B=B0=EC=9B=90=20=EA=B3=A0=EB=A0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/back/matchduo/domain/party/entity/PartyMember.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java index f49a337..7d60513 100644 --- a/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyMember.java @@ -62,4 +62,11 @@ public void leaveParty() { this.state = PartyMemberState.LEFT; this.leftAt = LocalDateTime.now(); } + + // 나갔던 유저가 다시 들어올 때 사용 + public void rejoinParty() { + this.state = PartyMemberState.JOINED; + this.joinedAt = LocalDateTime.now(); + this.leftAt = null; + } } \ No newline at end of file From 3f87d36d94eff7be5d3fe09cb87dbcdd2b0e93b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Thu, 11 Dec 2025 14:33:09 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat(party):=20=ED=8C=8C=ED=8B=B0,=ED=8C=8C?= =?UTF-8?q?=ED=8B=B0=EC=9B=90=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/party/entity/PartyStatus.java | 2 +- .../repository/PartyMemberRepository.java | 26 +++++++++++++++++++ .../party/repository/PartyRepository.java | 13 ++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java diff --git a/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java b/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java index 6c6e049..a1c71d0 100644 --- a/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java +++ b/src/main/java/com/back/matchduo/domain/party/entity/PartyStatus.java @@ -2,5 +2,5 @@ public enum PartyStatus { ACTIVE, // 모집완료 시 - CLOSED // 모집중 , 게임완료일 시 + CLOSED // 모집중 , 게임완료(수동, 6시간 자동 포함) } diff --git a/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java b/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java new file mode 100644 index 0000000..b964ac3 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java @@ -0,0 +1,26 @@ +package com.back.matchduo.domain.party.repository; + +import com.back.matchduo.domain.party.entity.PartyMember; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface PartyMemberRepository extends JpaRepository { + + // 1. 특정 파티의 멤버 목록 조회 (가입된 상태만 가져오거나, 전체 다 가져오거나) + // 용도: GET /api/v1/parties/{partyId}/members (파티원 목록 보여주기) + List findByPartyId(Long partyId); + + // 2. 내가 참여한 파티 목록 조회 + // 용도: GET /api/v1/users/me/parties (내 파티 목록) + List findByUserId(Long userId); + + // 3. 이미 참여했는지 확인 (중복 참여 방지) + // 용도: 파티 참여 신청 시 검증 로직 (Validation) + boolean existsByPartyIdAndUserId(Long partyId, Long userId); + + // 4. 특정 파티에서 내 멤버 정보 찾기 + // 용도: 탈퇴하거나 강퇴할 때 내 멤버 ID를 찾기 위해 사용 + Optional findByPartyIdAndUserId(Long partyId, Long userId); +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/repository/PartyRepository.java b/src/main/java/com/back/matchduo/domain/party/repository/PartyRepository.java index d05021d..ca2257e 100644 --- a/src/main/java/com/back/matchduo/domain/party/repository/PartyRepository.java +++ b/src/main/java/com/back/matchduo/domain/party/repository/PartyRepository.java @@ -1,7 +1,20 @@ package com.back.matchduo.domain.party.repository; import com.back.matchduo.domain.party.entity.Party; +import com.back.matchduo.domain.party.entity.PartyStatus; import org.springframework.data.jpa.repository.JpaRepository; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + public interface PartyRepository extends JpaRepository { + + // 1. 모집글 ID로 파티 조회 + // 용도: GET /api/v1/posts/{postId}/party (모집글 눌렀을 때 파티 정보 띄우기) + Optional findByPostId(Long postId); + + // 2. 만료 시간이 지났고, 상태가 ACTIVE인 파티 조회 + // 용도: 스케줄러가 6시간 지난 파티를 찾아서 자동으로 닫을 때 사용 + List findByStatusAndExpiresAtBefore(PartyStatus status, LocalDateTime now); } From 232b64f1873010e1c36cbdfff23040591682a502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Thu, 11 Dec 2025 14:38:49 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat(party):=20party=20=EB=A0=88=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/back/matchduo/domain/party/dto/PartyDto.java | 5 ----- .../domain/party/repository/PartyMemberRepository.java | 4 ---- 2 files changed, 9 deletions(-) delete mode 100644 src/main/java/com/back/matchduo/domain/party/dto/PartyDto.java diff --git a/src/main/java/com/back/matchduo/domain/party/dto/PartyDto.java b/src/main/java/com/back/matchduo/domain/party/dto/PartyDto.java deleted file mode 100644 index 39d9bbc..0000000 --- a/src/main/java/com/back/matchduo/domain/party/dto/PartyDto.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.back.matchduo.domain.party.dto; - -public class PartyDto { -} - diff --git a/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java b/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java index b964ac3..9f493c6 100644 --- a/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java +++ b/src/main/java/com/back/matchduo/domain/party/repository/PartyMemberRepository.java @@ -9,18 +9,14 @@ public interface PartyMemberRepository extends JpaRepository { // 1. 특정 파티의 멤버 목록 조회 (가입된 상태만 가져오거나, 전체 다 가져오거나) - // 용도: GET /api/v1/parties/{partyId}/members (파티원 목록 보여주기) List findByPartyId(Long partyId); // 2. 내가 참여한 파티 목록 조회 - // 용도: GET /api/v1/users/me/parties (내 파티 목록) List findByUserId(Long userId); // 3. 이미 참여했는지 확인 (중복 참여 방지) - // 용도: 파티 참여 신청 시 검증 로직 (Validation) boolean existsByPartyIdAndUserId(Long partyId, Long userId); // 4. 특정 파티에서 내 멤버 정보 찾기 - // 용도: 탈퇴하거나 강퇴할 때 내 멤버 ID를 찾기 위해 사용 Optional findByPartyIdAndUserId(Long partyId, Long userId); } \ No newline at end of file From a4437de9f162d33f1050e0981dab108dada3f904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EA=B7=9C=EC=84=AD?= Date: Thu, 11 Dec 2025 14:39:11 +0900 Subject: [PATCH 6/6] =?UTF-8?q?feat(party):=20Request,=20Response=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../party/dto/request/PartyCloseRequest.java | 5 +++ .../dto/request/PartyMemberAddRequest.java | 10 ++++++ .../dto/response/MyPartyListResponse.java | 33 +++++++++++++++++++ .../dto/response/PartyByPostResponse.java | 30 +++++++++++++++++ .../dto/response/PartyCloseResponse.java | 9 +++++ .../dto/response/PartyMemberAddResponse.java | 29 ++++++++++++++++ .../dto/response/PartyMemberListResponse.java | 33 +++++++++++++++++++ .../response/PartyMemberRemoveResponse.java | 20 +++++++++++ 8 files changed, 169 insertions(+) create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/request/PartyCloseRequest.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/request/PartyMemberAddRequest.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/MyPartyListResponse.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/PartyByPostResponse.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/PartyCloseResponse.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberAddResponse.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberListResponse.java create mode 100644 src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberRemoveResponse.java diff --git a/src/main/java/com/back/matchduo/domain/party/dto/request/PartyCloseRequest.java b/src/main/java/com/back/matchduo/domain/party/dto/request/PartyCloseRequest.java new file mode 100644 index 0000000..38a4b43 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/request/PartyCloseRequest.java @@ -0,0 +1,5 @@ +package com.back.matchduo.domain.party.dto.request; + +public record PartyCloseRequest( + Long partyId +) {} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/request/PartyMemberAddRequest.java b/src/main/java/com/back/matchduo/domain/party/dto/request/PartyMemberAddRequest.java new file mode 100644 index 0000000..8aa71f8 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/request/PartyMemberAddRequest.java @@ -0,0 +1,10 @@ +package com.back.matchduo.domain.party.dto.request; + +import jakarta.validation.constraints.NotEmpty; + +import java.util.List; + +public record PartyMemberAddRequest( + @NotEmpty(message = "추가할 유저를 최소 1명 이상 선택해주세요.") + List targetUserIds // 다인파티 확정성 고려하여 List로 받음 +) {} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/MyPartyListResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/MyPartyListResponse.java new file mode 100644 index 0000000..10294c1 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/MyPartyListResponse.java @@ -0,0 +1,33 @@ +package com.back.matchduo.domain.party.dto.response; + +import com.back.matchduo.domain.party.entity.PartyMemberRole; +import com.back.matchduo.domain.party.entity.PartyStatus; + +import java.time.LocalDateTime; +import java.util.List; + +public record MyPartyListResponse( + List parties +) { + public record MyPartyDto( + Long partyId, + Long postId, + String postTitle, + String gameMode, + PartyStatus status, + PartyMemberRole myRole, + LocalDateTime joinedAt + ) { + public static MyPartyDto of(Long partyId, Long postId, String postTitle, String gameMode, PartyStatus status, PartyMemberRole myRole, LocalDateTime joinedAt) { + return new MyPartyDto( + partyId, + postId, + postTitle, + gameMode, + status, + myRole, + joinedAt + ); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/PartyByPostResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyByPostResponse.java new file mode 100644 index 0000000..4e8ea45 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyByPostResponse.java @@ -0,0 +1,30 @@ +package com.back.matchduo.domain.party.dto.response; + +import com.back.matchduo.domain.party.entity.PartyMemberRole; +import com.back.matchduo.domain.party.entity.PartyStatus; + +import java.time.LocalDateTime; +import java.util.List; + +public record PartyByPostResponse( + Long partyId, + Long postId, + PartyStatus status, + int currentCount, + int maxCount, + LocalDateTime createdAt, + boolean isJoined, + List members +) { + public record PartyMemberDto( + Long partyMemberId, + Long userId, + String nickname, + String profileImage, + PartyMemberRole role + ) { + public static PartyMemberDto of(Long partyMemberId, Long userId, String nickname, String profileImage, PartyMemberRole role) { + return new PartyMemberDto(partyMemberId, userId, nickname, profileImage, role); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/PartyCloseResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyCloseResponse.java new file mode 100644 index 0000000..2b50f50 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyCloseResponse.java @@ -0,0 +1,9 @@ +package com.back.matchduo.domain.party.dto.response; + +import java.time.LocalDateTime; + +public record PartyCloseResponse( + Long partyId, + String status, // "CLOSED" + LocalDateTime closedAt +) {} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberAddResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberAddResponse.java new file mode 100644 index 0000000..421e8a0 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberAddResponse.java @@ -0,0 +1,29 @@ +package com.back.matchduo.domain.party.dto.response; + +import com.back.matchduo.domain.party.entity.PartyMember; +import com.back.matchduo.domain.party.entity.PartyMemberRole; +import com.back.matchduo.domain.party.entity.PartyMemberState; + +import java.time.LocalDateTime; + +public record PartyMemberAddResponse( + Long partyMemberId, + Long userId, + String nickname, + String profileImage, + PartyMemberRole role,// LEADER / MEMBER + PartyMemberState state,// JOINED + LocalDateTime joinedAt +) { + public static PartyMemberAddResponse of(PartyMember member, String nickname, String profileImage) { + return new PartyMemberAddResponse( + member.getId(), + member.getUserId(), + nickname, + profileImage, + member.getRole(), + member.getState(), + member.getJoinedAt() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberListResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberListResponse.java new file mode 100644 index 0000000..add05f0 --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberListResponse.java @@ -0,0 +1,33 @@ +package com.back.matchduo.domain.party.dto.response; + +import com.back.matchduo.domain.party.entity.PartyMemberRole; + +import java.time.LocalDateTime; +import java.util.List; + +public record PartyMemberListResponse( + Long partyId, + int currentCount, + int maxCount, + List members +) { + public record PartyMemberDto( + Long partyMemberId, + Long userId, + String nickname, + String profileImage, + PartyMemberRole role, // LEADER / MEMBER + LocalDateTime joinedAt + ) { + public static PartyMemberDto of(Long partyMemberId, Long userId, PartyMemberRole role, LocalDateTime joinedAt, String nickname, String profileImage) { + return new PartyMemberDto( + partyMemberId, + userId, + nickname, + profileImage, + role, + joinedAt + ); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberRemoveResponse.java b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberRemoveResponse.java new file mode 100644 index 0000000..083156c --- /dev/null +++ b/src/main/java/com/back/matchduo/domain/party/dto/response/PartyMemberRemoveResponse.java @@ -0,0 +1,20 @@ +package com.back.matchduo.domain.party.dto.response; + +import com.back.matchduo.domain.party.entity.PartyMember; +import java.time.LocalDateTime; + +public record PartyMemberRemoveResponse( + Long partyMemberId, + Long userId, + String state,// "LEFT" + LocalDateTime leftAt +) { + public static PartyMemberRemoveResponse from(PartyMember member) { + return new PartyMemberRemoveResponse( + member.getId(), + member.getUserId(), + member.getState().name(), + member.getLeftAt() + ); + } +} \ No newline at end of file