회원 · 프로필 · 티어
회원 계정과 프로필, 실력 등급(티어)에 대한 요구사항.
회원은 이메일 기반 계정을 만들고 닉네임 · 볼링 스타일 · 주손 · 지역 등 프로필을 관리한다.
Member 엔티티에 프로필 필드 저장, PATCH /api/members/profile로 수정.회원의 공개 프로필과 개인 통계(평균 · 기록)를 조회할 수 있다.
GET /api/members/:id/public, 본인 GET /api/members/my/stats.회원 평균과 MMR로 티어를 산정하고, 티어 정의(TierDefinition)의 구간에 따라 등급을 부여한다.
MemberTier 기록 생성, 리그/경기일의 tierMin/tierMax로 참가 자격을 거를 수 있다.리그 · 시즌 · 편성
대회 구조(시즌–리그–라운드–경기일–경기)의 편성 요구사항.
관리자는 시즌을 만들고 그 아래 리그(정원 · 참가비 · 티어 범위 · 상금풀 등)를 생성한다.
POST /api/admin/leagues, League가 Season에 속함.관리자는 리그의 라운드/경기일 일정을 규칙에 따라 자동 생성하고, 특정 날짜를 건너뛰거나 재조정할 수 있다.
POST /api/admin/leagues/:id/generate-schedule, skip-date.비로그인 사용자도 리그 목록 · 상세 · 캘린더를 볼 수 있다.
GET /api/leagues, /:id, /:id/calendar (@Public()).참가 · 결제
경기일 참가 신청과 결제 · 대기 · 듀오 요구사항.
회원은 경기일에 참가 신청하고 취소할 수 있다. 정원 초과 시 대기 순번이 부여된다.
POST /api/match-days/:id/apply, DELETE /api/participations/:id, waitlistOrder.참가비가 있는 경기일은 결제를 거쳐 참가가 확정된다. 관리자는 강제 환불을 처리할 수 있다.
pg-callback, HMAC 검증), 모바일은 TossPayments. Payment ─1:1─ Participation.두 명이 짝(듀오)으로 함께 참가하고, 다음 라운드로 참가를 이어받을(승계) 수 있다.
duoPartnerId, 승계 POST /api/rounds/:id/apply, 모바일 딥링크 abl://duo-invite/{code}.매칭 · 레인
마감 후 팀 편성과 레인 배정 요구사항.
신청 마감 후 참가자를 팀 A/B로 균형 있게 배정한다. 인원이 안 맞으면 밸런스용 고스트를 채운다.
POST /api/matching/batch-generate, MatchPlayer.team, isGhost, matchingMmr/matchingAvg.관리자는 경기일 참가자에게 레인을 배정하고 조회한다.
GET/POST /api/lanes/:matchDayId, laneAssignmentStatus.경기 · 점수 · 검증
점수 기록 · 핸디캡 · 사진 증빙 검증 요구사항.
경기별 점수를 제출하고, 수정 시 이전 값과 사유를 이력으로 남긴다. 동시 수정 충돌은 막는다.
POST /api/matches/:id/scores, ScoreEditHistory, GameScore 낙관적 락(@VersionColumn).평균 차이에 따라 핸디캡을 자동 계산해 점수에 반영한다.
MatchPlayer.handicap → handicapScore.제출 점수는 사진 증빙 검증을 거쳐야 정산 대상이 된다. 관리자는 승인 · 반려한다.
POST /api/upload(S3), 검증 POST /api/verification/:id/verify·reject, ScoreVerification.정산
경기 결과에 따른 정산과 잠금 요구사항.
경기가 확정되면 참가별로 결과 · 상금을 계산해 정산을 만든다.
Settlement(result · prize · prizeRule), 회원 조회 GET /api/settlements/my.정산이 확정된(settledAt) 뒤에는 관련 점수 · 정산 수정이 차단된다.
SettlementGuard로 확정 후 편집 차단.랭킹 · 평균
레이팅 · 랭킹 · 평균 집계 요구사항.
경기 결과에 따라 레이팅 포인트(RP)가 변동되며 이력이 남는다.
RpHistory, GET /api/rating/my/rp·history.시즌/전체 리더보드와 회원 평균(시즌 · 롤링)을 조회한다.
GET /api/stats/leaderboard, GET /api/average/....게이미피케이션
뱃지 · 미션 · 마스터리 · 시즌패스 · 포인트 요구사항.
조건 달성 시 뱃지를 부여하고, 일간/주간 미션과 출석을 추적한다.
Badge/MemberBadge, Mission/MemberMission, AttendanceLog, GET /api/badges·/api/missions.참여/성과로 마스터리 레벨과 시즌패스 단계가 오르고, 적립 포인트를 관리한다.
MasteryExpLog, SeasonPass/MemberSeasonPass, ABL 포인트 모듈.얼라이언스 · 운영
얼라이언스(볼링센터 그룹) · 공지 · 배너 등 운영 요구사항.
얼라이언스가 여러 리그를 총괄하고, 소속 볼링센터/회원을 관리한다.
Alliance ─1:N─ League/Member, BowlingCenter, 얼라이언스 매니저 전용 웹 콘솔.얼라이언스/전체 공지와 마케팅 배너를 게시한다.
Announcement, AllianceNotice, Banner.알림 · 실시간
알림과 실시간 업데이트 요구사항.
회원은 경기 · 정산 등 알림을 받고 읽음 처리한다. 모바일은 푸시(FCM)로도 받는다.
Notification, GET /api/notifications/my, FCM(구성 시).경기 상태 · 정원 변화 등이 실시간으로 클라이언트에 반영된다.
status:changed, slots:updated), 재연결 시 캐시 무효화.인증 · 권한
로그인 · 토큰 · 권한 요구사항.
이메일/비밀번호와 소셜 로그인을 지원하고, 접근 토큰 만료 시 refresh로 재발급한다.
POST /api/auth/login·refresh·social, 모바일 Google/Kakao/Naver.관리자 기능은 역할 · 권한으로 접근을 제한한다. 웹 관리자는 ADMIN/얼라이언스 매니저 이중 로그인을 쓴다.
RolesGuard + @RequirePermission()(resource:action), 경로별(/admin vs /alliance) 로그인 분리.변경 이력
이 문서가 바뀐 내용을 시간순으로 남깁니다. 내용이 바뀌면 본문에서 옛 문장은 취소선으로, 새 내용은 추가 표시로 남기고, 아래에 날짜·요약을 덧붙입니다.