장단콩 보드게임 & 미니어처 게임 클럽

커스텀 파티(고정 인원) 기능 설계

배경

프로스트헤이븐처럼 고정 인원이 여러 차례 게임을 함께하는 경우, 매번 일정 등록 시 참석자를 한 명씩 신청하는 대신 미리 만들어둔 “파티”를 선택해 참석 인원을 자동으로 채우고 싶다. 파티는 아무 유저나 자신의 마이페이지에서 만들고 관리한다.

데이터 모델

새 컬렉션 parties:

parties/{partyId}
  ownerUid: string        // 파티를 만든 유저의 uid
  name: string            // 예: "프로스트헤이븐 파티"
  memberUids: string[]    // ownerUid 본인 포함, 승인된 유저의 uid 배열
  createdAt, updatedAt

Firestore 규칙

parties 컬렉션은 콘솔에서 직접 규칙을 관리 중이므로(레포에 firestore.rules 없음), 아래 규칙을 사용자가 Firebase 콘솔에서 직접 반영해야 한다:

match /parties/{partyId} {
  allow read, write: if request.auth != null && request.auth.uid == resource.data.ownerUid;
  allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUid;
}

파티는 소유자 본인만 읽고 쓸 수 있다(다른 유저의 파티 목록은 조회 불가).

컴포넌트 구성

assets/js/party.js (신규) — 파티 CRUD와 유저 검색을 담당하는 공통 모듈. mypage.js와 write.js 양쪽에서 가져다 쓴다.

// party.js가 제공하는 함수
listMyParties(ownerUid)              // 내 파티 목록 조회
createParty(ownerUid, name, memberUids)
updateParty(partyId, name, memberUids)
deleteParty(partyId)
searchApprovedUsers(nicknameQuery)   // status == "approved" 유저 중 닉네임 검색

유저 검색은 write.jsloadAuthorOptions(승인된 유저 전체 조회) 패턴을 재사용하되, 파티는 멤버가 소수이므로 클라이언트에서 닉네임 부분일치 필터링으로 충분하다(별도 서버 검색 함수 불필요).

마이페이지 (mypage.html / mypage.js) 변경

“내 파티” 섹션을 회원 탈퇴 섹션 위, <hr>로 구분해 추가한다.

글쓰기 페이지 (write.html / write.js) 변경

“최대 참석 인원” 필드 위에 “내 파티 불러오기” 드롭다운을 추가한다.

제출 시 처리

postData.attendees는 기존과 동일하게 uid 배열이다. 파티에서 온 것인지 여부를 구분하는 필드는 두지 않는다(파티-일정 간 참조가 없다는 원칙과 일관됨).

에러 처리

테스트